矩阵键盘按键LED显示键值

这两天事情很忙,有时间的时候才来调试一下程序。想调出一个LED显示矩阵键盘按键程序,调试了很久。先调其中的一行按键键值很OK。接着就调试4行按键程序,这其中出现了问题。

写的程序语法没有错误,逻辑上有错误很难找。最后参考了别人的程序,调出了满意的结果。

写矩阵一行的程序时,主程序:

 

main()

{

     init();

     while(1)

             {

 

                 keyscan();//键盘扫描程序,返回一个值全局变量keynum

                 display(keynum);

 

             }

}

单独调试第三行的时候没有出现问题,能得出正确的键值。

这样应该是不会出现错误。但是&与,&&按位与前者为总线操作,后者位操作。

&是位与运算;&&是逻辑与运算。
举例:a=0xfe;b=0x31;
则:a&b=0x30;  返回的是数据。
a=0xfe;b=0x31;c=0x11;d=0x00;
则:(a>b)&&(b>c)=1(真)
   (a>b)&&(c>a)=0(假,c小于a)
    a&&b  (真,对于不为0的数全为真,即  真“与”真,结果:真)
    a&&d  (假,a真d假,即  真“与”假,结果:假)
    返回的是布尔值。(只有1(真)和0(假))

等待松手程序和确认按键程序中都写成了,temp=P3;temp=temp&&0xf0;

所以出现了错误。

正确的程序为temp=P3;temp=temp&0xf0;

松手检测在确认按键后。

 

经过下列程序调试,实验成功。

/********************************************/
/**********矩阵键盘按键显示******************/
/***************************2010年2月7日21时*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keynum;
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39 ,0x5e,0x79,0x71};
void display(uchar num);


/******延时XMS************
**************************/
void delay(uchar xms)
{
    uchar i,j;
 for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}

 


/******初始化*******************
********************************/
void init()
{
duan=1;
P0=0x00;//初始时关段显示
duan=0;
wei=1;
P0=0x00;//位选全部选中
wei=0;
}


keyscan()
{
  uchar temp;
  P3=0xfe;//第三行 1111 1110
  temp=P3;
  temp=temp&0xf0;//屏蔽低四位
  if(temp!=0xf0)
   {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
  if(temp!=0xf0)
    {
   temp=P3;
   switch(temp)
   {
     case 0x7e:
                keynum=15;
       break;     //0111 1110
     case 0xbe:
                keynum=14;
       break;    
     case 0xde:
                keynum=13;
       break;    
     case 0xee:
                keynum=12;
       break;    
   }
      while(temp!=0xf0)
    {
     temp=P3;
     temp=temp&0xf0;
    }
    display(keynum);
   
    }
  
  
   }

 


  P3=0xfd; //第二行1111 1101
  temp=P3;
  temp=temp&0xf0;//屏蔽低四位
  if(temp!=0xf0)
   {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
  if(temp!=0xf0)
    {
   temp=P3;
   switch(temp)
   {
     case 0x7d:
                keynum=11;
       break;    
     case 0xbd:
                keynum=10;
       break;    
     case 0xdd:
                keynum=9;
       break;    
     case 0xed:
                keynum=8;
       break;   
   }
      while(temp!=0xf0)
    {
     temp=P3;
     temp=temp&0xf0;
    }
    display(keynum);
   
    }
  
  
   }


  P3=0xfb;//第一行1111 1011
  temp=P3;
  temp=temp&0xf0;//屏蔽低四位
  if(temp!=0xf0)
   {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
  if(temp!=0xf0)
    {
   temp=P3;
   switch(temp)
   {
     case 0x7b:
                keynum=7;
       break;    
     case 0xbb:
                keynum=6;
       break;    
     case 0xdb:
                keynum=5;
       break;   
     case 0xeb:
                keynum=4;
       break;    
   }
      while(temp!=0xf0)
    {
     temp=P3;
     temp=temp&0xf0;
    }
    display(keynum);
   
    }
  
  
   }

 

 

  P3=0xf7; //第零行 1111 0111
  temp=P3;
  temp=temp&0xf0;//屏蔽低四位
  if(temp!=0xf0)
   {
     delay(10);
     temp=P3;
     temp=temp&0xf0;
  if(temp!=0xf0)
    {
   temp=P3;
   switch(temp)
   {
     case 0x77:
                keynum=3;
       break;     //1110 1110
     case 0xb7:
                keynum=2;
       break;     //1101 1110
     case 0xd7:
                keynum=1;
       break;     //1011 1110
     case 0xe7:
                keynum=0;
       break;     //0111 1110
   }
      while(temp!=0xf0)
    {
     temp=P3;
     temp=temp&0xf0;
    }
    display(keynum);
   
    }
  
  
   }

 

 


}

void display(uchar num)
{
   duan=1;
   P0=table[num];
   duan=0;
  // delay(500);//时间足够短让人分辨不出来闪烁的效果
}

void main()
{
  init();
  while(1)
   {
     keyscan();
  //display();

 }

}

 

 

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值