矩阵键盘扫描程序

矩阵键盘扫描程序,第1张

你要放到“死循环”中不断扫描。他的原理图一般是这样的

以第一个按键为例,当你按下时I/O口读到的数据就不是0x0f了。好吧你最开始的赋值错了。你要用0xee,0xde检测的话你应该给0xfe。每四个按键是一组。我这有一个我做密码锁的程序你参考一下。

void key()

{

    P3=0xfe;

    if(P3!=0xfe)

    {

        time(50);

        if(P3!=0xfe)

            {

            switch(P3)

                {

case 0xee:num=1,cs++;

break;

case 0xde:num=2,cs++;

break;

case 0xbe:num=3,cs++;

break;

case 0x7e:num=4,cs++;

break;

                }

        }

        while(P3!=0xfe);

}

P3=0xfd;

if(P3!=0xfd)

{

time(50);

if(P3!=0xfd)

{

switch(P3)

{

case 0xed:num=5,cs++;

break;

case 0xdd:num=6,cs++;

break;

case 0xbd:num=7,cs++;

break;

case 0x7d:num=8,cs++;

break;

}

}

while(P3!=0xfd);

}

P3=0xfb;

if(P3!=0xfb)

{

time(50);

if(P3!=0xfb)

{

         switch(P3)

{

case 0xeb:num=9,cs++;

break;

case 0xdb:num=0,cs++;

break;

case 0xbb:cs++;

break;

case 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1;

break;

}

  }

while(P3!=0xfb);

}

}

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

我使用的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=1;break;

case 0x7d:P0=led[2];cord=2;break;

case 0x7b:P0=led[3];cord=3;break;

case 0x77:P0=led[4];cord=4;break;

case 0xbe:P0=led[5];cord=5;break;

case 0xbd:P0=led[6];cord=6;break;

case 0xbb:P0=led[7];cord=7;break;

case 0xb7:P0=led[8];cord=8;break;

case 0xde:P0=led[9];cord=9;break;

case 0xdd:P0=led[0];cord=0;break;

case 0xee:cord=13;break;

case 0xed:cord=14;break;

case 0xeb:cord=15;break;

case 0xe7:cord=16;break;

}

P2=h;

return(cord);//键盘最后组合码值

}

}return(0xff); //返回该值

}

如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~

祝您的问题早日得到解决 谢谢

P3=0xfe; //P3=0b1111 1110,令P30=0,同时令高四位为高电平,作好读端口准备(51IO特点)

temp=P3; //读回P3口的状态

temp=temp&0xf0; //temp&1111 0000,0与任何数结果为0,把temp变量的低四位屏蔽了,高四位因为任何数与1等于它本身,所以把高四位对应的端口状态读进来。

while(temp!=0xf0) //上步处理后,高四为不全为1,说明有按键按下(结合矩阵键盘的电路结构才能理解,这里不方便上图)

{

delay(5);

temp=P3;

temp=temp&0xf0;//这三句跟上面重复,功能是软件消抖

while(temp!=0xf0) //延时一段时间后判断还有按键按下,说明是真有按键按下,进入按键扫描与键值的判断,否则可能是意外抖动引起的,就不进行按键扫描。

{

temp=P3;

switch(temp)

我想注释完应该能读懂,关键是要理解矩阵键盘的扫描原理。

以上就是关于矩阵键盘扫描程序全部的内容,包括:矩阵键盘扫描程序、需要一个STC89C52芯片的矩阵按键扫描程序,要求:每一个按键(共16个)对应数码管0~F显示出来、单片机按键检测程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10129873.html

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

发表评论

登录后才能评论

评论列表(0条)

保存