找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3109|回复: 6
收起左侧

程序在proteus仿真正确,但在单片机开发板显示不正确

[复制链接]
ID:497598 发表于 2020-4-2 20:15 | 显示全部楼层 |阅读模式
20黑币
最近做的一个设计在仿真中lcd1602是可以显示的,如图一
但在普中V3.0开发板上lcd1602不能正确显示,如图二

普中lcd1602的RS、RW、E管脚分别是p2.7,p2.5,p2.6  仿真中lcd1602的RS、RW、E也是

普中开发板没有问题,可以使用光盘中的程序

希望大佬能够指导一下我哪里有错误,万分感谢,拜托了,找了一下午都没找出来

下面贴出lcd1602相关的单片机程序
  1. /***********************************************************************************************************
  2. LCD1602相关函数
  3. ***********************************************************************************************************/

  4. sbit LCDRS = P2^6;
  5. sbit LCDEN = P2^7;
  6. sbit LCDRW = P2^5;
  7. sbit D0        = P0^0;
  8. sbit D1        = P0^1;
  9. sbit D2        = P0^2;
  10. sbit D3        = P0^3;
  11. sbit D4        = P0^4;
  12. sbit D5        = P0^5;
  13. sbit D6        = P0^6;
  14. sbit D7        = P0^7;



  15. //LCD延时
  16. void LCDdelay(uint z)                  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
  17. {
  18.   uint x,y;
  19.   for(x=z;x>0;x--)
  20.     for(y=2;y>0;y--);
  21. }
  22. void LCD_WriteData(uchar dat)         
  23. {
  24.         if(dat&0x01)D0=1;else D0=0;
  25.         if(dat&0x02)D1=1;else D1=0;
  26.         if(dat&0x04)D2=1;else D2=0;
  27.         if(dat&0x08)D3=1;else D3=0;
  28.         if(dat&0x10)D4=1;else D4=0;
  29.         if(dat&0x20)D5=1;else D5=0;
  30.         if(dat&0x40)D6=1;else D6=0;
  31.         if(dat&0x80)D7=1;else D7=0;
  32. }
  33. //写命令
  34. void write_com(uchar com)
  35. {
  36.         LCDRS=0;
  37.     LCDRW = 0;                                 
  38.         LCD_WriteData(com);
  39.     LCDdelay(2);
  40.     LCDEN=1;
  41.     LCDdelay(2);
  42.     LCDEN=0;
  43. }
  44. //写数据
  45. void write_data(uchar date)
  46. {
  47.   LCDRS=1;
  48.   LCDRW = 0;
  49.         LCD_WriteData(date);
  50. //  DAT=date;
  51.   LCDdelay(2);
  52.   LCDEN=1;
  53.   LCDdelay(2);
  54.   LCDEN=0;
  55. }

  56. /*------------------------------------------------
  57.               选择写入位置
  58. ------------------------------------------------*/
  59. void SelectPosition(unsigned char x,unsigned char y)
  60. {     
  61.         if (x == 0)
  62.         {     
  63.                 write_com(0x80 + y);     //表示第一行
  64.         }
  65.         else
  66.         {      
  67.                 write_com(0xC0 + y);      //表示第二行
  68.         }        
  69. }
  70. /*------------------------------------------------
  71.               写入字符串函数
  72. ------------------------------------------------*/
  73. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  74. {     
  75.         SelectPosition(x,y);
  76.         while (*s)
  77.         {     
  78.                 write_data( *s);     
  79.                 s ++;     
  80.         }
  81. }
  82. //========================================================================
  83. // 函数: void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)
  84. // 应用: LCD_Write_Char(0,1,366,4) ;
  85. // 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
  86. // 参数: x:行,y:列,s:要显示的字,l:显示的位数
  87. // 返回: none.
  88. //========================================================================
  89. void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)
  90. {     
  91.         SelectPosition(x,y) ;

  92.         if(l>=5)
  93.                 write_data(0x30+s/10000%10);        //万位
  94.         if(l>=4)
  95.                 write_data(0x30+s/1000%10);                //千位
  96.         if(l>=3)
  97.                 write_data(0x30+s/100%10);                //百位
  98.         if(l>=2)
  99.                 write_data(0x30+s/10%10);                        //十位
  100.         if(l>=1)
  101.                 write_data(0x30+s%10);                //个位

  102. }

  103. //1602初始化
  104. void Init1602()
  105. {
  106.   uchar i=0;
  107.   write_com(0x38);//屏幕初始化
  108.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  109.   write_com(0x06);//当读或写一个字符是指针后一一位
  110.   write_com(0x01);//清屏        
  111. }
  112. void Display1(c,temp,temp2,temp3) //温度,烟雾,PM2.5,甲醛
  113. {
  114.         //时时温度
  115.         LCD_Write_Char(0,6,c/10,2);
  116.         write_data('.');
  117.         LCD_Write_Char(0,9,c%10,1);        
  118.         //时时烟雾
  119.         LCD_Write_Char(0,13,temp,3);
  120.         //时时pm25
  121.         LCD_Write_Char(1,6,temp2,3);
  122.         //时时甲醛
  123.         LCD_Write_Char(1,13,temp3,3);

  124. }


  125. void Display2(yushe_wendu,yushe_yanwu,yushe_pm25,yushe_jiaquan)
  126. {
  127.         //显示预设温度
  128.         LCD_Write_Char(0,6,yushe_wendu,2);

  129.         //显示预设烟雾
  130.         LCD_Write_Char(0,13,yushe_yanwu,3);

  131.         //显示预设PM2.5
  132.         LCD_Write_Char(1,6,yushe_pm25,3);
  133.         
  134.         //显示预设甲醛
  135.         LCD_Write_Char(1,13,yushe_jiaquan,3);        

  136. }
复制代码

图二

图二

图一

图一
回复

使用道具 举报

ID:420836 发表于 2020-4-2 23:18 | 显示全部楼层
尝试不同的延迟值。 模拟与实际控件不同,需要调整延迟。
回复

使用道具 举报

ID:235200 发表于 2020-4-3 01:30 | 显示全部楼层
光盘上有程序,可以直接使用其程序呀,估计你加了不同的传感器,是获取传感器数据时进入了等待状态,如果去掉传感器内容,又能够显示就不是显示程序的问题
回复

使用道具 举报

ID:665861 发表于 2020-4-3 09:44 | 显示全部楼层
你试试调整一下晶振
回复

使用道具 举报

ID:478073 发表于 2020-4-3 12:53 | 显示全部楼层
先下载别人成功例子的代码看看,这样会下走很多弯路
回复

使用道具 举报

ID:497598 发表于 2020-4-3 14:12 | 显示全部楼层
csmyldl 发表于 2020-4-3 01:30
光盘上有程序,可以直接使用其程序呀,估计你加了不同的传感器,是获取传感器数据时进入了等待状态,如果去掉传 ...

去掉传感器程序,还是不显示
回复

使用道具 举报

ID:606493 发表于 2020-4-3 15:03 | 显示全部楼层
仿真没问题的话程序应该是没有问题的,你可以看看你的硬件有没有问题,你看一下你开发板上的晶振是不是跟仿真用的晶振是一样的,一般用的是11.0592的,但是有的开发板的晶振是12M的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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