#include <reg52.h>
char num;
char temp;
sbit beep=P2^3;
sbit duan=P2^6;
sbit wei=P2^7;
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00, //熄灭
};
void keyboard();
void display(char shu);
void hang1();
void hang2();
void hang3();
void hang4();
void main()
{
beep=1;
while(1)
{
keyboard(); //扫描键盘
display(num);//显示键盘数字
}
}
void delay(unsigned char i) //延时函数
{
int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void keyboard() //键盘扫描函数
{
hang1(); //扫描第一行按键
hang2(); //扫描第二行按键
hang3(); //扫描第三行按键
hang4(); //扫描第四行按键
}
void display(char shu) //显示函数
{
if(shu/10)
{
P0=0x7f;
wei=1;
wei=0;
P0=leddata[shu%10];
duan=1;
duan=0;
P0=0xbf;
wei=1;
wei=0;
P0=leddata[shu/10];
duan=1;
duan=0;
}
else
{
P0=0x7f;
wei=1;
wei=0;
P0=leddata[shu];
duan=1;
duan=0;
}
}
void hang1() //第一行按键扫描函数
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
beep=0;
delay(10);
beep=1;
switch(temp)
{
case 0x70: num=4;
break;
case 0xb0: num=3;
break;
case 0xd0: num=2;
break;
case 0xe0: num=1;
break;
}
}
}
}
void hang2() //第二行按键扫描函数
{
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
beep=0;
delay(10);
beep=1;
switch(temp)
{
case 0x70: num=8;
break;
case 0xb0: num=7;
break;
case 0xd0: num=6;
break;
case 0xe0: num=5;
break;
}
}
}
}
void hang3() //第三行按键扫描函数
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
beep=0;
delay(10);
beep=1;
switch(temp)
{
case 0x70: num=12;
break;
case 0xb0: num=11;
break;
case 0xd0: num=10;
break;
case 0xe0: num=9;
break;
}
}
}
}
void hang4() //第四行按键扫描函数
{
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
beep=0;
delay(10);
beep=1;
switch(temp)
{
case 0x70: num=16;
break;
case 0xb0: num=15;
break;
case 0xd0: num=14;
break;
case 0xe0: num=13;
break;
}
}
}
}
不连接硬件的情况下,单纯从C语言角度看,程序不应该进入到if语句中啊,可是我在Keil中调试的时候却发现程序可以执行到if语句内部,为什么会这样?
{
unsigned char cord_h,cord_l;//行列值中间变量
KeyPort=0x0f; //行线输出全为0
cord_h=KeyPort&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
DelayMs(10); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //读入列线值
KeyPort=cord_h|0xf0; //输出当前列线值
cord_l=KeyPort&0xf0; //读入行线值
while((KeyPort&0xf0)!=0xf0);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
这个矩阵键盘扫描简单多了
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
你将 P3=0xf0,应该就不会出现你说的问题了
一周热门 更多>