📄 disp.as
字号:
; ---------------------------------------------------------------------------------------
; - Suported library for LCD graphic display EL12864A. This is fast way to paint image -
; - and write our text to graphic display. Use application Image Converter for convert -
; - image in *.BMP format to three code compress array type (None, Zero, Full). -
; - -
; - You can download Image Converter V1.1 from www.imfsoft.com -
; - -
; ---------------------------------------------------------------------------------------
PUBLIC DISP_ROW,DISP_COL
PUBLIC DISP_CLEAR,DISP_ON,DISP_OFF,DISP_INIT
PUBLIC DISP_ICON,DISP_TEXT,DISP_WRITE
EXTRN BIT(RS,E,CS1,CS2,RESET)
EXTRN NUMBER(M)
Time_Delay EQU 40 ; Time delay +-40us (AT89C51 12MHz)
mdata SEGMENT DATA
rseg mdata
DISP_ROW: DS 1 ; Position in ROW <0..7>
DISP_COL: DS 1 ; Position in COLUMN <0..63>
DISP_ACT: DS 1 ; Actualy position in COLUMN
mprog SEGMENT CODE
rseg mprog
; ****************************************
; Routines for graphic display
; ****************************************
; ----------------------------------------
; Inicialization routine
; ----------------------------------------
DISP_INIT:
CLR RESET
CLR CS1
CLR CS2
CLR RS
SETB RESET
CALL DISP_OFF
CALL DISP_ON
CALL DISP_CLEAR
RET
; ----------------------------------------
; Routine for writing text in ASCII code at screen
; In: R0 ........ Pointer to Array with text
; A ......... Length text
; B ......... Height text <0..1>
; DISP_ROW .. Position in ROW <0..7>
; DISP_COL .. Position in COLUMN <0..63>
; -----------------------------------------
DISP_TEXT:
PUSH DISP_ROW
PUSH M
PUSH M+1
PUSH M+2
PUSH B
PUSH Acc
PUSH PSW ; Uses bit F0 from PSW (users programable)
MOV M,A ; Save length text
ANL B,#1 ; Reduce height at 1
MOV M+1,B ; Save height text
INC M+1
MOV A,B ; F0 is PSW.5 bit (users programable)
MOV C,Acc.0 ; F0=Log0 -> Small Text
MOV F0,C ; F0=Log1 -> Large Text
DISP_T1:
MOV DISP_ACT,DISP_COL
MOV M+2,R0 ; Save Pointer to text Array @R0
PUSH M ; Save length text only for Large Text
DISP_T2:
CLR C
MOV DPTR,#TabASCII
MOV A,@R0
SUBB A,#32 ; Subb Offset first character ASCII code
MOV B,#6
MUL AB
PUSH Acc
MOV A,DPH
ADD A,B ; Add overflow multiply A*6 to DPH
MOV DPH,A
POP Acc
MOV B,#6 ; Width one character in pixels
DISP_T3:
PUSH Acc ; Cycle one character
MOVC A,@A+DPTR
JNB F0,DISP_T5 ; It's Small or Large character
; ------
PUSH M+1 ; Program Code for Large Character
DISP_T4:
SWAP A ; Select High or Low Nibble
DJNZ M+1,DISP_T4
POP M+1
CALL DISP_ZOOM ; Convert Low Nibble to Byte
CALL DISP_DATA ; Send Byte to display
; ------
DISP_T5:
CALL DISP_DATA ; Send Byte to display
INC DPTR
POP Acc
DJNZ B,DISP_T3
INC R0
DJNZ M,DISP_T2
POP M ; Get text length
MOV R0,M+2 ; Get pointer at first character in text array
INC DISP_ROW ; Set Next Row
DJNZ M+1,DISP_T1 ; Repeat only for Large text
POP PSW
POP Acc
POP B
POP M+2
POP M+1
POP M
POP DISP_ROW
RET
; ----------------------------------
; Convert Low Nibble to Byte
; In: Nibble(Acc)
; Out: Byte(Acc)
; ----------------------------------
DISP_ZOOM:
MOV C,Acc.3
MOV Acc.7,C
MOV Acc.6,C
MOV C,Acc.2
MOV Acc.5,C
MOV Acc.4,C
MOV C,Acc.1
MOV Acc.3,C
MOV Acc.2,C
MOV C,Acc.0
MOV Acc.1,C
MOV Acc.0,C
RET
; ----------------------------------------
; Routine for paint commpress Image
; In: DPTR ...... Adress tab with Image
; DISP_ROW .. Position in ROW <0..7>
; DISP_COL .. Position in COLUMN <0..63>
; -----------------------------------------
DISP_ICON:
PUSH Acc
PUSH M
PUSH M+1
PUSH M+2
PUSH M+3
PUSH B
CLR A
MOVC A,@A+DPTR
MOV M,A ; Get Count Row
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV M+1,A ; Get Count Column
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV M+2,#0
INC DPTR
JZ DISP_RY0 ; Type of Compress 0
DEC A
JZ DISP_RY1 ; Type of Compress 1
DEC A
JZ DISP_RY2 ; Type of Compress 2
DISP_IRET:
POP B
POP M+3
POP M+2
POP M+1
POP M
POP Acc
RET
; ----------------------------------
; Decode IMAGE in Compress 0 (NONE)
; ----------------------------------
DISP_RY0:
MOV DISP_ACT,DISP_COL
MOV B,M+1
DISP_RX0:
CLR A
MOVC A,@A+DPTR
CALL DISP_DATA
INC DPTR
DJNZ B,DISP_RX0
INC DISP_ROW ; Next Row
DJNZ M,DISP_RY0
JMP DISP_IRET
; ----------------------------------
; Decode IMAGE in Compress 1 (ZERO)
; ----------------------------------
DISP_RY1:
MOV DISP_ACT,DISP_COL
MOV B,M+1
DISP_RX1:
MOV A,M+2
JNZ DISP_RP1
CLR A
MOVC A,@A+DPTR
CALL DISP_DATA
INC DPTR
JNZ DISP_RZ1
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV M+2,A
DEC M+2
JMP DISP_RZ1
DISP_RP1:
DEC M+2
CLR A
CALL DISP_DATA
DISP_RZ1:
DJNZ B,DISP_RX1
INC DISP_ROW ; Next Row
DJNZ M,DISP_RY1
JMP DISP_IRET
; ----------------------------------
; Decode IMAGE in Compress 2 (FULL)
; ----------------------------------
DISP_RY2:
MOV DISP_ACT,DISP_COL
MOV B,M+1
DISP_RX2:
MOV A,M+2
JNZ DISP_RP2
CLR A
MOVC A,@A+DPTR
MOV M+3,A
CALL DISP_DATA
INC DPTR
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV M+2,A
DEC M+2
JMP DISP_RZ2
DISP_RP2:
DEC M+2
MOV A,M+3
CALL DISP_DATA
DISP_RZ2:
DJNZ B,DISP_RX2
INC DISP_ROW ; Next Row
DJNZ M,DISP_RY2
JMP DISP_IRET
; ------------------------------------
; Select direct control and send Byte to display
; In: A ... Byte to write
; DISP_ROW .. Position in ROW <0..7>
; DISP_COL .. Position in COLUMN <0..63>
; ------------------------------------
DISP_DATA:
PUSH Acc
MOV A,DISP_ACT
CJNE A,#64,DISP_POR
DISP_POR:
JC DISP_RAD1
CLR CS1
SETB CS2 ; Select control 2
JMP DISP_RAD2
DISP_RAD1:
SETB CS1 ; Select control 1
CLR CS2
DISP_RAD2:
CJNE A,DISP_COL,DISP_NE
JMP DISP_SET
DISP_NE:
CJNE A,#64,DISP_N1
DISP_SET:
MOV A,DISP_ROW
CALL DISP_ADR_X
MOV A,DISP_ACT ; Actual Column
ANL A,#00111111B ; Reduce at 64
CALL DISP_ADR_Y
DISP_N1:
POP Acc
CALL DISP_WRITE ; Send Byte
INC DISP_ACT ; Increase actual column
CLR CS1
CLR CS1
RET
; ------------------------------------
; Write Byte to Display
; In: A ... Byte to Write
; ------------------------------------
DISP_WRITE:
PUSH Acc
MOV P0,A
SETB E
CLR E
MOV A,#Time_Delay
DJNZ Acc,$
POP Acc
RET
; ---------------------------------------
DISP_ADR_X: ; Set Row <0..7>
CLR RS
ANL A,#00000111B
ORL A,#10111000B
CALL DISP_WRITE
SETB RS
RET
; ----------------------------------------
DISP_ADR_Y: ; Set Column <0..63>
CLR RS
ANL A,#00111111B
ORL A,#01000000B
CALL DISP_WRITE
SETB RS
RET
; ----------------------------------------
DISP_ADR_Z:
CLR RS
ANL A,#00111111B
ORL A,#11000000B
CALL DISP_WRITE
SETB RS
RET
; --------------------------------------
DISP_ON: ; Display ON
SETB CS1
SETB CS2
CLR RS
MOV A,#00111111B
CALL DISP_WRITE
SETB RS
CLR CS1
CLR CS2
RET
; --------------------------------------
DISP_OFF: ; Display OFF
SETB CS1
SETB CS2
CLR RS
MOV A,#00111110B
CALL DISP_WRITE
SETB RS
CLR CS1
CLR CS2
RET
; --------------------------------------------
; Display Clear
; --------------------------------------------
DISP_CLEAR:
PUSH Acc
PUSH M
PUSH M+1
PUSH B
SETB CS1
SETB CS2
MOV M,#8
MOV M+1,#64
DISP_CY:
MOV A,M
DEC A
CALL DISP_ADR_X
CLR A
CALL DISP_ADR_Y
MOV B,M+1
DISP_CX:
CLR A
CALL DISP_WRITE
DJNZ B,DISP_CX
DJNZ M,DISP_CY
CLR CS1
CLR CS2
POP B
POP M+1
POP M
POP Acc
RET
; ---------------------------------------
; Tab ASCII char
; ---------------------------------------
TabASCII:
DB 000H,000H,000H,000H,000H,000H,000H,05FH,000H,000H,000H,000H,000H,007H,000H,007H
DB 000H,000H,014H,07FH,014H,07FH,014H,000H,026H,049H,07FH,049H,032H,000H,043H,033H
DB 008H,066H,061H,000H,036H,049H,055H,022H,050H,000H,000H,005H,003H,000H,000H,000H
DB 000H,03EH,041H,000H,000H,000H,000H,041H,03EH,000H,000H,000H,014H,008H,03EH,008H
DB 014H,000H,008H,008H,03EH,008H,008H,000H,000H,0A0H,060H,000H,000H,000H,010H,010H
DB 010H,010H,010H,000H,000H,060H,060H,000H,000H,000H,000H,060H,01CH,003H,000H,000H
DB 03EH,041H,041H,041H,03EH,000H,000H,041H,07FH,040H,000H,000H,042H,061H,051H,049H
DB 066H,000H,022H,041H,049H,049H,036H,000H,018H,014H,012H,07FH,010H,000H,046H,045H
DB 045H,049H,031H,000H,03CH,04AH,049H,049H,031H,000H,002H,001H,061H,019H,007H,000H
DB 036H,049H,049H,049H,036H,000H,046H,049H,049H,029H,01EH,000H,000H,036H,036H,000H
DB 000H,000H,000H,056H,036H,000H,000H,000H,008H,014H,014H,014H,022H,000H,014H,014H
DB 014H,014H,014H,000H,022H,014H,014H,014H,008H,000H,002H,051H,009H,006H,000H,000H
DB 034H,052H,052H,042H,03CH,000H,060H,01CH,013H,01CH,060H,000H,07FH,049H,049H,049H
DB 036H,000H,03EH,041H,041H,041H,022H,000H,07FH,041H,041H,022H,01CH,000H,07FH,049H
DB 049H,049H,041H,000H,07FH,009H,009H,009H,001H,000H,03EH,041H,049H,049H,03AH,000H
DB 07FH,008H,008H,008H,07FH,000H,000H,000H,07FH,000H,000H,000H,030H,040H,040H,03FH
DB 000H,000H,07FH,018H,014H,022H,041H,000H,07FH,040H,040H,040H,000H,000H,07FH,00CH
DB 018H,00CH,07FH,000H,07FH,006H,008H,030H,07FH,000H,03EH,041H,041H,041H,03EH,000H
DB 07FH,009H,009H,009H,006H,000H,03EH,041H,051H,021H,05EH,000H,07FH,009H,009H,009H
DB 076H,000H,026H,049H,049H,049H,032H,000H,001H,001H,07FH,001H,001H,000H,03FH,040H
DB 040H,040H,03FH,000H,00FH,010H,060H,010H,00FH,000H,01FH,060H,018H,060H,01FH,000H
DB 063H,014H,008H,014H,063H,000H,003H,004H,078H,004H,003H,000H,061H,051H,049H,045H
DB 043H,000H,000H,07FH,041H,000H,000H,000H,015H,016H,07CH,016H,015H,000H,000H,041H
DB 07FH,000H,000H,000H,004H,002H,001H,002H,004H,000H,040H,040H,040H,040H,040H,000H
DB 000H,001H,002H,004H,000H,000H,020H,054H,054H,054H,078H,000H,07FH,044H,044H,044H
DB 038H,000H,038H,044H,044H,044H,028H,000H,038H,044H,044H,044H,07FH,000H,038H,054H
DB 054H,054H,018H,000H,07EH,005H,005H,001H,000H,000H,098H,0A4H,0A4H,0A4H,07CH,000H
DB 07FH,008H,008H,008H,070H,000H,000H,07DH,000H,000H,000H,000H,040H,03FH,000H,000H
DB 000H,000H,000H,07FH,008H,014H,022H,040H,000H,000H,03FH,040H,000H,000H,07CH,004H
DB 078H,004H,078H,000H,07CH,008H,004H,004H,078H,000H,038H,044H,044H,044H,038H,000H
DB 0FEH,012H,012H,012H,00CH,000H,00CH,012H,012H,012H,0FEH,000H,07EH,004H,002H,002H
DB 000H,000H,024H,04AH,052H,024H,000H,000H,004H,03FH,044H,040H,000H,000H,03CH,040H
DB 040H,020H,07CH,000H,00CH,010H,060H,010H,00CH,000H,01CH,060H,01CH,060H,01CH,000H
DB 06CH,010H,010H,06CH,000H,000H,05CH,050H,070H,01CH,000H,000H,064H,054H,054H,04CH
DB 000H,000H,000H,008H,036H,041H,000H,000H,000H,000H,07FH,000H,000H,000H,000H,041H
DB 036H,008H,000H,000H,008H,008H,02AH,01CH,008H,000H,008H,01CH,02AH,008H,008H,000H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -