本帖最后由 淡然处世 于 2016-8-9 10:06 编辑
单片机P0口接的4*4键盘,P1 口接的3*3矩阵键盘,12MHZ晶振。
/*问题:按一下后串口助手一直刷新按键值,而且0 1 4 5 8 9 均不能正常显示*/
#include<reg52.h>
#define uchar unsigned char //宏定义,后面所有的uchar,均为 unsigned char
#define uint unsigned int // 宏定义,后面所有的uint,均为 unsigned int
uchar num; //定义一个全局变量num
/*4*4矩阵键盘P0口,扫描函数*/
uchar keyscan1()
{
uchar temp;
P0 = 0xfe; //1111 1110 第一列线输出一个低电平
temp = P0; //temp = 1111 1110
temp = temp&0xf0; //1111 1110 & 1111 0000 = 1111 0000 =0xf0
while((temp&0xf0) != 0xf0) //当有按键按下,则P0值发生改变,
{
delay(5); //延时ms
temp = P0;
temp = temp & 0xf0;
while((temp&0xf0) != 0xf0) //再次确认是否有按键按下
{
temp = P0; //读取P0口的值
delay(5); //延时
switch(temp) //进行键值判断
{
case 0xee:num = 0; break;
case 0xde:num = 1; break;
case 0xbe:num = 2; break;
case 0x7e:num = 3; break;
}
while(temp != 0xf0)
{
temp = P0;
temp = temp&0xf0;
}
}
}
P0 = 0xfd; // 1111 1101 第二列线输出一个低电平
temp = P0;
temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
delay(5);
temp = P0;
temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
temp = P0;
delay(5);
switch(temp)
{
case 0xed:num = 4; break;
case 0xdd:num = 5; break;
case 0xbd:num = 6; break;
case 0x7d:num = 7; break;
}
while(temp != 0xf0)
{
temp = P0;
temp = temp&0xf0;
}
}
}
P0 = 0xfb; // 1111 1011 第三列线输出一个低电平
temp = P0;
temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
delay(5);
temp = P0;
temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
temp = P0;
delay(5);
switch(temp)
{
case 0xeb:num = 8; break;
case 0xdb:num = 9; break;
case 0xbb:num = 10; break;
case 0x7b:num = 11; break;
}
while(temp != 0xf0)
{
temp = P0;
temp = temp&0xf0;
}
}
}
P0 = 0xf7; // 1111 0111 第四列输出一个低电平
temp = P0;
temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
delay(5);
temp = P0;
temp = temp&0xf0;
while((temp&0xf0) != 0xf0)
{
temp = P0;
delay(5);
switch(temp)
{
case 0xe7:num = 12;break;
case 0xd7:num = 13; break;
case 0xb7:num = 14;break;
case 0x77:num = 15; break;
}
while(temp != 0xf0)
{
temp = P0;
temp = temp&0xf0;
}
}
}
return num;
}
/*主函数*/
void main()
{
uchar temp;
init(); //调用串口初始化函数
while(1)
{
i = keyscan1(); //调用矩阵键盘扫描函数
delay(200); //进行延时
send(i);
}
}
/*更新寄存器的值*/
void send (uchar dat)
{
sbuf = dat;
while(!TI);
TI = 0;
}
/*延时函数*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*串口初始化函数*/
void init()
{
TMOD = 0x20; //定时器工作方式一
SCON = 0x50; //串口允许接收数据
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
|