📄 ad9850.asm
字号:
W_CLK EQU p3.1
F_QUD EQU P3.0
;*****************************************************************************'
WORD_FREG_L1 EQU 44H ;注意:这里的高低位不要弄错了,我就是在这里弄错了
WORD_FREG_L2 EQU 43H
WORD_FREG_H1 EQU 42H
WORD_FREG_H2 EQU 41H
;*************************ZLG7289 PARAMETERS************************************
ZLG_PARA_NUM_H1 EQU 50H
ZLG_PARA_NUM_H2 EQU 51H
ZLG_PARA_NUM_H3 EQU 52H
ZLG_PARA_NUM_H4 EQU 53H
ZLG_PARA_NUM_L1 EQU 54H
ZLG_PARA_NUM_L2 EQU 55H
ZLG_PARA_NUM_L3 EQU 56H
ZLG_PARA_NUM_L4 EQU 57H
;*******************************************************************************
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
ZLG_DECIMAL_BUFF EQU 33H ;The digit of decimal
ZLG_MOVE_BUFF EQU 34H
ZLG_CS EQU P0.0 ;/CS of ZLG7289
ZLG_CLK EQU P0.1 ;CLK of ZLG7289
ZLG_DATA EQU P0.2 ;DIO of ZLG7289
ZLG_KEY EQU P0.3 ;/KEY of ZLG7289
;****************DELAY PARAMETERS**********************************************
TAG_REFURBISH EQU 60H
CURRENT_ADDRESS EQU 61H
DATA_REGISTER_L1 EQU 62H
DATA_REGISTER_L2 EQU 63H
DATA_REGISTER_H1 EQU 64H
DATA_REGISTER_H2 EQU 65H
;*******************************************************************************
VAR_DELAY EQU 71H ;The variable for delay function
;*******************************************************************************
org 0000H
ljmp MAIN
org 0030H
;*****************************************************************************
MAIN:
mov SP,#80H
lcall system_initialize
lcall para_initialize
lcall zlg_display
MAIN_LOOP:
jb ZLG_KEY,MAIN_LOOP
mov ZLG_SEND_BUF,#00010101B
lcall zlg_send
lcall zlg_receive
setb ZLG_CS
MAIN_CIRCLE:
jnb ZLG_KEY,MAIN_CIRCLE
lcall scan_key ;key scan
lcall zlg_display
ajmp MAIN_LOOP
ret
;*****************************************************************************
system_initialize:
setb ZLG_CS
setb ZLG_KEY
setb ZLG_DATA
lcall delay_50
mov ZLG_SEND_BUF,#10100100B ;Initialize ZLG7289
lcall zlg_send
setb ZLG_CS ;Set standby mode
ret
;****************************************************************************
para_initialize :
mov ZLG_PARA_NUM_H1,#00H
mov ZLG_PARA_NUM_H2,#00H
mov ZLG_PARA_NUM_H3,#00H
mov ZLG_PARA_NUM_H4,#00H
mov ZLG_PARA_NUM_L1,#00H
mov ZLG_PARA_NUM_L2,#00H
mov ZLG_PARA_NUM_L3,#00H
mov ZLG_PARA_NUM_L4,#00H
mov WORD_FREG_L1,#00H
mov WORD_FREG_L2,#00H
mov WORD_FREG_H1,#00H
mov WORD_FREG_H2,#00H
mov ZLG_DECIMAL_BUFF,#00H
mov CURRENT_ADDRESS,#00h
mov TAG_REFURBISH,#00H
ret
;***************************************************************************
zlg_display:
mov ZLG_SEND_BUF,#80H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_L1
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#81H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_L2
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#82H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_L3
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#83H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_L4
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#84H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_H1
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#85H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_H2
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#86H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_H3
lcall zlg_send
setb ZLG_CS
mov ZLG_SEND_BUF,#87H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_PARA_NUM_H4
lcall zlg_send
setb ZLG_CS
ret
;****************************************************************************
scan_key:
cjne a,#00,SCAN_KEY_ZERO
mov ZLG_DECIMAL_BUFF,#00H ;diplay 0
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_ZERO:
cjne a,#01,SCAN_KEY_ONE
mov ZLG_DECIMAL_BUFF,#01H ;diplay 1
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_ONE:
cjne a,#02,SCAN_KEY_TWO
mov ZLG_DECIMAL_BUFF,#02H ;diplay 2
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_TWO:
cjne a,#03,SCAN_KEY_THREE
mov ZLG_DECIMAL_BUFF,#03H ;diplay 3
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_THREE:
cjne a,#04,SCAN_KEY_FOUR
mov ZLG_DECIMAL_BUFF,#04H ;diplay 4
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_FOUR:
cjne a,#05,SCAN_KEY_FIVE
lcall move_left ;key of 5 is move left
jmp SCAN_KEY_EXIT
SCAN_KEY_FIVE:
cjne a,#06,SCAN_KEY_SIX
jmp SCAN_KEY_EXIT
SCAN_KEY_SIX:
cjne a,#07,SCAN_KEY_SEVEN
lcall para_initialize ;reset
jmp SCAN_KEY_EXIT
SCAN_KEY_SEVEN:
cjne a,#08,SCAN_KEY_EIGHT
mov ZLG_DECIMAL_BUFF,#05H ;display 5
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_EIGHT:
cjne a,#09,SCAN_KEY_NINE
mov ZLG_DECIMAL_BUFF,#06H ;display 6
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_NINE:
cjne a,#10,SCAN_KEY_TEN
mov ZLG_DECIMAL_BUFF,#07H ;display 7
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_TEN:
cjne a,#11,SCAN_KEY_ELEVEN ;display 8
mov ZLG_DECIMAL_BUFF,#08H
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_ELEVEN:
cjne a,#12,SCAN_KEY_TWELVE ;display 9
mov ZLG_DECIMAL_BUFF,#09H
mov TAG_REFURBISH,#0FFH
jmp SCAN_KEY_EXIT
SCAN_KEY_TWELVE:
cjne a,#13,SCAN_KEY_THIRTEEN ;key of 13 is move right
lcall move_right
jmp SCAN_KEY_EXIT
SCAN_KEY_THIRTEEN:
cjne a,#14,SCAN_KEY_FORTEEN ;key of 14 is sent data
mov ZLG_MOVE_BUFF,#0FFH
lcall zlg_move
lcall count_freg
lcall write_data
lcall zlg_display
mov WORD_FREG_L1,#00H
mov WORD_FREG_L2,#00H
mov WORD_FREG_H1,#00H
mov WORD_FREG_H2,#00H
jmp SCAN_KEY_EXIT
SCAN_KEY_FORTEEN:
cjne a,#15, SCAN_KEY_EXIT
mov ZLG_MOVE_BUFF,#07FH
mov ZLG_SEND_BUF,#88H
lcall zlg_send
mov ZLG_SEND_BUF,#01111111B
lcall zlg_send
setb ZLG_CS
lcall zlg_display
SCAN_KEY_EXIT:
push acc
mov a,TAG_REFURBISH
cjne a,#0FFH,NOT_REFURBISH
lcall parallelism_bit_refurbish
mov TAG_REFURBISH,#00H
NOT_REFURBISH:
pop acc
ret
;*****************************************************************************
move_left:
push acc
mov a,ZLG_MOVE_BUFF
RL a
mov ZLG_MOVE_BUFF,a
lcall zlg_move
pop acc
ret
;***************************************************************************
move_right:
push acc
mov a,ZLG_MOVE_BUFF
RR a
mov ZLG_MOVE_BUFF,a
lcall zlg_move
pop acc
ret
;****************************************************************************
zlg_move:
mov ZLG_SEND_BUF,#88H
lcall zlg_send
mov ZLG_SEND_BUF,ZLG_MOVE_BUFF
lcall zlg_send
setb ZLG_CS
RET
;***************************************************************************
parallelism_bit_refurbish: ;move left and right after refurbish every bit
push acc
mov a,ZLG_MOVE_BUFF
cjne a,#01111111B,BIT_H_4
mov ZLG_PARA_NUM_H4,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_H_4:
cjne a,#10111111B,BIT_H_3
mov ZLG_PARA_NUM_H3,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_H_3:
cjne a,#11011111B,BIT_H_2
mov ZLG_PARA_NUM_H2,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_H_2:
cjne a,#11101111B,BIT_H_1
mov ZLG_PARA_NUM_H1,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_H_1:
cjne a,#11110111B,BIT_L_4
mov ZLG_PARA_NUM_L4,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_L_4:
cjne a,#11111011B,BIT_L_3
mov ZLG_PARA_NUM_L3,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_L_3:
cjne a,#11111101B,BIT_L_2
mov ZLG_PARA_NUM_L2,ZLG_DECIMAL_BUFF
jmp PARA_BIT_EXIT
BIT_L_2:
cjne a,#11111110B,PARA_BIT_EXIT
mov ZLG_PARA_NUM_L1,ZLG_DECIMAL_BUFF
PARA_BIT_EXIT:
pop acc
ret
;***************************************************************************
count_freg:
push acc
mov r3,#08H
COUNT_LOOP:
cjne r3,#08,COUNT_FREG_99
mov a,ZLG_PARA_NUM_H4 ;read high bit of four
mov dptr,#TAB_FREG_10MHZ ;check the table 10MHZ
jmp COUNT_FREG_EXIT
COUNT_FREG_99:
cjne r3,#07,COUNT_FREG_1
mov a,ZLG_PARA_NUM_H3 ;read high bit of three
mov dptr,#TAB_FREG_1MHZ_TO_9MHZ ;check the table 1MHZ~9MHZ
jmp COUNT_FREG_EXIT
COUNT_FREG_1:
cjne r3,#06,COUNT_FREG_2
mov a,ZLG_PARA_NUM_H2 ;read high bit of two
mov dptr,#TAB_FREG_100KHZ_TO_900KHZ;check the table 100KHZ~900KHZ
jmp COUNT_FREG_EXIT
COUNT_FREG_2:
cjne r3,#05,COUNT_FREG_3
mov a,ZLG_PARA_NUM_H1 ;read high bit of one
mov dptr,#TAB_FREG_10KHZ_TO_90KHZ ;check the table 10KHZ~90KHZ
jmp COUNT_FREG_EXIT
COUNT_FREG_3:
cjne r3,#04,COUNT_FREG_4
mov a,ZLG_PARA_NUM_L4 ;read low bit of four
mov dptr,#TAB_FREG_1KHZ_TO_9KHZ ;check the table 1KHZ~9KHZ
jmp COUNT_FREG_EXIT
COUNT_FREG_4:
cjne r3,#03,COUNT_FREG_5
mov a,ZLG_PARA_NUM_L3 ;read low bit of three
mov dptr,#TAB_FREG_100HZ_TO_900HZ ;check the table 100HZ~900HZ
jmp COUNT_FREG_EXIT
COUNT_FREG_5:
cjne r3,#02,COUNT_FREG_6
mov a,ZLG_PARA_NUM_L2 ;read low bit of two
mov dptr,#TAB_FREG_10HZ_TO_90HZ ;check the table 10HZ~90HZ
jmp COUNT_FREG_EXIT
COUNT_FREG_6:
cjne r3,#01,COUNT_FREG_EXIT
mov a,ZLG_PARA_NUM_L1 ;read low bit of one
mov dptr,#TAB_FREG_0HZ_TO_9HZ ;check the table 1HZ~9HZ
COUNT_FREG_EXIT:
mov b,#04
mul ab ;the freg is bits of 32
mov CURRENT_ADDRESS,a
movc a,@a+dptr
mov DATA_REGISTER_H2,a
inc CURRENT_ADDRESS
mov a,CURRENT_ADDRESS
movc a,@a+dptr
mov DATA_REGISTER_H1,a
inc CURRENT_ADDRESS
mov a,CURRENT_ADDRESS
movc a,@a+dptr
mov DATA_REGISTER_L2,a
inc CURRENT_ADDRESS
mov a,CURRENT_ADDRESS
movc a,@a+dptr
mov DATA_REGISTER_L1,a
lcall add_freg
djnz r3,COUNT_LOOP
pop acc
ret
;***************************************************************************
add_freg: ;check the freg table,and add the freg every bits
push acc
mov a,WORD_FREG_L1
addc a,DATA_REGISTER_L1
mov WORD_FREG_L1,a
mov a,WORD_FREG_L2
addc a,DATA_REGISTER_L2
mov WORD_FREG_L2,a
mov a,WORD_FREG_H1
addc a,DATA_REGISTER_H1
mov WORD_FREG_H1,a
mov a,WORD_FREG_H2
addc a,DATA_REGISTER_H2
mov WORD_FREG_H2,a
pop acc
ret
;****************************************************************************
write_data:
mov p1,#00H ;注意:这三句也不能忘记
clr W_CLK
clr F_QUD
lcall long_delay
mov 40H,#00H
mov r6,#05H ;setting data pointer
mov r1,#40H ;data register of address
WRITE_NEXT:
mov p1,@r1 ;
setb W_CLK ;On the rising edge of this clock,write data in AD9850
clr W_CLK ;clr
inc r1
djnz r6,WRITE_NEXT
setb F_QUD ;40 bits write in
clr F_QUD ;clr
ret
;******************************************************************************
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
;*****************************************************************************
long_delay:
mov r4,#0FH
LONG_DD:
mov r5,#0FFH
LONG_KK:
nop
nop
djnz r5,LONG_KK
djnz r4,LONG_DD
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
;********************************************************************************
TAB_FREG_0HZ_TO_9HZ:
DB 00H,00H,00H,00H ;0HZ
DB 00H,00H,00H,55H ;1HZ
DB 00H,00H,00H,0ABH ;2HZ
DB 00H,00H,01H,01H ;3HZ
DB 00H,00H,01H,58H ;4HZ
DB 00H,00H,01H,0ADH ;5HZ
DB 00H,00H,02H,03H ;6HZ
DB 00H,00H,02H,59H ;7HZ
DB 00H,00H,02H,0AFH ;8HZ
DB 00H,00H,03H,05H ;9HZ
TAB_FREG_10HZ_TO_90HZ:
DB 00H,00H,00H,00H ;00HZ
DB 00H,00H,03H,5BH ;10HZ
DB 00H,00H,06H,0B6H ;20HZ
DB 00H,00H,0AH,11H ;30HZ
DB 00H,00H,0DH,6CH ;40HZ
DB 00H,00H,10H,0CAH ;50HZ
DB 00H,00H,14H,22H ;60HZ
DB 00H,00H,17H,7DH ;70HZ
DB 00H,00H,1AH,0D8H ;80HZ
DB 00H,00H,1EH,033H ;90HZ
TAB_FREG_100HZ_TO_900HZ:
DB 00H,00H,00H,00H ;000HZ
DB 00H,00H,21H,8EH ;100HZ
DB 00H,00H,43H,1CH ;200HZ
DB 00H,00H,64H,0AAH ;300HZ
DB 00H,00H,86H,38H ;400HZ
DB 00H,00H,0A7H,0C6H ;500HZ
DB 00H,00H,0C9H,54H ;600HZ
DB 00H,00H,0EAH,0E2H ;700HZ
DB 00H,01H,0CH,6FH ;800HZ
DB 00H,01H,2DH,0FDH ;900HZ
;****************************************************
TAB_FREG_1KHZ_TO_9KHZ:
DB 00H,00H,00H,00H ;0KHZ
DB 00H,01H,04FH,8BH ;1KHZ
DB 00H,02H,9FH,17H ;2KHZ
DB 00H,03H,0EEH,0A2H ;3KHZ
DB 00H,05H,3EH,2DH ;4KHZ
DB 00H,06H,8DH,0B9H ;5KHZ
DB 00H,07H,0DDH,44H ;6KHZ
DB 00H,09H,2CH,0CFH ;7KHZ
DB 00H,0AH,7CH,05BH ;8KHZ
DB 00H,0BH,0CBH,0E6H ;9KHZ
TAB_FREG_10KHZ_TO_90KHZ:
DB 00H,00H,00H,00H ;00KHZ
DB 00H,0DH,1BH,71H ;10KHZ
DB 00H,1AH,36H,0E3H ;20KHZ
DB 00H,27H,52H,54H ;30KHZ
DB 00H,34H,6DH,0C8H ;40KHZ
DB 00H,41H,89H,37H ;50KHZ
DB 00H,4EH,0A4H,0A9H ;60KHZ
DB 00H,5BH,0C0H,1AH ;70KHZ
DB 00H,68H,0DBH,8CH ;80KHZ
DB 00H,75H,0F6H,0FDH ;90KHZ
TAB_FREG_100KHZ_TO_900KHZ:
DB 00H,00H,00H,00H ;000KHZ
DB 00H,83H,12H,6FH ;100KHZ
DB 01H,06H,24H,0DDH ;200KHZ
DB 01H,89H,37H,4CH ;300KHZ
DB 02H,0CH,49H,0BAH ;400KHZ
DB 02H,8FH,5CH,29H ;500KHZ
DB 03H,12H,6EH,98H ;600KHZ
DB 03H,95H,81H,06H ;700KHZ
DB 04H,18H,93H,75H ;800KHZ
DB 04H,9BH,0A5H,0E3H ;900KHZ
;*************************************************************
TAB_FREG_1MHZ_TO_9MHZ:
DB 00H,00H,00H,00H ;0M
DB 05H,1EH,0B8H,52H ;1M
DB 0AH,3DH,70H,0A4H ;2M
DB 0FH,5CH,028H,0F6H ;3M
DB 14H,7AH,0E1H,48H ;4M
DB 19H,99H,99H,9AH ;5M
DB 1EH,0B8H,51H,0ECH ;6M
DB 23H,0D7H,0AH,3DH ;7M
DB 28H,0F5H,0C2H,8FH ;8M
DB 2EH,14H,7AH,0E1H ;9M
TAB_FREG_10MHZ:
DB 00H,00H,00H,00H
DB 33H,33H,33H,33H ;10M
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H,00H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -