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

📄 4key led.asm

📁 这个源码的CPU为PIC16C54
💻 ASM
字号:
;CPU=16C54 OSC=RC 2.3MHz  无源蜂鸣器
;按键:RB2,RB3输入,RB0,RB1输出,行列键盘,端口与显示复用
;按键按下执行程序后延迟一定时间(TIME1,TIME2)再执行扫描,以防快速按键
;POWER:RB0-RB3,FAST:RB0-RB1,SLOW:RB1-RB3,LAMP:RB1-RB2
;RB4 LAMP cortrol,RB5 SLOW cortrol,RB6 FAST cortrol,RA2 BUZZ cortrol
   LIST P=16C54
INDF    EQU  0x00  
TMR0    EQU  0x01  
PCL     EQU  0x02
STATUS  EQU  0x03 
FSR     EQU  0x04  
RA      EQU  0x05 
RB      EQU  0x06  
;
TEMP          EQU  0x08    ;时间寄存器
COUNT1        EQU  0x09    ;计数器
COUNT2        EQU  0x0A    ;计数器
TIME_FLAG     EQU  0x0B
RUN_FLAG      EQU  0x0C    ;运行状态寄存器
COUNT3        EQU  0x0D

TIME_1        EQU  0x0E    ;不执行键扫描标志时间寄存器
TIME_2        EQU  0x0F
KEY_VAL       EQU  0x10    ;键值寄存器
BUZZ_TIME1    EQU  0x11    ;蜂鸣时间寄存器
BUZZ_TIME2    EQU  0x12  

;RUN_FLAG位定义:
RUN_LAMP      EQU  3
RUN_BUZZ      EQU  4
RUN_SLOW      EQU  2
RUN_MID       EQU  6
RUN_FAST      EQU  1
RUN_POWER     EQU  0
;
;TIME_FLAG位定义
KEY_BOUND      EQU  0
TIME_BUZZ_START EQU  1
TIME_INT       EQU  2
NO_PRESS       EQU  3       ;不执行键扫描标志
;**********************************************
;
    ORG    0
    GOTO   INIT
;
;************************************************
;交流蜂鸣器程序
;**************************************************
BUZZ:    
   BTFSC  TIME_FLAG,TIME_BUZZ_START
   GOTO   BUZZ_1
   BSF    TIME_FLAG,TIME_BUZZ_START
   MOVLW  02H                ;OSC=4MHz:02,OSC=RC:01
   MOVWF  BUZZ_TIME1    
   MOVLW  0FFH
   MOVWF  BUZZ_TIME2  
BUZZ_1:
   BTFSS  TIME_FLAG,TIME_INT
   GOTO   BUZZ_2
   BSF    RA,2   
   DECFSZ BUZZ_TIME2,1
   RETLW  0
   DECFSZ BUZZ_TIME1,1
   GOTO   BUZZ_NOEND         ;BUZZ_TIME1和BUZZ_TIME1都为0
   GOTO   BUZZ_END
BUZZ_2:
   BCF    RA,2
   DECFSZ BUZZ_TIME2,1
   RETLW  0
   DECFSZ BUZZ_TIME1,1
   GOTO   BUZZ_NOEND          ;BUZZ_TIME1和BUZZ_TIME1都为0
   GOTO   BUZZ_END
BUZZ_END:
   BCF    RUN_FLAG,RUN_BUZZ
   BCF    TIME_FLAG,TIME_BUZZ_START
   RETLW  0
BUZZ_NOEND
   MOVLW  0FFH
   MOVWF  BUZZ_TIME2
   RETLW  0
;***************************************
;初始化时蜂鸣程序
;***************************************
INIT_BUZZ:
   MOVF   TMR0,0
   BTFSS  STATUS,2
   GOTO   INIT_BUZZ
   MOVLW  D'210'            ;OSC=4MHz:120,OSC=RC:210
   MOVWF  TMR0
   BTFSS  TIME_FLAG,TIME_INT
   GOTO   INIT_BUZZ_1
   BCF    TIME_FLAG,TIME_INT
   CALL   BUZZ              ;蜂鸣
   BTFSC  RUN_FLAG,RUN_BUZZ
   GOTO   INIT_BUZZ
   RETLW  0
INIT_BUZZ_1:
   BSF    TIME_FLAG,TIME_INT
   CALL   BUZZ              ;蜂鸣
   GOTO   INIT_BUZZ
;***************************************
DELAY_10ms:
   MOVLW  01H               ;3F
   MOVWF  COUNT1
   MOVLW  0FFH
   MOVWF  COUNT2 
DELAY_10ms_1:              
   DECFSZ COUNT1,1    
   GOTO   DELAY_10ms_2 
   RETLW  0 
DELAY_10ms_2:
   DECFSZ COUNT2,1
   GOTO   DELAY_10ms_2  
   GOTO   DELAY_10ms_1
DELAY_SHOW:
   MOVLW  0x10
   MOVWF  COUNT3
DELAY_SHOW_1:
   DECFSZ COUNT3,1
   GOTO   DELAY_SHOW_1
   RETLW  0
;*********************************
;      键盘程序
;*********************************
TEST_KEY:
   MOVLW  0x0C              ;0CH
   TRIS   6                 ;RB2,RB3 INPUT
   BCF    RB,0              ;scan 1 line
   BCF    RB,1
   MOVLW  0x0C
   ANDWF  RB,0
   MOVWF  TEMP
   MOVLW  0x0C
   SUBWF  TEMP,0
   BTFSS  STATUS,2
   GOTO   SAVE_KEY_VAL
;   MOVLW  0x0C              ;0CH
;   TRIS   6                 ;RB2,RB3 INPUT
;   BSF    RB,0              ;scan 2 line
;   BCF    RB,1
;   MOVLW  0x0C
;   ANDWF  RB,0
;   MOVWF  TEMP
;   MOVLW  0x0C
;   SUBWF  TEMP,0
;   BTFSS  STATUS,2
;   GOTO   SAVE_KEY_VAL
   GOTO   MAIN1
SAVE_KEY_VAL
   MOVLW  0x0F              ;Low 4 Bit
   ANDWF  RB,0
   MOVWF  KEY_VAL
   CALL   DELAY_10ms 
   MOVLW  0x0F
   ANDWF  RB,0
   SUBWF  KEY_VAL,0
   BTFSS  STATUS,2
   GOTO   MAIN1             ;是干扰
   BSF    TIME_FLAG,KEY_BOUND;确实按下
   GOTO   MAIN1
WAIT_KEY_BOUND:
   MOVLW  0x0C
   TRIS   6                 ;RB2,RB3 INPUT
   BCF    RB,0
   BCF    RB,1
   MOVLW  0x0C
   ANDWF  RB,0
   MOVWF  TEMP
   MOVLW  0x0C
   SUBWF  TEMP,0
   BTFSS  STATUS,2
   GOTO   MAIN1
CAL_KEY_VAL:
;   BSF    TIME_FLAG,NO_PRESS  ;不进行按键扫描标记
;   MOVLW  0xFE
;   MOVWF  TIME_1              ;不进行按键扫描时间寄存器
;   MOVLW  0x03
;   MOVLW  TIME_2
   BCF    TIME_FLAG,KEY_BOUND ;清键按下标记
   MOVLW  0x06
   SUBWF  KEY_VAL,0
   BTFSC  STATUS,2
   GOTO   POWER_KEY          ;调用电源子程序
   MOVLW  0x0A
   SUBWF  KEY_VAL,0
   BTFSC  STATUS,2
   GOTO   FAST_KEY           ;调用快档子程序

   MOVLW  0x05
   SUBWF  KEY_VAL,0
   BTFSC  STATUS,2
   GOTO   SLOW_KEY           ;调用慢档子程序
   MOVLW  0x09
   SUBWF  KEY_VAL,0
   BTFSC  STATUS,2
   GOTO   LAMP_KEY           ;调用灯子程序
   GOTO   MAIN1
;****************************************
SLOW_KEY:                    ;慢档子程序
   CLRF   KEY_VAL
   BSF    RUN_FLAG,RUN_BUZZ  ;蜂鸣

   BTFSC  RUN_FLAG,RUN_SLOW
   GOTO   SLOW_OFF
   BCF    RB,6               ;快档关
   BCF    RUN_FLAG,RUN_FAST

   BSF    RB,5               ;慢档开
   BSF    RUN_FLAG,RUN_SLOW
   BSF    RUN_FLAG,RUN_POWER
   GOTO   MAIN1 
SLOW_OFF:
   BCF    RB,5
   BCF    RUN_FLAG,RUN_SLOW
   BTFSS  RUN_FLAG,RUN_LAMP
   BCF    RUN_FLAG,RUN_POWER
   GOTO   MAIN1

;*****************************************
FAST_KEY:                    ;快档子程序
   CLRF   KEY_VAL
   BSF    RUN_FLAG,RUN_BUZZ  ;蜂鸣

   BTFSC  RUN_FLAG,RUN_FAST
   GOTO   FAST_OFF
   BCF    RB,5               ;慢档关
   BCF    RUN_FLAG,RUN_SLOW

   BSF    RB,6               ;快档开
   BSF    RUN_FLAG,RUN_FAST
   BSF    RUN_FLAG,RUN_POWER
   GOTO   MAIN1  
FAST_OFF:
   BCF    RB,6
   BCF    RUN_FLAG,RUN_FAST
   BTFSS  RUN_FLAG,RUN_LAMP
   BCF    RUN_FLAG,RUN_POWER
   GOTO   MAIN1
;*******************************************
POWER_KEY: 
   CLRF   KEY_VAL
   BTFSS  RUN_FLAG,RUN_POWER ;测电源指示灯亮跳
   GOTO   MAIN1
   CLRF   RUN_FLAG
   BSF    RUN_FLAG,RUN_BUZZ   ;蜂鸣
   BCF    RB,4               ;灯灭
   BCF    RB,6               ;快档关

   BCF    RB,5               ;慢档关
   GOTO   MAIN1
;**************************************
LAMP_KEY:                     ;灯子程序
   CLRF   KEY_VAL
   BSF    RUN_FLAG,RUN_BUZZ  ;蜂鸣  
   BTFSS  RUN_FLAG,RUN_LAMP  ;测灯指示灯亮跳
   GOTO   LAMPON    
   BCF    RB,4               ;灯灭
   BCF    RUN_FLAG,RUN_LAMP
   BTFSC  RUN_FLAG,RUN_SLOW
   GOTO   MAIN1
   BTFSC  RUN_FLAG,RUN_MID
   GOTO   MAIN1
   BTFSS  RUN_FLAG,RUN_FAST
   BCF    RUN_FLAG,RUN_POWER
   GOTO   MAIN1
LAMPON:                       ;关灯子程序
   BSF    RB,4                ;灯亮
   BSF    RUN_FLAG,RUN_LAMP
   BSF    RUN_FLAG,RUN_POWER
   GOTO   MAIN1
;*****************************************
DISPLAY
   MOVLW  0
   TRIS   6
   CLRF   RB
   BTFSC  RUN_FLAG,RUN_POWER
   BSF    RB,0
   BTFSC  RUN_FLAG,RUN_SLOW
   BSF    RB,1
   CALL   DELAY_SHOW
   CLRF   RB
   BTFSC  RUN_FLAG,RUN_FAST
   BSF    RB,0
   BTFSC  RUN_FLAG,RUN_LAMP
   BSF    RB,1
   CALL   DELAY_SHOW
   CLRF   RB
   RETLW  0
INIT:
   MOVLW  01H               ;0
   OPTION                   ;置RTCC有效WDT无效内部时钟计数1:128
   MOVLW  0H   
   TRIS   5
   MOVLW  0CH
   TRIS   6                 ;2,3 INPUT
   CLRF   RA
   CLRF   RB
   CLRF   KEY_VAL
   CLRF   RUN_FLAG          ;运行状态不显示
   CLRF   TIME_FLAG
   CLRF   TIME_1
   BSF    RUN_FLAG,RUN_BUZZ
   CALL   INIT_BUZZ
MAIN:                        ;主程序
   BTFSC  TIME_FLAG,NO_PRESS ;
   GOTO   MAIN1
   BTFSS  TIME_FLAG,KEY_BOUND ;判键按下
   GOTO   TEST_KEY
;   BTFSC  TIME_FLAG,KEY_BOUND
   GOTO   WAIT_KEY_BOUND
MAIN1:
;   CALL   DISPLAY
   MOVLW  D'10'              ;10D
   SUBWF  TMR0,0
   BTFSC  STATUS,0           ;测试RTCC小于10即已溢出一次
   GOTO   MAIN
   MOVLW  D'215'             ;215
   ADDWF  TMR0,1             ;置计数初值
;
   BTFSS  TIME_FLAG,NO_PRESS ;
   GOTO   MAIN2
   DECFSZ TIME_1,1
   GOTO   MAIN2
   DECFSZ TIME_2,1
   GOTO   MAIN1_1
   BCF    TIME_FLAG,NO_PRESS
   GOTO   MAIN2
MAIN1_1
   MOVLW  0xFE
   MOVWF  TIME_1
;
MAIN2
   BTFSS  RUN_FLAG,RUN_BUZZ
   GOTO   MAIN
   BTFSS  TIME_FLAG,TIME_INT
   GOTO   MAIN3
   BCF    TIME_FLAG,TIME_INT
   CALL   BUZZ
   GOTO   MAIN
MAIN3
   BSF    TIME_FLAG,TIME_INT
   CALL   BUZZ
   GOTO   MAIN
   END

⌨️ 快捷键说明

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