搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2012-5-30 22:45:57 | 显示全部楼层 |阅读模式
线反转法键盘扫描,数码管显示健值(原创)。。《初学者,望指教》以下是程序。。。
#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];
                                  };
                  }                 
          }
         
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入169汤圆

发表于 2012-5-30 23:31:09 | 显示全部楼层
楼主就从消灭哪几个Delay();开始改进吧,这将是一个有效的进步

出0入0汤圆

发表于 2012-5-31 00:10:15 | 显示全部楼层
矩阵键盘反转法早有了,赞同LS,建议LZ从消灭Delay();开始更进一层

出0入0汤圆

发表于 2012-5-31 00:12:04 | 显示全部楼层
用状态机更好!

出0入0汤圆

 楼主| 发表于 2012-5-31 13:08:24 | 显示全部楼层
lxvtag 发表于 2012-5-30 23:31
楼主就从消灭哪几个Delay();开始改进吧,这将是一个有效的进步

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

出0入169汤圆

发表于 2012-5-31 13:25:57 | 显示全部楼层
杏花雨 发表于 2012-5-31 13:08
能详细说下吗???我初学者,谢谢指教。。

看这个帖子:
http://www.ourdev.cn/forum.php?m ... 7%E4%BD%BF%E7%94%A8
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表