完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这是我写的将串口接收的信息 发到1602LCD上不过显示有问题
#include #define uint unsigned int #define uchar unsigned char ***it lcden = P3^4; ***it lcdrs = P3^5; ***it lcdrw = P3^6; ***it dula = P2^6; //关闭数码管 避免因为USB供电不足 导致显示问题 ***it 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; } }
|
|
相关推荐
11个回答
|
|
串口每次收到的是1个字节数据,需要处理成字符串才能在1602屏上显示
uchar table[] ="0123456789ABCDEF"; /******用for循环按字节逐个写入********/ write_com(0x80); //数据指针第一行起始0x80位置 for(a=0;a write_date(table[a]); //写一个字节数据 } |
|
|
|
wulinwl 发表于 2017-7-12 11:00 那从串口接收的 字符 要怎么转换 |
|
|
|
你先这样测试吧,由单片机发送数据给串口助手,测试发送是否正确,测试波特率是否正确,测试发送格式是否正确。
发送数据需要按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]);//个 |
|
|
|
本帖最后由 z674195564 于 2017-7-12 11:38 编辑
这样的话 如果是发送多个字符的话会非常麻烦的啊 |
|
|
|
按16进制数来显示,一个字节显示两位数,如0x3a,则显示3a。 按10进制数来显示,一个字节显示三位数,如0x3a,则显示058。 按ASCII码来显示,一个字节显示一位数,如0x41,则显示A。 显示内容和显示方式有你的数据类型和格式定义来决定。 |
|
|
|
我建议楼主把1602和串口的驱动写成.c和.h的头文件,方便调用函数来写主程序,这样程序看起来比较清爽。
|
|
|
|
额,你这个程序写的不是太标准,给你提几个建议吧,
1、我记得我以前做的1602 的接口函数都是3个参数,写入的行,写入的列,写入的字符串 2、你这个串口接受写的有问题,不能说接收到一个数就把中断关了,去显示这一个字符,那么在你显示的同时,新的数据来了,就接收不到了, 3、楼上所说的ASCII码的事,是没有必要的,数字、字母、常用的符号,这些都是占用一个字节的,不存在转换的问题,详细的你可以看一下ASCII码表 4、仿真终归是下策,可以买个便宜的开发板, |
|
|
|
将军问鼎 发表于 2017-7-12 17:36 是要关掉的 这个串口说明上是这样写的 |
|
|
|
感觉你写命令的函数和写数据的函数有点问题。
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
726 浏览 0 评论
777 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
680 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1149 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1120 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11800 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 06:58 , Processed in 0.727276 second(s), Total 89, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号