找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3551|回复: 7
收起左侧

lcd1602在单片机开发板上是正常的 用proteus仿真只显示黑色方块呢?

[复制链接]
ID:454366 发表于 2020-5-6 13:58 | 显示全部楼层 |阅读模式
51hei.png

以下是原代码:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define LCD1602_DB P0

  4. sbit LCD1602_RS = P2^0;
  5. sbit LCD1602_RW = P2^1;
  6. sbit LCD1602_E = P2^2;

  7. bit flag500ms = 0;                                                 //500毫秒标志

  8. unsigned char T0RH = 0;
  9. unsigned char T0RL = 0;

  10. unsigned char code str1[] = "DA  JIA  HAO.";
  11. unsigned char code str2[] = "Let's move...";

  12. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str, unsigned char len);
  13. void configT0(unsigned int ms);
  14. void InitLcd1602();

  15. void main()
  16. {
  17.         unsigned char i;
  18.         unsigned char index = 0;
  19.         
  20.         unsigned char pdata bufMove1[16 + sizeof(str1) + 16];                //字符缓冲区
  21.         unsigned char pdata bufMove2[16 + sizeof(str2) + 16];
  22.         
  23.         EA = 1;

  24.         InitLcd1602();
  25.         configT0(2);
  26.         
  27.         for(i = 0; i < 16; i++)                                                                                 //字符缓冲区前15字符赋初值
  28.         {
  29.                 bufMove1[i] = ' ';
  30.                 bufMove2[i] = ' ';
  31.         }
  32.         for(i = 0; i < (sizeof(str1) - 1); i++)                                                //字符缓冲区中间15字符赋初值
  33.         {
  34.                 bufMove1[16+i] = str1[i];
  35.                 bufMove2[16+i] = str2[i];               
  36.         }
  37.         for(i = (16 + sizeof(str1) - 1); i < sizeof(bufMove1); i++)         //字符缓冲区后15字符赋初值
  38.         {
  39.                 bufMove1[i] = ' ';
  40.                 bufMove2[i] = ' ';               
  41.         }  
  42.         
  43.         while(1)
  44.         {
  45.                 if(flag500ms)                                                                                          //到达500毫秒刷新一次
  46.                 {
  47.                         flag500ms = 0;

  48.                         LcdShowStr(0, 0, bufMove1 + index, 16);
  49.                         LcdShowStr(0, 1, bufMove2 + index, 16);

  50.                         index++;

  51.                         if(index >= (16 + sizeof(str1) - 1))
  52.                         {
  53.                                 index = 0;        
  54.                         }
  55.                 }        
  56.         }        
  57. }

  58. void configT0(unsigned int ms)                                         
  59. {
  60.         unsigned long int tmp;

  61.         tmp = 12000000 / 12;
  62.         tmp = (tmp * ms) / 1000;
  63.         tmp = 65536 - tmp + 12;

  64.         T0RH = (unsigned char)(tmp >> 8);
  65.         T0RL = (unsigned char)tmp;

  66.         TMOD &= 0XF0;
  67.         TMOD |= 0X01;
  68.         TH0 = T0RH;
  69.         TL0 = T0RL;
  70.         ET0 = 1;
  71.         TR0 = 1;
  72. }

  73. void LcdWaiReady()                           //读指令
  74. {
  75.         unsigned char sta;
  76.         LCD1602_E = 0;
  77.         LCD1602_DB = 0XFF;
  78.         LCD1602_RS = 0;
  79.         LCD1602_RW = 1;

  80.         do
  81.         {
  82.                 LCD1602_E = 1;               
  83.                 sta = LCD1602_DB;
  84.                 LCD1602_E = 0;
  85.         }
  86.         while(sta & 0x80);
  87. }

  88. void LcdWriteCMD(unsigned char cmd)           //写指令
  89. {
  90.         LcdWaiReady();
  91.         LCD1602_E = 0;
  92.         LCD1602_RS = 0;
  93.         LCD1602_RW = 0;
  94.         LCD1602_DB = cmd;
  95.         LCD1602_E = 1;
  96.         LCD1602_E = 0;
  97. }

  98. void LcdWriteDat(unsigned char dat)          //写数据
  99. {
  100.         LcdWaiReady();
  101.         LCD1602_E = 0;
  102.         LCD1602_RS = 1;
  103.         LCD1602_RW = 0;
  104.         LCD1602_DB = dat;
  105.         LCD1602_E = 1;
  106.         LCD1602_E = 0;
  107. }

  108. void LcdSetCursor(unsigned char x, unsigned char y)
  109. {
  110.         unsigned char addr;

  111.         if(y == 0)
  112.         {
  113.                 addr = 0x00 + x;
  114.         }
  115.         else
  116.         {
  117.                 addr = 0x40 + x;
  118.         }
  119.         LcdWriteCMD(addr | 0x80);
  120. }

  121. void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str, unsigned char len)
  122. {
  123.         LcdSetCursor(x, y);

  124.         while(len--)
  125.         {
  126.                 LcdWriteDat(*str++);        
  127.         }
  128. }

  129. void InitLcd1602()
  130. {
  131.         LcdWriteCMD(0x38);
  132.         LcdWriteCMD(0x0C);
  133.         LcdWriteCMD(0x06);
  134.         LcdWriteCMD(0x01);
  135. }

  136. void interrupt_T0() interrupt 1
  137. {
  138.         static unsigned char time500ms = 0;

  139.         TH0 = T0RH;
  140.         TL0 = T0RL;
  141.         
  142.         time500ms++;
  143.         
  144.         if(time500ms >= 250)
  145.         {
  146.                 time500ms = 0;
  147.                 flag500ms = 1;
  148.         }        
  149. }
复制代码

以下是原代码与仿真文件:
2.LCD1602整屏移动.rar (84.59 KB, 下载次数: 8)
回复

使用道具 举报

ID:584814 发表于 2020-5-6 14:52 | 显示全部楼层
可能是对比度调整的问题
回复

使用道具 举报

ID:454366 发表于 2020-5-6 15:16 | 显示全部楼层
本帖最后由 pandingjia58 于 2020-5-6 16:42 编辑
man1234567 发表于 2020-5-6 14:52
可能是对比度调整的问题

已经调过了不是他的问题
回复

使用道具 举报

ID:462827 发表于 2020-5-6 17:01 | 显示全部楼层
仿真里又不用调什么对比度,哪怕是把仿真里lcd的电源去掉它就不影响。

简单测试了一下,你代码里的LcdWriteCMD()、LcdWriteDat()、LcdShowStr()这几个函数都OK的,可以在指定位置正确显示内容。所以,问题肯定就是出在你操作滚动缓冲区的部分上。
回复

使用道具 举报

ID:703927 发表于 2020-5-6 18:08 | 显示全部楼层
t调调
对比度
回复

使用道具 举报

ID:96682 发表于 2020-5-6 19:03 来自手机 | 显示全部楼层
问题是添加了波形发生器
回复

使用道具 举报

ID:454366 发表于 2020-5-6 21:34 | 显示全部楼层
hantu 发表于 2020-5-6 17:01
仿真里又不用调什么对比度,哪怕是把仿真里lcd的电源去掉它就不影响。

简单测试了一下,你代码里的LcdWr ...

我在开发板上测试是没问题的,用仿真软件测试就是不行
回复

使用道具 举报

ID:819173 发表于 2020-9-15 09:24 | 显示全部楼层
把你的定义bufMove数组的pdata去掉,pdata是单片机片外RAM,仿真时候没有外部RAM,访问的是不存在的地址空间,显示就是黑块
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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