找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1739|回復(fù): 1
收起左側(cè)

幫忙看看lcd顯示程序有什么錯(cuò)誤,lcd不顯示字符 求幫助

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 3 黑幣 回復(fù)本帖可獲得 3 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:397660 發(fā)表于 2019-4-8 17:57 | 顯示全部樓層 |閱讀模式
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "main.h"
  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. /*LCD12864  端口定義*/
  7. #define LCD_data  P0            //數(shù)據(jù)口
  8. sbit LCD_RS  =  P2^5;            //寄存器選擇輸入
  9. sbit LCD_RW  =  P2^6;            //液晶讀/寫控制
  10. sbit LCD_EN  =  P2^7;            //液晶使能控制
  11. sbit LCM_RST =  P3^2;
  12. //sbit LCD_PSB =  P0^4;            //串/并方式控制,部分液晶不需要

  13. uchar code dis0[]="  IC卡門禁系統(tǒng)  ";
  14. uchar code dis1[]="1.IC卡輸入      ";
  15. uchar code dis2[]="2.密碼輸入:8位  ";
  16. uchar code dis3[]="3.IC卡登記      ";
  17. uchar code dis4[]="4.密碼設(shè)置:8位  ";
  18. uchar code dis5[]="成功            ";
  19. uchar code dis6[]="失敗            ";


  20. void delay(int ms)         //延時(shí)xms
  21. {
  22.     while(ms--)
  23.         {
  24.       uchar i;
  25.           for(i=0;i<250;i++)  
  26.            {
  27.             _nop_();                          
  28.                 _nop_();
  29.                 _nop_();
  30.                 _nop_();
  31.            }
  32.         }
  33. }      

  34. void delayNOP()  //延時(shí)4us
  35. { _nop_(); _nop_(); _nop_(); _nop_();}
  36. /*******************************************************************/
  37. /*                                                                 */
  38. /*因?yàn)橐_的定義DB0..DB7是從P1.7...P1.0排列的                                                    */
  39. /*所以順序需要調(diào)換一下                                             */
  40. /*                                                                 */
  41. /*******************************************************************/
  42.   INT8U swapbit(INT8U udata)
  43. {
  44.   INT8U ii,tmp=0;
  45.   for(ii=0;ii<8;ii++)
  46.   {
  47.     tmp<<=1;
  48.     if(udata&0x01)
  49.     {
  50.       tmp|=0x01;
  51.     }
  52.     udata>>=1;
  53.   }
  54.   return tmp;
  55. }

  56. /*******************************************************************/
  57. /*                                                                 */
  58. /*檢查L(zhǎng)CD忙狀態(tài)                                                    */
  59. /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。      */
  60. /*                                                                 */
  61. /*******************************************************************/
  62. bit lcd_busy()
  63. {                          
  64.     bit result;
  65.     LCD_RS = 0;
  66.     LCD_RW = 1;
  67.     LCD_EN = 1;
  68.     delayNOP();
  69.     result = (bit)(LCD_data&0x80);
  70.     LCD_EN = 0;
  71.     return(result);
  72. }
  73. /*******************************************************************/
  74. /*                                                                 */
  75. /*寫指令數(shù)據(jù)到LCD                                                  */
  76. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  77. /*                                                                 */
  78. /*******************************************************************/
  79. void write_cmd(unsigned char WCLCM,BuysC)
  80. {                          
  81.    unsigned int K=20000;     
  82.    while(lcd_busy() && K--);  //預(yù)防沒插LCD時(shí)候停在這
  83.     LCD_RS = 0;
  84.     LCD_RW = 0;
  85.     LCD_EN = 0;
  86.     _nop_();
  87.     _nop_();
  88.     LCD_data = swapbit(WCLCM);
  89.     delayNOP();
  90.     LCD_EN = 1;
  91.     delayNOP();
  92.     LCD_EN = 0;  
  93. }
  94. /*******************************************************************/
  95. /*                                                                 */
  96. /*寫顯示數(shù)據(jù)到LCD                                                  */
  97. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  98. /*                                                                 */
  99. /*******************************************************************/
  100. void lcd_wdat(unsigned char WDLCM)
  101. {                          
  102.    unsigned int K=20000;     
  103.    while(lcd_busy() && K--);  //預(yù)防沒插LCD時(shí)候停在這
  104.     LCD_RS = 1;
  105.     LCD_RW = 0;
  106.     LCD_EN = 0;
  107.     LCD_data= swapbit(WDLCM);
  108.     delayNOP();
  109.     LCD_EN = 1;
  110.     delayNOP();
  111.     LCD_EN = 0;
  112. }
  113. /*******************************************************************/
  114. /*                                                                 */
  115. /*  LCD初始化設(shè)定                                                  */
  116. /*                                                                 */
  117. /*******************************************************************/
  118. void lcd_init()
  119. {

  120. //   LCD_PSB = 1;         //并口方式        ,部分液晶不需要
  121.    // LCM_RST =0;
  122.     write_cmd(0x36);      //擴(kuò)充指令操作
  123.     delay(5);
  124.     write_cmd(0x30);      //基本指令操
  125.         delay(5);
  126.     write_cmd(0x0C);      //顯示開,關(guān)光標(biāo)
  127.     delay(5);
  128.     write_cmd(0x01);      //清除LCD的顯示內(nèi)容
  129.     delay(5);
  130. }         
  131. /*********************************************************/
  132. /*                                                       */
  133. /* 設(shè)定顯示位置                                          */
  134. /*                                                       */
  135. /*********************************************************/
  136. void lcd_pos(uchar X,uchar Y)
  137. {                          
  138.    uchar  pos;
  139.    if (X==0)
  140.      {X=0x80;}
  141.    else if (X==1)
  142.      {X=0x90;}
  143.    else if (X==2)
  144.      {X=0x88;}
  145.    else if (X==3)
  146.      {X=0x98;}
  147.    pos = X+Y ;  
  148.    write_cmd(pos);     //顯示地址
  149. }

  150. /*********************************************************/
  151. /*                                                                                                                 */
  152. /* 顯示主程序                                                                        */
  153. /*                                                       */
  154. /*********************************************************/
  155. void display_all()
  156. {

  157.     uchar i;         
  158.                      
  159.           lcd_pos(0,0);             //第一行顯示數(shù)字0~9
  160.           i = 0;   
  161.       while(dis0[i] != '\0')
  162.        {
  163.          lcd_wdat(dis0[i]);      //顯示字母
  164.          i++;
  165.        }
  166.             
  167.       lcd_pos(1,0);             //第二行顯示字母
  168.           i = 0;   
  169.       while(dis1[i] != '\0')
  170.        {
  171.          lcd_wdat(dis1[i]);      //顯示字母
  172.          i++;
  173.        }

  174.           lcd_pos(2,0);             //第三行顯示文字
  175.           i = 0;
  176.       while(dis2[i] != '\0')
  177.        {
  178.          lcd_wdat(dis2[i]);     
  179.          i++;
  180.        }

  181.           lcd_pos(3,0);             //第四行顯示廣工無線電社
  182.           i = 0;
  183.       while(dis3[i] != '\0')
  184.        {
  185.          lcd_wdat(dis3[i]);     
  186.          i++;
  187.        }
  188.          
  189. }

  190. /*********************************************************/
  191. /*                                                                                                                 */
  192. /* 特定字符顯示主程序                                                                        */
  193. /*                                                     

  194. C:
  195. 0="  IC卡點(diǎn)臺(tái)燈    ";
  196. 1="1.讀卡中....    ";
  197. 2="2.登記....      ";
  198. 3="成功            ";
  199. 4="失敗            ";

  200. /*********************************************************/
  201. void display(uchar a,uchar b,uchar c)
  202. {

  203.       uchar i;                    
  204.           lcd_pos(a,b);             //第一行顯示數(shù)字0~9
  205.           i = 0;
  206.           switch(c)
  207.           {
  208.                case 0:
  209.                 while(dis0[i] != '\0')
  210.               {
  211.                 lcd_wdat(dis0[i]);      //顯示字母
  212.                 i++;
  213.               }
  214.                           break;

  215.                      case 1:
  216.                while(dis1[i] != '\0')
  217.               {
  218.                 lcd_wdat(dis1[i]);      //顯示字母
  219.                 i++;
  220.               }
  221.                           break;

  222.                          case 2:
  223.                while(dis2[i] != '\0')
  224.               {
  225.                 lcd_wdat(dis2[i]);      //顯示字母
  226.                 i++;
  227.               }
  228.                           break;


  229.                           case 3:
  230.                while(dis3[i] != '\0')
  231.               {
  232.                 lcd_wdat(dis3[i]);      //顯示字母
  233.                 i++;
  234.               }
  235.                           break;         
  236.                           
  237.                           
  238.            case 4:
  239.                while(dis4[i] != '\0')
  240.               {
  241.                 lcd_wdat(dis4[i]);      //顯示字母
  242.                 i++;
  243.               }                 
  244.                           break;         

  245.            case 5:
  246.                while(dis5[i] != '\0')
  247.               {
  248.                 lcd_wdat(dis5[i]);      //顯示字母
  249.                 i++;
  250.               }                 
  251.                           break;
  252.            case 6:
  253.                while(dis6[i] != '\0')
  254.               {
  255.                 lcd_wdat(dis6[i]);      //顯示字母
  256.                 i++;
  257.               }                 
  258.                           break;

  259.                           default :break;
  260.           }
  261. }

  262. /*********************************************************/
  263. /*                                                                                                                 */
  264. /* 一般字符顯示主程序                                                            */
  265. /*                                                     

  266. *p:內(nèi)容
  267. c:個(gè)數(shù)

  268. /*********************************************************/
  269. void display2(uchar a,uchar b,uchar *p,uchar num)
  270. {

  271.       uchar i;                 
  272.           lcd_pos(a,b);             //第一行顯示數(shù)字0~9      
  273.       for(i=0;i<num;i++)
  274.           lcd_wdat(p[i]);      //顯示字母

  275. }

  276. /********************
  277. 清除某一行
  278. *********************/
  279. void display_clear_line(uchar a)
  280. {
  281.    uchar i;
  282.    lcd_pos(a,0);
  283.    for(i=0;i<16;i++)
  284.      lcd_wdat(' ');
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:454897 發(fā)表于 2019-12-10 10:23 | 顯示全部樓層
請(qǐng)問你解決了嗎,我也遇到一樣的問題。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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