小弟最近学到了串口通信,于是自己动手写了个发送程序:
键盘是3*3的矩阵键盘,K1到K9以此对应要发送的A到I字符
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char;
kbscan();键盘
rs232_into();
send(unsigned char sdata);
delay(uint t);
unsigned char key,dat;
main()
{
rs232_into();
while(1)
{
key=kbscan();键盘扫描带回的返回值
dat=key&0x3f;屏蔽高两位,保留六位
switch(dat)
{
case(0x1e): //k1
{
send('A');
break;
}
case(0x2e): //k2
{
send('B');
break;
}
case(0x36): //k3
{
send('C');
break;
}
case(0x1d): //k4
{
send('D');
break;
}
case(0x2d): //k5
{
send('E');
break;
}
case(0x35): //k6
{
send('F');
break;
}
case(0x1b): //k7
{
send('G');
break;
}
case(0x2b): //k8
{
send('H');
break;
}
case(0x33): //k9
{
send('I');
break;
}
default:
break;
}
}
}
rs232_into() //初始化232
{
SCON=0x50;//串口方式1,允许接收
TMOD=0x20;//启用定时器1
PCON=0x80;//SMOD=0不加倍
TH1=0XFD;
TL1=0XFD;
TR1=1;
}
kbscan()//键盘扫描
{
unsigned char sccode,recode;
P1=0XF0;
if((P1&0xf0)!=0xf0)
{
delay(10000);
if((P1&0XF0)!=0XF0)
{
sccode=0xfe;
while((sccode&0x10)!=0)
{
P1=sccode;
if((P1&0xf0)!=0xf0)
{
recode=P1&0XF0;
sccode=sccode&0x0f;
return(recode+sccode);
}
else
sccode=sccode<<1|0x01;
}
}
}
return(0);
}
delay(uint t)
{
for(;t>0;t--);
}
send(unsigned char sdata)
{
SBUF=sdata;
while(!TI);
TI=0;
}
程序有些臃肿,
问题是下载到实验板上K3,K6,K9始终没有任何反应,更搞不懂的是在超级终端里显示接收到得都是乱码或者空格,用串口调试除了K1,K2,K5三个按键有反应外其他都没反应像没用一样,可以确定的是键盘的硬件上没有问题,程序部分的键盘扫描是调用以前做数字钟的部分程序返回值也是正确的,可是为什么会这样呢?百思不得其解?? |