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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機LCD1602漢字顯示中文及詳細注釋 顯示年月日漢字

[復制鏈接]
跳轉到指定樓層
樓主
1602是液晶顯示內容,漢字顯示對于初學者來說,有較大難度,我在學習過程中對前人的程序做了詳細注釋。希望可以幫助到列位黑友。




需要等1分鐘左右才顯示
單片機源程序如下:
  1. /*************************************************************************
  2. 程序功能:在LCD上顯示2013年08月21日
  3.           I Love Mcu
  4.           Author
  5.           x x x
  6. ******************頭文件聲明**********************************************/
  7. #include <reg51.h>
  8. #include <intrins.h>
  9. /*********************************端口定義**********************************/
  10. sbit rs=  P3^0;
  11. sbit rw = P3^1;
  12. sbit en = P3^2;
  13. sbit busy=P0^7;
  14. /********************************顯示數據表*********************************/
  15. unsigned char day[] = {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; //日的字符表
  16. unsigned char month[]={0x1f,0x11,0x1d,0x11,0x1d,0x11,0x11,0x00}; //月的字符表                                     //月的字符表
  17. unsigned char year[] ={0x40,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02}; //年的字符表
  18. unsigned char time[] ={"20130821"};
  19. unsigned char code1[]={"I Love Mcu"};
  20. unsigned char author[]={"Author"};
  21. unsigned char name[]={"X X X"};
  22. /*****************************************************************************
  23. 函數功能:LCD延時子程序
  24. *****************************************************************************/
  25. void Delay(unsigned char x)
  26. {
  27.    int i,j;
  28.    for(i=x;i>0;i--)
  29.      for(j=110;j>0;j--);
  30. }
  31. /*****************************************************************************
  32. 函數功能:測試LCD狀態是否忙碌
  33. 檢測原因:單片機處理速度較快,而LCD的處理速度較慢
  34. *****************************************************************************/
  35. bit lcd_check_busy()
  36. {
  37.         P0=0Xff;
  38.         rs = 0;//只要設置了rs=0,rw=1,就是要讀BF位
  39.         rw = 1;
  40.         en = 0;
  41.         _nop_(); //這三行的作用是進行一個空操作,讀BF數值,然后使能輸出BF值
  42.         en=1;
  43.         return busy; //如果LCD忙,就返回忙(BF=1)
  44. }
  45. /*****************************************************************************
  46. 函數功能:寫指令到LCD子程序
  47. *****************************************************************************/
  48. void lcd_wcmd(unsigned char cmd)
  49. {
  50.     while(lcd_check_busy()); //判斷LCD是否忙碌,忙才寫。我曾經改成!lcd_check_busy(),無法正常顯示
  51.         rs = 0;   //寫指令(只要rs = 0,rw = 0就是寫指令)
  52.         rw = 0;
  53.         en = 1;
  54.         P0 = cmd;
  55.         _nop_();
  56.         en = 0;
  57. }
  58. /*****************************************************************************
  59. 函數功能:寫數據到LCD子程序
  60. *****************************************************************************/
  61. void lcd_wdat(unsigned char dat)
  62. {
  63.         while(lcd_check_busy()); //判斷LCD是否忙碌,忙才寫
  64.         rs = 1;  //寫數據(只要rs = 1,rw = 0就是寫指令)
  65.         rw = 0;
  66.         en = 1;
  67.         P0 = dat;//先使能,才能讀dat數據
  68.         _nop_();
  69.         en = 0;
  70. }
  71. /*****************************************************************************
  72. 函數功能:設定顯示位置子程序
  73. *****************************************************************************/
  74. void lcd_pos(unsigned char pos)
  75. {
  76.         lcd_wcmd(pos | 0x80);//DDRAM地址設置,0x80=1000 0000,N = 1,分兩行顯示,
  77. }                        //首行A6-A0=00H-2FH|pos值,次行A6-A0 = 40H-67H|pos值
  78. /*****************************************************************************
  79. 函數功能:LCD初始化子程序(有個疑問,初始化程序,為什么顯示開關不直接設為0x0c?
  80.                           是不是因為要先全部關閉,才能清屏?)
  81. *****************************************************************************/
  82. void lcd_init()  // 以下指令名lcd_wcmd只是有個名字而已,0x38等才是關鍵
  83. {
  84.         lcd_wcmd(0x38);    //功能設置:8位數據,雙行顯示,5*7點陣
  85.         lcd_wcmd(0x08);    //顯示開關設置:顯示關閉,無光標,不閃爍--先關閉
  86.         lcd_wcmd(0x01);    //清屏
  87.         lcd_wcmd(0x06);    //輸入方式設置:光標自動增一
  88.         Delay(100);
  89.         lcd_wcmd(0x0c);    //顯示開關設置:顯示開啟,無光標,不閃爍--再開啟
  90. }
  91. /****************************************************************************
  92. 函數功能:建立年月日字符
  93. *****************************************************************************/
  94. void lcd_setup()    //先建立年月日字符
  95. {
  96.         unsigned int i;
  97.         lcd_wcmd(0x40);   //功能設置P0=0x40=0010 0000,4位,一行顯示,5*7點陣顯示
  98.         for(i=0;i<8;i++)
  99.         {
  100.         lcd_wdat(year[i]);
  101.         }
  102.     Delay(1000);
  103.         lcd_wcmd(0x48);
  104.         for(i=0;i<8;i++)
  105.         {
  106.                 lcd_wdat(month[i]);
  107.         }
  108.         Delay(1000);
  109.         lcd_wcmd(0x56);
  110.         for(i=0;i<8;i++)
  111.         {
  112.                 lcd_wdat(day[i]);
  113.         }
  114.         Delay(1000);
  115. }
  116. /*****************************************************************************
  117. 函數功能:主程序
  118. *****************************************************************************/
  119. void main(void)
  120. {
  121.         unsigned char i;
  122.         lcd_init();               //初始化LCD
  123.     lcd_setup();              //建立字符
  124.         while(1)
  125.         {
  126.             lcd_pos(0x00);            
  127.                 for(i=0;i<4;i++)
  128.                 {
  129.                         lcd_wdat(time[i]);     //顯示2013
  130.                 }

  131.                 lcd_pos(0x05);             //設置起始地址是0x05,0x05|0x80=0x85
  132.                 lcd_wdat(0x00);            //寫指令,P0=0x00
  133.          
  134.                 lcd_pos(0x07);  //設置起始地址是0x07,0x05|0x80=0x87
  135.                 for(i=4;i<6;i++)
  136.                 {
  137.                         lcd_wdat(time[i]);     //顯示08
  138.             Delay(1000);
  139.                 }
  140.          
  141.                 lcd_pos(0x0a);             //設置起始地址是0x0a,0x0a|0x80=0x8a
  142.                 lcd_wdat(0x01);            //寫數據,P0=0x01
  143.         
  144.                 lcd_pos(0x0c);            //設置起始地址是0x0c,0x0c|0x80=0x8c
  145.                 for(i=6;i<8;i++)
  146.                 {
  147.                         lcd_wdat(time[i]);    //顯示21
  148.             Delay(1000);
  149.                 }
  150.                 lcd_pos(0x0f);            //設置起始地址是0x0f,0x0f|0x80=0x8f
  151.                 lcd_wdat(0x02);           //寫數據,P0=0x02
  152.            
  153.                 lcd_pos(0x43);            //設置起始地址是0x43,0x43|0x80=0xc3           
  154.                 for(i=0;i<10;i++)
  155.                 {
  156.                         lcd_wdat(code1[i]); //顯示I Love Mcu
  157.                Delay(1000);
  158.                 }
  159.                 for(i=0;i<17;i++)
  160.                 {
  161.                         lcd_wcmd(0x18); //0001 1000顯示字符平移一個字符位(0001),
  162.                         Delay(1000);    //顯示字符整體左移1位(1000)
  163.                 }                  
  164.                 lcd_wcmd(0x01);     //清屏      
  165.                  

  166.                 lcd_pos(0x05);
  167.                 for(i=0;i<6;i++)
  168.                 {
  169.                         Delay(10);
  170.                         lcd_wdat(author[i]);
  171.                 }

  172.                 lcd_pos(0x41);
  173.                 for(i=0;i<13;i++)
  174.                 {
  175.                         Delay(10);
  176.                         lcd_wdat(name[i]);
  177.                 }

  178.                 Delay(10);
  179.                 lcd_wcmd(0x01);
  180.         }
  181. }
復制代碼

所有資料51hei提供下載(有問題的問題):
1602LCD顯示詳細注釋.zip (864.6 KB, 下載次數: 118)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:753618 發表于 2020-6-10 19:31 | 只看該作者
可以顯示,但是要過一段時間,具體原因我不清楚。
回復

使用道具 舉報

板凳
ID:753618 發表于 2020-6-11 20:02 | 只看該作者
是的,需要等一分鐘左右,具體原因不清楚。開始懷疑是寫指令和數據時判斷LCD忙的條件有誤,改為非忙后,反而無法顯示漢字。
回復

使用道具 舉報

地板
ID:319868 發表于 2021-5-23 11:42 | 只看該作者
上面各位遇到的問題我解決了,沒有用忙判斷。樓主有兩個錯誤,一是寫命令和寫數據時序有問題,二是中文寫入地址有問題,所以樓主的“日”字顯示不出來,“年”地址是0x40,“月”地址是0x48,“日”地址應該是0x50,而不是0x56,因為是十六進制。代碼如下:
/*************************************************************************
3ìDò1|Äü£oÔúLCDéÏÏÔê¾2013Äê08ÔÂ21èÕ
          I Love Mcu
          Author
          x x x
******************í·ÎļtéùÃ÷**********************************************/
#include <reg51.h>
#include <intrins.h>
/*********************************¶Ë¿ú¶¨òå**********************************/
sbit rs=  P3^5;
sbit rw = P3^6;
sbit en = P3^4;
sbit busy=P1^7;
/********************************ÏÔê¾êy¾Y±í*********************************/
unsigned char day[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; //èÕμÄ×Ö·û±í
unsigned char month[]={0x1f,0x11,0x1d,0x11,0x1d,0x11,0x11,0x00}; //ÔÂμÄ×Ö·û±í
unsigned char year[] ={0x40,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02}; //ÄêμÄ×Ö·û±í
unsigned char one[]={0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00};//ò»
unsigned char two[]={0x00,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00};//¶t
unsigned char three[]={0x00,0x1F,0x00,0x0E,0x00,0x1F,0x00,0x00};//èy
unsigned char time[] ={"20130821"};
unsigned char code1[]={"I Love Mcu"};
unsigned char author[]={"Author"};
unsigned char name[]={"X X X"};
/*****************************************************************************
oˉêy1|Äü:LCDÑóê±×ó3ìDò
*****************************************************************************/
void Delay(unsigned char x)
{
   int i,j;
   for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}
/*****************************************************************************
oˉêy1|Äü£o2aêÔLCD×′ì¬êÇ·ñÃ|Âμ
¼ì2aÔ-òò£oμ¥Ƭ»ú′|àíËù¶è½Ï¿ì£¬¶øLCDμÄ′|àíËù¶è½ÏÂy
*****************************************************************************/
//bit lcd_check_busy()
//{
//        P1=0Xff;
//        rs = 0;//Ö»òaéèÖÃáËrs=0,rw=1,¾íêÇòa¶áBFλ
//        rw = 1;
//        en = 0;
//        _nop_(); //ÕaèyDDμÄ×÷óÃêǽøDDò»¸ö¿Õ2ù×÷£¬¶áBFêyÖ죬è»oóê1Äüêä3öBFÖμ
//        en=1;
//        return busy; //èç1ûLCDÃ|£¬¾í·μ»ØÃ|(BF=1)
//}
/*****************************************************************************
oˉêy1|Äü:D′Ö¸áîμ½LCD×ó3ìDò
*****************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
//  while(lcd_check_busy()); //ÅD¶ÏLCDêÇ·ñÃ|Â죬Ã|2ÅD′¡£ÎòÔø¾-¸Ä3飡lcd_check_busy()£¬ÎT·¨Õy3£ÏÔê¾
        rs = 0;   //D′Ö¸áî(Ö»òars = 0,rw = 0¾íêÇD′Ö¸áî)
        rw = 0;
        en = 1;
        P1 = cmd;
        _nop_();
        Delay(5);
        en = 0;
}
/*****************************************************************************
oˉêy1|Äü:D′êy¾Yμ½LCD×ó3ìDò
*****************************************************************************/
void lcd_wdat(unsigned char dat)
{
//        while(lcd_check_busy()); //ÅD¶ÏLCDêÇ·ñÃ|Â죬Ã|2ÅD′
        rs = 1;  //D′êy¾Y(Ö»òars = 1,rw = 0¾íêÇD′Ö¸áî)
        rw = 0;
        en = 1;
        P1 = dat;//Ïèê1Äü£¬2ÅÄü¶ádatêy¾Y
        _nop_();
        Delay(5);
        en = 0;
}
/*****************************************************************************
oˉêy1|Äü:é趨ÏÔê¾Î»ÖÃ×ó3ìDò
*****************************************************************************/
void lcd_pos(unsigned char pos)
{
        lcd_wcmd(pos | 0x80);//DDRAMμØÖ·éèÖã¬0x80=1000 0000£¬N = 1,·Öá½DDÏÔê¾£¬
        Delay(50);
}                        //ê×DDA6-A0=00H-2FH|posÖ죬′ÎDDA6-A0 = 40H-67H|posÖμ
/*****************************************************************************
oˉêy1|Äü:LCD3õê¼»ˉ×ó3ìDò£¨óD¸öòéÎ꣬3õê¼»ˉ3ìDò£¬Îaê2Ã′ÏÔ꾿a1Ø2»Ö±½óéèÎa0x0c£¿
                          êÇ2»êÇòòÎaòaÏèè«2¿1رÕ£¬2ÅÄüÇåÆá£¿£©
*****************************************************************************/
void lcd_init()  // òÔÏÂÖ¸áîÃûlcd_wcmdÖ»êÇóD¸öÃû×Ö¶øòÑ£¬0x38μè2ÅêÇ1ؼü
{
        lcd_wcmd(0x38);    //1|ÄüéèÖão8λêy¾Y£¬Ë«DDÏÔê¾£¬5*7μãÕó
        lcd_wcmd(0x08);    //ÏÔ꾿a1ØéèÖãoÏÔê¾1رÕ£¬ÎT1a±ê£¬2»éá˸--Ïè1رÕ
        lcd_wcmd(0x01);    //ÇåÆá
        lcd_wcmd(0x06);    //êäèë·½ê½éèÖão1a±ê×Ô¶ˉÔöò»
        Delay(100);
        lcd_wcmd(0x0c);    //ÏÔ꾿a1ØéèÖãoÏÔ꾿aÆô£¬ÎT1a±ê£¬2»éá˸--Ôù¿aÆô
}
/****************************************************************************
oˉêy1|Äü£o½¨á¢ÄêÔÂèÕ×Ö·û
*****************************************************************************/
void lcd_setup()    //Ï轨á¢ÄêÔÂèÕ×Ö·û
{
        unsigned int i;
        lcd_wcmd(0x40);   //1|ÄüéèÖÃP0=0x40=0010 0000£¬4룬ò»DDÏÔê¾£¬5*7μãÕóÏÔê¾
        for(i=0;i<8;i++)
        {
    lcd_wdat(year[i]);
                Delay(50);
        }
       
        lcd_wcmd(0x48);
        for(i=0;i<8;i++)
        {
                lcd_wdat(month[i]);
                Delay(50);
        }
       
        lcd_wcmd(0x50);
        for(i=0;i<8;i++)
        {
                lcd_wdat(day[i]);
                Delay(50);
        }
       
        lcd_wcmd(0x58);
        for(i=0;i<8;i++)
        {
                lcd_wdat(one[i]);
                Delay(50);
        }
       
        lcd_wcmd(0x60);
        for(i=0;i<8;i++)
        {
                lcd_wdat(two[i]);
                Delay(50);
        }
       
        lcd_wcmd(0x68);
        for(i=0;i<8;i++)
        {
                lcd_wdat(day[i]);
                Delay(50);
        }
}
/*****************************************************************************
oˉêy1|Äü:Ö÷3ìDò
*****************************************************************************/
void main(void)
{
        unsigned char i;
        lcd_init();               //3õê¼»ˉLCD
  lcd_setup();              //½¨á¢×Ö·û
        while(1)
        {
          lcd_pos(0x00);
                for(i=0;i<4;i++)
                {
                        lcd_wdat(time[i]);     //ÏÔê¾2013
                }

                lcd_pos(0x04);             //éèÖÃÆeê¼μØÖ·êÇ0x05£¬0x05|0x80=0x85
                lcd_wdat(0x00);            //D′Ö¸áP0=0x00
               
                lcd_pos(0x06);  //éèÖÃÆeê¼μØÖ·êÇ0x07£¬0x05|0x80=0x87
                for(i=4;i<6;i++)
                {
                        lcd_wdat(time[i]);     //ÏÔê¾08
                }
         
                lcd_pos(0x09);             //éèÖÃÆeê¼μØÖ·êÇ0x0a£¬0x0a|0x80=0x8a
                lcd_wdat(0x01);            //D′êy¾Y£¬P0=0x01
               
                lcd_pos(0x0b);            //éèÖÃÆeê¼μØÖ·êÇ0x0c£¬0x0c|0x80=0x8c
                for(i=6;i<8;i++)
                {
                        lcd_wdat(time[i]);    //ÏÔê¾21
                }
               
                lcd_pos(0x0e);            //éèÖÃÆeê¼μØÖ·êÇ0x0f£¬0x0f|0x80=0x8f
                lcd_wdat(0x02);           //D′êy¾Y£¬P0=0x02
               
                lcd_pos(0x43);            //éèÖÃÆeê¼μØÖ·êÇ0x43£¬0x43|0x80=0xc3  
                for(i=0;i<10;i++)
                {
                        lcd_wdat(code1[i]); //ÏÔê¾I Love Mcu
                }
//               
//                for(i=0;i<17;i++)
//                {
//                        lcd_wcmd(0x18); //0001 1000ÏÔê¾×Ö·ûƽòÆò»¸ö×Ö·ûλ(0001)£¬
//                        Delay(50);    //ÏÔê¾×Ö·ûÕûìå×óòÆ1λ(1000)
//                }                  
//                lcd_wcmd(0x01);     //ÇåÆá
//                Delay(50);
//                 
//                lcd_pos(0x05);
//                Delay(50);
//                for(i=0;i<6;i++)
//                {
//                        lcd_wdat(author[i]);
//                        Delay(50);
//                }

//                lcd_pos(0x41);
//                Delay(50);
//                for(i=0;i<13;i++)
//                {
//                        lcd_wdat(name[i]);
//                        Delay(50);
//                }

//                Delay(10);
//                lcd_wcmd(0x01);
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久一区二区三区 | 日韩aⅴ在线观看 | 亚洲一区欧美一区 | 黄色毛片在线看 | 久久精品—区二区三区 | www.久久.com| 午夜精品一区二区三区在线观看 | 国产成人精品一区二区三 | 亚洲天堂中文字幕 | 9999久久| 一区二区三区视频在线观看 | 国产精品久久久久9999鸭 | 一区二区av | 看真人视频一级毛片 | 精品视频在线观看 | 久久精品国产清自在天天线 | 四虎在线视频 | 久久精品一级 | 亚州精品成人 | 国产一区二区三区色淫影院 | 自拍偷拍精品 | 国产免费又色又爽又黄在线观看 | 成人国产精品久久久 | 美女视频h | 天天操夜夜骑 | 精精久久| 成人免费共享视频 | 天堂在线中文字幕 | 99热国产精品 | 久久不卡 | 精品久久av | 精品欧美乱码久久久久久1区2区 | 国产97视频在线观看 | 欧美精品综合在线 | 精品丝袜在线 | 99精品网| 国产高清自拍视频在线观看 | 久久av资源网 | 日韩一区二区三区视频在线观看 | 精品美女久久久 | 久久久www|