您的位置:首页 > 编程语言 > C语言/C++

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

2008-08-08 16:33 363 查看
//好不容易调好的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];

}

}

/*根据自己的情况作相应修改即可,还可以自由发挥*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: