?? ds1620.asm
字號:
;file : ds1620.asm
;date : 23 jun 2000
;read ds1620 reading display char to lcd
lf: equ 0ah
cr: equ 0dh
dout reg p1 ;port1
user_flag: equ 20h
period: equ 21h
second: equ 22h
minute: equ 23h
hour: equ 24h
cmd: equ 26h
temperatureh: equ 27h
temperaturel: equ 28h ;;;;;;;;;now reading
reading: equ 29h
buffer: equ 2ah
onesecondpass: equ 2bh
hi: equ 2ch
lo: equ 2dh
;{{{{{{{ for sbc31
cs1 reg p3.0
resetpin reg p3.1
lcda0 reg p3.2
wrpin reg p3.3
;}}}}}}}
ddq: reg p1.0
cclk: reg p1.1
rrst: reg p3.7
;{{{{{{{ for 89c2051
;cs1: reg p3.2
;resetpin: reg p3.3
;lcda0: reg p3.4
;wrpin: reg p3.5
;{{{{{{{ 89c2051 end
user: equ 00h
; lcd command
ccc: equ 30 ;contrast
disp_on equ 10101111b
adc_reverse equ 10100001b
lcd_bias0 equ 10100010b ;1/6 bias
reset_internal equ 11100010b
scan_dir1 equ 11001000b
powerctl equ 00101111b
evolcmd equ 10000001b
dispsl0 equ 01000000b ;display start line 0
pageaddr equ 10110000b
hcoladdr equ 00010000b
lcoladdr equ 00000000b
colume: equ 112
;;;;;;;;;;;;;;;;;;;
org user ; power on/reset vector
jmp on_reset
org user+0003h ; external interrupt 0 vector
reti ; undefined
org user+000bh ; timer 0 overflow vector
jmp ctc0_int_serv
org user+0013h ; external interrupt 1 vector
reti ; undefined
org user+001bh ; timer 1 overflow vector
jmp ctc0_int_serv
org user+0023h ; serial i/o interrupt vector
reti ; undefined
org user+30h
on_reset:
; initialize ctc 0 for time clock use 11.0592 mhz crystal
; 11.0592 mhz / 12 / 256 / 180 / = 20 hz
; crystal cyc tl0 th0 = interrupt rate
orl tmod,#00000001b ; set ctc 0 mode 1
mov tl0,#256-256 ; set low byte divide 256
mov th0,#256-180 ; set high byte divide 180
setb tr0 ; start ctc 0
; initialize ctc 1 for sio baud rate use 11.0592 mhz crystal
; 11.0592 mhz / 12 / 2 / 3 / 16 = 9600
; crystal cyc smod ctc 1 sio = baud rate
orl tmod,#00100000b ; set ctc mode 2 auto reload
; internal clock source
mov th1,#256-3 ; 3=9600 6=4800
mov tl1,#256-3 ; 12=2400 24=1200
setb tr1 ; start ctc 1
orl scon,#01010000b ; set sio mode 1, enable receive
setb et0 ;timer 0
setb ea ;enable all interrupt
mov period,#0
mov second,#0
mov hour,#0
mov minute,#0
mov hi,#00h
mov lo,#70
acall initialize
run: call main
jbc user_flag.0,second_pass
jmp run
second_pass: call send_time ; send out current time to host
jmp run
initialize: jmp init_lcd
lcd_data: setb lcda0
jmp pw2
lcd_com: clr lcda0
pw2: ;parallel_write
clr wrpin
clr cs1
mov dout,a ;output byte
nop
nop
setb cs1
setb wrpin
ret
gotoxy:
; set display pointers to x(r0),y(r1)
clr lcda0 ;command
mov a,r0
swap a
anl a,#00001111b;
orl a,#hcoladdr
acall pw2
mov a,r0
anl a,#00001111b ; form low column address
acall pw2
mov a, r1 ; r1=0..8
orl a, #b0h ;
acall pw2
ret
init_lcd: mov r3,#ccc
setb wrpin
setb cs1
clr resetpin
mov r0,#05h
nop
nop
nop
nop
nop
nop
setb resetpin
mov r0,#05h
nop
nop
nop
nop
nop
clr lcda0 ;command
mov dptr,#init_data
init_loop: clr a
movc a,@a+dptr
mov b,a
xrl a,#ffh
jz start_go
mov a,b
call pw2
inc dptr
jmp init_loop
start_go: call clr_ram
ret
init_data: db reset_internal
db dispsl0
db pageaddr
db hcoladdr
db lcoladdr
db lcd_bias0 ;1/6 bias
db adc_reverse
db scan_dir1
db powerctl
db evolcmd
db ccc
db disp_on
db ffh
clr_ram: mov r6,#08h
cr1: mov a, r6
orl a, #b0h
acall clr_page
djnz r6,cr1
mov a, #b0h
clr_page:
clr lcda0 ;command
acall pw2
mov a, #hcoladdr
acall pw2
mov a, #lcoladdr
acall pw2
setb lcda0 ;data
mov r7,#colume
clr a
cp1: acall pw2
djnz r7,cp1
ret
;print char to display
;input r3
mlcd_data: push dpl
push dph
mov dptr,#word_data
mov a,r3 ;asc=asc-20h
clr c
subb a,#20h
mov b,#06 ;asc=asc*5
mul ab
clr c ;dptr=dptr+asc
addc a,dpl
mov dpl,a
mov a,b
addc a,dph
mov dph,a
mov r2,#06h
setb lcda0
asc_conv1: clr a
movc a,@a+dptr
mov b,a
call pw2
inc dptr
djnz r2,asc_conv1
pop dph
pop dpl
ret
;*************************
;* *
;* text message tables *
;* for lcd *
;*************************
mlcd_text: push a
mov a, #hcoladdr
acall pw2
mov a, #lcoladdr
acall pw2
setb lcda0 ;data
mov r7,#00h
mlsend_text1: mov a,r7
movc a,@a+dptr
jz mlsend_text_ret ; end of text table
mov r3,a
call mlcd_data
inc r7
cjne r7,#00h,mlsend_text1
inc dph
jmp mlsend_text1
mlsend_text_ret:
pop a
ret
send_data: mov sbuf,a
jnb ti,$
clr ti
ret
;************************************************************************
;* *
;* subroutine : convert a hex number to corresponding ascii character *
;* and send it out. *
;* *
;************************************************************************
send_hex_asc: push a
swap a
call hex_asc
call send_data
pop a
push a
call hex_asc
call send_data
pop a
ret
;**********************************************************
;* *
;* subroutine : convert hex number to ascii characters. *
;* *
;* input : a = hex number in low nibble. *
;* *
;* output : a = corresponding ascii character. *
;* *
;**********************************************************
hex_asc: anl a,#00001111b
inc a
movc a,@a+pc
ret
db '0123456789ABCDEF0'
new_line: push a
mov a,#lf
call send_data
mov a,#cr
call send_data
pop a
ret
;*************************************
;* *
;* ctc 0 interrupt service routine *
;* *
;*************************************
ctc0_int_serv: push psw ; save program status word
push a ; save accumulator
push dph
push dpl
mov th0,#256-180 ; reload high byte of ctc 0
inc period ; increase period
mov a,period
xrl a,#24 ; compare period = 20
jnz ctc0_ret ; if not jmp return
mov period,#0 ; if yet clear it
setb user_flag.0 ; set flag for one second pass
mov a,second
add a,#1 ; second add 1
da a ; decimal adjust
mov second,a
xrl a,#60h ; compare second equ 60
jnz ctc0_ret ; if not jmp return
mov second,#0 ; if yet clear it
mov a,minute
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -