⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wodefm-1.asm

📁 89C2051和HB4145音频发射带LCD显示采用HT1621驱动原代码!请查收
💻 ASM
字号:


;***************************;
;     数控调频台控制器      ;
;***************************;
    KMARK       BIT     2AH.0 ;有键被按着
    KFIRST      BIT     2AH.1 ;第一次
    KFUNC       BIT     2AH.2;代表两种功能
    KENTER      BIT     2AH.3 ;代表执行S4键的操作
    KS12        BIT     2AH.4 ;S1 S2两个键被按下
    KFUNC1      BIT     2AH.5
    KCOUNT      EQU     2BH ;统计次数
    COUNT       EQU     2CH
    TMRVAR      EQU     60110;65536-5000*12/11.0592 定时器初值5毫秒
;***************************************************************************************
;26H-29H放显示小数位、个位、十位、百位BCD码数,24H-25H放频率控制数据(十六进制)
;
             CONBITL  EQU  21H  ;频率控制字节低8位
             CONBITH  EQU  22H  ;频率控制字节高8位
             KEYWORD  EQU  23H  ;存放键扫描时P1口值
;
;
              ORG 0000H   ;程序开始地址
              LJMP      START    ;转START执行
              ORG  0003H       ;
              RETI         ;不用中断程序
              ORG  000BH       ;
              RETI      ; 不用中断程序
              ORG  0013H       ;
              RETI         ; 不用中断程序
              ORG  001BH       ;
              RETI         ; 不用中断程序
              ORG  0023H       ;
              RETI         ; 不用中断程序
              ORG  002BH      ;
              RETI         ; 不用中断程序
	      ORG   30H
;*******************************************************************************************
;初始化程序
CLEARMEN:    MOV   R0,#20H       ;20H-2CH循环清0
             MOV   R1,#0CH       ;
CLEARLOOP:   MOV   @R0,#00H      ;
             INC   R0          ;
             DJNZ  R1,CLEARLOOP  ;
             MOV   P0,#0FFH      ;四端口置1
             MOV   P1,#0FFH      ;
             MOV   P2,#0FFH      ;
             MOV   P3,#0FFH      ;
             CLR   P1.5        ;BH1415禁止操作
             CLR   P1.6       ;
             CLR   P1.7       ;
 
;OFF:         SETB  P1.1
       

CLEAR1:      MOV   PCON,#00H     ;控制寄存器清0
             MOV   29H,#00H        ; 置初始值为88MHZ(显示为088.0)
             MOV   28H,#08H     ;
             MOV   27H,#08H        ;
             MOV   26H,#00H        ;
             LCALL DISPUPDAT      ;写入BH1415芯片(修改发送频率)

             
             RET           ;子程序返回
;
;***************************************************************************************************

;****************************************************************************************************
;主程序
START:       MOV     SP,#5FH
             
	    
	    
	     LCALL  CLEARMEN        ;上电初始化
MAIN:        
             ORL     P3,#00111100B
             MOV     A,P3
             ORL     A,#11000011B
             CPL     A
             JZ      NO_KEY1          ;无键按下,返回
             LCALL   KEY
             JB      KFUNC,KEYFUN13    ;如果是第一功能写88.0MHZ
             JNB     KFUNC,KEYFUN05    ;如果是第二功能写108.0MHZ
	     LCALL  DISPUPDAT       ;写入控制芯片(修改发射频率)
             LCALL  DISPLAY         ;LED显示一次
             AJMP   MAIN         ;转MAIN循环
             NOP           ;PC出错处理
             NOP           ;
            
	     AJMP   START         ;重新初始化
;*****************************************************************************************************
NO_KEY1 :  LCALL   NO_KEY
;***********************************************************************

;
;05号键功能程序(频率预置键)
KEYFUN05:    MOV   29H,#01H       ; 预置108.0MHZ发射频率
             MOV   28H,#00H
             MOV   27H,#08H
             MOV   26H,#00H
             
	     RET
;

;
;13号键功能程序(频率预置键)
KEYFUN13:    MOV   29H,#00H         ; 预置88.0MHZ发射频率
             MOV   28H,#08H
             MOV   27H,#08H
             MOV   26H,#00H
           
            
	     RET
;

;
;15号键功能程序(立体声/单声道设置键)

;ON:          CLR   P1.1
            
             ;RET        ;返回
          
;以下是键盘程序,实现显示及键盘处理

    
    
KEY:    
    
    JNB     KMARK,KEY_1     ;键按下标志有效吗(无效转)?
    DEC     KCOUNT          ;键值计数器减1
    MOV     A,KCOUNT
    JNZ     INT_EXIT1        ;如果是0,退出中断
    JNB     P3.2,KEY_S1     ;S1键按下
    JNB     P3.3,KEY_S2     ;S2键按下
    JNB     P3.4,KEY_S303     ;S3键按下
    JNB     P3.5,KEY_S404     ;S4键搂下
    JMP     NO_KEY          ;无键按下
KEY_1:
    MOV     KCOUNT,#1
    SETB    KMARK
    JMP     INT_EXIT    
KEY_S1: 
   
    SETB    KS12
    MOV     A, 26H
    CJNE    A,     #09H,   CC2  ; 是否向个位进位
    MOV     26H,     #00H         ; 小数位清零
    MOV     A, 27H
    CJNE    A,     #09H,   CC4       ; 是否向十位进位
    MOV     27H,     #00H;           个位清零
    MOV     A, 28H
    CJNE    A,     #09H ,  CC5 ;是否向百位进位
    MOV     28H,     #00H;        十位清零
KEYFUN00:   
     INC    29H           ;
     MOV    A,29H         ;
     CLR    C           ;
     CJNE   A,#02H,FUN00     ;
FUN00:       
     JC     FUN00OUT         ;
     MOV    29H,#00H         ;
FUN00OUT:    
     MOV    A,29H         ; 
     XRL    A,#01H   ;
     JNZ     F00OUT1   ;
     MOV    28H,#00H   ;
     RET  ;
F00OUT1:     
     MOV    28H,#08H   ;
     JMP     KEY_2
;*************************************************************************************************
CC2:    INC     26H                    ;小数位加1

        JMP     KEY_2
        ;
CC4:    INC     27H                    ;个位加1
        
        JMP     KEY_2
        ;
CC5:    INC     28H                   ;十位加1
        
        JMP     KEY_2

CC6:    DEC     26H                   ;小数位减1
        JMP     KEY_2
CC7:    DEC     27H                   ;个数位减1
        JMP     KEY_2
CC8:    DEC     28H                   ;十数位减1
        JMP     KEY_2
     
;***************************************************************************************************


INT_EXIT1: LCALL   INT_EXIT
KEY_S303:  LCALL   KEY_S3
KEY_S404:  LCALL   KEY_S4

;*****************************************************************************************************
KEY_S2: 
     SETB    KS12
     MOV     A, 26H
     CJNE    A,     #00H,   CC6  ; 是否向个位借位
     MOV     26H,     #00H         ; 小数位清零
     MOV     A, 27H
     CJNE    A,     #00H,   CC7       ; 是否向十位进位
     MOV     27H,     #00H;           个位清零
     MOV     A, 28H
     CJNE    A,     #00H ,  CC8 ;是否向百位进位
     MOV     28H,     #00H;        十位清零
KEYFUN01:   
     DEC    29H           ;
     MOV    A,29H         ;
     CLR    C           ;
     CJNE   A,#00H,FUN01     ;
FUN01:       
     JC     FUN00OUT1         ;
     MOV    29H,#00H         ;
FUN00OUT1:    
     MOV    A,29H         ; 
     XRL    A,#01H   ;
     JNZ     F00OUT11   ;
     MOV    28H,#00H   ;
     RET  ;
F00OUT11:     
     MOV    28H,#08H   ;
     JMP     KEY_2
     
KEY_S3: 
       LCALL  KEYFUN05

KEY_2:  
    JNB     KFIRST,KEY_3    ;如果无效,转
    MOV     KCOUNT,#20
    JMP     INT_EXIT
KEY_3:  
    MOV     KCOUNT,#200
    SETB    KFIRST
    JMP     INT_EXIT
NO_KEY: 
    CLR     KMARK
    CLR     KFIRST
    CLR     KFUNC1
    MOV     KCOUNT,#0
INT_EXIT:   
    
    RET


       
;***************************************************************************************************
        

         
      
;************************************************************************************
; 将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT:   LCALL  BCDB         ; 
             LCALL  CONCOMMAND    ; 
             LCALL  PUTBIT        ; 发控制字至BH1415
             RET        ;返回

; 将BCD码转为十六进制数程序
BCDB:        MOV    CONBITL,#00H    ; 控制字清0
             MOV    CONBITH,#00H    ; 控制字清0
             MOV    CONBITL,26H    ;小数位数放入控制字低8位
             MOV    A,27H      ;个位数乘10操作
             MOV    B,#10      ;
             LCALL  MULLOOP     ;调乘法子程序
             MOV    A,28H      ;十位数乘100操作
             MOV    B,#100     ;
             LCALL  MULLOOP     ; 调乘法子程序
            MOV    A,29H      ;
             JNZ    ADD3E8     ;百位数为1转ADD3E8(加1000操作)
             RET        ; 百位数为0退出
ADD3E8:      CLR    C       ;清进位档标志
             MOV    A,#0E8H      ;低8位加法
             ADD    A,CONBITL      ;累加
             MOV    CONBITL,A      ;放回CONBITL
             MOV    A,#03H      ; 高8位加法
             ADDC   A,CONBITH      ;
             MOV    CONBITH,A      ;放回CONBITH
             RET         ;返回
;*****************************************************************************************
;乘法及累加处理程序(将四位显示的十进制BCD码转为1个二进制数)
MULLOOP:     MUL    AB       ;乘法
             CLR    C        ;清进位标志
             ADD    A,CONBITL      ;积低8位与CONBITL相加
             MOV    CONBITL,A      ;放回CONBITL
             MOV    A,CONBITH      ;
             ADDC   A,B       ;积高8位与CONBITH带进位累加
             MOV    CONBITH,A      ;放回CONBITH
             RET         ;返回
;******************************************************************************************
;频率控制数据与5位控制码合成BH1415控制字
CONCOMMAND:   ANL   CONBITH,#07H     ;
             MOV   A,20H       ;
             ORL   A,CONBITH      ;
             MOV   CONBITH,A      ;
             RET         ;返回
;******************************************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           显示程序                  ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;共阳LED显示,P0口输出段码,P2口输出扫描字
DISPLAY:     MOV R1,#26H       ;显示首址
             MOV R5,#0FEH       ;设扫描字
PLAY:        MOV A,R5        ;放入A
             MOV P2,A        ;P2口输出
             MOV A,@R1       ;取显示数据
             MOV DPTR,#TAB      ;取段码表首址
             MOVC A,@A+DPTR      ;查段码
             MOV P0,A        ;从P0输出
             MOV A,R5        ;读入扫描字
             JB ACC.1,PLAY1      ; 不是十位(LED),不显示小数点
             CLR P0.7        ;是十位,显示小数点
PLAY1:       LCALL DL1MS       ;点亮1毫秒
             INC R1        ;指向下一显示数据
             JNB ACC.3,ENDOUT      ;是第四位LED,退出
             RL A         ;不是,左移一位
             MOV R5,A        ;放回R5
             SETB  P0.7       ;关小数点
             AJMP PLAY       ;转PLAY循环
ENDOUT:      MOV  P2,#0FFH      ;显示结束,关显示输出口
             MOV  P0,#0FFH      ;
             RET         ;返回
	     
;*****************************************************************************************
;0-9共阳段码表
TAB: DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH
;*****************************************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;           发送控制字节子程序        ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT:      MOV   A,CONBITL      ;低8位控制字入A
             SETB  P1.5       ;BH1415使能(允许写)
             LCALL PUT       ;发送8位
             MOV   A,CONBITH      ; 高8位控制字入A
             LCALL PUT       ; 发送8位
             CLR   P1.5       ; BH1415写禁止
             CLR   P1.6      ;复位
             CLR   P1.7       ;复位
             RET         ;返回
;*****************************************************************************************
;字节发送子程序
PUT:         MOV   R3,#8       ;发送8位控制
             CLR   C        ;清C
PUT1:        RRC   A        ;带进位位右移(先发低位)
             MOV   P1.7,C       ;低位送至P3.0口
             NOP         ;延时4微秒
             NOP         ;
             NOP         ;
             NOP         ;
             SETB  P1.6       ;锁存数据(上升沿时锁存数据)
             NOP         ;延时4微秒
             NOP         ;
             NOP         ;
             NOP         ;
             CLR   P1.6       ;
             DJNZ  R3,PUT1      ;8位未发完转PUT1再发
             RET         ; 8位发完结束
;****************************************************************************************
;513微秒延时子程序
DL513:       MOV   R3,#0FFH
DL513LOOP:   DJNZ  R3,DL513LOOP
             RET
;****************************************************************************************
;1毫秒延时子程序(LED点亮用)
DL1MS:       MOV   R4,#02H
DL1MSLOOP:   LCALL DL513
            DJNZ  R4,DL1MSLOOP
            RET
;*****************************************************************************************
;10毫秒延时子程序(消抖动用)
;DL10MS:      MOV   R6,#0AH
;DL10MSLOOP:  LCALL DL1MS
;             DJNZ  R6,DL10MSLOOP
 ;            RET
;
;
             END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -