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

QQ登錄

只需一步,快速開(kāi)始

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

在stc15w單片機(jī)上的lcd12864顯示源程序(并口方式)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于在stc15w上的顯示
LCD12864實(shí)驗(yàn)步驟:
1、將12864按照正確方向插到開(kāi)發(fā)板J4上面;
1、MINI USB連接線給開(kāi)發(fā)板通電下載程序,下載軟件中內(nèi)部IRC時(shí)鐘選擇11.0592MHZ;
2、下載程序后,撥動(dòng)RP1調(diào)節(jié)顯示灰度,LCD12864顯示正常(若不行,則LCD12864上的可調(diào)電位器也要調(diào)節(jié))。


單片機(jī)源程序如下:
  1. /****************************************Copyright (c)息---------------------------------------------------------------------------------
  2. ** 文件名  :                main.c                                                         
  3. **--------------------------------------------------------------------------------------------------------
  4. ** 作    者:                三棱鏡
  5. ** 創(chuàng)建日期:                2016-4-25
  6. ** 初始版本:                V1.0
  7. ** 描    述:                LCD12864顯示實(shí)驗(yàn)
  8. **--------------修改信息-----------------------------------------------------------------------------------
  9. ** 修改人  :                       
  10. ** 修改日期:               
  11. ** 當(dāng)前版本:                               
  12. ** 修改記錄:                               
  13. **********************************************************************************************************/
  14. #include <15W4KxxS4.h>
  15. #include <stdint.h>
  16. #include "config.h"
  17. #include "lcd.h"
  18. #include "hal_delay.h"                       

  19. /***************************************************************************
  20. * 描  述 : 主函數(shù)
  21. * 參  數(shù) : 無(wú)
  22. * 返回值 : 無(wú)
  23. **************************************************************************/
  24. int main()
  25. {

  26. /////////////////////////////////////////////////
  27. //注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關(guān)的IO口均為
  28. //      高阻態(tài),需將這些口設(shè)置為準(zhǔn)雙向口或強(qiáng)推挽模式方可正常使用
  29. //相關(guān)IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
  30. //        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
  31. /////////////////////////////////////////////////
  32.         P0M1 = 0;        P0M0 = 0;        //設(shè)置P0.0~P0.7為準(zhǔn)雙向口
  33.         P1M1 = 0;        P1M0 = 0;        //設(shè)置P1.0~P1.7為準(zhǔn)雙向口
  34.         P3M1 = 0;        P3M0 = 0;        //設(shè)置P3.0~P3.7為準(zhǔn)雙向口
  35.         P4M1 = 0;        P4M0 = 0;        //設(shè)置P4.0~P4.7為準(zhǔn)雙向口
  36.         P5M1 = 0;        P5M0 = 0;        //設(shè)置P5.0~P5.7為準(zhǔn)雙向口
  37.         P2M1 = 0; P2M0 = 0;
  38.                
  39.        
  40.         LCD_Init();        //LCD初始化
  41.         delay_ms(10);
  42.         Fill_GDRAM(0x00);  //清屏
  43.         delay_ms(10);

  44.   LCD_ShowString(1,2,8,"LCD12864");
  45.         LCD_ShowString(2,2,8,"液晶模塊");

  46.        
  47.         while(1);
  48. }
  49. /*********************************END FILE********************************************/       
復(fù)制代碼
  1. /****************************************Copyright (c)         
  2. **
  3. **--------------文件信息---------------------------------------------------------------------------------
  4. ** 文件名  :                lcd.c                                                         
  5. **--------------------------------------------------------------------------------------------------------
  6. ** 作    者:                三棱鏡
  7. ** 創(chuàng)建日期:                2016-9-10
  8. ** 初始版本:                V1.0
  9. ** 描    述:                LCD12864驅(qū)動(dòng)程序
  10. **--------------修改信息-----------------------------------------------------------------------------------
  11. ** 修改人  :                       
  12. ** 修改日期:               
  13. ** 當(dāng)前版本:                               
  14. ** 修改記錄:                               
  15. **********************************************************************************************************/
  16. #include <15W4KxxS4.h>
  17. #include <math.h>
  18. #include "config.h"
  19. #include "lcd.h"
  20. #include "hal_delay.h"


  21. /***************************************************************************
  22. * 描  述 : LCD12864液晶判忙程序。如LCD為“忙”狀態(tài),一直等待直到LCD空閑
  23. * 參  數(shù) : 無(wú)
  24. * 返回值 : 無(wú)
  25. **************************************************************************/
  26. void Busy(void)   
  27. {   
  28.         uchar busy;
  29.        
  30.         do  
  31.         {         
  32.                 RW = 1; RS = 0;   //讀                                          
  33.                 E = 1;            //使能液晶模塊.0=關(guān)閉使能端,1=打開(kāi)使能端
  34.                 P0M0=0x00;
  35.                 P0M1=0x00;              //設(shè)置P2.0~P2.7為準(zhǔn)雙向口
  36.                 busy=P0;          //讀取P2狀態(tài)      
  37.                 delay_5us(10);        
  38.                 E = 0;            //關(guān)閉液晶模塊使能端.0=關(guān)閉使能端,1=打開(kāi)使能端     
  39.         }while(busy&0x80);  //判斷BUSY位是否工作:1=內(nèi)部在工作,0=空閑
  40. }  
  41. /***************************************************************************
  42. * 描  述 : LCD12864液晶模塊從當(dāng)前地址讀RAM數(shù)據(jù)
  43. * 參  數(shù) : 無(wú)
  44. * 返回值 : Dat:讀取的數(shù)據(jù)
  45. **************************************************************************/
  46. uchar ReadDat(void)
  47. {
  48.   uchar Dat;
  49.   
  50.         P0 = 0xff;
  51.         Busy();         //判忙
  52.        
  53.         RW = 1;RS = 1;  //讀
  54.         E = 1;          //使能液晶模塊.0=關(guān)閉使能端,1=打開(kāi)使能端
  55.   Dat=P0;         //保存讀取的數(shù)據(jù)
  56.         delay_5us(1);
  57.   E = 0;          //關(guān)閉液晶模塊使能端.0=關(guān)閉使能端,1=打開(kāi)使能端      
  58.   delay_5us(1);
  59.   return Dat;
  60. }
  61. /***************************************************************************
  62. * 描  述 : LCD12864液晶命令寫入程序
  63. * 參  數(shù) : cmd[in]:寫入的命令
  64. * 返回值 : 無(wú)
  65. **************************************************************************/
  66. void Write_Cmd(uchar cmd)
  67. {      
  68.         Busy();       //判忙
  69.           
  70.         RW=0; RS=0;   //寫指令                     
  71.         P0M1 = 0;          
  72.         P0M0 = 0xff;        //設(shè)置P2.0~P2.7為推挽輸出
  73.         P0=cmd;       //寫入命令
  74.        
  75.         E=1;          //使能液晶模塊.0=關(guān)閉使能端,1=打開(kāi)使能端
  76.         delay_5us(1);  
  77.         E=0;          //關(guān)閉液晶模塊使能端.0=關(guān)閉使能端,1=打開(kāi)使能端  
  78.   delay_5us(1);        
  79. }
  80. /***************************************************************************
  81. * 描  述 : LCD12864液晶數(shù)據(jù)寫入程序
  82. * 參  數(shù) : dat[in]:寫入的數(shù)據(jù)
  83. * 返回值 : 無(wú)
  84. **************************************************************************/
  85. void Write_Data(uchar dat)
  86. {   
  87.         Busy();       //判忙                   
  88.         RW=0;RS=1;    //寫數(shù)據(jù)   
  89.                 
  90.         P0M1 = 0;       
  91.         P0M0 = 0xff;        //設(shè)置P2.0~P2.7為推挽輸出       
  92.         P0=dat;       //寫入數(shù)據(jù)
  93.   
  94.         E =1;         //使能液晶模塊
  95.         delay_5us(3);     
  96.         E =0;         //關(guān)閉液晶模塊使能端
  97. }  

  98. /**************************************************************************
  99. * 描  述 : 指定位置顯示單個(gè)字符
  100. * 參  數(shù) : row[in]:行,范圍1~4
  101. *        :column[in]:列,范圍0~7  
  102. *        :chr[in]:字符編碼
  103. * 返回值 : 無(wú)
  104. **************************************************************************/
  105. void LCD_ShowChar(uchar row,uchar column,uchar chr)
  106. {             
  107.         uchar Address;
  108.        
  109.         //row判斷第幾行,column判斷第幾列,0x80為液晶行初始地址   
  110.         if(row == 1)Address=0x80+column;   
  111.         if(row == 2){Address=0x90+column;}        
  112.         if(row == 3){Address=0x88+column;}   
  113.         if(row == 4){Address=0x98+column;}  
  114.         Write_Cmd(Address);  //寫入地址命令到LCD12864     
  115.         Write_Data(chr);     //寫入顯示數(shù)據(jù)到LCD12864   
  116. }

  117. /***************************************************************************
  118. * 描  述 : 字符串顯示
  119. * 參  數(shù) : row[in]:行,范圍1~4
  120. *        :column[in]:列,范圍0~7  
  121. *        :num[in]:字符個(gè)數(shù),注意一個(gè)漢字=2個(gè)字符
  122. *        :s[in]:指向待顯示的字符串
  123. * 返回值 : 無(wú)
  124. **************************************************************************/
  125. void LCD_ShowString(uchar row,uchar column,uchar num,uchar *s)   
  126. {     
  127.         uchar Address;   
  128.        
  129.         //row判斷第幾行,column判斷第幾列,0x80為液晶行初始地址   
  130.         if(row == 1)Address=0x80+column;   
  131.         if(row == 2){Address=0x90+column;}        
  132.         if(row == 3){Address=0x88+column;}   
  133.         if(row == 4){Address=0x98+column;}   
  134.         Write_Cmd(Address);    //寫入顯示起始地址
  135.         while(num)             //寫入顯示數(shù)據(jù)的大小  
  136.         {   
  137.                 Write_Data(*(s++));  //寫入顯示數(shù)據(jù)到LCD12864   
  138.                 num--;         
  139.         }   
  140. }

  141. /***************************************************************************
  142. * 描  述 : 填充,當(dāng)如數(shù)數(shù)據(jù)為0的時(shí)候即可實(shí)現(xiàn)清屏
  143. * 參  數(shù) : dat[in]:填充的數(shù)據(jù)
  144. * 返回值 : 無(wú)
  145. **************************************************************************/
  146. void Fill_GDRAM(uchar dat)
  147. {
  148.   uchar i,j,k;

  149.   uchar GDRAM_X=0x80;
  150.   uchar GDRAM_Y=0x80;

  151.   for(i=0;i<2;i++)
  152.   {
  153.     for(j=0;j<32;j++)
  154.     {
  155.       for(k=0;k<8;k++)
  156.       {
  157.         Write_Cmd(0x34);
  158.         Write_Cmd(GDRAM_Y+j);
  159.         Write_Cmd(GDRAM_X+k);
  160.         Write_Data(dat);
  161.         Write_Data(dat);
  162.       }
  163.     }
  164.     GDRAM_X=0x88;
  165.   }

  166.   Write_Cmd(DRAM_ON);//開(kāi)啟繪圖模式
  167.   Write_Cmd(0x30);   //恢復(fù)基本指令集,關(guān)閉繪圖模式
  168. }

  169. /***************************************************************************
  170. * 描  述 : LCD12864液晶初始化程序
  171. * 參  數(shù) : 無(wú)
  172. * 返回值 : 無(wú)
  173. **************************************************************************/
  174. void LCD_Init(void)     
  175. {     
  176.    E = 0;         

  177.          delay_ms(1);                  
  178.          Write_Cmd(0x30);   // 基本指令集     
  179.          delay_ms(1);      
  180.          Write_Cmd(0x02);   // 地址歸位     
  181.          delay_ms(1);      
  182.          Write_Cmd(0x0c);   // 整體顯示打開(kāi),游標(biāo)關(guān)閉     
  183.          delay_ms(1);      
  184.          Write_Cmd(0x06);   // 游標(biāo)右移     
  185.          delay_ms(1);      
  186.          Write_Cmd(0x80);   // 設(shè)定顯示的起始地址     
  187.          delay_ms(1);      
  188.          Write_Cmd(0x01);   // 清除顯示
  189.          delay_ms(10);      // 這個(gè)延時(shí)必須要有,否則可能會(huì)出現(xiàn)花屏
  190. }

  191. /*********************************END FILE********************************************/
復(fù)制代碼

所有資料51hei提供下載:

實(shí)驗(yàn)52 - LCD12864顯示字符漢字.rar (90.61 KB, 下載次數(shù): 135)


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

使用道具 舉報(bào)

沙發(fā)
ID:370415 發(fā)表于 2018-7-12 18:28 | 只看該作者
感覺(jué)好高科技,能不能教我兩招?
回復(fù)

使用道具 舉報(bào)

板凳
ID:60656 發(fā)表于 2018-7-16 09:49 | 只看該作者
無(wú)法下載,扣了10幣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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