找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4078|回复: 22
打印 上一主题 下一主题
收起左侧

单片机程序,我想输入一个任意数字,然后显示在lcd上,但是不行,希望求解

[复制链接]
跳转到指定楼层
楼主
ID:885542 发表于 2021-2-27 20:23 来自触屏版 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"reg52.h"
#include "lcd.h"
typedef unsigned int u16;
typedef unsigned char u8;

void UsartInit()      //初始串口
{
  TMOD=0x20;
  TH1=0xF3;      //设置比特率
  TL1=0xF3;
  PCON=0x80;
  TR1=1;
  SCON=0x50;
  ES=1;
  EA=1;
}

void Usart() interrupt 4
{
  u8 receiveData;
  receiveData=SBUF;
  receiveDat=receiveData+0x30;   
  LcdWriteData(receiveData);   //写入函数,写入函数
                                                    在另一个文档有过设置
  RI =0;
  SBUF=receiveData;
  while(!TI);
  TI=0;
}

void main()
{
  LcdInit();        //初始化函数,另一个.c文档有说明
  UsartInit();
  while(1);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:885542 发表于 2021-2-27 20:39 来自触屏版 | 只看该作者
同时,命令函数也是有的,lcdwritecom,大佬解答时方便直接用这个
回复

使用道具 举报

板凳
ID:390416 发表于 2021-2-27 21:18 | 只看该作者
你真是人才,在串口中断里面 居然去调用LCD显示函数。把LCD显示独立 把串口收发独立 ,这样处理串口的时候,不会被迫增加时间。
还有 串口发送使用whiel 死等是很浪费CPU的。可以用中断直接处理就行了。
这是LCD http://www.51hei.com/bbs/dpj-200685-1.html
这是串口http://www.51hei.com/bbs/dpj-200927-1.html
这是串口打印 http://www.51hei.com/bbs/dpj-201660-1.html
回复

使用道具 举报

地板
ID:213173 发表于 2021-2-27 21:45 | 只看该作者
void Usart() interrupt 4
{
        u8 receiveData;
        RI =0;
        receiveData=SBUF;
//        receiveDat=receiveData+0x30;   
        lcdwritecom(0x80);                                        //数据指针设置显示位置  
        LcdWriteData(receiveData+0x30);                //写入函数,数据转换成ASCII字符码
        SBUF=receiveData;                                        //将收到的数据返回上位机
        while(!TI);
        TI=0;
}
回复

使用道具 举报

5#
ID:885542 发表于 2021-2-27 22:01 来自触屏版 | 只看该作者
wulin 发表于 2021-2-27 21:45
void Usart() interrupt 4
{
        u8 receiveData;

不行呀,好兄弟,我用串口发一个1,lcd上出现乱码呢。。。。
回复

使用道具 举报

6#
ID:213173 发表于 2021-2-28 06:47 | 只看该作者
刮痧小能手 发表于 2021-2-27 22:01
不行呀,好兄弟,我用串口发一个1,lcd上出现乱码呢。。。。

出现乱码要在串口助手里看看返回的数字是否正确以区分是串口程序问题还是LCD驱动程序问题
回复

使用道具 举报

7#
ID:885542 发表于 2021-2-28 09:09 来自触屏版 | 只看该作者
wulin 发表于 2021-2-28 06:47
出现乱码要在串口助手里看看返回的数字是否正确以区分是串口程序问题还是LCD驱动程序问题

串口上也不会显示我所输入的数字,那咋么办,我没有一点头绪呀,应该改哪里
回复

使用道具 举报

8#
ID:882829 发表于 2021-2-28 10:42 | 只看该作者
很简单,网上大把例子
回复

使用道具 举报

9#
ID:748788 发表于 2021-2-28 10:45 | 只看该作者
怀疑你是一接触单片机就直接上手串口和显示屏,若果真这样就没有不蒙的,还是循序渐进吧
回复

使用道具 举报

10#
ID:885542 发表于 2021-2-28 12:21 来自触屏版 | 只看该作者
wwh2382 发表于 2021-2-28 10:45
怀疑你是一接触单片机就直接上手串口和显示屏,若果真这样就没有不蒙的,还是循序渐进吧

不不不,我学了一点了,20天了,我已经想了很久了,好几天了都没有结果。
回复

使用道具 举报

11#
ID:885542 发表于 2021-2-28 15:37 | 只看该作者
天意如是 发表于 2021-2-28 10:42
很简单,网上大把例子

没有的啦,我也找了,反正没找到对的,如果有,还请你不嫌麻烦给一个
回复

使用道具 举报

12#
ID:885542 发表于 2021-2-28 15:52 | 只看该作者
人人学会单片机 发表于 2021-2-27 21:18
你真是人才,在串口中断里面 居然去调用LCD显示函数。把LCD显示独立 把串口收发独立 ,这样处理串口的时候 ...

您所说的独立出来是否如此,我试过这样还是不行,如果哪里不对还望指正,感谢!

#include"reg52.h"
#include "lcd.h"
typedef unsigned int u16;
typedef unsigned char u8;

void UsartInit()
{
  TMOD=0x20;
  TH1=0xF3;
  TL1=0xF3;
  PCON=0x80;
  TR1=1;
  SCON=0x50;
  ES=1;
  EA=1;
}
  

u8 receiveData;
void lcdscreen()                                                                          //lcd显示独立出来
{
        LcdInit();
    LcdWriteCom(0x80);                                                           //设置指针在第一格
    LcdWriteData(receiveData+0x30);                                        //写入函数,数据转换成ASCII字符码
                      
}




void Usart() interrupt 4
{
        u8 receiveData;
        RI=0;
        receiveData=SBUF;
                lcdscreen();                                                //lcd显示
        SBUF=receiveData;                                        //将收到的数据返回上位机
        while(!TI);
        TI=0;
}

void main()
{
  LcdInit();                                                                        //初始化lcd
  UsartInit();                                                                        //初始化串口
   
  while(1);
  
}
回复

使用道具 举报

13#
ID:885542 发表于 2021-2-28 19:21 来自触屏版 | 只看该作者
难道真的就没有人能写出来吧,不会吧
回复

使用道具 举报

14#
ID:286819 发表于 2021-2-28 22:55 | 只看该作者
看这个程序貌似没有错误,把写入函数上传一下,分析分析
回复

使用道具 举报

15#
ID:885542 发表于 2021-3-1 08:42 来自触屏版 | 只看该作者
houchg 发表于 2021-2-28 22:55
看这个程序貌似没有错误,把写入函数上传一下,分析分析

写入函数就不传了吧,我是看视频学的教程,都是一点点抄过去的,而且别的程序也用过,没有问题的,肯定
回复

使用道具 举报

16#
ID:691185 发表于 2021-3-1 09:02 | 只看该作者
你是在单片机上面实现吗还是仿真,如果是实物的话,你看单片机的晶振频率是不是对的。
回复

使用道具 举报

17#
ID:885542 发表于 2021-3-1 10:29 | 只看该作者
青街古城 发表于 2021-3-1 09:02
你是在单片机上面实现吗还是仿真,如果是实物的话,你看单片机的晶振频率是不是对的。

单片机上实现,波特率是对的,所以大哥我代码都出来了,还有可以修改的地方吗,我这边单片机上lcd还是没有显示哎
回复

使用道具 举报

18#
ID:213173 发表于 2021-3-1 11:50 | 只看该作者
刮痧小能手 发表于 2021-3-1 10:29
单片机上实现,波特率是对的,所以大哥我代码都出来了,还有可以修改的地方吗,我这边单片机上lcd还是没 ...

楼主的波特率肯定不对,以下两种任选。修改完整代码如下,但不宜在中断中调用LCD显示函数。
  1. #include"reg52.h"
  2. //#include "lcd.h"
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;

  5. sbit LCD_RS=P3^5;
  6. sbit LCD_EN=P3^4;
  7. sbit LCD_RW=P3^3;

  8. u8 receiveData;
  9. /*
  10. void UsartInit()
  11. {
  12.         TMOD=0x20;
  13.         TH1=0xF4;
  14.         TL1=0xF4;
  15. //        PCON=0x80;//不加倍
  16.         TR1=1;
  17.         SCON=0x50;
  18.         ES=1;
  19.         EA=1;
  20. }
  21. */
  22. void UsartInit()
  23. {
  24.         TMOD=0x20;
  25.         TH1=0xE8;
  26.         TL1=0xE8;
  27.         PCON=0x80;//加倍
  28.         TR1=1;
  29.         SCON=0x50;
  30.         ES=1;
  31.         EA=1;
  32. }
  33.   
  34. /*******100us延时程序********/
  35. void delay(u16 x)
  36. {
  37.         u16 a,b;
  38.         for(a=x;a>0;a--)
  39.                 for(b=10;b>0;b--);
  40. }

  41. /*******液晶写指令程序********/
  42. void LcdWriteCom(u8 com)
  43. {
  44.         LCD_EN=0;        //初始设置LCD_EN低电平
  45.         LCD_RS=0;        //允许写指令
  46.         P0=com;                //传递指令
  47.         delay(10);        //延时1ms
  48.         LCD_EN=1;        //使能写入
  49.         delay(10);        //延时1ms
  50.         LCD_EN=0;        //低跳变执行
  51.        
  52. }
  53. /*******液晶写数据程序********/
  54. void LcdWriteData(u8 date)
  55. {
  56. //        LCD_EN=0;        //初始设置LCD_EN低电平
  57.         LCD_RS=1;        //允许写数据
  58.         P0 =date;        //传递数据
  59.         delay(10);        //延时1ms
  60.         LCD_EN=1;        //使能写入
  61.         delay(10);        //延时1ms
  62.         LCD_EN=0;        //低跳变执行
  63.        
  64. }
  65. /*******液晶初始化程序********/
  66. void LcdInit()                //设置显示模式、
  67. {
  68.         LCD_RW=0;                        //初始设置LCD_RW低电平
  69.         LcdWriteCom(0x38);//设置16*2显示,5*7点阵,8位数据接口
  70.         LcdWriteCom(0x01);//显示清零,数据指针清零
  71.         LcdWriteCom(0x0c);//设置开显示,不显光标
  72.         LcdWriteCom(0x06);//设置写一个字符后地址指针加1
  73. }
  74. void lcdscreen(u8 t)    //lcd显示独立出来
  75. {
  76. //        LcdInit();
  77.         LcdWriteCom(0x80);   //设置指针在第一格
  78.         LcdWriteData(t+0x30);//写入函数,数据转换成ASCII字符码
  79. }

  80. void Usart() interrupt 4
  81. {
  82.         u8 receiveData;
  83.         RI=0;
  84.         receiveData=SBUF;
  85.         lcdscreen(receiveData);        //lcd显示
  86.         SBUF=receiveData;   //将收到的数据返回上位机
  87.         while(!TI);
  88.         TI=0;
  89. }

  90. void main()
  91. {
  92.         LcdInit();          //初始化lcd
  93.         UsartInit();        //初始化串口

  94.         while(1);
  95. }
复制代码


回复

使用道具 举报

19#
ID:798631 发表于 2021-3-1 12:37 | 只看该作者
先确定是哪里的问题   写液晶呢直接先写个常数    根据结果处理  这样你就有方向了
回复

使用道具 举报

20#
ID:885542 发表于 2021-3-1 18:11 来自触屏版 | 只看该作者
wulin 发表于 2021-3-1 11:50
楼主的波特率肯定不对,以下两种任选。修改完整代码如下,但不宜在中断中调用LCD显示函数。

不管行不行,你写了这么多,我一定要试一下的,这么久终于有个认真回答的了,我爱死你了
回复

使用道具 举报

21#
ID:885542 发表于 2021-3-1 19:03 | 只看该作者
wulin 发表于 2021-3-1 11:50
楼主的波特率肯定不对,以下两种任选。修改完整代码如下,但不宜在中断中调用LCD显示函数。

我这边单片机和你肯定不一样,几个端口不一样,所以初始化那几个没有复制,但是其他的复制了,我也检查了几遍还是没有用。。。我再想想办法吧,感谢你了
回复

使用道具 举报

22#
ID:213173 发表于 2021-3-1 21:17 | 只看该作者
刮痧小能手 发表于 2021-3-1 19:03
我这边单片机和你肯定不一样,几个端口不一样,所以初始化那几个没有复制,但是其他的复制了,我也检查了 ...

这个程序是经过实物验证过的,只要你是用的51内核单片机,串口初始化定时器都一样。你的核心错误就是串口初始化定时器错误导致波特率不对。LCD1602与MCU的接口是可以按实际硬件电路定义的。
回复

使用道具 举报

23#
ID:748788 发表于 2021-3-2 17:41 | 只看该作者
应该确认你的单片机晶振是不是11.0592m的。串口程序的波特率都是按照这个数字计算的,否则即使别人的程序在你的单片机上调通,也无法与串口助手之类的工具正常通信
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表