;该pic单片机键盘程序通过PORTB的"电平变化中断"进行键盘的输入,使按下K1键时第一个数码管显示1,按下K2 ;键时第一个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个数码管上显示4 ;对键盘的扫描采用中断方式
LIST P=18F458 INCLUDE "P18F458.INC"
;所用的寄存器 JIANR EQU 0X20 DEYH EQU JIANR+1 DEYL EQU JIANR+2 ORG 0X00 GOTO MAIN ORG 0X08 GOTO INTSERVE ORG 0X30 ;************以下为码值转换表************** CONVERT ADDWF PCL,1 RETLW 0XC0 ;0,显示段码与具体的硬件连接有关 RETLW 0XF9 ;1 RETLW 0XA4 ;2 RETLW 0XB0 ;3 RETLW 0X99 ;4 RETLW 0X92 ;5 RETLW 0X82 ;6 RETLW 0XD8 ;7 RETLW 0X80 ;8 RETLW 0X90 ;9 RETLW 0X88 ;A RETLW 0X83 ;B RETLW 0XC6 ;C RETLW 0XA1 ;D RETLW 0X86 ;E RETLW 0X8E ;F RETLW 0X7F ;"." RETLW 0XBF ;"-" RETLW 0X89 ;H RETLW 0XFF ;DARK RETURN ;***************初始化子程序*************** INITIAL CLRF INTCON ;禁止总中断和外围中断 BSF INTCON,RBIE ;B口变位中断允许 BCF INTCON2,7 ;使弱上拉有效 BSF INTCON2,0 ;B口变位中断高优先级 BSF RCON,7 ;使能中断优先级 BCF TRISA,5 ;置RA5为输出方式,以输出锁存信号 BCF TRISB,1 BCF TRISA,3 BCF TRISE,0 BCF TRISE,1 BSF TRISB,4 ;设置与键盘有关的各口的输入输出方式 BCF TRISC,5 BCF TRISC,3 ;设置SCK与SDO为输出方式 MOVLW 0XC0 MOVWF SSPSTAT ;设置SSPSTAT寄存器 MOVLW 0X30 MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并在时钟下降 ;沿发送数据,与“74HC595当其SCLK从低到高电平 ;跳变时,串行输入数据(DI)移入寄存器"的特点相对应。 MOVLW 0X01 MOVWF JIANR ;显示值寄存器赋初值 BCF PORTB,1 BCF PORTA,3 BCF PORTE,0 BCF PORTE,1 ;K1,K2,K3,K4四条列线置0,为电平变化中断的 ;产生创造初始条件 MOVF PORTB,W ;读PORTB端口,建立变位中断的初始条件 ; (由高到低时中断) RETURN ;返回 ;*************中断服务子程序***************** INTSERVE NOP BCF INTCON,RBIF ;中断标志清0 CALL KEYDELAY ;调用8ms的软件延时子程序,以消除抖动 MOVF PORTB,W ;读PORTB的值,并同时改变中断发生的条件,可屏蔽 ;一次按键松开时产生的无效的中断,又可以防止按键 ;时间过长发生连续中断 BTFSC PORTB,4 RETFIE ;判断为干扰,则返回,并可以屏蔽一次无用的中断 CALL KEYSERVE ;调用键服务子程序,确定键值 BCF PORTB,1 BCF PORTA,3 BCF PORTE,0 BCF PORTE,1 ;送低电平至K1,K2,K3,K4,以防止键扫描时改变 ;K1,K2,K3,K4的电平,从而改变中断条件 BCF INTCON,RBIF ;键扫描时可能会产生“电平变化”而使RBIF ;置1,再清除一次RBIF以求避免额外中断 MOVF JIANR,W ;把需要显示的值送给W寄存器 CALL CONVERT ;查要显示的段码 CALL DISPLAY ;调用显示子程序 RETFIE ;中断返回 ;***************显示子程序****************** DISPLAY CLRF PORTA MOVWF SSPBUF LOOP NOP BTFSS PIR1,SSPIF GOTO LOOP NOP BCF PIR1,SSPIF BSF PORTA,5 ;详细程序语句请参考3. 1. 3节 RETURN ;*********键盘去抖子程序(8ms的延时)****************** KEYDELAY MOVLW 0X0A MOVWF DEYH AGAIN2 MOVLW 0XFF MOVWF DEYL AGAIN1 DECFSZ DEYL,1 GOTO AGAIN1 DECFSZ DEYH,1 GOTO AGAIN2 ;具体程序语句参考3. 2节 RETURN ;***************键服务子程序****************** KEYSERVE JIANZHI ;确定键值的子程序 BCF PORTB,1 BCF PORTA,3 MOVLW 0X03 MOVWF PORTE ;K1,K2置低电平,K3,K4置高电平 NOP NOP ;使引脚电平稳定 BTFSS PORTB,4 GOTO K1K2 ;RB4为0,表示按键为K1,K2中的一个 GOTO K3K4 ;RB4为1,表示按键为K3,K4中的一个
K1K2 BCF PORTB,1 BSF PORTA,3 ;K1置低电平,K2置高电平 NOP NOP ;使引脚电平稳定 BTFSS PORTB,4 GOTO K1 ;RB4为0,表示按键为K1 GOTO K2 ;RB4为1,表示按键为K2
K3K4 BCF PORTE,0 BSF PORTE,1 ;K3置低电平,K4置高电平 NOP NOP ;使引脚电平稳定 BTFSS PORTB,4 GOTO K3 ;RB4为0,表示按键为K3 GOTO K4 ;RB4为1,表示按键为K4,以上对键盘进行扫描, ;来确定是哪一个键按下 K1 MOVLW 0X03 MOVWF JIANR GOTO RET K2 MOVLW 0X05 MOVWF JIANR BCF PORTA,3 GOTO RET K3 MOVLW 0X07 MOVWF JIANR GOTO RET K4 MOVLW 0X09 MOVWF JIANR ;以上根据按下的键把相应的值送给JIANR BCF PORTE,1 RET NOP RETURN ;**************************************** MAIN NOP CALL INITIAL ;调用初始化子程序 BSF INTCON,GIE ;总中断允许 HERE GOTO HERE ;等待中断发生 END |