📄 ci910flash.asm.svn-base
字号:
mov a,sp
clr c
subb a,#13 ;buffer lenght
mov sp,a ;restore stack pointer
pop DataPointer2
pop DataPointer1
ret
;========================================================================;
DisplayAddCal1:
mov dptr,#LCD_LineTable1
mov a,r5 ;Y1
mov b,#8
div ab
mov PageReg1,a ;Y1/8
mov a,b
movc a,@a+dptr
mov HideReg1,a
mov a,PublicVariable1 ;Y2
inc a ;zdhy 用于避免Y=0和Y=8时造成少一个点的错误
cjne a,#128,CalJudgY21
CalJudgY21:
jc CalY2NoAdjust1 ;>128?
mov a,#127
CalY2NoAdjust1:
mov dptr,#LCD_LineTable2
mov b,#8
div ab
mov PageReg2,a ;Y2/8
mov a,b
movc a,@a+dptr
mov HideReg2,a
ret
;========================================================================;
DisplayAddCal:
mov dptr,#LCD_LineTable1
mov a,r5 ;Y1
mov b,#8
div ab
mov PageReg1,a ;Y1/8
mov a,b
movc a,@a+dptr
mov HideReg1,a
mov a,PublicVariable1 ;Y2
inc a ;zdhx for Y2==0 and Y2==8 error
cjne a,#128,CalJudgY2
CalJudgY2:
jc CalY2NoAdjust ;>128?
mov a,#127
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
;========================================================================;
DisplayConfig:
mov AddressRegL,#00h
mov AddressRegH,#00h ;external library address
mov a,PublicVariable2
jnb acc.2,NormalDispaly
xrl PublicVariable2,#03h ;reversal display color
NormalDispaly:
swap a
anl a,#0fh
mov CharInterval,a ;dispaly character interval
mov a,PublicVariable2
anl a,#03h
clr c
rlc a ;*2
mov b,a
mov dptr,#ColorGroundTab
movc a,@a+dptr
mov r3,a ;foregroud color1
mov a,b
inc a
movc a,@a+dptr
mov PublicVariable2,a ;foregroud color2
cjne r7,#0ffh,DisplayGetY ;r7==0xff x display center
mov a,r4 ;r4==column number of one character
add a,CharInterval
mov b,a
mov a,PublicVariable1 ;PublicVariable1==length
mul ab
clr c
subb a,CharInterval
clr c
rrc a ;(128-x)/2
mov b,a
mov a,#64
clr c
subb a,b ;64-x/2
mov r7,a
DisplayGetY:
mov a,PublicVariable3
swap a
anl a,#03h
clr c
rlc a ;*2
mov b,a
mov dptr,#ColorGroundTab
movc a,@a+dptr
mov BackgroundColor1,a ;get background color1
mov a,b
inc a
movc a,@a+dptr
mov BackgroundColor2,a ;get background color2
clr TempBit3 ;no use background color
mov a,PublicVariable3
jnb acc.6,DisplayGetYProcess
setb TempBit3 ;use background color
DisplayGetYProcess:
mov b,#4
DisplayAddress2Get:
cjne r5,#0ffh,DisplayNoCenter
mov a,#64 ;Y==(128-Y)/2
clr c
subb a,b
mov r5,a ;get Y1
add a,b
add a,b ;get Y2
ljmp DisplayCalAddress
DisplayNoCenter:
mov a,b
add a,b
add a,r5 ;get Y2
DisplayCalAddress:
push PublicVariable1
dec a ;for inc 1 in DisplayAddCal zdhx
mov PublicVariable1,a ;PublicVariable1==Y2
lcall DisplayAddCal
pop PublicVariable1
mov HideReg1Copy,HideReg1 ;copy HideReg1
mov a,PageReg1
add a,#0b0h
mov DispPageCopy,a ;copy page address
ret
;========================================================================;
SetLCDAddress:
mov dptr,#LCD_CommandPort
mov a,PageReg1
anl a,#0fh
orl a,#0b0h
movx @dptr,a ;write page address
SetLCD_X_Address:
mov a,r7 ;X1
anl a,#0fh
movx @dptr,a ;write column address LSB
mov a,r7
anl a,#070h
swap a
orl a,#10h
movx @dptr,a ;write column address MSB
mov dptr,#LCD_DataPort
ret
;========================================================================;
;Description: write display data to LCD
; In: R0
; Out: No
; Use: A,B,R0,R2,R3,R4,DPTR
;-------------------------------;
WriteDisplayData:
push AR4
push BackgroundColor1
push BackgroundColor2
mov r2,LengthX ;r2==ColumnNum/2
jb TempBit3,WriteDisplayGetColor
mov HideReg1,#0ffh
WriteDisplayGetColor:
mov a,HideReg1
cpl a
anl BackgroundColor1,a
anl BackgroundColor2,a
WriteDisplayLoop:
movx a,@dptr ;dumy read
movx a,@dptr ;read in data 1
anl a,HideReg1
orl a,BackgroundColor1
mov r4,a
mov a,@r0
mov b,a
anl a,r3 ;r3=foreground color 1
xch a,b
cpl a
anl a,r4
orl a,b
movx @dptr,a ;write new data1
movx a,@dptr ;dumy read
movx a,@dptr ;read in data 2
anl a,HideReg1
orl a,BackgroundColor2
mov r4,a
mov a,@r0
mov b,a
anl a,PublicVariable2 ;BackgroundColor2=foreground color2
xch a,b
cpl a
anl a,r4
orl a,b
movx @dptr,a ;write new data2
inc r0
djnz r2,WriteDisplayLoop
pop BackgroundColor2
pop BackgroundColor1
pop AR4
ret
;========================================================================;
;void BMPDisplay(uchar X,uchar Y,ucharx *PPointer);
;-------------------------------;
;Description: Display BMP on LCD,The BMP file compose format (Width+Height+DATA)
; IN: R7==X
; R5==Y
; R2==PPointer(MSB)
; R3==PPointer(LSB)
; OUT: No
; USE: A,B,R0,R1,R2,R3,R4,R5,R5,R7,DPTR,(A,B,R0,R1,R2,R4,R6,DPTR)
;-------------------------------;
_BMPDisplay:
mov AR1,r3
lcall EnterModifyReadMode ;LCD enter modify-read mode
push DataPointer1
push DataPointer2
mov a,sp
inc a
mov DataPointer1,a ;buffer 1
add a,#16
mov DataPointer2,a ;buffer 2
add a,#16
mov sp,a
push AddressRegL
push AddressRegH
push CharInterval
push PageReg1
push PageReg2
push HideReg1
push HideReg2
push LengthX
push HideReg1Copy
push DispPageCopy
lcall StoreBmpHead ;store width and height of BMP
push acc
add a,r5
dec a
mov PublicVariable1,a ;PublicVariable1==Y2
lcall DisplayAddCal
pop acc
add a,#7
mov b,#8
div ab
mov b,a
mov a,PageReg2
clr c
subb a,PageReg1 ;Y2/8-Y1/8+1
inc a
mov PageReg2,a ;Y loop counter
setb psw.5
cjne a,b,GetPageAdd
clr psw.5
GetPageAdd:
mov a,PageReg1
add a,#0b0h
mov PageReg1,a ;page
mov a,LengthX
mov b,#16
div ab
inc a
mov LengthX,a ;LengthX==width/16
mov PublicVariable2,b ;PublicVariable2==(X2-X1)%16
mov DispPageCopy,PageReg1 ;copy page
mov HideReg1Copy,HideReg1
mov CharInterval,PageReg2 ;copy Y loop counter
mov a,HideReg1
inc a
mov r6,a ;shift control register
_BMPDisplayX_Loop:
mov r5,#0 ;for display control(line1(0),line2--linen(1),lineEnd(2))
mov PageReg1,DispPageCopy ;restore page
mov HideReg1,HideReg1Copy ;restore HideReg1
mov PageReg2,CharInterval ;restore Y loop counter
mov r4,#16
mov a,LengthX
cjne a,#1,_BMPDisplayY_Loop
mov r4,PublicVariable2
cjne r4,#00h,_BMPDisplayY_Loop
ljmp _BMP_DisplayExit
_BMPDisplayY_Loop:
lcall SetLCDAddress ;set display address
mov a,PageReg2
cjne a,#1,_BMP_NoEnd
mov HideReg1,HideReg2
mov r5,#2
mov a,CharInterval
cjne a,#1,_BMP_NoEnd
mov r5,#1
_BMP_NoEnd:
lcall BMP_Read
lcall BMP_Write
mov r5,#1
inc PageReg1 ;page increment
mov HideReg1,#00h
djnz PageReg2,_BMPDisplayY_Loop
mov a,r4
clr c
rrc a
mov r4,a
mov a,r7
add a,r4
mov r7,a
djnz LengthX,_BMPDisplayX_Loop
_BMP_DisplayExit:
lcall ResetModifyReadMode
pop DispPageCopy
pop HideReg1Copy
pop LengthX
pop HideReg2
pop HideReg1
pop PageReg2
pop PageReg1
pop CharInterval
pop AddressRegH
pop AddressRegL
mov a,sp
clr c
subb a,#32
dec a
mov sp,a
pop DataPointer2
pop DataPointer1
ret
;========================================================================;
;void SaveWindow(uchar X1,uchar Y1,ucharx *BufferPointer);
;-------------------------------;
;Description: Read specified area on LCD into internal RAM
; IN: R2==BufferPointer(MSB)
; R3==BufferPointer(LSB)
; R7==X1
; R5==Y1
; PublicVariable1==X2
; PublicVariable2==Y2
; OUT: No
; USE: A,B,R1,R2,R3,R4,R5,R7,DPTR
;-------------------------------;
_SaveWindow:
push DataPointer1
mov a,sp
inc a
mov DataPointer1,a
add a,#32
mov sp,a
mov a,PublicVariable1
cjne a,#128,SaveWindowX2Judg
SaveWindowX2Judg:
jc SaveWindowX2OK
mov PublicVariable1,#127
SaveWindowX2OK:
push PageReg1
push PageReg2
push HideReg1
push HideReg2
push LengthX
mov dph,r2
mov dpl,r3
mov a,r7
movx @dptr,a ;write X1
inc dptr
mov a,r5
movx @dptr,a ;write Y1
inc dptr
mov a,PublicVariable1
movx @dptr,a ;write X2
inc dptr
mov a,PublicVariable2
movx @dptr,a ;write Y2
inc dptr
mov r2,dph
mov r3,dpl
lcall GenerateCounter
lcall DisplayAddCal1 ;zdhy
lcall Calculate
jnb psw.5,SaveJudg
mov a,HideReg2
orl a,HideReg1
cpl a ;in same page
mov HideReg1,a
ajmp _ReadWindowNoEnd
SaveJudg:
mov a,PageReg2
cjne a,#16,SaveWindowYJudg
SaveWindowYJudg:
jc SaveWindowYOK
mov PageReg2,#16
SaveWindowYOK:
xrl HideReg1,#0ffh ;hide control
xrl HideReg2,#0ffh
_ReadWindowLoopY:
mov a,PageReg2
cjne a,#1,_ReadWindowNoEnd
mov HideReg1,HideReg2 ;end line
_ReadWindowNoEnd:
mov r4,LengthX
lcall SetLCDAddress ;set display address
movx a,@dptr ;dumy read,warning!! "must read previous"
_ReadWindowLoopX:
mov dptr,#LCD_DataPort
mov r1,DataPointer1 ;temp buffer
mov r5,#32
cjne r4,#1,_ReadWindowProIni
cjne r5,#00h,_ReadWindowCon
ljmp _WriteWindowExit
_ReadWindowCon:
mov r5,PublicVariable2
_ReadWindowProIni:
push AR5
_ReadWindowPro:
movx a,@dptr ;read in data
mov @r1,a
inc r1
djnz r5,_ReadWindowPro
mov r1,DataPointer1 ;temp buffer
pop AR5
mov dph,r2
mov dpl,r3
_WriteWindowData:
mov a,@r1
anl a,HideReg1
movx @dptr,a
inc r1
inc dptr
djnz r5,_WriteWindowData
mov r2,dph
mov r3,dpl
djnz r4,_ReadWindowLoopX
inc PageReg1
mov HideReg1,#0ffh
djnz PageReg2,_ReadWindowLoopY
_WriteWindowExit:
pop LengthX
pop HideReg2
pop HideReg1
pop PageReg2
pop PageReg1
mov a,sp
clr c
subb a,#33
mov sp,a
pop DataPointer1
ret
;========================================================================;
;void RestoreWindow(uchar *BufferPointer);
;-------------------------------;
;Description: Restore RAM content onto LCD
; IN: R6==BufferPointer(MSB)
; R7==BufferPointer(LSB)
; OUT: No
; USE: A,B,R1,R2,R3,R4,R5,R7,DPTR
;-------------------------------;
_RestoreWindow:
mov AR2,r6 ;copy pointer
mov AR3,r7
push DataPointer1
mov a,sp
inc a
mov DataPointer1,a ;temp buffer
add a,#32
mov sp,a
push PageReg1
push PageReg2
push HideReg1
push HideReg2
push LengthX
lcall EnterModifyReadMode ;LCD enter modify-read mode
mov dpl,r3
mov dph,r2
movx a,@dptr
mov r7,a ;X1
inc dptr
movx a,@dptr
mov r5,a ;Y1
inc dptr
movx a,@dptr
mov PublicVariable1,a ;X2
inc dptr
movx a,@dptr
mov PublicVariable2,a ;Y2
inc dptr
mov r3,dpl
mov r2,dph
lcall GenerateCounter
lcall DisplayAddCal1 ;zdhy
lcall Calculate
jnb psw.5,_RestoreWindowLoopY
mov a,HideReg2
orl a,HideReg1
cpl a ;in same page
mov HideReg1,a
ajmp _RestoreWindowNoEnd
_RestoreWindowLoopY:
mov a,PageReg2
cjne a,#1,_RestoreWindowNoEnd
mov HideReg1,HideReg2
_RestoreWindowNoEnd:
lcall SetLCDAddress ;set display address
mov r4,LengthX
_RestoreWindowLoopX:
mov r1,DataPointer1 ;temp buffer
mov r5,#32
cjne r4,#1,_RestoreReadIni
mov r5,PublicVariable2
_RestoreReadIni:
push AR5
mov dpl,r3
mov dph,r2
_RestoreReadLoop:
movx a,@dptr
mov @r1,a
inc r1
inc dptr
djnz r5,_RestoreReadLoop
mov r3,dpl
mov r2,dph
pop AR5
mov dptr,#LCD_DataPort
mov r1,DataPointer1 ;temp buffer
_RestoreLcdLoop:
movx a,@dptr ;dumy read
movx a,@dptr
anl a,HideReg1
orl a,@r1
movx @dptr,a
inc r1
djnz r5,_RestoreLcdLoop
djnz r4,_RestoreWindowLoopX
inc PageReg1
mov HideReg1,#0
djnz PageReg2,_RestoreWindowLoopY
pop LengthX
pop HideReg2
pop HideReg1
pop PageReg2
pop PageReg1
lcall ResetModifyReadMode
mov a,sp
clr c
subb a,#33
mov sp,a
pop DataPointer1
ret
;========================================================================;
Calculate:
mov a,PageReg2
clr c
subb a,PageReg1
clr psw.5 ;in same page flag
jnz NoInSamePage
setb psw.5 ;psw.5==1,in same page
NoInSamePage:
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
push acc
inc a
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
cjne a,#16,DeltaXOKJudg
DeltaXOKJudg:
jc DeltaXOK
mov a,#16
DeltaXOK:
mov LengthX,a ;LengthX==(X2-X1+1)/16+1
pop acc
clr c
subb a,r7
mov b,#16
div ab
mov a,b
clr c
inc a
rlc a
mov PublicVariable2,a ;PublicVariable2==((X2-X1+1)%16)*2
ret
;========================================================================;
LCD_PixelTable:
DB 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh
LCD_LineTable1:
DB 00h,01h,03h,07h,0fh,1fh,3fh,7fh,0ffh
LCD_LineTable2:
DB 0feh,0fch,0f8h,0f0h,0e0h,0c0h,080h,000h
;========================================================================;
ColorGroundTab:
DB 000h,000h ;white
DB 000h,0ffh ;light gray
DB 0ffh,000h ;dark grak
DB 0ffh,0ffh ;black
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -