📄 dac8512.asm
字号:
;Writed by LinXiwei,on 2006.06.15
;*******ZLG7289 PARAMETERS*******
ZLG_BIT_CNT EQU 30H ;The number of data sended
ZLG_REC_BUF EQU 31H ;The buffer of data sended
ZLG_SEND_BUF EQU 32H ;The buffer of data received
DAC_NUMBER EQU 3FH ;The nuber to D/A
ZLG_HUNDRED EQU 40H ;The digit of hundred
ZLG_DECIMAL EQU 41H ;The digit of decimal
ZLG_ONE EQu 42H ;The digit of one
ZLG_CS EQU P1.0 ;/CS of ZLG7289
ZLG_CLK EQU P1.1 ;CLK of ZLG7289
ZLG_DATA EQU P1.2 ;DIO of ZLG7289
ZLG_KEY EQU P1.3 ;/KEY of ZLG7289
DAC8512_DATA EQU P0.4 ;SCLK of DAC8512
DAC8512_SCLK EQU P0.5 ;/CS of DAC8512
DAC8512_LD EQU P0.6 ;LD OF DAC8512
DAC8512_CS EQU P0.7 ;DOUT of DAC8512
;*******DELAY PARAMETERS*******
VAR_DELAY EQU 71H ;The variable for delay function
VAR_DELAY_2 EQU 72H ;The variable for delay function
;*****************************************************************
org 0000H
ljmp MAIN
;*****************************************************************
org 0030H
MAIN:
lcall sys_initialize
lcall func_display
lcall DASUB ;Start D/A change
MAIN_LOOP:
jb ZLG_KEY,$ ;Wait for keyboard
mov ZLG_SEND_BUF,#00010101B ;Send the command of reading keyboard
lcall zlg_send
lcall zlg_receive ;Read the data of keyboard
setb ZLG_CS ;Set standby mode
mov r6,ZLG_REC_BUF
;Inc
cjne r6,#15,KEY_DEC
inc DAC_NUMBER
jmp MAIN_LOOP_NEXT
KEY_DEC:
;Dec
cjne r6,#7,MAIN_LOOP_NEXT
dec DAC_NUMBER
;Display the number
MAIN_LOOP_NEXT:
lcall func_display
lcall DASUB ;Start D/A change
jnb ZLG_KEY,$ ;Wait the key to pop
ajmp MAIN_LOOP
ret ;main return
;*****************************************************************
sys_initialize:
;Initialize TLC5615
SETB DAC8512_CS
SETB DAC8512_DATA
SETB DAC8512_SCLK
SETB DAC8512_LD
;***Initialize ZLG7289***
setb ZLG_CS
setb ZLG_KEY
setb ZLG_DATA
lcall delay_50
mov ZLG_SEND_BUF,#10100100B
lcall zlg_send
setb ZLG_CS ;Set standby mode
/*Parameter initialize*/
mov DAC_NUMBER,#00H
mov ZLG_HUNDRED,#00H
mov ZLG_DECIMAL,#00H
mov ZLG_ONE,#00H
lcall delay_125ms
ret
;*****************************************************************
;Send DA number to TLC5615
DASUB:
PUSH PSW
PUSH ACC
MOV R3,#0FH
MOV R2,#0FFH
MOV R7,#04H
DASUB0:
CLR C
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
DJNZ R7,DASUB0
MOV R7,#0CH
DASUB1:
CLR DAC8512_CS
NOP
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV DAC8512_DATA,C
CLR DAC8512_SCLK
NOP
SETB DAC8512_SCLK
DJNZ R7,DASUB1
CLR DAC8512_LD
NOP
SETB DAC8512_LD
POP ACC
POP PSW
RET
;*****************************************************************
;Display then DA number
;Using a,b
func_display:
/*Get the hundred*/
mov acc,DAC_NUMBER
mov b,#100
div ab
mov ZLG_HUNDRED,a
/*Get the decimal and one*/
mov acc,b
mov b,#10
div ab
mov ZLG_DECIMAL,a
mov ZLG_ONE,b
;***Display the hundred***
mov ZLG_SEND_BUF,#10000010B ;Download data and encode in mode 0
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_HUNDRED
lcall zlg_send
setb ZLG_CS
;***Display the decimal***
mov ZLG_SEND_BUF,#10000001B ;Download data and encode in mode 0
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_DECIMAL
lcall zlg_send
setb ZLG_CS
;***Display the one***
mov ZLG_SEND_BUF,#10000000B ;Download data and encode in mode 0
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_ONE
lcall zlg_send
setb ZLG_CS
ret
;*****************************************************************
;Send a byte to MCU with higer bit first
zlg_send:
mov ZLG_BIT_CNT,#8 ;Set the number of data sended
clr ZLG_CS ;Set set ZLG7289 ready,T1
lcall delay_50;T1
ZLG_SEND_LP:
;Send a bit
mov acc,ZLG_SEND_BUF
rlc a
mov ZLG_SEND_BUF,acc
mov ZLG_DATA,c
nop ;Wait for data to ready
nop
setb ZLG_CLK ;T2
lcall delay_8
clr ZLG_CLK ;T3
lcall delay_8
djnz ZLG_BIT_CNT,ZLG_SEND_LP ;Loop to next bit
clr ZLG_DATA
ret
;*****************************************************************
;Receive a byte to ZLG7289 with higer bit first
zlg_receive:
mov ZLG_BIT_CNT,#8 ;Set the number of data received
clr ZLG_CS ;Set set ZLG7289 ready,T1
lcall delay_50
ZLG_REC_LP:
;Receive a bit
setb ZLG_CLK ;T2
lcall delay_8
mov c,ZLG_DATA
mov acc,ZLG_REC_BUF
rlc a
mov ZLG_REC_BUF,acc
clr ZLG_CLK ;T3
lcall delay_8
djnz ZLG_BIT_CNT,ZLG_REC_LP ;Loop to next bit
clr ZLG_DATA
ret
;*****************************************************************
;Delay for 25ms
delay_125ms:
mov VAR_DELAY_2,#250
DELAY_25MS_LOOP:
mov VAR_DELAY,#250
djnz VAR_DELAY,$
djnz VAR_DELAY_2,DELAY_25MS_LOOP
ret
;*****************************************************************
;Delay for (50+2) us
delay_50:
mov VAR_DELAY,#25
djnz VAR_DELAY,$
ret
;*****************************************************************
;Delay for (8+2) us
delay_8:
mov VAR_DELAY,#4
djnz VAR_DELAY,$
ret
;*****************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -