📄 4key led.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 + -