標(biāo)題: 提供LCD1602四線八線的單片機(jī)驅(qū)動(dòng)程序給新手參考使用 [打印本頁(yè)]

作者: 475345347    時(shí)間: 2018-11-3 18:03
標(biāo)題: 提供LCD1602四線八線的單片機(jī)驅(qū)動(dòng)程序給新手參考使用
制作出來(lái)的實(shí)物圖如下:



四線八線都可以用,送給需要的

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

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar dis1[]={"    welcome     "};
  6. uchar dis2[]={"   4line Mode   "};

  7. /***********************************************************/
  8. /***********************************************************/
  9. /***********************************************************/                                                                                 //
  10. #define                LcdMode4                   1                 // 選擇4線 為1   則為0
  11. #define                LcdMode8                   0                 // 選擇8線 為1   則為0
  12. #define                LineMode4                0x28                 //        zz1d nfxx        d=1是8線   d=0是4線         n=0是1行  n=1是2行 f=0是5x7 f=1是5x10                                                                                                                                                                               
  13. #define                LineMode8                0x38                 //        zz1d nfxx        d=1是8線   d=0是4線         n=0是1行  n=1是2行 f=0是5x7 f=1是5x10
  14. #define                Display_ON                0x0c                 //        zzzz 1dcb   d=1開(kāi)顯示  c=1有光標(biāo)  b=1光標(biāo)不閃     顯示開(kāi),有光標(biāo) 不閃
  15. #define                Display_OFF                0x08                 //        zzzz 1dcb   d=1開(kāi)顯示  c=1有光標(biāo)  b=1光標(biāo)不閃     顯示開(kāi),有光標(biāo) 不閃
  16. #define                EntryMode                0x06                 //        顯示光標(biāo)移動(dòng)設(shè)置
  17. #define                LcdClear                0x01                 //清屏                                                                                                                


  18. /***********************************************************/
  19. /*************** LCD1602腳位定義  **************************/
  20. /***********************************************************/
  21. #if LcdMode4>0                           //4線改這里

  22. sbit LcdEn = P2^2;
  23. sbit LcdRs = P2^3;
  24. sbit LcdRw = P2^5;
  25. #define lcdDat P3                   //xx0000xx

  26. #endif
  27. #if LcdMode8>0
  28.                                                   //8線改這里
  29. sbit LcdEn = P2^7;
  30. sbit LcdRs = P2^6;
  31. sbit LcdRw = P2^5;
  32. #define lcdDat P0

  33. #endif
  34. /***********************************************************/
  35. /***********************************************************/
  36. /***********************************************************/
  37. void Lcddelay(uint us){
  38.         uint i;
  39.         for(i=0;i<us;i++){
  40.                 _nop_();
  41.                 _nop_();       
  42.         }
  43. }
  44. /***********************************************************/
  45. /***********************************************************/
  46. /***********************************************************/


  47. bit Check_Busy()
  48. {                        
  49.         bit result;
  50.         LcdRs = 0;
  51.         LcdRw = 1;
  52.         LcdEn = 1;
  53. #if LcdMode4>0
  54.         result = (bit)((lcdDat>>2) & 0x80);         //檢測(cè)P0最高位是否為1
  55. #endif
  56. #if LcdMode8>0
  57.         result = (bit)(lcdDat & 0x80);         //檢測(cè)P0最高位是否為1
  58. #endif
  59.         LcdEn = 0;
  60.         return result;//返回側(cè)忙結(jié)果
  61. }


  62. void LcdWriteBety(uchar dat1,uchar btey){//btey=1  寫(xiě)數(shù)據(jù)   btey=0 寫(xiě)指令
  63. //        while(Check_Busy());                         //LcdRw 不用要屏蔽掉查忙
  64.         if(btey==0){
  65.                 LcdRs = 0;        }
  66.         else{
  67.                 LcdRs = 1;        }       
  68.         LcdRw = 0;
  69. #if LcdMode4>0
  70.         LcdEn = 0;       
  71.         lcdDat=        (dat1>>2)&0x3c;         //  1111 1111        先高
  72.         LcdEn = 1;
  73. //        Lcddelay(13);                         //不用時(shí)鐘分頻延時(shí)要用         c51不用
  74.         _nop_();
  75.         LcdEn = 0;
  76.         LcdEn = 0;
  77.         lcdDat=        (dat1<<2)&0x3c;         //再低
  78.         LcdEn = 1;
  79. //        Lcddelay(11);                         //不用時(shí)鐘分頻延時(shí)要用         c51不用
  80.         _nop_();
  81.         LcdEn = 0;

  82. #endif          
  83. #if LcdMode8>0

  84.         lcdDat=        dat1;
  85.         LcdEn = 1;
  86.         _nop_();
  87.         LcdEn = 0;

  88. #endif
  89. }
  90. /***********************************************************/
  91. /***********************************************************/
  92. /***********************************************************/
  93. void LcdInit(void){
  94.         #if LcdMode4>0
  95.         LcdWriteBety(LineMode4,0);
  96.         Lcddelay(20);
  97.         LcdWriteBety(LineMode4,0);
  98.        
  99.         #endif
  100.         #if LcdMode8>0
  101.         LcdWriteBety(LineMode8,0);
  102.         Lcddelay(20);
  103.         LcdWriteBety(LineMode8,0);
  104.         #endif
  105.         Lcddelay(20);
  106.         LcdWriteBety(Display_ON,0);
  107.         Lcddelay(10);
  108.         LcdWriteBety(EntryMode,0);
  109.         Lcddelay(10);
  110.         LcdWriteBety(LcdClear,0);
  111.         Lcddelay(10);
  112. }
  113. /***********************************************************/
  114. /***********************************************************/
  115. /***********************************************************/                                                 
  116. void LcdPos(uchar x,uchar y){
  117.         if(y==1) x=0x80+x-1;
  118.         if(y==2) x=0xc0+x-1;
  119.         LcdWriteBety(x,0);
  120. }
  121. /***********************************************************/
  122. /***********************************************************/
  123. /***********************************************************/
  124. void LcdClread(){
  125.         LcdWriteBety(LcdClear,0);
  126.         Lcddelay(1500);
  127. }
  128. /***********************************************************/
  129. /***********************************************************/
  130. /***********************************************************/
  131. void WriteStr(uchar x,uchar y,uchar *str){

  132.         LcdPos(x,y);
  133.         while(*str!='\0'){
  134.                 LcdWriteBety(*str++,1);
  135.         }
  136. }
  137. /***********************************************************/
  138. /***********************************************************/
  139. /***********************************************************/
  140. void LcdStr(uchar x,uchar y,uchar *str,uchar mun){
  141.         uchar i;
  142.         LcdPos(x,y);
  143.         for(i=0;i<mun;i++){
  144.                 LcdWriteBety(*str++,1);
  145.         }
  146. }

  147. /***********************************************************/
  148. /***********************************************************/
  149. /***********************************************************/
  150. sbit LED=P1^0;
  151. /***********************************************************/
  152. /***********************************************************/
  153. /***********************************************************/

  154. /***********************************************************/
  155. /***********************************************************/
  156. /***********************************************************/         

  157. void main(){
  158.        
  159.         LcdInit();
  160.         LcdClread();

  161. /****************************************************/       
  162. //測(cè)屏代碼
  163.         CLK_DIV=0x02; //時(shí)鐘分頻         c51用不上,stc12c5404用
  164.         while(1){
  165.                
  166.                 WriteStr(1,1,dis1);
  167.                 WriteStr(1,2,dis2);
  168.                 LED = ~LED;       
  169.          
  170.         }         

  171. }
復(fù)制代碼

所有資料51hei提供下載:
4-8line1602.zip (46.56 KB, 下載次數(shù): 69)


作者: 宋志碩    時(shí)間: 2019-3-25 20:28
老哥四線的好像不管用啊我用的是STC89C51
作者: tototm    時(shí)間: 2020-4-8 14:08
謝謝分享,超贊。。!




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