键盘扫描程序及体会

        因为键盘扫描程序是一个经常会用的程序,所以我就将其编成了一个头文件需要用的时候直接调用就行了,在这个头文件的程序中我没有用到全局变量,这是因为在使用头文件时我发现头文件的程序要是使用全局变量的话给人感觉参数的调用比较混乱,最好还是只用局部变量和返回值,这样在调用子程序时不用考虑子程序内部的参数。#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define pout P3
uchar key_scan(void);          //键盘函数定义段;
void delay(uchar t);

void delay(uchar t)               //延时子程序
{                          
   uchar k;
   while(t--)
   {
     for(k=0; k<125; k++)
     { }
   }
}
uchar key_scan(void)                                   //键盘扫描
{  uchar sccode,recode,i,ta,rr,k,kb;
        pout=0xf0;

       kb=0xff;                            

 //如果不赋给kb一个在下面键盘译码值之外的值,在没有按键按下时,程序也会不停的返回0
            if((pout&0xf0)!=0xf0)                 
          {
               delay(10);
                if((pout&0xf0) !=0xf0)
              {
                        sccode=0xfe;
                    for(i=0;i<4;i++)
                   {
                        pout=sccode;
                     if((pout&0xf0) !=0xf0)
                        {
                              recode=(pout&0xf0)|0x0f;
                              k=(~recode)+(~sccode);
                              rr=pout;                        
                             do {ta=pout;}while(ta==rr);                            //判断按键是否松开
      switch(k)                                                                               //扫描结果译码为相应4*4键盘按键的数字值
                        { case 0x11:kb=0x00;break;
                          case 0x21:kb=0x01;break;
                          case 0x41:kb=0x02;break;
                          case 0x81:kb=0x03;break;
                          case 0x12:kb=0x04;break;
                          case 0x22:kb=0x05;break;
                          case 0x42:kb=0x06;break;
                          case 0x82:kb=0x07;break;
                          case 0x14:kb=0x08;break;
                          case 0x24:kb=0x09;break;
                          case 0x44:kb=0x0a;break;
                          case 0x84:kb=0x0b;break;
                          case 0x18:kb=0x0c;break;
                          case 0x28:kb=0x0d;break;
                          case 0x48:kb=0x0e;break;
                          case 0x88:kb=0x0f;break;
                          default  :kb=0x00;break;
                         }
         }
                      else
                         sccode=(sccode<<1)|0x01;                                若扫描没有结果,则扫描下一行
                  }
             }
 
  }
  return kb;                                               
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值