我使用的P3口接的矩阵键盘,你可以根据需要适当改变. 还要注意我的键值可能和你不一样,这就要看你的硬件电路是怎么设计的了.
uint keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uint cord_h,cord_l,cord//行列值
P3=0x0f //行线输出全为0
cord_h=P3&0x0f//读入列线值
if(cord_h!=0x0f)//先枣橘检测有无按键按下
{
delay() //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f //读入列线值
P3=cord_h|0xf0 //输出当前列线值
cord_l=P3&0xf0 //读入行线值
for()
{
P3=0x0f
if(P3==0x0f)
break
}
P10=0
delayring()
P10=1
switch(cord_h+cord_l)
{
case 0x7e:P0=led[1]cord=1break
case 0x7d:P0=led[2]cord=2break
case 0x7b:P0=led[3]cord=3break
case 0x77:P0=led[4]cord=4break
case 0xbe:P0=led[5]cord=5break
case 0xbd:P0=led[6]cord=6break
case 0xbb:P0=led[7]cord=7break
case 0xb7:P0=led[8]cord=8break
case 0xde:P0=led[9]cord=9break
case 0xdd:P0=led[0]cord=0break
case 0xee:cord=13break
case 0xed:cord=14break
case 0xeb:cord=15break
case 0xe7:cord=16break
}
P2=h
return(cord)//键盘最后组合码值
}
}return(0xff)//返庆激回该值
}
如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你誉岩袜用的是共阴的还是共阳的数码管了~~
祝您的问题早日得到解决. 谢谢
取那么多、那么长时间的平均值干什么?连续取 20 次,其中有10 次,按的是这个键,有10 次,按的是那个键,
平均一下,判定结果:是按下了一个根本就没有按的键。
========
#include<reg52.h>键蔽
#include<intrins.h>
unsigned char code k_AD[] = {
10, 40, 70, 100, 130, 160, 190, 210, 230}//九个按基兆键所对应的ADC值
unsigned char code duan[] = { //共阳段码
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
//--------------------------------------------
void delay(int x)
{
int i
while(x--) for(i = 115i >0i--)
}
//--------------------------------------------
unsigned char keyscan()
{
unsigned char k1, k2
k1 = GetADCResult(0)//读出
if(k1 <238) { //按下了
delay(20)//延时
k2 = GetADCResult(0) //再次读出
if((k1 >(k2 - 5) &&(k1 <(k2 + 5)) { //两者相差无几
k1 /= 2 k2 /= 2 k1 += k2//两次的平均值
for(k2 = 0k2 <9k2++) //稿锋州在表格中查找9次
if(k1 >(k_AD[k2]) - 5) &&(k1 <(k_AD[k2]) + 5)) //找到了
return(k2) //就返回键值
}
}
return(255) //没有按键
}
//--------------------------------------------
void main()
{
unsigned char key
while(1) {
key = keyscan()
if(key != 255) P0 = duan[key]//显示键值
}
}
//--------------------------------------------
本程序未经验证,仅供参考。
2*3的键盘雹宏,太简单了,不值得用循环,特别是双重循环。最简明、行搜高效的程序如下:
sbit P10 = P1^0
sbit P11 = P1^1
sbit P12 = P1^2
sbit P13 = P1^3
sbit P14 = P1^4
char scan_key(void)
{
P13 = 0
if (!P10) return 0
if (!P11) return 1
if (!P12) return 2
P13 = 1
P14 = 0
if (!P10) return 3
if (!P11) return 4
if (!P12) return 5
}
本程序,使用的变量最少,也不涉及其它接口。
代源带册码最少,执行效率最高。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)