杏花雨 发表于 2012-5-30 22:45:57

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

线反转法键盘扫描,数码管显示健值(原创)。。《初学者,望指教》以下是程序。。。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keytab={{11,12,13,14},        //键盘编码
                      {21,22,23,24},
                {31,32,33,34},
                {41,42,43,44}
                          };
uchar tabled={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管段选显示数字编码
uchar code tablew={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;
                               return KEY;
                         }
                  }
       }
}
void table()//数码管显示函数
{          
   uint i,j;
   uchar temp;
   temp=keyscan();
   for(i=0;i<4;i++)
          {
                  for(j=0;j<4;j++)
                  {
                          if(temp==keytab)
                                  {
                                          P2=0;
                                          P0=tabled;
                                  };
                  }               
          }
       
}

lxvtag 发表于 2012-5-30 23:31:09

楼主就从消灭哪几个Delay();开始改进吧,这将是一个有效的进步{:smile:}

BXAK 发表于 2012-5-31 00:10:15

矩阵键盘反转法早有了,赞同LS,建议LZ从消灭Delay();开始更进一层

hamipeter 发表于 2012-5-31 00:12:04

用状态机更好!

杏花雨 发表于 2012-5-31 13:08:24

lxvtag 发表于 2012-5-30 23:31 static/image/common/back.gif
楼主就从消灭哪几个Delay();开始改进吧,这将是一个有效的进步

能详细说下吗???我初学者,谢谢指教。。

lxvtag 发表于 2012-5-31 13:25:57

杏花雨 发表于 2012-5-31 13:08 static/image/common/back.gif
能详细说下吗???我初学者,谢谢指教。。

看这个帖子:
http://www.ourdev.cn/forum.php?mod=viewthread&tid=4310923&highlight=%E6%9C%80%E9%AB%98%E6%95%88%E7%8E%87%E4%BD%BF%E7%94%A8
页: [1]
查看完整版本: 线反转法键盘扫描,数码管显示健值(原创)。。