打印
[51单片机]

帮忙解答一下疑问

[复制链接]
590|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DT天若有情|  楼主 | 2017-6-26 23:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
void delayms(uint z);
void matrixkeyscan();
void main()
{
  dula=1;
  P0=0;
  dula=0;
  wela=1;
  P0=0xc0;
  wela=0;
  while(1)
   {
    matrixkeyscan();
   }
  }

void delayms(uint z)  
{
  uint i,j;
  for(i=z;i>0;i--)
   for(j=110;j>0;j--);
}

void matrixkeyscan()
{
  uchar temp,num;
  P3=0xfe;
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
    delayms(10);
    temp=P3;
    temp=temp&0xf0
    if(temp!=0xf0)
     {
      temp=P3;
      switch(temp
       {
        case 0xee:num=0;break;       //0xee=1110 1110
        case 0xde:num=1;break;       //0xde=1101 1110
        case 0xbe:num=2;break;       //0xbe=1011 1110
        case 0x7e:num=3;break;       //0x7e=0111 1110
       }
      
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
     }
       dula=1;
       P0=table[num];             (请问上下这两个num是一回事吗,可以这样用吗,

                                                  上面的num我感觉是键盘,比如第一个num=0说的
                                                  是第一个键盘被选中,下面的P0=num就是赋值,从前边的code table选
                                                  我上面也可以写num=1...4,下面对应P0=num-1.

                                                  我的意思是第一个讲的是键盘选择,第二个是相应的赋值,这两个用一个Num不会出事吗            )
       dula=0;
     
    }
   


  P3=0xfd;
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
            
       {
       case 0xed:num=4;break;
       case 0xdd:num=5;break;
       case 0xbd:num=6;break;
       case 0x7d:num=7;break;
       }
      
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      }
       dula=1;
       P0=table[num];
       dula=0;
     
    }
   
   
  P3=0xfb;
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
            
       {
        case 0xeb:num=8;break;
        case 0xdb:num=9;break;
        case 0xbb:num=10;break;
        case 0x7b:num=11;break;
       }
      
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      
     }
       dula=1;
       P0=table[num];
       dula=0;
}
   
   
   
  P3=0xf7;
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
            
       {
        case 0xe7:num=12;break;
        case 0xd7:num=13;break;
        case 0xb7:num=14;break;
        case 0x77:num=15;break;
       }
      
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
      }
       dula=1;
       P0=table[num];
       dula=0;
}
}

相关帖子

沙发
mcu5i51| | 2017-6-27 08:02 | 只看该作者
程序好长,大概看了一下,你可以这样理解:
前面的是一个转换,把你说的键盘的键值转换为一个好用,好理解的值,这里是0-3;
后面的同样是一个转换,通过查表方式把键值转换为一个代码,同时在P0上输出,从表格的值是看应该是七段LED的数字码;即LED屏上会显示按下的键的键值;
前面是写num,后面是读num,所以没有冲突;

使用特权

评论回复
板凳
kingkits| | 2017-6-27 10:02 | 只看该作者
 temp=temp&0xf0; 
if(temp!=0xf0)
   {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;   
    if(temp!=0xf0)
     {
      temp=P3;    // Temp 重新赋值了,有可能已经发生变化了,这一行应该去掉。
      switch(temp) 
       {
       case 0xed:num=4;break;
       case 0xdd:num=5;break;
       case 0xbd:num=6;break;
       case 0x7d:num=7;break;
       }
   。。。
}
这里存在问题,看上面的注释

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

23

帖子

0

粉丝