键盘与主板不兼容的一种表现,还有一些现象,如无法开机,电脑不定期死机,这个是无法修复的,如果你买的是低端山寨键盘,请换中高端品牌键盘。单片机书上应该有讲的哦,多查资料。既然是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 }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)