每次按下RB2的按键,输出不同的结果,这个实例是:每按下1次RB2,C口的灯从低位开始显示,规律是:RC0-RC7的8个LED灯循环显示其实,读者可以变通一下,每按一下RB2,可以电亮一盏灯,可以执行一段程序,通过反复按压RB2可以实现多种功能循环的复杂程序.我就用他作了一个7音警报器程序.可见,键判断的应用是很广的,下边是实验学习程序: LIST P=PIC16F876A #INCLUDE P16F876A.INC;
*************************************COUNT1 EQU 20h ;定义一个廷时变量寄存器COUNT2 EQU 21h ;定义另一个廷时变量寄存器 ORG 0 GOTO START ORG D'20'START BSF STATUS,RP0 MOVLW B'00011111' MOVWF TRISB MOVLW B'00000000' MOVWF TRISC BCF OPTION_REG,7 BCF STATUS,RP0;
***************************************LOOP0 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP0 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP0 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,0 ;置C口0为1LOOP1 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP1 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP1 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;
***************************** LOOP2 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP2 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP2 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,1 ;置C口1为1LOOP3 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP3 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP3 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;*****************************
LOOP4 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP4 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP4 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,2 ;置C口2为1LOOP5 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP5 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP5 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;
***************************** LOOP6 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP6 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP6 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,3 ;置C口3为1LOOP7 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP7 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP7 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;
*****************************LOOP8 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP8 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP8 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,4 ;置C口4为1LOOP9 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP9 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP9 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;
*****************************LOOP10 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP10 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP10 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,5 ;置C口5为1LOOP11 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP11 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP11 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;
***************************** LOOP12 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP12 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP12 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,6 ;置C口6为1LOOP13 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP13 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP13 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 ;
***************************** LOOP14 BTFSC PORTB,2 ;测试S2按下否?是!跳过下条指令 GOTO LOOP14 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 BTFSC PORTB,2 ;再次测试S2按下否?是!跳过下条指令 GOTO LOOP14 ;为1,没按下,继续判断 CALL DELAY ;调用延时,消抖 CLRF PORTC BSF PORTC,7 ;置C口7为1LOOP15 BTFSS PORTB,2 ;判断松开否?为1,松开了,跳一步 GOTO LOOP15 ;为0,没放开,等待 CALL DELAY ;调用延时,消抖动 BTFSS PORTB,2 ;再次判断S2松开否?为1,松开了,跳一步 GOTO LOOP15 ;为0,没放开,等待 CALL DELAY ;为0,按键按下了,调用消抖动 GOTO LOOP0;
****************************DELAY MOVLW D'13' MOVWF COUNT2LOP0 MOVLW D'255' MOVWF COUNT1 DECFSZ COUNT1,1 ;延时消抖程序 GOTO $-1 DECFSZ COUNT2,1 GOTO LOP0 RETURN;*****************************
END