?? 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 + -