📄 at89c2051controlddspll.asm
字号:
自己写的89C2051控制AD9850的程序,显示用74hc164
;89C2051 DDS频率合成器
; P3.4为八位74HC164输入P3.5为时钟
; 50,51,52,53,54,55,56,57存显示缓存 bcd码
; 3D,3E,3F,40,41频率缓存 AD9850contrl 字
;端口定义
;74hc164
DAT EQU P3.4
CLK EQU P3.5
;ad9850
DATA7 EQU P3.3
w_clk EQU P3.7
FQ_UD EQU P3.2
;除法地址
dbuf06 equ 20h
dbuf08 equ 3dh
dbuf10 equ 70h
org 0000h
ljmp start
;初始化
start:
mov 50h,#0h ;显示频率置初值 可以自选 十进制,单位Hz
mov 51h,#1h
mov 52h,#0h
mov 53h,#0h
mov 54h,#0h
mov 55h,#0h
mov 56h,#0h
mov 57h,#0h
lcall SETUP_AD9850
lcall value
;=======================
;主程序
main:
acall key
cjne R3,#0ffh,NEXT ;有键??
sJMP main
NEXT: cjne R3,#0bh,nokey ;ENT?
ljmp key_ENT ;输入数
nokey:
ljmp main
Value: LCALL BCDTOBIN
LCALL BINTOF
LJMP MAIN
LCALL DELAY20mS
lcall ad9850
lcall ad9850
lcall ad9850
lcall dir
ret
;==============================;直接输入
KEY_ENT:
lcall black
MOV R1,#50H
MOV R2,#08H
ENT: acall key
CJNE R3,#0FFH,ent ;ent
acall delay20ms
ent2: acall key
cjne r3,#0ffh,ent1
sjmp ent2
ent1: mov a,r3
SUBB A,#09H
JNC ENT
MOV A,R3
mov @r1,a
lcall dir
inc r1
djnz r2,ENT
ent3: lcall value
ljmp main
key:
mov r3,#0ffh
mov p1,#0fh ;键盘扫描
mov a,p1
mov b,a
cjne a,#0fh,keyhit ;有键按下?
keyout: mov r3,#0ffh
RET ;无键返回
keyhit: lcall delay20ms ;去抖动
mov a,p1
cjne a,b,keyout ;干扰返回
mov p1,#0efh ;查1行
mov a,p1
cjne a,#0efh,key1
mov p1,#0dfh ;查2行
mov a,p1
cjne a,#0dfh,key2
mov p1,#0bfh ;查3行
mov a,p1
cjne a,#0bfh,key3
mov p1,#7fh ;查4行
mov a,p1
cjne a,#7fh,key4
ljmp keyout ;返回
key1: ;键盘行初值
mov r3,#00h
ljmp key5
key2:
mov r3,#04h
ljmp key5
key3:
MOV r3,#08h
ljmp key5
key4:
MOV r3,#0ch
ljmp key5
key5:
mov dptr,#keytab
anl a,#0fh
mov b,a
clr a
mov r0,a
key6: ;查表求列值
mov a,r0
subb a,#04h
jnc keyout
mov a,r0
movc a,@a+dptr
inc r0
cjne a,b,key6
dec r0
mov a,r3
add a,r0
mov r3,a ;键值入R3
ret
keytab: db 07h,0bh,0dh,0eh ;键值表
;=================================
;显示子程序
dir: ;显示
mov r0,#57h ;显示初始化
mov r4,#08h
dir1:
mov a,@r0
acall disp
DEC R0
djnz r4,dir1
ret
disp:
CLR DAT
CLR CLK
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R5,#08H
DISP1:
RRC A
MOV DAT,C
SETB CLK
CLR CLK
DJNZ R5,DISP1
ret
;=====================
delay: ;长延时 自己测试用的
mov r7,#0ffh
d1:
mov r6,#0fFh
d2:
djnz r6,d2
djnz r7,d1
ret
delay20ms: ;延时
mov r7,#10h
d3:
mov r6,#0eeh
d4:
djnz r6,d4
djnz r7,d3
ret
BLACK:
MOV R0,#57H
MOV R1,#07H
B1: MOV @R0,#10h
DEC R0
DJNZ R1,B1
mov 50h,#0fh
acall dir
ret
;=============================
;初始化DDS
;DDS启动,设置
;初始化DDS
SETUP_AD9850:
CLR W_CLK ;初始化信号脚
CLR FQ_UD
SETB W_CLK ;设置为串行输入
CLR W_CLK
SETB FQ_UD
CLR FQ_UD
RET
;发送数据到DDS
AD9850: CLR FQ_UD
MOV A,3Dh
LCALL SEND_PLLRDATA
MOV A,3Eh
LCALL SEND_PLLRDATA
MOV A,3Fh
LCALL SEND_PLLRDATA
MOV A,40h
LCALL SEND_PLLRDATA
MOV A,41H
LCALL SEND_PLLRDATA
SETB FQ_UD
CLR FQ_UD
RET
;--------------------------------------------------
;==================================================
;==================================================
;--------------------------------------------------
SEND_PLLRDATA: ;送数据1字节
MOV R2,#08H
S1: RRC A
MOV data7,C
SETB W_CLK
CLR W_CLK
DJNZ R2,S1
RET;-------------------------------------
;========BCDTOBIN
bcdtobin:
mov r1,#40h
BINCLR:
MOV @R1,#00H
INC R1
CJNE R1,#48H,BINCLR
mov r1,#60h
BINCLR1:
MOV @R1,#00H
INC R1
CJNE R1,#68H,BINCLR1
mov r0,#50h ;01-23 50高
;R3
mov r1,#40h ;R4 40低
MOV R7,#08H
;r2 位数
bcd: ACALL PUSHR0R1
mov a,@r0
ADD A,40H
MOV 40H,A
MOV R0,#40H
MOV R3,#04H
CJNE R7,#01H,BCDOUT1
AJMP BCDOUT
BCDOUT1: ACALL MUL2
ACALL COPY
MOV R0,#40H
MOV R3,#04H
ACALL MUL2
MOV R0,#40H
MOV R3,#04H
ACALL MUL2
ACALL ADDR
ACALL POPR0R1
INC R0
DJNZ R7,BCD
BCDOUT:
RET
MUL2: MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R3,MUL2
RET
COPY: MOV R0,#40H
MOV R1,#60H
COPY1: MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R1,#64H,COPY1
RET
ADDR: clr F0
MOV R0,#40H
MOV R1,#60H
ADD1:
MOV A,@R0
MOV C,F0
ADDC A,@R1
MOV F0,C
MOV @R0,A
INC R0
INC R1
CJNE R1,#64H,ADD1
RET
PUSHR0R1: MOV A,R0
MOV R2,A
MOV A,R1
MOV R3,A
RET
POPR0R1: MOV A,R2
MOV R0,A
MOV A,R3
MOV R1,A
RET
;============================================
;除法子程序:
;R3:存放被除数指针,R4:存放除数指针
;商放入R3所指向RAM中,余数放入以DBUF10开始的连续RAM中,R5表示相除位数, 高位表示被除数位数,低位
;地址高存放高位
bintof:
lcall chen
MOV R1,#03DH
FCLR:
MOV @R1,#00H
INC R1
CJNE R1,#40H,FCLR
mov r1,#60h
MOV 20H,#0E1H
MOV 21H,#0F5H
MOV 22H,#05H
MOV R3,#DBUF08
MOV R4,#DBUF06
MOV R5,#083H
LCALL DIVSTART
ret
DIVSTART: MOV A,R5 ; 除法子程序
ANL A,#0F0H ;
MOV B,A ;
SWAP A ;
MOV R6,A ;R6:表示R3位数,
ANL 05H,#0FH ;R5:表示R4位数
DEC A ;
ADD A,R3 ;
MOV R3,A ;
MOV R0,A ;
DIVLOOP1: MOV A,@R0 ;
JNZ DIVLOOP2 ;
DEC R0 ;
DJNZ R6,DIVLOOP1 ;
RET ;
DIVLOOP2: MOV 03H,R0 ;
MOV A,R4 ;
DEC A ;
ADD A,R5 ;
MOV R1,A ;
DIVLOOP3 : MOV A,@R1 ;
JNZ DIVLOOP4 ;
DEC R1 ;
DJNZ R5,DIVLOOP3 ;高位为零屏去
RET ;
DIVLOOP4: MOV 02H,R5 ;
INC R2 ;
MOV R1,#DBUF10 ;
CLR A ;
DIVLOOP5: MOV @R1,A ;
INC R1 ;
DJNZ R2,DIVLOOP5 ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,R5 ;
INC A ;
SWAP A ;
ORL 05H,A ;
DIVLOOP6: MOV R7,#08H ;
DIVLOOP7: MOV 00H,R3 ;
MOV R1,#DBUF10 ;
MOV A,R5 ;
ANL A,#0FH ;
INC A ;
MOV R2,A ;
CLR C ;
MOV A,@R0 ;
RLC A ;
MOV @R0,A ;
DIVLOOP8: MOV A,@R1 ;
RLC A ;
MOV @R1,A ;
INC R1 ;
DJNZ R2,DIVLOOP8 ;
MOV A,R4 ;
MOV R1,A ;
MOV R0,#DBUF10 ;
MOV 02H,R5 ;
LCALL SUBSTART ;
JNC DIVLOOP9 ;
MOV 01H,R4 ;
MOV R0,#DBUF10 ;
MOV 02H,R5 ;
LCALL ADDSTART ;
SJMP DIVLOOP0 ;
DIVLOOP9: MOV 00H,R3 ;
INC @R0 ;
DIVLOOP0: DJNZ R7,DIVLOOP7 ;
DEC R3 ;
DJNZ R6,DIVLOOP6 ;
NOP ;
;==================
;以下运算为四舍五收
MOV R0,#DBUF10 ;
MOV R1,#DBUF10 ;
MOV 02H,R5 ;
NOP ;
LCALL ADDSTART ;
MOV R0,#DBUF10 ;
MOV 01H,R4 ;
MOV 02H,R5 ;
NOP ;
LCALL SUBSTART ;
JC DIVRETURN ;
MOV A,B ;
MOV R2,A ;
MOV 00H,R3 ;
INC R0 ;
INC R2 ;
MOV R1,#01H ;
NOP ;
LCALL ADDSTART ;
DIVRETURN: RET ;
;========================================
;加法子程序
;@R0+@R1 to @R0,R2 表示相加位数, 高位表示@R0位数,低位表示R1位数
;@r0 @@r1 地址高存放高位
ADDSTART: CLR C
ADDLOOP: MOV A,@R0 ;
ADDC A,@R1 ;
MOV @R0,A ;
INC R0 ;
INC R1 ;
DEC R2 ;
MOV A,R2 ;
ANL A,#0FH ;
JZ ADLBITZ ;
XCH A,R2 ;
ANL A,#0F0H ;
DEC A ;
ANL A,#0F0H ;
ORL 02H,A ;
SJMP ADDLOOP ;
ADLBITZ: MOV A,R2 ;
SWAP A ;
DEC A ;
JZ ADHBITZ ;
MOV R2,A ;
ADHBITNZ: CLR A ;
ADDC A,@R0 ;
MOV @R0,A ;
INC R0 ;
DJNZ R2,ADHBITNZ ;
ADHBITZ: RET ;
;=======================================
;减法子程序:
;@R0-@R1放入@R0中,R2 表示相加位数, 高位表示@R0位数,低位表示@R1位数
;@r0 ,@r1 地址高存放高位
SUBSTART: CLR C
SUBLOOP : MOV A,@R0 ;
SUBB A,@R1 ;
MOV @R0,A ;
INC R0 ;
INC R1 ;
DEC R2 ;
MOV A,R2 ;
ANL A,#0FH ;
JZ SUBLOOP1 ;
XCH A,R2 ;
ANL A,#0F0H ;
DEC A ;
ANL A,#0F0H ;
ORL 02H,A ;
SJMP SUBLOOP ;
SUBLOOP1: MOV A,R2 ;
SWAP A ;
DEC A ;
JZ SUBLOOP3 ;
MOV R2,A ;
SUBLOOP2: MOV A,@R0 ;
SUBB A,#00H ;
MOV @R0,A ;
INC R0 ;
DJNZ R2,SUBLOOP2 ;
SUBLOOP3 : RET ;/
chen: ;乘2
MOV R0,#40H
MOV R3,#08H
acall mul2
ret
;=========================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -