久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4151|回復: 7
打印 上一主題 下一主題
收起左側

lcd1602在單片機開發板上是正常的 用proteus仿真只顯示黑色方塊呢?

[復制鏈接]
跳轉到指定樓層
樓主


以下是原代碼:
  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)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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的,可以在指定位置正確顯示內容。所以,問題肯定就是出在你操作滾動緩沖區的部分上。
回復

使用道具 舉報

5#
ID:703927 發表于 2020-5-6 18:08 | 只看該作者
t調調
對比度
回復

使用道具 舉報

6#
ID:96682 發表于 2020-5-6 19:03 來自觸屏版 | 只看該作者
問題是添加了波形發生器
回復

使用道具 舉報

7#
ID:454366 發表于 2020-5-6 21:34 | 只看該作者
hantu 發表于 2020-5-6 17:01
仿真里又不用調什么對比度,哪怕是把仿真里lcd的電源去掉它就不影響。

簡單測試了一下,你代碼里的LcdWr ...

我在開發板上測試是沒問題的,用仿真軟件測試就是不行
回復

使用道具 舉報

8#
ID:819173 發表于 2020-9-15 09:24 | 只看該作者
把你的定義bufMove數組的pdata去掉,pdata是單片機片外RAM,仿真時候沒有外部RAM,訪問的是不存在的地址空間,顯示就是黑塊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆av一区二区三区久久 | 成人在线中文字幕 | 国产成人精品一区二 | 亚洲综合第一页 | 亚洲视频免费在线观看 | 天天草草草| 亚洲综合色站 | 国产一区二区 | 在线观看中文字幕 | 久www| 91精品一区 | 久久一区二区免费视频 | 99精品网| av在线电影网 | 天堂一区二区三区 | 亚洲电影免费 | 九色网址| 日一日操一操 | 欧美一区二区三区视频 | 日干夜干 | 91在线免费视频 | 成人av免费在线观看 | 香蕉久久av | 欧美成人激情 | 国产91在线精品 | 精品国产伦一区二区三区观看方式 | 麻豆av免费观看 | av网站免费观看 | 天天干天天操天天爽 | 国产一区欧美 | 九九av | 久久看片 | com.国产| 狠狠艹 | 天天亚洲 | 色爱综合| 日韩精品在线观看网站 | 久久精品欧美一区二区三区不卡 | 性国产xxxx乳高跟 | 国产成人精品久久二区二区91 | 欧美一区二区三区在线看 |