⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1620.asm

📁 DS1620/display for 8051
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;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 + -