需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来

需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来,第1张

这个是单独的键盘扫描子程序,你可以借鉴一下..

我使用的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

}

本程序,使用的变量最少,也不涉及其它接口。

代源带册码最少,执行效率最高。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12432357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存