;该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为输出方式
MOV LW 0XC0
MOV WF SSPSTAT ;设置SSPSTAT寄存器
MOV LW 0X30
MOV WF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并在时钟下降
;沿发送数据,与“74HC595当其SCLK从低到高电平
;跳变时,串行输入数据(DI)移入寄存器"的特点相对应。
MOV LW 0X01
MOV WF JIANR ;显示值寄存器赋初值
BCF PORTB,1
BCF PORTA,3
BCF PORTE,0
BCF PORTE,1 ;K1,K2,K3,K4四条列线置0,为电平变化中断的
;产生创造初始条件
MOV F PORTB,W ;读PORTB端口,建立变位中断的初始条件
; (由高到低时中断)
RETURN ;返回
;*************中断服务子程序*****************
INTSERVE NOP
BCF INTCON,RBIF ;中断标志清0
CALL KEYDELAY ;调用8ms的软件延时子程序,以消除抖动
MOV F 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以求避免额外中断
MOV F JIANR,W ;把需要显示的值送给W寄存器
CALL CONVERT ;查要显示的段码
CALL DISPLAY ;调用显示子程序
RETFIE ;中断返回
;***************显示子程序******************
DISPLAY
CLRF PORTA
MOV WF SSPBUF
LOOP NOP
BTFSS PIR1,SSPIF
GOTO LOOP
NOP
BCF PIR1,SSPIF
BSF PORTA,5 ;详细程序语句请参考3. 1. 3节
RETURN
;*********键盘去抖子程序(8ms的延时)******************
KEYDELAY
MOV LW 0X0A
MOV WF DEYH
AGAIN2 MOV LW 0XFF
MOV WF DEYL
AGAIN1 DECFSZ DEYL,1
GOTO AGAIN1
DECFSZ DEYH,1
GOTO AGAIN2 ;具体程序语句参考3. 2节
RETURN
;***************键服务子程序******************
KEYSERVE
JIANZHI ;确定键值的子程序
BCF PORTB,1
BCF PORTA,3
MOV LW 0X03
MOV WF 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 MOV LW 0X03
MOV WF JIANR
GOTO RET
K2 MOV LW 0X05
MOV WF JIANR
BCF PORTA,3
GOTO RET
K3 MOV LW 0X07
MOV WF JIANR
GOTO RET
K4 MOV LW 0X09
MOV WF JIANR ;以上根据按下的键把相应的值送给JIANR
BCF PORTE,1
RET NOP
RETURN
;****************************************
MAIN NOP
CALL INITIAL ;调用初始化子程序
BSF INTCON,GIE ;总中断允许
HERE GOTO HERE ;等待中断发生
END
本文关键字:单片机 程序 键盘 PIC单片机,单片机-工控设备 - PIC单片机