单片机串口通信与矩阵键盘 20

按下矩阵键盘第一行时以1200bps发送,1,2,3,4,第二行时以2400bps发送5,6,7,8,第三行以4800bps发送,9,10,11,12,第四行以9600p... 按下矩阵键盘第一行时以1200bps发送,1,2,3,4,第二行时以2400bps发送5,6,7,8,第三行以4800bps发送,9,10,11,12,第四行以9600pbs 发送,13,14,15,16。
以下为我写的程序

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint temp;
void display(uint num1);
void delay(uint z);

void main()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
TMOD=0x20;
TH1=0xe8;
TL1=0xe8;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
temp=P3;
switch(temp)
{
case 0xee:{SBUF='1';while(!TI);TI=0;}break;
case 0xde:{SBUF='2';while(!TI);TI=0;}break;
case 0xbe:{SBUF='3';while(!TI);TI=0;}break;
case 0x7e:{SBUF='4';while(!TI);TI=0;}break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}

P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
TMOD=0x20;
TH1=0xF4;
TL1=0xF4;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
temp=P3;
switch(temp)
{
case 0xed:{SBUF='5';while(!TI);TI=0;}break;
case 0xdd:{SBUF='6';while(!TI);TI=0;}break;
case 0xbd:{SBUF='7';while(!TI);TI=0;}break;
case 0x7d:{SBUF='8';while(!TI);TI=0;}break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}

P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
TMOD=0x20;
TH1=0xfa;
TL1=0xfa;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
temp=P3;
switch(temp)
{
case 0xeb:{SBUF='9';while(!TI);TI=0;}break;
case 0xdb:{SBUF='1';while(!TI);TI=0;SBUF='0';while(!TI);TI=0;}break;
case 0xbb:{SBUF='1';while(!TI);TI=0;SBUF='1';while(!TI);TI=0;}break;
case 0x7b:{SBUF='1';while(!TI);TI=0;SBUF='2';while(!TI);TI=0;}break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}

P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
temp=P3;
switch(temp)
{
case 0xe7:{SBUF='1';while(!TI);TI=0;SBUF='3';while(!TI);TI=0;}break;
case 0xd7:{SBUF='1';while(!TI);TI=0;SBUF='4';while(!TI);TI=0;}break;
case 0xb7:{SBUF='1';while(!TI);TI=0;SBUF='5';while(!TI);TI=0;}break;
case 0x77:{SBUF='1';while(!TI);TI=0;SBUF='6';while(!TI);TI=0;}break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
}

void ser() interrupt 4
{
RI=0;
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

问题:第一行以1200bps发送没有任何问题,第三行以4800bps发送没问题,第四行以9600bps发送也没问题,但是一旦当我把串口调试助手把bps调整到2400时,按下第二行键盘却无反应,为什么啊……
另:程序下载到板子上时数码管为什么会微微发亮?
望能有高手帮忙解答,小生不胜感激!
若有人能改好代码,使其能正常运行,我将追加财富值10分。若你是高手,那就来大展身手吧!
再次感谢!
展开
 我来答
tony_sgt
2011-10-04 · TA获得超过8418个赞
知道大有可为答主
回答量:5330
采纳率:66%
帮助的人:1165万
展开全部
你的按键是装在P3口,在判断第二行按键时你让P3口输出11111101(0xfd),也就让TX一直为0,所以...串口当然不会输出你按下的东西了...
续甫年恨桃
2019-06-01 · TA获得超过3713个赞
知道小有建树答主
回答量:3115
采纳率:32%
帮助的人:170万
展开全部
串行通信是有中断的,按道理不会与键盘口冲突,那就是程序的问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
生活如歌_
2011-10-03 · TA获得超过1.5万个赞
知道大有可为答主
回答量:7398
采纳率:78%
帮助的人:2099万
展开全部
串口有一点电能过去,使数码管发微弱亮光。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
花陌雨
2012-04-09
知道答主
回答量:5
采纳率:0%
帮助的人:8087
展开全部
矩阵键盘换接口吧 我也这么尝试过不过还是失败了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
微不卒d
2011-10-03
知道答主
回答量:21
采纳率:0%
帮助的人:14.3万
展开全部
你这个主程序写的东西太多了,还有你的输出口为什么设成p3口了,
追问
第一、主程序写的代码多与少跟错误没有直接关系,当然可以简化;第二,输出口为什么设为P3口,这不是我能左右的,这是常识。
请你不要灌水!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式