標題: 基于51單片機的ST7920芯片lcd12864液晶顯示程序 [打印本頁]

作者: AAA1122    時間: 2017-3-18 18:59
標題: 基于51單片機的ST7920芯片lcd12864液晶顯示程序
有助新人學習12864液晶的資料

ST7920驅動程序:
  1. /*********************************************************************************
  2. * 【編寫時間】: 2017年3月19日
  3. * 【作    者】: 清翔電子:03
  4. * 【版    本】: 1.0
  5. * 【實驗平臺】: QX-MCS51 單片機開發(fā)板
  6. * 【外部晶振】: 11.0592mhz       
  7. * 【主控芯片】: STC89C52RC
  8. * 【編譯環(huán)境】: Keil μVisio4       
  9. * 【程序功能】: 12864液晶顯示測試                                                                                           
  10. * 【使用說明】: 使用液晶前拔下數碼管J6跳帽
  11. 12864屏幕向板子外插,插在L1排母上
  12. **********************************************************************************/

  13. #include <reg52.h>
  14. #include <string.h>

  15. #define uchar unsigned char
  16. #define uint  unsigned int

  17. uchar code IC_DAT[];
  18. uchar code pic1[];
  19. uchar code pic2[];
  20. uchar code pic3[];

  21. sbit RS  = P0^7;
  22. sbit WRD = P0^6;
  23. sbit E   = P0^5;
  24. sbit PSB = P0^4;
  25. sbit RES = P0^3;

  26. void TransferData(char data1,bit DI);
  27. void display(void);
  28. void display_grapic(void);
  29. void delayms(uint n);
  30. void DisplayLine(uchar line1,uchar line2);
  31. void DisplayGraphic(uchar code *adder);
  32. void delay(uint m);
  33. void lcd_mesg(uchar code *adder1);

  34. uchar code IC_DAT[]={
  35. "    智能小車    "  
  36. "    俱樂部      "
  37. "    QQ 群號:     "
  38. "   12933307    "
  39. };

  40. uchar code IC_DAT2[]={
  41. "  床前明月光,  "                        //0x80
  42. "  疑是地上霜,  "                        //0x90
  43. "  舉頭望明月。  "                        //0x88
  44. "  低頭思故鄉(xiāng)。  "                        //0x98
  45. };

  46. /********************************************************************
  47. * 名稱 : Convert(uchar In_Date)
  48. * 功能 : 因為電路設計時,P0.0--P0.7接法剛好了資料中的相反,所以設計該函數。
  49. * 輸入 : 1602資料上的值
  50. * 輸出 : 送到1602的值
  51. ***********************************************************************/
  52. unsigned char Convert(unsigned char In_Date)
  53. {
  54.     unsigned char i, Out_Date = 0, temp = 0;
  55.     for(i=0; i<8; i++)
  56.     {
  57.         //temp = (In_Date >> i) & 0x01;
  58.         //Out_Date |= (temp << (7 - i));
  59.                 Out_Date=  In_Date;

  60.     }
  61.     return Out_Date;
  62. }

  63. void initinal(void)           //LCD字庫初始化程序
  64. {
  65.            delay(40);             //大于40MS的延時程序
  66.            PSB=1;                 //設置為8BIT并口工作模式
  67.            delay(1);              //延時
  68.            RES=0;                 //復位
  69.            delay(1);              //延時
  70.            RES=1;                 //復位置高
  71.            delay(10);
  72.            TransferData(0x30,0);  //Extended Function Set :8BIT設置,RE=0: basic instruction set, G=0 :graphic display OFF
  73.            delay(100);            //大于100uS的延時程序
  74.            TransferData(0x30,0);  //Function Set
  75.            delay(37);             ////大于37uS的延時程序
  76.            TransferData(0x08,0);  //Display on Control
  77.            delay(100);            //大于100uS的延時程序
  78.            TransferData(0x10,0);  //Cursor Display Control光標設置
  79.            delay(100);            //大于100uS的延時程序
  80.            TransferData(0x0C,0);  //Display Control,D=1,顯示開
  81.            delay(100);            //大于100uS的延時程序
  82.            TransferData(0x01,0);  //Display Clear
  83.            delay(10);             //大于10mS的延時程序
  84.            TransferData(0x06,0);  //Enry Mode Set,光標從右向左加1位移動
  85.            delay(100);            //大于100uS的延時程序
  86.           }

  87. /********************************************************************
  88. * 名稱 : Main()
  89. * 功能 : 主函數
  90. * 輸入 : 無
  91. * 輸出 : 無
  92. ***********************************************************************/
  93. void     initina2(void)           //LCD顯示圖片(擴展)初始化程序
  94.           {
  95.            delay(40);             //大于40MS的延時程序
  96.            PSB=1;                 //設置為8BIT并口工作模式
  97.            delay(1);              //延時
  98.            RES=0;                 //復位
  99.            delay(1);              //延時
  100.            RES=1;                 //復位置高
  101.            delay(10);

  102.            TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction
  103.            delay(100);            //大于100uS的延時程序
  104.            TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set
  105.            delay(37);             ////大于37uS的延時程序
  106.            TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)
  107.            delay(100);            //大于100uS的延時程序
  108.            TransferData(0x01,0);  //CLEAR SCREEN
  109.            delay(100);            //大于100uS的延時程序
  110.           }

  111. /********************************************************************
  112. * 名稱 : Main()
  113. * 功能 : 主函數
  114. * 輸入 : 無
  115. * 輸出 : 無
  116. ***********************************************************************/
  117. void    main(void)
  118.      {
  119.          while(1)
  120.             {
  121.                   initina2();            //調用LCD顯示圖片(擴展)初始化程序
  122.   
  123.           DisplayGraphic(pic2);  //顯示圖片2
  124.           delayms(200);                          

  125.           initinal();                    //調用LCD字庫初始化程序
  126.           delay(100);            //大于100uS的延時程序
  127.           lcd_mesg(IC_DAT);      //顯示中文漢字1
  128.           delayms(240);
  129.           delayms(240);
  130.           
  131.           initinal();                    //調用LCD字庫初始化程序
  132.           delay(100);            //大于100uS的延時程序
  133.           lcd_mesg(IC_DAT2);     //顯示中文漢字2
  134.           delayms(240);
  135.                   delayms(240);
  136.                   initinal();  
  137.         }
  138.       }

  139. /********************************************************************
  140. * 名稱 : Main()
  141. * 功能 : 主函數
  142. * 輸入 : 無
  143. * 輸出 : 無
  144. ***********************************************************************/
  145. void   lcd_mesg(unsigned char code *adder1)
  146. {
  147.         unsigned char i;
  148.         TransferData(0x80,0);  //Set Graphic Display RAM Address
  149.         delay(100);
  150.         for(i=0;i<32;i++)
  151.                 {
  152.                           TransferData(*adder1,1);
  153.                            adder1++;
  154.                 }

  155.         TransferData(0x90,0);  //Set Graphic Display RAM Address
  156.         delay(100);
  157.         for(i=32;i<64;i++)
  158.                 {
  159.                           TransferData(*adder1,1);
  160.                            adder1++;
  161.                 }
  162. }

  163. /********************************************************************
  164. * 名稱 : Main()
  165. * 功能 : 主函數
  166. * 輸入 : 無
  167. * 輸出 : 無
  168. ***********************************************************************/
  169. void    TransferData(char data1,bit DI)  //傳送數據或者命令,當DI=0是,傳送命令,當DI=1,傳送數據.
  170.           {
  171.             WRD=0;
  172.             RS=DI;
  173.             delay(1);
  174.             P2=Convert(data1);
  175.             E=1;
  176.             delay(1);
  177.             E=0;
  178.            }

  179. /********************************************************************
  180. * 名稱 : Main()
  181. * 功能 : 主函數
  182. * 輸入 : 無
  183. * 輸出 : 無
  184. ***********************************************************************/
  185. void    delayms(unsigned int n)            //延時10×n毫秒程序
  186.                    {
  187.                       unsigned int i,j;
  188.                       for(i=0;i<n;i++)
  189.                          for(j=0;j<2000;j++);
  190.                    }

  191. /********************************************************************
  192. * 名稱 : Main()
  193. * 功能 : 主函數
  194. * 輸入 : 無
  195. * 輸出 : 無
  196. ***********************************************************************/
  197. void    delay(unsigned int m)            //延時程序
  198.                    {
  199.                       unsigned int i,j;
  200.                       for(i=0;i<m;i++)
  201.                          for(j=0;j<10;j++);
  202.                    }

  203. /********************************************************************
  204. * 名稱 : Main()
  205. * 功能 : 主函數
  206. * 輸入 : 無
  207. * 輸出 : 無
  208. ***********************************************************************/
  209. void DisplayGraphic(unsigned char code *adder)
  210. {

  211.    int i,j;
  212. //*******顯示上半屏內容設置
  213.    for(i=0;i<32;i++)              //
  214.     {
  215.       TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD
  216.       TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD
  217.       for(j=0;j<16;j++)
  218.        {
  219.          TransferData(*adder,1);
  220.          adder++;
  221.        }
  222.     }          
  223. //*******顯示下半屏內容設置
  224.    for(i=0;i<32;i++)              //
  225.     {
  226.       TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
  227.       TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD
  228.       for(j=0;j<16;j++)
  229.        {
  230.          TransferData(*adder,1);
  231.          

  232. …………余下代碼請下載附件…………
復制代碼

下載:
實驗23 12864液晶測試程序.rar (40.5 KB, 下載次數: 117)


作者: lyjsongshan    時間: 2018-8-10 09:13
這個程序LCD讀寫不會出錯嗎?TransferData(char data1,bit DI) ,我看時序圖,
作者: lyjsongshan    時間: 2018-8-10 09:15
void    TransferData(char data1,bit DI)  //傳送數據或者命令,當DI=0是,傳送命令,當DI=1,傳送數據.           {             WRD=0;             RS=DI;             delay(1);             P2=Convert(data1);             E=1;             delay(1);             E=0;            },,感覺應該是先 E=1;P2=Convert(data1); delay(1);             E=0;
作者: popo321    時間: 2018-11-28 15:02
太好了,支持!謝謝樓主!
作者: ttaniscy    時間: 2018-12-26 08:23
好資料,正在學12864,太及時了,謝謝LZ
作者: Lzw1    時間: 2018-12-29 20:30
你們有花屏的情況嗎
作者: 1246698540    時間: 2019-4-7 22:36
感謝分享
作者: durongze    時間: 2024-6-5 00:11
這個驗證過了嗎?
作者: durongze    時間: 2024-6-5 00:16
void Ini_Lcd( void )
{
Port_init_12864(); /*  液晶控制端口設置為輸出 */
LCD_write_com( 0x30 ); /*  基本指令集 */
Delay_1ms();
LCD_write_com( 0x02 ); /*  地址歸位 */
Delay_1ms();
LCD_write_com( 0x0c ); /*  整體顯示打開 , 游標關閉 */
Delay_1ms();
LCD_write_com( 0x01 ); /*  清除顯示 */
Delay_1ms();
LCD_write_com( 0x06 ); /*  游標右移 */
Delay_1ms();
LCD_write_com( 0x80 ); /*  設定顯示的起始地址 */
}
你的初始化和別人的差異好大,這個有影響嗎?
作者: durongze    時間: 2024-6-9 01:13
感謝樓主分享。這個我試過了,可以使用




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1