Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TASM source: display.inc
; display constants and routines for ES535
; Processor: 8051(80535?) on ES535 + DisplayTech 164A
;
; Hardware: 8000h display command port (memory mapped)
; 8001h display data write port (memory mapped)
; 8002h display status port (memory mapped)
; 8003h display data read port (memory mapped)
; Routines:
; ds_init Init display, clear, cursor home
; ret: A=0 no display, A=1 display ok
; ds_busy Wait until display not busy
; ds_clear clear display
; ds_cursor set cursor to A=lc (nibbles for line/column)
; ds_write display zero delimited string at DPTR
; ds_int display A as a dezimal integer
; ds_hex display A as a hexadezimal byte
;
; (c) 2003, M.Kuhn, aka "Schwabix"
DISP_CMD .EQU 8000h
DISP_WR .EQU 8001h
DISP_BSY .EQU 8002h
DISP_RD .EQU 8003h
ds_init push DPH
push DPL
acall ds_busy
mov DPTR,#DISP_CMD
mov A,#40H ; read CGRAM @0
movx @DPTR,A
acall ds_busy
mov DPTR,#DISP_RD
movx A,@DPTR
mov B,A
acall ds_busy
mov DPTR,#DISP_CMD
mov A,#4FH ; read CGRAM @F
movx @DPTR,A
acall ds_busy
mov DPTR,#DISP_RD
movx A,@DPTR
xrl A,B ; both equal?
jnz disp_ok
mov A,#0
sjmp di_exit
disp_ok acall ds_busy
mov DPTR,#DISP_CMD
mov A,#38H ; 8bit, 2lines, 5x7dots
movx @DPTR,A
acall ds_busy
; mov DPTR,#DISP_CMD
mov A,#06H ; inc, no shift
movx @DPTR,A
acall ds_busy
; mov DPTR,#DISP_CMD
mov A,#0CH ; lcd on, no cursor/blink
; mov A,#0FH ; lcd on, cursor/blink
movx @DPTR,A
acall ds_busy
; mov DPTR,#DISP_CMD
mov A,#01H ; clear
movx @DPTR,A
acall ds_busy
mov DPTR,#DISP_CMD
mov A,#80H ; cursor home
movx @DPTR,A
mov A,#1
di_exit pop DPL
pop DPH
ret
ds_busy push DPH
push DPL
db_1 mov DPTR,#DISP_BSY
movx A,@DPTR
jb ACC.7,db_1
pop DPL
pop DPH
ret
ds_clear push DPH
push DPL
acall ds_busy
mov DPTR,#DISP_CMD
mov A,#01H ; clear display
movx @DPTR,A
pop DPL
pop DPH
ret
; this is valid only for 4x16 displays
crs_tab .DB 80h, 0C0h, 90h, 0D0h
ds_curs push DPH
push DPL
push ACC
acall ds_busy
pop ACC
mov B,A
anl B,#0Fh
swap A
anl A,#0Fh
mov DPTR,#crs_tab
movc A,@A + DPTR
add A,B
mov DPTR,#DISP_CMD
movx @DPTR,A
pop DPL
pop DPH
ret
ds_write mov R0,DPL
mov R1,DPH
dw_1 acall ds_busy
mov DPL,R0
mov DPH,R1
mov A,#00
movc A,@A + DPTR
jz dw_exit
inc DPTR
mov R0,DPL
mov R1,DPH
mov DPTR,#DISP_WR
movx @DPTR,A
sjmp dw_1
dw_exit ret
ds_int push DPH
push DPL
mov R0,A
di_1 acall ds_busy
mov A,R0
mov B,#100
div AB
mov R0,B
jnz di_2
mov A,R0
mov B,#10
div AB
mov R0,B
jnz di_3
sjmp di_4
di_2 orl A,#30h
mov DPTR,#DISP_WR
movx @DPTR,A
acall ds_busy
mov A,R0
mov B,#10
div AB
mov R0,B
di_3 orl A,#30h
mov DPTR,#DISP_WR
movx @DPTR,A
di_4 acall ds_busy
mov A,R0
orl A,#30h
mov DPTR,#DISP_WR
movx @DPTR,A
di_exi1 pop DPL
pop DPH
ret
ds_0int push DPH
push DPL
mov R0,A
d0i_1 acall ds_busy
mov A,R0
mov B,#100
div AB
mov R0,B
jnz d0i_2
mov A,R0
mov B,#10
div AB
mov R0,B
sjmp d0i_3
d0i_2 orl A,#30h
mov DPTR,#DISP_WR
movx @DPTR,A
acall ds_busy
mov A,R0
mov B,#10
div AB
d0i_3 mov R0,B
orl A,#30h
mov DPTR,#DISP_WR
movx @DPTR,A
acall ds_busy
mov A,R0
orl A,#30h
mov DPTR,#DISP_WR
movx @DPTR,A
pop DPL
pop DPH
ret
ds_hex push DPH
push DPL
mov R0,A
acall ds_busy
mov A,R0
swap A
anl A,#0Fh
acall make_dig
mov DPTR,#DISP_WR
movx @DPTR,A
acall ds_busy
mov A,R0
anl A,#0Fh
acall make_dig
mov DPTR,#DISP_WR
movx @DPTR,A
pop DPL
pop DPH
ret
make_dig orl A,#30h
mov B,A
setb C
subb A,#39h
mov A,B
jc lt9
add A,#'A'-'9'-1
lt9 ret
.end
Das gehört zu meinen ersten 8051-Routinen überhaupt ... =:-O
Lesezeichen