简便小巧的4*4按键识别程序(C语言) 简约不简单

来源:互联网 发布:java swing 时间控件 编辑:程序博客网 时间:2024/05/16 15:16

//好不容易调好的4*4按键识别程序
//通过按键相应显示0-F

/*心得:初次调试时 按键后总是无反应 通过观察硬件
电路选择好相应的I/O接口 烧入程序观察 还是无反应,
又不断检测电路 反复调试 结果还是一样。折腾了半天,
还是将问题落在程序上。发现程序开头的3个数组均定义为code型,
怀疑是不是程序存储器空间不够用,果然去掉3个code后 按键就有了反应,
其间发现去掉code后程序生成的data 增大了许多(data=46)
再将其中一个数组改为code型后data减少了不少(data=29),
在将另一个也改为code后 data又减小到13将程序烧入后可以用。
(当然SB <旺财)>才会将第3个也改为code)
然而按键时相应的显示却不是按照自己的意愿,
理解按键扫描原理后 将查表码重新摆放
果然达到了自己的意愿 太爽了!!!!!!!
呵呵晚上还要看奥运呢!!
frrank 2008-08-08-16:09     */

#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int

sbit P1_0=P1^0;
uchar code key_code[]={0x7E,0X7D,0X7B,0X77,0XBE,0XBD,0XBB,0XB7,
                            0XDE,0XDD,0XDB,0XD7,0XEE,0XED,0XEB,0XE7};

uchar  code xianshi[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14,
                      0x0c,0x04,0x27,0x05,0x26,0x2e,0xff};

uchar ksp[4]={0x7F,0xBF,0xDF,0xEF};
void delay (void) 
{                   /* 时间延迟函数 */
  unsigned char i,j;                 
     for (i=0;i<5;i++)
          for(j=0;j<255;j++)
          ;
}

uchar keypad_scan()
{
    uchar key,i;
    P0=0x0f;
    while (P0!=0x0f);
      do{
       for(i=0;i<=3;i++)
       {        
           P0=ksp[i];
           if(P0!=ksp[i])
           {
              delay();
              key=P0;
              if(key!=ksp[i])
              {
                  return(key);
              }
           }
       }
    } while(1);
}
// 检查是否有按键按下
uchar gotkey()
{
     uchar temp,i;
     temp=keypad_scan();
     for (i=0;i<=15;i++) {
          if(temp==key_code[i]) return(i);
     }
     return(16);
}

void main()
{
 uchar i=0; 
  while(1)
  {
  i=gotkey();
  P1_0=0;
  P2=xianshi[i];
 
 
  }
 
 
}

 

 

/*根据自己的情况作相应修改即可,还可以自由发挥*/ 

原创粉丝点击