线反转法键盘扫描,数码管显示健值(原创)。。

2020-02-05 09:13发布

线反转法键盘扫描,数码管显示健值(原创)。。《初学者,望指教》以下是程序。。。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int  
uchar keytab[4][4]={{11,12,13,14},        //键盘编码
                        {21,22,23,24},  
                {31,32,33,34},
                {41,42,43,44}
                          };
uchar tabled[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段选显示数字编码
uchar code tablew[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选编码
void Delay(uint i);//延时函数申明
uchar keyscan();//键盘扫描函数申明
void table();//数码管显示函数申明
void main()          //主函数
{

  while(1)
        {
           table();
         }
}
void Delay(uint i) //延时函数
        {
                uint x,j;
                for(j=0;j<i;j++)
                for(x=0;x<=148;x++);   
        }
uchar keyscan()        //键盘扫描函数
{
  uchar hang,lie,ltemp,htemp,KEY;
  P1=0xf0;
  while(1)
         {
       P1=0xf0;
       if((P1&0xf0)!=0xf0)
                  {
                      Delay(20);
                          if((P1&0xf0)!=0xf0)
                          {
                                 htemp=P1;
                                 switch(htemp)
                                        {
                                            case 0xe0: hang=0;break;
                                                case 0xd0: hang=1;break;
                                                case 0xb0: hang=2;break;
                                                case 0x70: hang=3;break;
                                        }
                                 P1=0x0f;
                                 Delay(10);
                                 ltemp=P1;
                                 switch(ltemp)
                                    {
                                                  case 0x07: lie=0;break;
                                                  case 0x0b: lie=1;break;
                                                  case 0x0d: lie=2;break;
                                                  case 0x0e: lie=3;break;
                                         }
                                 KEY=keytab[hang][lie];
                                 return KEY;
                           }
                  }
         }
}
void table()//数码管显示函数
{          
   uint i,j;
   uchar temp[1];
   temp[0]=keyscan();
   for(i=0;i<4;i++)
          {
                  for(j=0;j<4;j++)
                  {
                          if(temp[0]==keytab[i][j])
                                  {
                                          P2=0;
                                          P0=tabled[i*4+j];
                                  };
                  }                 
          }
         
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
lxvtag
1楼-- · 2020-02-05 12:08
楼主就从消灭哪几个Delay();开始改进吧,这将是一个有效的进步
BXAK
2楼-- · 2020-02-05 14:12
矩阵键盘反转法早有了,赞同LS,建议LZ从消灭Delay();开始更进一层
hamipeter
3楼-- · 2020-02-05 16:21
用状态机更好!
杏花雨
4楼-- · 2020-02-05 17:39
lxvtag 发表于 2012-5-30 23:31
楼主就从消灭哪几个Delay();开始改进吧,这将是一个有效的进步

能详细说下吗???我初学者,谢谢指教。。
lxvtag
5楼-- · 2020-02-05 22:52
 精彩回答 2  元偷偷看……

一周热门 更多>