找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4227|回复: 2
收起左侧

提供LCD1602四线八线的单片机驱动程序给新手参考使用

[复制链接]
ID:55211 发表于 2018-11-3 18:03 | 显示全部楼层 |阅读模式
制作出来的实物图如下:
IMG_20181103_000856.jpg IMG_20181103_000456_HHT.jpg IMG_20181103_000735.jpg
QQ浏览器截图20181103175332.png

四线八线都可以用,送给需要的

单片机源程序如下:
  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开显示  c=1有光标  b=1光标不闪     显示开,有光标 不闪
  15. #define                Display_OFF                0x08                 //        zzzz 1dcb   d=1开显示  c=1有光标  b=1光标不闪     显示开,有光标 不闪
  16. #define                EntryMode                0x06                 //        显示光标移动设置
  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);         //检测P0最高位是否为1
  55. #endif
  56. #if LcdMode8>0
  57.         result = (bit)(lcdDat & 0x80);         //检测P0最高位是否为1
  58. #endif
  59.         LcdEn = 0;
  60.         return result;//返回侧忙结果
  61. }


  62. void LcdWriteBety(uchar dat1,uchar btey){//btey=1  写数据   btey=0 写指令
  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);                         //不用时钟分频延时要用         c51不用
  74.         _nop_();
  75.         LcdEn = 0;
  76.         LcdEn = 0;
  77.         lcdDat=        (dat1<<2)&0x3c;         //再低
  78.         LcdEn = 1;
  79. //        Lcddelay(11);                         //不用时钟分频延时要用         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. //测屏代码
  163.         CLK_DIV=0x02; //时钟分频         c51用不上,stc12c5404用
  164.         while(1){
  165.                
  166.                 WriteStr(1,1,dis1);
  167.                 WriteStr(1,2,dis2);
  168.                 LED = ~LED;       
  169.          
  170.         }         

  171. }
复制代码

所有资料51hei提供下载:
4-8line1602.zip (46.56 KB, 下载次数: 68)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:223183 发表于 2019-3-25 20:28 | 显示全部楼层
老哥四线的好像不管用啊我用的是STC89C51
回复

使用道具 举报

ID:264697 发表于 2020-4-8 14:08 | 显示全部楼层
谢谢分享,超赞!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表