找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2632|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

我的單片機(jī)+LCD1602怎么顯示不了?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. //定義控制引腳
  4. sbit RS=P2^0;
  5. sbit RW=P2^1;
  6. sbit E=P2^2;

  7. extern void lcd_W_cmd(unsigned char com);                 //LCD寫命令函數(shù)
  8. extern void lcd_W_dat(unsigned char dat);                    //LCD寫數(shù)據(jù)函數(shù)
  9. extern void lcd_init();                                                  //LCD初始化函數(shù)
  10. extern        void show_sting(unsigned char ch[]);             //顯示字符串
  11. extern void show_data(unsigned int dbyte)reentrant;       //顯示數(shù)據(jù)


  12. //實(shí)現(xiàn)軟件延時(shí),延時(shí)時(shí)間為i*1ms
  13. void delay(unsigned int i)
  14. {
  15.         unsigned char k;
  16.         while(i--);        
  17.         for(k=0;k<120;k++);                   //120次空操作
  18. }

  19. //采用軟件延時(shí),5個(gè)機(jī)器周期
  20. void delay1()
  21. {
  22.         _nop_();
  23.         _nop_();
  24.         _nop_();
  25. }

  26. //讀狀態(tài)字
  27. unsigned char lcd_r_start()
  28. {
  29.         unsigned char s;
  30.         RW=1;                  //RW=1,RS=0,讀LCd狀態(tài)
  31.         delay1();
  32.         RS=0;
  33.         delay1();
  34.         E=1;                                                                        //E端時(shí)序
  35.         delay1();
  36.         s=P0;                 //從LCD的數(shù)據(jù)口讀狀態(tài)
  37.         delay1();
  38.         E=0;               
  39.         delay1();
  40.         RW=0;
  41.         delay1();
  42.         return(s);           //返回讀取的LCD狀態(tài)字
  43. }

  44. //寫命令
  45. void lcd_w_cmd(unsigned char com)
  46. {
  47.         unsigned char i;
  48.         do{                               //查LCD忙操作
  49.                 i=lcd_r_start();      //調(diào)用讀狀態(tài)字函數(shù),讀取LCD狀態(tài)字
  50.                 i=i&0x80;             //與操作屏蔽掉低7位
  51.                 delay(1);             //延時(shí)1ms
  52.         }while(i!=0);               //LCD忙,繼續(xù)查詢,否則退出循環(huán)
  53.         RW=0;                  
  54.         delay1();
  55.         RS=0;                  //RW=0,RS=0,寫LCD命令操作
  56.         delay1();
  57.         E=1;                                                                                //E端時(shí)序
  58.         delay1();
  59.         P0=com;               //將com中的命令寫入LCD數(shù)據(jù)口
  60.         delay1();
  61.         E=0;
  62.         delay1();
  63.         RW=1;
  64.         delay(1);
  65. }

  66. //寫數(shù)據(jù)
  67. void lcd_W_dat(unsigned char dat)
  68. {
  69.         unsigned char i;
  70.         do{                               //查LCD忙操作
  71.                 i=lcd_r_start();      //調(diào)用讀狀態(tài)字函數(shù),讀取LCD狀態(tài)字
  72.                 i=i&0x80;             //與操作屏蔽掉低7位
  73.                 delay(1);             //延時(shí)1ms
  74.         }while(i!=0);              //LCD忙,繼續(xù)查詢,否則退出循環(huán)
  75.         RW=0;
  76.         delay1();
  77.         RS=1;                                                                                //RW=0,RS=0,寫LCD數(shù)據(jù)
  78.         delay1();
  79.         E=1;                                                                                //E端時(shí)序
  80.         delay1();
  81.         P0=dat;                 //將dat中的命令寫入LCD數(shù)據(jù)口   
  82.         delay1();
  83.         E=0;
  84.         delay1();
  85.         RW=1;
  86.         delay(255);
  87. }

  88. //lcd初始化
  89. void lcd_init()
  90. {
  91.         lcd_w_cmd(0x38);     //設(shè)置工作方式
  92.         lcd_w_cmd(0x0c);     //設(shè)置顯示狀態(tài)
  93.         lcd_w_cmd(0x01);            //清屏
  94.         lcd_w_cmd(0x06);     //設(shè)置輸入方式
  95.         lcd_w_cmd(0x80);     //設(shè)置初始顯示位置
  96. }

  97. //在LCD上顯示字符串函數(shù)
  98. void show_sting(unsigned char ch[])
  99. {
  100.         unsigned char i;
  101.         i=0;
  102.         while(ch[i]!='\0')                   //字符串結(jié)束符
  103.         {
  104.                 lcd_w_cmd(0x83+i);      //字符串顯示位置
  105.                 lcd_W_dat(ch[i]);
  106.                 i++;
  107.         }
  108. }

  109. void main()
  110. {
  111.         lcd_init();           //LCD初始化   
  112.         while(1)
  113.         {
  114.                 show_sting("HELLO");
  115.         }
  116. }
復(fù)制代碼

LCDtest.zip

40.22 KB, 下載次數(shù): 6

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:907204 發(fā)表于 2022-3-26 18:06 | 只看該作者
求有空的大佬幫忙看看哪里出問題了!謝謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:975909 發(fā)表于 2022-3-26 18:59 | 只看該作者
如果lcd1602顯示達(dá)不到預(yù)期效果,肯定程序有點(diǎn)錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

地板
ID:149451 發(fā)表于 2022-3-26 19:12 | 只看該作者
有顯示啊,沒問題的

回復(fù)

使用道具 舉報(bào)

5#
ID:161164 發(fā)表于 2022-3-26 19:21 | 只看該作者
部份版本的Protues LCD1602仿真不支援查忙
于是你的程序在While(i!=0)中死循環(huán)了
回復(fù)

使用道具 舉報(bào)

6#
ID:907204 發(fā)表于 2022-3-26 19:36 | 只看該作者
w1179benp 發(fā)表于 2022-3-26 19:12
有顯示啊,沒問題的

謝大佬幫忙查看,看了二樓知道問題出在哪里了!前幾天protues8.6升8.9了,應(yīng)該是這個(gè)原因。
回復(fù)

使用道具 舉報(bào)

7#
ID:907204 發(fā)表于 2022-3-26 19:38 | 只看該作者
lkc8210 發(fā)表于 2022-3-26 19:21
部份版本的Protues LCD1602仿真不支援查忙
于是你的程序在While(i!=0)中死循環(huán)了

謝謝大佬!應(yīng)該是版本問題,我前幾天protues8.6換8.9了。感謝
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表