关于矩阵键盘程序

2019-07-15 19:39发布

请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。
程序如下,“//”后面的内容加了为去抖的。

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;
        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
SmallGang
1楼-- · 2019-07-16 01:15
这个不太懂……
olive2003
2楼-- · 2019-07-16 04:41
继续求解..~~~~~~
olive2003
3楼-- · 2019-07-16 09:30
本帖最后由 olive2003 于 2014-5-20 23:06 编辑

今天试了下在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;
   
}


}

liu@cqupt
4楼-- · 2019-07-16 10:42
 精彩回答 2  元偷偷看……
HYBGWC
5楼-- · 2019-07-16 10:44
请教下矩阵键盘程序加了去抖程序哪里错误。
个人用的反转法,发现不加去抖程序的时候运行正常。加了去抖反而检测不出按键了,求教。
程序如下,“//”后面的内容加了为去抖的。

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;
        }

HYBGWC
6楼-- · 2019-07-16 11:42
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;
        }

一周热门 更多>