本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar code keycode[]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,0xdd};//10个按键码值
uchar cord_h,cord_l,k=0xff,i;//行列值中间变量
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; //读入行线
for(i=0;i<10;i++)
{
if(cord_h+cord_l==keycode) //查找行列组合值在键盘表中位置
{ k=i; //找到,该位置即为键值
break;
} }
P3=0x0f;
while(P3!=0x0f); //等待按键释放
return k;
}
}return k; //返回该值
}
这个程序有问题吗?为什么后面执行一直不正确?
while(1)
{
num1=keyscan();
while(num1)
{
we0=0; //数码管动态扫描,we0,1,2都是位选。38译码器,亮前两个灯。
we1=0;
we2=0;
P0=tab[num1];
delay(300);
we0=1;
we1=0;
we2=0;
P0=tab[num2];
delay(300);
}
}
小弟程序是想让按下按键第一个数码管亮对应数值,再按下亮第二个数值。一直调试不成功,各位大哥帮帮忙啊。 |
|