51单片机LCD1602如何显示串口助手发过来的一串数据

jy05393591 2015-12-09 09:49:49
最近写了一个程序,可以把串口助手发送的一个字符(比如1,2,3,a,A,b)显示到LCD1602中,但是如果发送一串数据(比如1234,abcd),LCD也只能显示一位数据而且是最后一位数据:下面是我写的一个程序:
#include<reg51.h>
#include"lcd.h"
void chuankoushezhi();
uchar chuankoushuju;

void main(void)
{
LcdInit(); //LCD显示频初始化
chuankoushezhi(); //串口设置
while(1)
{
RI=0;
LcdWriteCom(0x80); //LCD第一行第一个开始显示
chuankoushuju=SBUF;
LcdWriteData(chuankoushuju); //显示接收到的数据
}
}
void chuankoushezhi() //串口设置波特率为4800;
{
SCON=0X50;
TMOD=0X20;
PCON=0x80;
TH1=0XF3;
TL1=0XF3;
EA=1;
ES=1;
TR1=1;
}
void chuankou() interrupt 4 //串口中断程序
{
chuankoushuju=SBUF;
RI=0;
SBUF=chuankoushuju;
while(!TI);
TI=0;
}
...全文
4578 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujinqiang 2015-12-13
  • 打赏
  • 举报
回复

标签:51串口
发送程序
 
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
   for(j=0;j<112;j++);
}   
 
void init()
{
 
TMOD= 0X20;   //T1 方式2 ,8位   自动重装  
TH1=0Xfd;
TL1=0Xfd;    //9600
TR1=1;    // 定时器1启动
 
//SCON= 0X40;   // 串口工作模式 1
SM0=0; // 设置串口的工作模式
SM1=1;     //方式1
 
 
REN=0;    // 不允许串口接收数据
 
 
//ES=1; // 串口中断应许
//EA=1;   // 开启中断
 
}
 
void uart_sendB(uchar d)
{
 
SBUF=d;
while(!TI);
 
TI=0;
}
void uart_sendS(uchar *str)
{
while(*str)
{
   uart_sendB(*str) ;
   str++;
   delay(1);
}
}
void main()
{
 
   init();
 
  
//uart_sendB('S');
uart_sendS("XXXXXXXXXXXaaa@@@@@@@@@@ ");
 
//uart_sendB(0x0d);    //换行
//uart_sendB(0x0a);
 
 
while(1);
 
}
 
========================================================================
 
========================================================================
 
========================================================================
 
接收程序
 
#include <reg52.h>
#include "1602.h"
 
#define uchar unsigned char
#define uint unsigned int
 
uchar BUF[30],i=0;
 
void delay(uint ms)
{
uint e,j;
for(e=0;e<ms;e++)
   for(j=0;j<112;j++);
}   
 
void init_uart()
{
 
TMOD= 0X20;   //T1 方式2 ,8位   自动重装
TH1=0Xfd;
TL1=0Xfd;    //9600
TR1=1;     // 定时器1启动
 
 
//SCON= 0X40;   // 串口工作模式 1
SM0=0; // 设置串口的工作模式
SM1=1;     //方式1
//SM2 = 1;   //;收到有效的停止位时才将RI置1yh
 
REN=1;    // 允许串口接收数据
ES=1;    // 串口中断应许
//RI=0;
EA=1;   // 开启中断
}
 
void uart_sendB(uchar d)
{
 
SBUF=d;
while(!TI);
 
TI=0;
}
void uart_sendS(uchar *str)
{
while(*str)
{
   uart_sendB(*str) ;
   str++;
   delay(1);
}
}
 
void main()
{
 
   init_uart();
init_1602();
 
LCD_write_string(0,0,"LYQ"); //列x=0-15,行y=0,1
BUF[0]='\0';
RI=0;
 
   while(1)
{
   LCD_write_string(0,1,BUF);
}
  
}
void uart_rx(void) interrupt 4 //using 3
{
   EA=0;
   if(RI)
{
    //RI=0;
    BUF[i++]=SBUF;
   //uart_sendB(BUF[i]);
   //LCD_write_char(12,1,'i');
 
  
}
EA=1;
}
这个例程比你上面贴的好一点。 注意初始化时给BUF写了个\0进去,接收中断中收到新数据时却没有写这个字符串结束标志。这样LCD_write可能会跑飞出去。 可以在BUF[i++]=SBUF;后面加一句BUF[i]=0; 这样当缓冲区写满时也还是有问题,可以再加个边界检查 if(i>=28) i=0;
ykhuyanglin 2015-12-12
  • 打赏
  • 举报
回复
我们学的还是MOV.MOVX....汇编,你敢信
嵌入式Linux, 2015-12-09
  • 打赏
  • 举报
回复
现在有什么难度?感觉很简单啊
01-LedTest -- 实现LED按照一定频率闪烁。主要用来测试LED工作是否正常。P10要接通。 02-CrossLed -- 实现花灯显示。主要学习对软件延时的使用。P10要接通。 03-FlowRight -- 实现流水灯,方向是从左向右。主要学习在C语言里如何实现准确的位操作。P10要接通。 04-FlowLeft -- 实现流水灯,方向是从右向左。主要学习在C语言里如何实现准确的位操作。P10要接通。 05-button -- 独立按键测试,实现按哪个按键然后使用对应LED显示。实现按键的检测和LED的控制。拨码开关要打到OFF位置。 06-boma -- 用LED显示拨码状态。不可以按按键。 07-Relay -- 继电器测试程序,并有LED指示同时伴有蜂鸣器的声音。P8纵向连接上面2个。 08-music -- 用C语言演奏生日快乐歌,使用软件定时。使用软件定时演奏生日快乐歌。P8纵向连接上面2个。 09-musicasm -- 用汇编语言演奏一首民歌,使用硬件定时。主要学习51定时器汇编语言编写中断功能,和如何编写中断服务程序。P8纵向连接上面2个。 10-music2 -- 用C语言中断演奏。主要学习在C语言中定义51内部定时器中断服务程序。P8纵向连接上面2个。 11-disp1234 -- 采用软件延时在数码管上显示1234ABCD。这是比较普遍的数码管显示。P14接通 12-disp1234int -- 采用硬件延时在数码管上显示1234ABCD。利用中断可以节约资源,这个程序比10更好。P14接通 13-adddec -- 使用两个按键S22,S23控制数码管上显示的数加减,具有去抖动功能。主要讲如何进行数码管动态显示并且怎样对键盘去抖动。P14接通。 14-time -- 15-alarm -- 综合实验,实现倒计时结束时使用蜂鸣器报警,编程技巧的组合。P8纵向连接上面2个。 16-uart -- UART发送和接收,实现从PC发送到单片机任何字母和数字,单片机立即向PC发送同样的字母数字可以由超级终端或者串口调试助手调试。 17-uartint -- UART接收采用不占用资源的中断接收,其余同16。推荐使用串口中断方式,使用查询方式太占用资源。 18-18b20 -- 使用温度传感器18B20测温度,并用数码管显示。P14接通。 19-1602 -- 使用LCD1602显示字符。LCD1602接到P4,方向和板子方向相反。 20-24c08 -- 对24c08进行写读操作。并把写进和读到的数用LED显示。P8纵向连接下面2个。 21-matrix -- 调试矩阵键盘,对应LED亮。注意,本程序执行需要把拨码开关打到OFF状态,程序只有矩阵键盘前两行显示,后两行请自行添加代码。 22-DS1302 -- 使用DS1302时钟芯片对预制的时间进行计时。P9横向连接左边两个。 23-chibang -- 演奏《飞舞翅膀的女孩》等音乐的综合程序。 24-wannianli -- 综合程序,用DS1302,LCD1602,温度传感器等板上设备做一个万年历。LCD1602要正确连接,P9横向连接左边两个。使能DS1302。独立按键从左到右功能为,选择设置/加/减/确定,由于去抖动功能和LCD响应时间问题,所以要按时间稍微长一点。 25-demo -- 使用RS-232实现PC与51之间通信,详细操作方法请见相关教程。 26-remote -- 红外功能测试程序,使用普通遥控器和红外接收头协同工作,用板上LED显示接收状态,LED_EN跳线必须接通,否则观察不到LED状态。 27-1602-scroll -- LCD1602动态字幕显示,方便用户理解1602的用户指令集。有时程序不正常,则为LCD1602的RAM没有清空所致,必须给板子重新上电,并按一次复位键。 28-12864 -- LCD12864显示程序。AT89S5x系列单片机需要摘掉LCD下载程序,下载完毕后插上LCD,并按复位键才可以正常显示,带着LCD下载程序会失败。STC单片机则无此问题。 29-12864-pic -- LCD12864的汉字,图形,半屏,反白及动态显示测试程序。注意事项同28。 30-adc0832 -- 扩展ADC0832调试程序,具体扩展口请见程序内说明。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧