BSF PIE1,TMR1IE ;开定时器1中断
BCF STATUS,RP0 ;BANK0
MOVLW 0D8H ;TIM1 中断周期 10 ms
MOVWF TMR1H ;
MOVLW 0EFH
MOVWF TMR1L
CLRF T1CON
BSF T1CON,TMR1ON ;定时器1启动
GOTO MAIN
MAIN: NOP
NOP
CLRWDT
NOP
NOP
;GOTO MAIN
;CALL DELAY ;延时10毫秒
NOP
NOP
NOP
NOP
BTFSC BIT_SG,KEY_U
CALL KEY_INC
NOP
NOP
NOP
NOP
BTFSC BIT_SG,KEY_D
CALL KEY_DEC
NOP
NOP
NOP
NOP
BTFSC BIT_SG,KEY_DOK
GOTO KEY_DEC_OK
NOP
NOP
NOP
NOP
BTFSC BIT_SG,KEY_UOK
GOTO KEY_INC_OK
NOP
NOP
NOP
NOP
GOTO MAIN
KEY_DEC_OK: NOP
CALL KEY_DEC ;确认有 DOWN 键按下并放开
NOP
BCF BIT_SG,KEY_DOK
GOTO CH_NEW
KEY_INC_OK: NOP
CALL KEY_INC ;确认有 UP 键按下并放开
NOP
BCF BIT_SG,KEY_UOK
CH_NEW: CLRF SG_S1
CLRF SG_S2
NOP
CALL LED_HL ;显示新频道
NOP
NOP
CALL CXA ;设定新频道
NOP
NOP
MOVF CH_X,W
MOVWF VALU
MOVLW 01H
MOVWF ADDR
NOP
CALL EEPROM_W ;保存新频道
NOP
NOP
GOTO MAIN
KEY_INC: MOVF CH_X,W
MOVWF WW
MOVLW 0CH ;
SUBWF WW,W
BTFSC STATUS,Z
GOTO CH21 ;CH_X = CH12 加 1 转 CH_21
MOVLW 45H ;
SUBWF WW,W
BTFSC STATUS,Z
GOTO CH21 ;CH5 ;CH_X = CH69 加 1 转 CH_5
INCF CH_X,F ;其它正常加 1
GOTO INC_RET
CH21: MOVLW 15H
MOVWF CH_X
GOTO INC_RET
CH5: MOVLW 05H
MOVWF CH_X
NOP
INC_RET: NOP
CALL LED_HL
BCF BIT_SG,KEY_U
RETURN
KEY_DEC: NOP
MOVF CH_X,W ;确认有 DOWN 键按下
MOVWF WW
MOVLW 05H
SUBWF WW,W
BTFSC STATUS,Z
GOTO CH69 ;CH_X = CH5 减 1 转 CH_68
MOVLW 15H
SUBWF WW,W
BTFSC STATUS,Z
GOTO CH69 ;CH12 ;CH_X = CH21 减 1 转 CH_12
DECF CH_X,F ;其它正常减 1
GOTO DEC_RET
CH69: MOVLW 45H ;CH_69
MOVWF CH_X
GOTO DEC_RET
CH12: MOVLW 0CH ;CH_12
MOVWF CH_X
NOP
DEC_RET: CALL LED_HL
BCF BIT_SG,KEY_D
NOP
RETURN
;////////////////////////////////////////////////////////////////////////
T0_INT:
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
MOVF WW,W
MOVWF WW_TEMP
BCF STATUS,RP0
BCF PIR1,TMR1IF
MOVLW 0D8H ;TIM1 中断周期 10 ms
MOVWF TMR1H ;
MOVLW 0EFH
MOVWF TMR1L
CLRWDT
MOVF TIM_CUNT1,W ;计数器TIM_CUNT1
BTFSC STATUS,Z
GOTO INT00
DECF TIM_CUNT1,F
INT00: NOP
NOP
MOVF TIM_CUNT2,W ;计数器TIM_CUNT2
BTFSC STATUS,Z
GOTO INT01
DECF TIM_CUNT2,F
INT01: NOP
NOP
CALL DISPLAY ;显示LED
NOP
NOP
CALL KEYBOARD ;检测键盘
NOP
NOP
NOP
NOP ;
MOVF WW_TEMP,W
MOVWF WW
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;////////////////////////////////////////////////////////////////////////
KEYBOARD:
BCF STATUS,RP0
BCF STATUS,RP1 ;BANK0
BTFSS PORTA,S1
GOTO DOWN
NOP
BTFSS PORTA,S2
GOTO UP
GOTO KEY_SCH
;去抖动
DOWN: BTFSS SG_S1,0
GOTO DOWN1 ;第一次有 DOWN 键按下
BTFSC SG_S1,1
GOTO DOWN2 ;长按键
BSF SG_S1,1 ;确认有 DOWN 键按下
GOTO KEY_RET
DOWN1: BSF SG_S1,0 ;第一次有 DOWN 键按下标志
GOTO KEY_RET
NOP
DOWN2: BTFSC SG_S1,2
GOTO DOWN3
MOVLW 14H ;确认有长键延时 200 ms
MOVWF TIM_CUNT1
BSF SG_S1,2
GOTO KEY_RET
DOWN3: MOVF TIM_CUNT1,W
BTFSS STATUS,Z
GOTO KEY_RET
BSF BIT_SG,KEY_D ;
MOVLW 14H ;长按键周期200 ms
MOVWF TIM_CUNT1
GOTO KEY_RET
UP: BTFSS SG_S2,0
GOTO UP1 ;第一次有 UP 键按下
BTFSC SG_S2,1
GOTO UP2 ;长按键
BSF SG_S2,1 ;确认有 UP 键按下
上一页 [1] [2] [3] [4] 下一页
本文关键字:通信 程序 键盘 PIC单片机,单片机-工控设备 - PIC单片机