带字库液晶显示模块LCM12864_C51驱动

楼主
带字库液晶显示模块LCM12864_C51驱动
作者:清风徐徐
复制代码
  1. /**********************带字库液晶显示模块LCM12864ZK********************/  
  2. #include <REG51.H>  
  3. #include <STDIO.H>  
  4. /*********************************************************************/  
  5. #define Uchar unsigned char  
  6. #define Uint unsigned int  
  7. #define Ulong unsigned long  
  8. sbit E=P3^0; //对应第8脚  
  9. sbit RW=P3^1; //对应第7脚  
  10. sbit RS=P3^2; //对应第6脚  
  11. sbit BG=P3^3; //背光源正极2脚  
  12. Uchar BUSY,hang,lie;  
  13.  
  14. /********************************/  
  15. //定义字符串数组 */  
  16. /********************************/  
  17. code char STR2[]="单片机显示技术网";  
  18. code char STR3[]="网址:http://www.mcubbs.net";  
  19.  
  20. /**************************定义函数原型********************************/  
  21. void Delayus(Ulong t) ; /*延时函数*/  
  22. void BUSYLOOP(); //*判忙函数*//  
  23. void Write_command(Uchar CMD,Uchar bb); //*发控制字函数*//  
  24. void Write_data(Uchar CMD); //*发数据函数*//  
  25. void CHUSHIHUA(); //*初始化函数*//  
  26. void CLEAR(); //*清屏*//  
  27. void Display( Uchar *ptr,Uchar ddram); //**显字符串函数**//  
  28.  
  29.  
  30. /*********************************************延时**************************************/  
  31. void Delayus(Ulong t)  
  32. {int i,j;  
  33. for (i=0;i<t;i++)  
  34. for (j=0;j<t;j++)  
  35. ;  
  36. }  
  37.  
  38. //*********************判忙函数************************//  
  39. void BUSYLOOP()  
  40. { P1=0x0ff;  
  41. RS=0;  
  42. RW=1;  
  43. do {  
  44. E=1;  
  45. BUSY=P1;  
  46. E=0;  
  47. }  
  48. while(BUSY>0x7F);  
  49. }  
  50. //*********************写控制字函数****************************//  
  51. void Write_command(Uchar CMD,Uchar bb)  
  52. { if(bb)  
  53. {BUSYLOOP();}  
  54. RS=0;  
  55. RW=0;  
  56. E=1;  
  57. P1=CMD;  
  58. Delayus(1);  
  59. E=0;  
  60. }  
  61.  
  62. //*********************写数据函数****************************//  
  63. void Write_data(Uchar CMD)  
  64. { BUSYLOOP();  
  65. RS=1;  
  66. RW=0;  
  67. E=1;  
  68. P1=CMD;  
  69. Delayus(1);  
  70. E=0;  
  71. }  
  72.  
  73. //*************************液晶初始化********************************//  
  74. void CHUSHIHUA()  
  75. {  
  76. Delayus(38);  
  77. Write_command(0x30,0);  
  78. Delayus(1);  
  79. Write_command(0x30,0);  
  80. Delayus(1);  
  81. Write_command(0x0C,1);  
  82. Delayus(1);  
  83. Write_command(0x01,1);  
  84. Delayus(20);  
  85. Write_command(0x06,1);  
  86. }  
  87. /***************************清 屏*************************************/  
  88. void CLEAR()  
  89. { RS=0;  
  90. RW=0;  
  91. E=1;  
  92. P1=0x01;  
  93. Delayus(1);  
  94. E=0;  
  95. }  
  96. /**************************主函数开始***********************************/  
  97. main()  
  98. { CLEAR();  
  99. CHUSHIHUA(); //初始化函数//  
  100. Display(STR2,0x82); // 上面一行显示一个预定字符串  
  101. Display(STR3,0x88);  
  102. Delayus(200);  
  103. Write_command(0x9C,0); //将光标移到0x9C  
  104. Write_command(0x0f,0); //光标处反白闪烁  
  105.  
  106. // write_command(0x08,0); //进入睡眠状态  
  107. // delayus(200);  
  108. // write_command(0x0C,0); //唤醒  
  109.  
  110. while(1)  
  111. { ; }  
  112. }  
  113. /*************************主函数结束*************************************/  
  114.  
  115. /*=======================================================  
  116. 显示字符串  
  117. =======================================================*/  
  118. void Display(Uchar *ptr,Uchar ddram)  
  119. {  
  120. Uchar l,i1,x;  
  121. l=0;  
  122. if(ddram<0x88)  
  123. { hang=0; } //定位行地址:第一行  
  124. else if(ddram<0x90)  
  125. { hang=2; } //定位行地址:第三行  
  126. else if(ddram<0x98)  
  127. { hang=1; } //定位行地址:第二行  
  128. else  
  129. { hang=3; } //定位行地址:第四行  
  130.  
  131. lie=0x0f&ddram; //定位列地址  
  132. if(lie>0x07)  
  133. { lie=lie-0x08;}  
  134. x=lie*2;  
  135. Write_command(ddram,0); // 定位显示起始地址  
  136. while ((ptr[l])!='\0')  
  137. {l++;}  
  138. for (i1=0;i1<l;i1++)  
  139. { Write_data(ptr[i1]); //输出单个字符  
  140.   x++;  
  141.  if (x ==0x10)  
  142.  { x=0;  
  143.   hang++;  
  144.   switch (hang)  
  145.  {  
  146.  case 0:Write_command(0x80,0);  
  147.  break;  
  148.  case 1:Write_command(0x90,0);  
  149.  break;  
  150.  case 2:Write_command(0x88,0);  
  151.  break;  
  152.  case 3:Write_command(0x98,0);  
  153.  }  
  154.   if (hang>3)  
  155.    {  
  156.     Write_command(0x80,0);  
  157.     hang=0;  
  158.    }  
  159.   }  
  160.  }  
  161. }

电脑版 Page created in 6.5781 seconds width 3 queries.