|
'  ;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,next1 ;ent? ljmp key_ent ;输入数 next1: cjne r3,#0ch,nokey acall delay ;sys? ljmp sysnokey: 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;------------------------------------- ;========bcdtobinbcdtobin: 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 ;========================================================= tab: db 21h,0f9h,13h,051h,0c9h,45h,05h,0f1h,01h,41h ;0123456789 db 81h,0dh,27h,19h,007h,87h,0ffh,0ffh,0ffh,0ffh ;abcdef 消 ;与我的lcd连接有关,,不一定一样
' 班门弄斧,有几个行,有点大意 ...
|