微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于矩阵键盘程序

关于矩阵键盘程序

时间:10-02 整理:3721RD 点击:
请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。
程序如下,“//”后面的内容加了为去抖的。
uchar scan()
{
//        P1=0xf0;
//        temp=P1;
//        if(temp!=0xf0)
//        {
//                delay(5);
//                temp=P1;
//                if(temp!=0xf0)
//                {
                        P1=0xf0;
                        delay(5);
                    temp=P1&0xF0;
                    temp=~((temp>>4)|0xf0);
                        switch(temp)
                        {
                                case 8:key=1;break;
                                case 4:key=2;break;
                                case 2:key=3;break;
                                case 1:key=4;break;
                                default:key=17;
                        }                        
                    P1=0x0f;        //低四位输入
                    delay(5);  
                    temp=P1&0x0f;
                    temp=~(temp|0xF0);
                        switch(temp)
                        {
                                case 8:key=key+0;break;
                                case 4:key=key+4;break;
                                case 2:key=key+8;break;
                                case 1:key=key+12;break;
                                default:key=17;
                        }
//                           }}
        return key;
        }

这个不太懂……

继续求解..~~~~~~

今天试了下在scan()前独立出一个keydown()检测程序,只要一加,就又不行了。
还是把整个程序贴出来吧(LED灯的目的我只是用来检测按键1~8)
#include <STC89.H>
#define uchar unsigned char
#define uint unsigned int
uchar temp,key;
uchar scan();
void delay(uint c)
{
uint x,y;
for(x=0;x<c;x++)
  for(y=0;y<110;y++);
}
void keydown()
{
P1=0xf0;
temp=P1;
if(temp!=0xf0)
{
  delay(5);
  temp=P1;
  if(temp!=0xf0)
   key=scan();
}
}
uchar scan()
{
//        P1=0xf0;
//        temp=P1;
//        if(temp!=0xf0)
//        {
//                delay(5);
//                temp=P1;
//                if(temp!=0xf0)
//                {
                        P1=0xf0;
                        delay(5);
                    temp=P1&0xF0;
                    temp=~((temp>>4)|0xf0);
                        switch(temp)
                        {
                                case 8:key=1;break;
                                case 4:key=2;break;
                                case 2:key=3;break;
                                case 1:key=4;break;
                                default:key=17;
                        }                        
                    P1=0x0f;        //低四位输入
                    delay(5);  
                    temp=P1&0x0f;
                    temp=~(temp|0xF0);
                        switch(temp)
                        {
                                case 8:key=key+0;break;
                                case 4:key=key+4;break;
                                case 2:key=key+8;break;
                                case 1:key=key+12;break;
                                default:key=17;
                        }
//                           }}
        return key;
        }
void main()
{
keydown();        //这里如果我换成key=scan();,即跳过keydown直接scan就没问题
switch(key)
{
//  case 0:
//   P2=0xee;
//   delay(2000);
//   P2=0xff;
//   break;
  case 1:
   P2=0xfe;
   delay(2000);
   P2=0xff;
   break;
  case 2:
   P21=0;
   delay(2000);
   P21=1;
   break;
  case 3:
   P22=0;
   delay(2000);
   P22=1;
   break;
  case 4:
   P23=0;
   delay(2000);
   P23=1;
   break;
  case 5:
   P24=0;
   delay(2000);
   P24=1;
   break;
  case 6:
   P25=0;
   delay(2000);
   P25=1;
   break;
  case 7:
   P26=0;
   delay(2000);
   P26=1;
   break;
  case 8:
   P27=0;
   delay(2000);
   P27=1;
   break;
  default:
   P2=0x00;
   break;
   
}

}

你直接用扫描法吧,那个简单点吧:
具体是
令一行为0;
检测一列是否为0;
若是;
则延时抖动;
在检测这列是0不;
再写按键中要执行的程序;
最后让行变1,就可以了,参考下思路吧

请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。
程序如下,“//”后面的内容加了为去抖的。
uchar scan()
{
        P1=0xf0;                    //P1输出0xf0
        temp=P1;                   //读出P1端口的值赋给变量temp
        if(temp!=0xf0)            //如果有按键按下
       {
               delay(5);             //延时
                temp=P1;          //再次读取P1的值
                if(temp!=0xf0)   //确实有按键按下
               {
        //              P1=0xf0;         //问题应该出在这里,将这条语句去掉。把0xf0赋给p1后,
                        delay(5);
                    temp=P1&0xF0;    //P1&0xf0永远等于0xf0
                    temp=~((temp>>4)|0xf0);       //~((temp>>4)|0xf0)永远等于0x00
                        switch(temp)
                        {
                                case 8:key=1;break;
                                case 4:key=2;break;
                                case 2:key=3;break;
                                case 1:key=4;break;
                                default:key=17;               
                        }                        
                    P1=0x0f;        //低四位输入
                    delay(5);  
                    temp=P1&0x0f;
                    temp=~(temp|0xF0);
                        switch(temp)
                        {
                                case 8:key=key+0;break;
                                case 4:key=key+4;break;
                                case 2:key=key+8;break;
                                case 1:key=key+12;break;
                                default:key=17;
                        }
//                           }}
        return key;
        }

uchar scan()
{
        P1=0xf0;                    //P1输出0xf0
        temp=P1;                   //读出P1端口的值赋给变量temp
        if(temp!=0xf0)            //如果有按键按下
       {
               delay(5);             //延时
                temp=P1;          //再次读取P1的值
                if(temp!=0xf0)   //确实有按键按下
               {
        //              P1=0xf0;         //问题应该出在这里,将这条语句去掉。把0xf0赋给p1后,
                        delay(5);
                    temp=P1&0xF0;    //P1&0xf0永远等于0xf0
                    temp=~((temp>>4)|0xf0);       //~((temp>>4)|0xf0)永远等于0x00,后面的自己分析吧
                        switch(temp)
                        {
                                case 8:key=1;break;
                                case 4:key=2;break;
                                case 2:key=3;break;
                                case 1:key=4;break;
                                default:key=17;               
                        }                        
                    P1=0x0f;        //低四位输入
                    delay(5);  
                    temp=P1&0x0f;
                    temp=~(temp|0xF0);
                        switch(temp)
                        {
                                case 8:key=key+0;break;
                                case 4:key=key+4;break;
                                case 2:key=key+8;break;
                                case 1:key=key+12;break;
                                default:key=17;
                        }
//                           }}
        return key;
        }

嗯,我最先接触的是扫描法,不过觉得程序太长了。就试着换成这种了。

汗,换了个主程序,用数码管显示按键的序号,还是那个加了去抖的检测程序,居然没问题了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top