串口通信单片机上位机接收发送数据的问题,单片机发送数据时第一位会多发一个黑点,
单片机接收时LCD最后一位有时会显示2次,不是每次都两位,下面是程序。/*************************************************...
单片机接收时LCD最后一位有时会显示2次,不是每次都两位,下面是程序。
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
Delay_1ms(20);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num='1';q++;m++;
break;
case 0xde:num='2';q++;m++;
break;
case 0xbe:num='3';q++;m++;
break;
case 0x7e:num='A';
q=0;
m=7;
L1602_init();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num='4';q++;m++;
break;
case 0xdd:num='5';q++;m++;
break;
case 0xbd:num='6';q++;m++;
break;
case 0x7d:num='B';
p++;
q=0;
m=7;
L1602_init();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num='7';q++;m++;
break;
case 0xdb:num='8';q++;m++;
break;
case 0xbb:num='9';q++;m++;
break;
case 0x7b:num='C';
for(p=0;p<3;p++)
{for(q=0;q<9;q++)
{ ES=0;
TI=0;
SBUF=a[p][q];
if(a[p][q]=='#')
{q=9;
}
while(!TI);
TI=0;
}}
p=0;
q=0;
m=7;
L1602_init();
a[p][q];
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num='.';q++;m++;
break;
case 0xd7:num='0';q++;m++;
break;
case 0xb7:num='#';q++;m++;
break;
case 0x77:num='D';q++;m++;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
/********************************************************************
名称 : Main()
功能 : 主函数
输入 : 无
输出 : 无
***********************************************************************/
void Main(void)
{
init1();
L1602_init();
while(1)
{
ES=1;
Keyscan();
a[p][q]=num;
write_cmd(0x80+m);
write_data(a[p][q]);
if(m==16)
{
L1602_init();
m=7;
p++;
q=0;
}
}
}
void intrr() interrupt 4
{
RI=0;
temp1[k]=SBUF;
if(temp1[k]=='#')
{L1602_init();
for(g=1;g<9;g++)
{write_cmd(0x80+0x40+0x07+g);
write_data(temp1[g]);
if(temp1[g]=='#')
{g=8;
}
}
k=0;
}
k++;
} 展开
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
Delay_1ms(20);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num='1';q++;m++;
break;
case 0xde:num='2';q++;m++;
break;
case 0xbe:num='3';q++;m++;
break;
case 0x7e:num='A';
q=0;
m=7;
L1602_init();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num='4';q++;m++;
break;
case 0xdd:num='5';q++;m++;
break;
case 0xbd:num='6';q++;m++;
break;
case 0x7d:num='B';
p++;
q=0;
m=7;
L1602_init();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num='7';q++;m++;
break;
case 0xdb:num='8';q++;m++;
break;
case 0xbb:num='9';q++;m++;
break;
case 0x7b:num='C';
for(p=0;p<3;p++)
{for(q=0;q<9;q++)
{ ES=0;
TI=0;
SBUF=a[p][q];
if(a[p][q]=='#')
{q=9;
}
while(!TI);
TI=0;
}}
p=0;
q=0;
m=7;
L1602_init();
a[p][q];
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num='.';q++;m++;
break;
case 0xd7:num='0';q++;m++;
break;
case 0xb7:num='#';q++;m++;
break;
case 0x77:num='D';q++;m++;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
/********************************************************************
名称 : Main()
功能 : 主函数
输入 : 无
输出 : 无
***********************************************************************/
void Main(void)
{
init1();
L1602_init();
while(1)
{
ES=1;
Keyscan();
a[p][q]=num;
write_cmd(0x80+m);
write_data(a[p][q]);
if(m==16)
{
L1602_init();
m=7;
p++;
q=0;
}
}
}
void intrr() interrupt 4
{
RI=0;
temp1[k]=SBUF;
if(temp1[k]=='#')
{L1602_init();
for(g=1;g<9;g++)
{write_cmd(0x80+0x40+0x07+g);
write_data(temp1[g]);
if(temp1[g]=='#')
{g=8;
}
}
k=0;
}
k++;
} 展开
3个回答
展开全部
程序中发送数据是的语句是:SBUF=a[p][q]; ,这数组是字符吗?还是二进制数?这决定单片机发送的数据格式是什么样的,是字符就是发送ASCII码,否则发送的二进制数(即十六进制)。上位机是用串口调试助手接收的,还是用超级终端接收的,用超级端终接收时需要发送ASCII码才能显示出来,发送二进制数就会显示乱码的。而串口调试助手可以接收并显示十六进制数,但需要在“十六进制显示”上打勾。
更多追问追答
追问
是串口助手,不是ASCII码的问题,我感觉还是我发送接收程序的问题,帮忙看看
追答
用串口调试助手接收就容易找到毛病了,在“十六进制显示”上打勾,看接收的数据都是什么数,正常的ASCII码显示十六进制数时是大于20H的,而小于20H的就会在显示ASCII码时显示出乱码的,看有没有小于20H的数,是什么数,就能从程序中找到这个数是从哪发出来的了。
展开全部
你怎么总是在调用L1602_init();初始化LCD一次就够了。
更多追问追答
追问
每次接收数据我只调用一次
追答
不用每次接受数据前都调用,在main里开始调用一次就够了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没经过ascii转换吧,所以乱码了
追问
不用转换啊,键盘输入就是字符,串口助手显示也是,加过转换显示反倒不对了,只是某一位并不是全都乱码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询