这个键盘扫描程序怎么理解(急急急急急!!!!)

#include <reg51.h>
#include <math.h>
#include <intrins.h>
#define uchar unsigned char
#define TURE 1
#define FALSE 0
int key;
int del;
void Tkey(void);
/************主 程序*************/
void main(void)
{
void tkey(void);
void delay(int);

SCON=0x00;
TI=0;
while(TURE)
{
Tkey();
delay(2000);
}

}
void Tkey(void)
{
uchar readkey;//rereadkey;
uchar x_temp,y_temp;

P1=0x0f;
x_temp=P1&0x0f;
if(x_temp==0x0f) goto keyout;
P1=0xf0;
y_temp=P1&0xf0;
readkey=x_temp|y_temp;
readkey=~readkey;

switch(readkey)
{
case 0x11:key=0; break;
case 0x21:key=1; break;
case 0x41:key=2; break;
case 0x81:key=3; break;
case 0x12:key=4; break;
case 0x22:key=5; break;
case 0x42:key=6; break;
case 0x82:key=7; break;
case 0x14:key=8; break;
case 0x24:key=9; break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
default: key=16;break;
}

keyout:_nop_();
}
/************延时程序*************/
void delay(del)
{
for(del;del>0;del--);
}
peigongjunbd :
谢谢指教,不知道哪里有错,能不能帮忙改正?
还有下面0x11这些按键代码是怎么出来的,前面没有定义啊?
case 0x11:key=0; break;

能不能把总体的原理说一下,谢谢!
追加积分哦!

你的程序有问题哦!
#include <reg51.h>
#include <math.h>
#include <intrins.h>
#define uchar unsigned char
#define TURE 1
#define FALSE 0
int key;
int del;
void Tkey(void);
/************主 程序*************/
void main(void)
{
void tkey(void);
void delay(int);

SCON=0x00;
TI=0;
while(TURE)
{
Tkey();
delay(2000);
} //这是一个死循环

}
void Tkey(void)
{
uchar readkey;//rereadkey;
uchar x_temp,y_temp;
/*你给出的程序提示你的键盘是4X4的*/

P1=0x0f; //给行送高电平,列送低电平
x_temp=P1&0x0f; //读回行的状态
if(x_temp==0x0f) goto keyout; /*若行中有低电平也即不等于0x0f,
/*表示有键按下
P1=0xf0; //给给列送高电平,行送低电平
y_temp=P1&0xf0; //读回列状态
readkey=x_temp|y_temp; //行状态列状态并起代表一个按键
readkey=~readkey; //取反
switch(readkey) //判定按键代码
{
case 0x11:key=0; break;
case 0x21:key=1; break;
case 0x41:key=2; break;
case 0x81:key=3; break;
case 0x12:key=4; break;
case 0x22:key=5; break;
case 0x42:key=6; break;
case 0x82:key=7; break;
case 0x14:key=8; break;
case 0x24:key=9; break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
default: key=16;break;
}

keyout:_nop_();
}
/************延时程序*************/
void delay(del)
{
for(del;del>0;del--);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-11
找到他的目录给它卸载了,从其动力给他删除掉。
相似回答