单片机串口通信与矩阵键盘 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分。若你是高手,那就来大展身手吧!
再次感谢! 展开
以下为我写的程序
#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分。若你是高手,那就来大展身手吧!
再次感谢! 展开
5个回答
展开全部
串行通信是有中断的,按道理不会与键盘口冲突,那就是程序的问题了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
串口有一点电能过去,使数码管发微弱亮光。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
矩阵键盘换接口吧 我也这么尝试过不过还是失败了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个主程序写的东西太多了,还有你的输出口为什么设成p3口了,
追问
第一、主程序写的代码多与少跟错误没有直接关系,当然可以简化;第二,输出口为什么设为P3口,这不是我能左右的,这是常识。
请你不要灌水!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询