你这程序这么写,在调用时肯定会重复读取一个键值的。
改进方法:在没有按键时,读取的键值应该是多少,知道吗,或者能计算出来吗?用xx表示。
主程序要用一个变量,假设叫keyx,保存原键值的,初始值就是那个未按键的值keyx=xx。
好了,在主程序调用时,判断键值,是未按键:keyx=xx,就不处理。继续调用。
如果有按键,按键值=keyx?不等,说明是新按键了,keyx=新键值。
这时会出现重复读取的现象了,但是:按键值=keyx了,就不处理了。
这样有按键,只处理一次。
当松开按键,读取的是按键值xx,keyx=xx了。
再有新按键,按键值=keyx肯定不成立,则又有新按键,依此类推,就可以了。
单片机书上应该有讲的哦,多查资料。
既然是4x4,即4行4列了,共需要8个I/O口,有8bit数据(如高四位为行4bit,低四位为列4bit)位:xxxx xxxx。还要结合你的程序来编码键值,如果有键按下了,查询所有按键的所连接的I/O口电平状态,每个按键需要两个I/O口,一端连接行(行4bit之一),一端连接列(列4bit之一);若此时按键的电平状态为0010 0001,即十六进制数据0x21,按下的按键所对应的键值编码即为0x21。当然为了使用方便,在确定了按下按键的编码后,可对其赋值,我要将它赋值为数字键8,方便后续编程使用。例:
//获取键值编码,由于确定哪个按键按下
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
while(1)
{
key=keyscan();//调用键盘扫描,
//keyVal=0~15表示按键对应的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}
如果你用的键盘hook的话,你可以用msdn查询一下里面包含了 keyboardproc回调函数的
参数的解释!!其中 wparam就是所谓的 虚拟件 例如
VK_SPACED代表 空格
在vb中你可以 根据 定义宏或者常量来 给16进制的 数字赋值 然后旧可以和c一样调用
vk_拉, 加分谢谢!!!
RegValue = CreateObject("WscriptShell")RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
Msgbox(RegValue)
以上就是关于C51单片机键值重复读取全部的内容,包括:C51单片机键值重复读取、单片机中的4×4矩阵键盘的键值怎么求、VB里如何获得在windows下按键盘的键值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)