📄 ci910cpu.asm.svn-base
字号:
CalY2NoAdjust:
mov b,#8
div ab
mov PageReg2,a ;Y2/8
mov a,b
movc a,@a+dptr
cpl a
mov HideReg2,a
ret
;========================================================================;
EnterModifyReadMode:
mov dptr,#LCD_CommandPort
mov a,#0e0h
movx @dptr,a ;set modify-read mode
mov dptr,#LCD_DataPort
ret
;========================================================================;
ResetModifyReadMode:
mov dptr,#LCD_CommandPort
mov a,#0eeh
movx @dptr,a ;reset modify-read mode
ret
;========================================================================;
Calculate:
mov a,PageReg2
clr c
subb a,PageReg1
inc a
mov PageReg2,a ;Y loop counter
mov a,PageReg1
add a,#0b0h
mov PageReg1,a ;page address
ret
;========================================================================;
GenerateCounter:
mov a,PublicVariable1 ;X2
clr c
subb a,r7
mov PublicVariable1,PublicVariable2 ;PublicVariable1==Y2
mov b,#16
cjne a,#128,JudgX2Val
JudgX2Val:
jc GenerX2Ok
mov a,#127
GenerX2Ok:
div ab
inc a
mov LengthX,a ;LengthX==(X2-X1)/16+1
mov a,b
clr c
rlc a ;*2
mov PublicVariable2,a ;PublicVariable2==(X2-X1)%16*2
ret
;========================================================================;
DisplayVersion:
mov b,#16
mov r5,#113 ;Y
mov r7,#16 ;X
mov dptr,#CPUDispVersion ;display hardware version
lcall MemoryCopy
mov r2,#HIGH(ExternTempBuffer) ;pointer(MSB)
mov r3,#LOW(ExternTempBuffer) ;pointer(LSB)
mov PublicVariable1,b
mov PublicVariable2,#01h ;display color
mov PublicVariable3,#41h ;library select
lcall _StringDisplayPro ;exit setup?
ret
;========================================================================;
ReadTable:
clr a
movc a,@a+dptr
inc dptr
ret
;========================================================================;
_MenuGetAddress:
mov dph,MenuAddressH
mov dpl,MenuAddressL
_MenuGetAddressLoop:
mov a,b
cjne a,#1,_MenuGetContinue
ljmp _MenuGetData
_MenuGetContinue:
inc dptr ;skip X
inc dptr ;skip Y
clr a
movc a,@a+dptr ;read in length
add a,#3
add a,dpl
mov dpl,a
mov a,dph
addc a,#0
mov dph,a
djnz b,_MenuGetAddressLoop
_MenuGetData:
lcall ReadTable
add a,#29
mov r7,a ;X1
lcall ReadTable
clr c
subb a,#1
mov r5,a ;Y1
lcall ReadTable
clr c
subb a,#5
mov r3,a ;length
mov a,dpl
add a,#7
mov dpl,a
mov a,dph
addc a,#0
mov dph,a ;pointe to data
mov b,#0
_MenuGetCharLenLoop:
lcall ReadTable
inc b
cjne a,#CPU_CharType,_MenuCharJudg
_MenuCharJudg:
jnc _MenuContinue
inc b
_MenuContinue:
djnz r3,_MenuGetCharLenLoop
mov a,#6
mul ab ;(char number)*6=X2
add a,#4
add a,r7
mov r3,a ;X2=X1+x
mov a,r5
add a,#14
mov PublicVariable1,a ;Y2
lcall _ReverseRectanglePro
ret
;========================================================================;
;uchar DisplayWindow(uchar* WindowID)
;-------------------------------;
;Description: CPU menu display
; IN: DPTR==Display window ID number
; R7==Key upper limit
; Acc==Now focus
; B==Hisroy focus
; OUT: R7==User selected key
; USE: R7==Pressed valid key
;-------------------------------;
_DisplayWindow:
push HistoryFocus
push NowFocus
push Index
push MenuAddressH
push MenuAddressL
push SubMenuNumber
mov NowFocus,a ;line1
mov HistoryFocus,b
mov b,r7
push dph
push dpl
push acc
push b
mov r5,#0h
mov r7,#0h
lcall ClearLCDPro ;clear display
mov r7,#0 ;X1
mov r5,#20 ;Y1
mov r3,#127 ;X2
mov PublicVariable1,#20 ;Y2
mov PublicVariable2,#02h ;color
lcall _DrawLinePro
mov r7,#0 ;X1
mov r5,#22 ;Y1
mov r3,#127 ;X2
mov PublicVariable1,#22 ;Y2
mov PublicVariable2,#02h ;color
lcall _DrawLinePro
pop b
pop acc
pop dpl
pop dph
mov r7,b
clr a
movc a,@a+dptr
inc dptr
mov SubMenuNumber,a
mov CharInterval,a ;save MAX key
push dph
push dpl
inc dptr
inc dptr
lcall ReadTable
add a,#2
add a,dpl
mov MenuAddressL,a
mov a,dph
addc a,#0
mov MenuAddressH,a ;save address
pop dpl
pop dph
push SubMenuNumber
_MenuDisplayLoop:
lcall ReadTable
mov r7,a ;X
lcall ReadTable
mov r5,a ;Y
lcall ReadTable
mov PublicVariable1,a ;Length
lcall ReadTable
mov PublicVariable2,a ;Display mode
lcall ReadTable
mov PublicVariable3,a ;Library select
mov b,PublicVariable1
lcall MemoryCopy
push dph
push dpl
mov r2,#HIGH(ExternTempBuffer) ;pointer(MSB)
mov r3,#LOW(ExternTempBuffer) ;pointer(LSB)
lcall _StringDisplayPro
pop dpl
pop dph
djnz SubMenuNumber,_MenuDisplayLoop
lcall DisplayVersion
pop SubMenuNumber ;recover length
ljmp _MenuReverse
_MenuGetKeyLoop:
mov r6,#HIGH(AutoOffTime)
mov r7,#LOW(AutoOffTime) ;3 minute limited
mov r5,#1 ;buzzer enable
lcall _GetCharPro
cjne r7,#TimerOut,_MenuShutPowerCheck ;disable auto power off
ajmp _MenuCheckUp
_MenuShutPowerCheck:
lcall _ShutPowerCheckPro
_MenuCheckUp:
cjne r7,#KeyUp,_MenuJudgDownKey ;up key judg
mov HistoryFocus,NowFocus
dec NowFocus
lcall _MenuBoundaryCheck
ajmp _MenuReverse
_MenuJudgDownKey:
cjne r7,#KeyDown,_MenuJudgEnter ;down key judg
mov HistoryFocus,NowFocus
inc NowFocus
lcall _MenuBoundaryCheck
ajmp _MenuReverse
_MenuJudgEnter:
cjne r7,#KeyEnter,_MenuJudgSelect ;enter key judg
mov r7,NowFocus
ajmp _MenuDisplayExit
_MenuJudgSelect:
cjne r7,#KeySelect,_MenuJudgClear ;clear key judg
mov r7,NowFocus
ajmp _MenuDisplayExit
_MenuJudgClear:
cjne r7,#KeyClear,_MenuJudgESC ;clear key judg
ajmp _MenuDisplayExit
_MenuJudgESC:
cjne r7,#KeyEsc,_MenuJudgNumber1 ;ESC key judg
mov r7,#KeyClear
ajmp _MenuDisplayExit
_MenuJudgNumber1:
cjne r7,#Key1,_MenuJudgKey1
_MenuJudgKey1:
jnc _MenuJudgNumber2
ljmp _MenuGetKeyLoop ;press invalid key loop again
_MenuJudgNumber2:
mov b,SubMenuNumber ;key upper limit
mov a,r7
cjne a,b,_MenuJudgKey2
_MenuJudgKey2:
jc _MenuDisplayExit
ljmp _MenuGetKeyLoop ;1<Key<(key upper limit) then key value valid
_MenuReverse:
mov b,NowFocus
lcall _MenuGetAddress ;reverse display now line
mov b,HistoryFocus
mov a,b ;copy B
cjne a,#NoKey,_MenuReverseHistory
ljmp _MenuGetKeyLoop ;loop untile presse valid key
_MenuReverseHistory:
lcall _MenuGetAddress ;reverse display history line
ljmp _MenuGetKeyLoop ;loop untile presse valid key
_MenuDisplayExit:
pop SubMenuNumber
pop MenuAddressL
pop MenuAddressH
pop Index
pop NowFocus
pop HistoryFocus
ret
;========================================================================;
_MenuBoundaryCheck:
mov a,NowFocus
cjne a,#0,_MenuUpBoundaryCheck
mov a,SubMenuNumber
add a,#0ffh ;NowFocus==SubMenuNumber-1
mov NowFocus,a ;SubMenuNumber=upper limit
_MenuUpBoundaryCheck:
mov a,SubMenuNumber
cjne a,NowFocus,_MenuBoundaryExit
mov NowFocus,#Key1 ;reload key1
_MenuBoundaryExit:
ret
;========================================================================;
;void Communication(void)
;-------------------------------;
;Description: CPU download program process
; IN: No
; OUT: No
; USE:
;-------------------------------;
Communication:
mov r7,#5
mov r5,#30
mov r3,#122
mov PublicVariable1,#100
mov PublicVariable2,#03h
lcall _DrawRectanglePro ;draw rectangle
mov b,#4
mov r5,#45 ;Y
mov r7,#40 ;X
mov dptr,#CommInf ;display communication
lcall DisplayString
mov b,#6
mov r5,#74 ;Y
mov r7,#28 ;X
mov dptr,#PressKeyInf ;press enter exit
lcall DisplayString
DownLoadLoop:
mov r6,#LOW(ExternTempBuffer)
mov r7,#HIGH(ExternTempBuffer)
lcall _ReceiveFramePro
cjne r7,#UserExitKey,CommPowerDetect
ret
CommPowerDetect:
cjne r7,#PowerLower,DownLoadContinue
mov dptr,#PowerLowerInf
ljmp InterruptShut ;power low shutdown system
DownLoadContinue:
cjne r7,#00h,DownReturnAnswer
mov FlashLatch,#Enable
mov dpl,r1
mov dph,r2
movx a,@dptr ;read in SEQ
mov b,a
inc dptr
movx a,@dptr ;read in TAG
inc dptr
inc dptr ;point to length 2
cjne a,#WRITE_FLASH,ReadFlashCheck
lcall CommWriteFlash
ljmp DownReturnAnswer
ReadFlashCheck:
cjne a,#READ_FLASH,SelfCheckJudg ;comp command
push acc
inc dptr
movx a,@dptr
inc dptr ;read in source address(MSB)
mov r2,a
movx a,@dptr
inc dptr ;read in source address(LSB)
mov r3,a
inc dptr ;skip length(MSB)
mov r4,#0 ;length(MSB)
movx a,@dptr
inc dptr ;length(LSB)
mov r5,a
movx a,@dptr
inc dptr ;attribute byte
clr c
rrc a
mov r7,a ;page
mov dptr,#ExternTempBuffer
mov a,b
movx @dptr,a ;save SEQ
inc dptr
pop acc
movx @dptr,a ;save TAG
inc dptr
clr a
movx @dptr,a ;save length(MSB)
inc dptr
mov a,r5
movx @dptr,a ;save length(LSB)
inc dptr
mov PublicVariable2,#HIGH(ExternTempBuffer+4)
mov PublicVariable3,#LOW(ExternTempBuffer+4)
lcall _ReadFlashToExterMemPro
ajmp DownLoadAnswer
DownReturnAnswer:
mov dptr,#(ExternTempBuffer+2)
mov a,#0
movx @dptr,a
inc dptr
mov a,#1
movx @dptr,a
inc dptr
mov a,r7 ;result
movx @dptr,a
ajmp DownLoadAnswer
SelfCheckJudg:
;Reserved ;reserved
mov r7,#NoDefineCommand ;no defined command
ajmp DownReturnAnswer
DownLoadAnswer:
mov r6,#HIGH(ExternTempBuffer)
mov r7,#LOW(ExternTempBuffer)
lcall _CombFramePro
ljmp DownLoadLoop
;========================================================================;
;void CommWriteFlash(void)
;-------------------------------;
;Description: Download program then write into FLASH
; IN: No
; OUT: R7==0 Success
; R7==0x13 Write error
; R7==0x14 Erase error
; USE: A,R4,R5,R6,(A,B,R1,R2,R3,R7,DPTR)
; Format: SEQ+TAG+LEN1+LEN2+Data+LRC
;-------------------------------;
CommWriteFlash:
movx a,@dptr ;read in LEN2
inc dptr
clr c
subb a,#3 ;subb write address and operation control byte
mov r5,a ;length(LSB)
mov R4,#0 ;length(MSB)
movx a,@dptr
inc dptr
mov PublicVariable2,a ;Destaddress(MSB)
movx a,@dptr ;read in LEN2
inc dptr
mov PublicVariable3,a ;Destaddress(LSB)
movx a,@dptr ;read in attribute byte
push acc
inc dptr
mov r3,dpl
mov r2,dph
anl a,#0eh
clr c
rrc a
mov r7,a ;page
mov FlashWriteEnable,FlashLatch
pop acc
jnb acc.0,CommWriteToFlash
mov r5,PublicVariable2
lcall _EraseBlockPro
ret
CommWriteToFlash:
lcall _ExternalWriteFlashPro
ret
;========================================================================;
;Description: Peripheral selfcheck(keyboard、LCD、RTC、SRAM、Buzzer、Encryptro)
; IN: No
; OUT: No
; USE:
;-------------------------------;
SelfCheck:
push Index
mov Index,#Key1
SelfCheckLoop:
mov a,Index ;now focus
mov b,#NoKey ;history focus
mov dptr,#SelfCheckMenu
lcall _DisplayWindow
mov Index,r7 ;save now focus
KeyBoardCheck:
cjne r7,#Key1,LCD_Check
lcall KeyBoardSelfCheck ;keyboard selfcheck
ljmp SelfCheckLoop
LCD_Check:
cjne r7,#Key2,Others
lcall LCD_SelfCheck ;LCD selfcheck
ljmp SelfCheckLoop
Others:
cjne r7,#Key3,ReturnCheck
lcall OthersCheck ;LCD selfcheck
ljmp SelfCheckLoop
ReturnCheck:
cjne r7,#KeyClear,SelfCheckLoop
pop Index
ret
;========================================================================;
;Description: Real time clock selfcheck
; IN: No
; OUT: R7==0 RTC ok
; ==1 RTC error
; USE:
;-------------------------------;
RTC_SelfCheck:
mov r7,#RTC_ReadStatus
mov r5,#TempBuffer
lcall _ReadRTclockPro ;read in status register
mov r7,#RTC_Read2
mov r5,#TempBuffer
lcall _ReadRTclockPro ;read hour,minute,second
mov p2,#ReleasePeripheral
mov r7,#30 ;1.5 seconds limited
push ie
mov ie,#82h ;EA=1,ET0=1
RTC_Delay:
mov th0,#04bh
mov tl0,#03ah ;50ms for 11.0592Mhz
setb tr0 ;start timer0
mov p0,#00h ;save power
mov pcon,IDLEvalue ;enter idle mode for key scan
djnz r7,RTC_Delay
pop ie
mov p2,#00h ;enable SRAM 256 bytes
mov r7,#RTC_Read2
mov r5,#(TempBuffer+3) ;read in real time from RTC
lcall _ReadRTclockPro ;read hour,minute,second
mov r0,#(TempBuffer+5) ;get from CPU
mov a,@r0
mov r6,a
mov r1,#(TempBuffer+2)
mov r7,#2
RTC_Check:
mov a,@r1
add a,#01h
da a
mov @r1,a
mov b,#60h
div ab ;second
mov a,b
cjne a,AR6,RTC_CheckAgain
mov r7,#0 ;check succes
ret
RTC_CheckAgain:
djnz r7,RTC_Check
mov r7,#1 ;checkerror
ret
;========================================================================;
;Description: Keyboard selfcheck
; IN: No
; OUT: No
; USE: R7,(A,)
;-------------------------------;
KeyBoardSelfCheck:
mov r7,#0 ;for exit flag
mov NowFocus,#NULL
mov HistoryFocus,#NULL
lcall DrawKeyBoard
push SubMenuNumber
mov SubMenuNumber,#0
KeyCheckLoop:
mov HistoryFocus,NowFocus
mov r6,#HIGH(AutoOffTime)
mov r7,#LOW(AutoOffTime) ;3 minute limited
mov r5,#1 ;buzzer enable
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -