| 
 | 
 
 
'    ;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连接有关,,不一定一样 
 ' 班门弄斧,有几个行,有点大意            ...
  
 
 |