谁能帮我分析此键盘扫描显示程序?

2019-07-15 16:35发布

#include <reg52.h>
char num;
char temp;

sbit beep=P2^3;
sbit duan=P2^6;
sbit wei=P2^7;
unsigned char leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                                0x00,  //熄灭
                         };

void keyboard();
void display(char shu);
void hang1();
void hang2();
void hang3();
void hang4();

void main()
{
        beep=1;
        while(1)
        {
                keyboard();        //扫描键盘
                display(num);//显示键盘数字       
        }

}

void delay(unsigned char i)         //延时函数
{
        int j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

void keyboard()                  //键盘扫描函数
{
        hang1();   //扫描第一行按键
        hang2();   //扫描第二行按键
        hang3();   //扫描第三行按键
        hang4();   //扫描第四行按键

}

void display(char shu)         //显示函数
{
        if(shu/10)
                {
                         P0=0x7f;
                        wei=1;
                        wei=0;

                        P0=leddata[shu%10];
                        duan=1;
                        duan=0;

                        P0=0xbf;
                        wei=1;
                        wei=0;

                        P0=leddata[shu/10];
                        duan=1;
                        duan=0;

                }
                else
                        {
                                 P0=0x7f;
                                wei=1;
                                wei=0;
                               
                                P0=leddata[shu];
                                duan=1;
                                duan=0;
                        }
                       
}

void hang1()   //第一行按键扫描函数
{
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
                  beep=0;
                delay(10);
                beep=1;
                switch(temp)
                        {
                                case 0x70:  num=4;
                                                        break;
                                case 0xb0:  num=3;
                                                        break;
                                case 0xd0:  num=2;
                                                        break;
                                case 0xe0:  num=1;
                                                        break;               
                         }
          }
       
    }       
}

void hang2()         //第二行按键扫描函数
{
        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
                  beep=0;
                delay(10);
                beep=1;
                switch(temp)
                        {
                                case 0x70:  num=8;
                                                        break;
                                case 0xb0:  num=7;
                                                        break;
                                case 0xd0:  num=6;
                                                        break;
                                case 0xe0:  num=5;
                                                        break;               
                         }
          }
       
    }       
}

void hang3()   //第三行按键扫描函数
{
        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
                  beep=0;
                delay(10);
                beep=1;
                switch(temp)
                        {
                                case 0x70:  num=12;
                                                        break;
                                case 0xb0:  num=11;
                                                        break;
                                case 0xd0:  num=10;
                                                        break;
                                case 0xe0:  num=9;
                                                        break;               
                         }
          }
       
    }       
}

void hang4()  //第四行按键扫描函数
{
        P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
                  beep=0;
                delay(10);
                beep=1;
                switch(temp)
                        {
                                case 0x70:  num=16;
                                                        break;
                                case 0xb0:  num=15;
                                                        break;
                                case 0xd0:  num=14;
                                                        break;
                                case 0xe0:  num=13;
                                                        break;               
                         }
          }
       
    }       
}
P3口赋值后 temp第一次赋值后 temp再次赋值后

不连接硬件的情况下,单纯从C语言角度看,程序不应该进入到if语句中啊,可是我在Keil中调试的时候却发现程序可以执行到if语句内部,为什么会这样?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
小代码
2019-07-15 19:24
unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
KeyPort=0x0f;            //行线输出全为0
cord_h=KeyPort&0x0f;     //读入列线值
if(cord_h!=0x0f)    //先检测有无按键按下
{
  DelayMs(10);        //去抖
  if((KeyPort&0x0f)!=0x0f)
  {
    cord_h=KeyPort&0x0f;  //读入列线值
    KeyPort=cord_h|0xf0;  //输出当前列线值
    cord_l=KeyPort&0xf0;  //读入行线值

    while((KeyPort&0xf0)!=0xf0);//等待松开并输出

    return(cord_h+cord_l);//键盘最后组合码值
   }
  }return(0xff);     //返回该值
}
这个矩阵键盘扫描简单多了
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
你将 P3=0xf0,应该就不会出现你说的问题了

一周热门 更多>