C语言判断键盘按下和释放,是通过检测该键的状态来实现的。如果是单一的一个按键,那么直接检测该键是“1”还是“0”,就可以确定是按下还是释放。如果是矩阵键盘,那么需要发送扫描码,再检测输入值,来判断键盘中键的状态。以下举例说明:
bit keychk() //单一按键检测
{
if(P1.0==0) //如果键按下
{
delay() //延时去抖
if(P1.0==0)return(1) //返回键状态
}
return(0)
}
unsigned char kbscan(void) //矩阵扫描按键检测
{
unsigned char sccode,recode
P1=0x0f //发0扫描,列线输入
if ((P2 & 0x0f) != 0x0f) //有键按下
{
delay(20) //延时去抖动
if ((P1&0x0f)!= 0x0f)
{
sccode = 0xef //逐行扫描初值
while((sccode&0x01)!=0)
{
P1=sccode
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0
while((P1&0x0f)!=0x0f)//等待键抬起
return((~sccode)+(~recode))
}
else
sccode=(sccode<<1)|0x01
}
}
}
return 0 //无键按下,返回0
}
if(key_l!=0xf0){
delay_nms(5)
key_l=P1
……
在第4行加 while( key_l!=0xf0 )
等待按键释放,按键不放开就一直在此处等待,知道按键释放,此语句执行完。再往下执行
1、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义如下:P3.2:开始,按此键则灯开始流动(由上而下)
P3.3:停止,按此键则停止流动,所有灯为暗
P3.4:上,按此键则灯由上向下流动
P3.5:下,按此键则灯由下向上流动
UpDown EQU 00H 上下行标志
StartEnd EQU 01H 起动及停止标志
LAMPCODE EQU 21H 存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown 启动时处于向上的状态
CLR StartEnd 启动时处于停止状态
MOV LAMPCODE,#0FEH 单灯流动的代码
LOOP:
ACALL KEY 调用键盘程序
JNB F0,LNEXT 如果无键按下,则继续
ACALL KEYPROC 不然调用键盘处理程序
LNEXT:
ACALL LAMP 调用灯显示程序
AJMP LOOP 反复循环,主程序到此结束
DELAY:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
----------------------------------------延时程序,键盘处理中调用
KEYPROC:
MOV A,B 从B寄存器中获取键值
JB ACC.2,KeyStart 分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)
JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd 第一个键按下后的处理
AJMP KEY_RET
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)