STC52单片机串口通信与1602LCD的问题
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden = P3^4;
sbit lcdrs = P3^5;
sbit lcdrw = P3^6;
sbit dula = P2^6; //关闭数码管 避免因为USB供电不足 导致显示问题
sbit wela = P2^7;
uint flag;
uchar receive,temp;
void wr_com(uchar com);
void wr_data(uchar dat);
void init();
void delay(uint z);
void main()
{
init();
while(1)
{
if(flag==1)
{
flag=0;
wr_data(receive);
ES = 0;
while(!RI);
TI = 0;
ES = 1;
}
}
}
void init()
{
//关闭数码管
dula = 0;
wela = 0;
//LCD 使能初始化
lcden = 0;
wr_com(0x38); //显示模式设置
wr_com(0x0f); //显示光标设置(闪烁/不闪)
wr_com(0x06); //光标 整屏设置
wr_com(0x01); //清零
wr_com(0x80); //数据指针初始化
//串口初始化
REN = 1;
SM1 = 1;
TR1 = 1; //定时器打开
TMOD = 0X20; //定时器1 工作方式2
TH1 = 0xfd; //9600 波特率
TL1 = 0xfd;
EA = 1; //总中断打开
ES = 1; //串行口中断打开
}
void wr_com(uchar com)
{
lcdrs = 0;
lcdrw = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void wr_data(uchar dat)
{
lcdrs = 1;
P0 = dat;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void ser() interrupt 4
{
if(RI){
RI = 0;
receive = SBUF;
flag = 1;
}
}
串口每次收到的是1个字节数据,需要处理成字符串才能在1602屏上显示
uchar table[] ="0123456789ABCDEF";
/******用for循环按字节逐个写入********/
write_com(0x80); //数据指针第一行起始0x80位置
for(a=0;a<x;a++) //x=每循环一次写一个字节数据
{
write_date(table[a]); //写一个字节数据
}
那从串口接收的 字符 要怎么转换
你先这样测试吧,由单片机发送数据给串口助手,测试发送是否正确,测试波特率是否正确,测试发送格式是否正确。
发送数据需要按ASCII码格式,也就是发送数字1,应该发送0x31。
发送正确后,再测试接收,因为你现在串口助手是按ASCII码格式发送的,而1602也是用ASCII码来显示的,所以暂时看你的程序似乎应该没有错误。
你也可以在程序里给receive任意的ASCII码数值,来判断显示是否正确
如果显示1个字符0~f
write_com(0x80+0);
write_date(table1[receive]);
如果显示3个字符0~255
write_com(0x80+0);
write_date(table1[receive/100]);//百
write_com(0x80+1);
write_date(table1[receive%100/10]);//十
write_com(0x80+2);
write_date(table1[receive%10]);//个
这样的话 如果是发送多个字符的话会非常麻烦的啊
按16进制数来显示,一个字节显示两位数,如0x3a,则显示3a。
按10进制数来显示,一个字节显示三位数,如0x3a,则显示058。
按ASCII码来显示,一个字节显示一位数,如0x41,则显示A。
显示内容和显示方式有你的数据类型和格式定义来决定。
我建议小编把1602和串口的驱动写成.c和.h的头文件,方便调用函数来写主程序,这样程序看起来比较清爽。
额,你这个程序写的不是太标准,给你提几个建议吧,
1、我记得我以前做的1602 的接口函数都是3个参数,写入的行,写入的列,写入的字符串
2、你这个串口接受写的有问题,不能说接收到一个数就把中断关了,去显示这一个字符,那么在你显示的同时,新的数据来了,就接收不到了,
3、楼上所说的ASCII码的事,是没有必要的,数字、字母、常用的符号,这些都是占用一个字节的,不存在转换的问题,详细的你可以看一下ASCII码表
4、仿真终归是下策,可以买个便宜的开发板,
是要关掉的 这个串口说明上是这样写的
感觉你写命令的函数和写数据的函数有点问题。
、
不错