其实就是一个按键的switch语句来的:如下,我只是在那个数码管的地方,换成了其它语句,出现的现象是:switch会不断地执行,比如,我在第一个case中有一个c++;的语句,只要我按了第一个键,那个c就会加到最大值,怎么这样呢,而且,我也不断地修改那个key的值,结果还是一样,只要你按了一个键,它就会在那个case语句里,重复地执行里面的语句。
void delay(uint i);
void main()
{
uchar key;
P2=0x00;
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
那个键值我也测试过。就让程序跑到后面的时候将它用其它值覆盖掉,没用~~~因为,它每扫一次,如果没有按下键,就会返回一个值,一个不是键的,所以
它里面已经包含了有修改KEY值的了。
unsigned char keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(200); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff);
}
void delay(unsigned int i)
{
while(i--);
我在百度上找到答案,有些网友说是程序跑飞了,我就觉得怪了,跑飞那也不会重复啊~~
还有 LZ是否定义过 uchar,否则key不一定是unsigned char 格式,引起数值错误
-----------------------------------------------------------------------
试试下面的键盘扫描函数
unsigned char keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(200); //去抖
P3=0x0f;
cord_h=P3&0x0f;
if(cord_h!=0x0f)
{
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff);
}
-----------------------------------------------------------------------
键盘扫描的原理都是一样的~结果还是一样,呵呵~~谢谢你哈!
一周热门 更多>