找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4378|回复: 11
收起左侧

PCF8574 STC15单片机的驱动程序 LCD1602显示

  [复制链接]
ID:466381 发表于 2019-4-14 14:01 | 显示全部楼层 |阅读模式
去网上找了很多的的1602程序,结果要么全是ARDUINO和STM32,要么没一个靠谱的,所以决定自己写,测了N久终于写出来了,看上去效果不错哈哈哈哈!
(MCU是STC15F2K60S2)

制作出来的实物图如下:
IMG_20190414_135456.jpg

单片机源程序如下:
  1. #include"pcf8574.h"

  2. #define WriteADDR 0x4e
  3. #define ReadADDR 0x4f
  4. #define u8 unsigned char
  5.         
  6. #define CSSet 0x04//EN=1
  7. #define CSReset  0x00//EN=0

  8. #define COMSet 0x08  // RS=0 RW=0
  9. #define DATSet 0x09  // RS=1 RW=0

  10. void delay_ms(u8 ms)   //误差 0us
  11. {
  12.         while(ms--)
  13.         {
  14.     u8 a,b;
  15.     for(b=129;b>0;b--)
  16.                  for(a=45;a>0;a--);
  17.         }
  18. }

  19. bit PCFSendAByte(u8 addr,dat)
  20. {
  21. IICStart();
  22. IICSend(addr);
  23. if(!IICCheckAck()){return(0);}
  24. IICSend(dat);
  25. if(!IICCheckAck()){return(0);}
  26. IICStop();
  27. return(1);
  28. }        

  29. /*u8 PCFReadAByte(u8 addr)
  30. {
  31. u8 mmp;
  32. IICStart();
  33. IICSend(addr);
  34. IICSendAck(Ack);
  35. mmp=IICRead();
  36. IICSendAck(NoAck);
  37. IICStop();
  38. return(mmp);
  39. }



  40. /***************以下为1602****************/
  41. bit WriteCom1602(u8 com)
  42. {
  43. u8 tmp,mmp;
  44. IICStart();
  45. IICSend(WriteADDR);
  46. if(!IICCheckAck()){return(0);}
  47. tmp=com&0xf0;
  48. IICSend(CSReset|COMSet);       //EN=0 RS.RW=0 无数据
  49. if(!IICCheckAck()){return(0);}
  50. mmp=tmp|CSReset|COMSet;
  51. IICSend(mmp);                  //EN=0 RS.RW=0 有数据(高四位)
  52. if(!IICCheckAck()){return(0);}
  53. mmp|=CSSet;                    //EN=1 RS.RW=0 有数据(高四位)
  54. IICSend(mmp);
  55. if(!IICCheckAck()){return(0);}
  56. mmp&=(0xf0|COMSet);            
  57. IICSend(mmp);                  //EN=0
  58. if(!IICCheckAck()){return(0);}

  59. tmp=com<<4;
  60. mmp=tmp|CSReset|COMSet;
  61. IICSend(mmp);                  //EN=0 RS.RW=0 有数据(低四位)
  62. if(!IICCheckAck()){return(0);}
  63. mmp|=CSSet;                    //EN=1 RS.RW=0 有数据(低四位)
  64. IICSend(mmp);
  65. if(!IICCheckAck()){return(0);}
  66. mmp&=(0xf0|COMSet);            
  67. IICSend(mmp);                  //EN=0
  68. if(!IICCheckAck()){return(0);}

  69. IICStop();
  70. return(1);
  71. }

  72. bit WriteDat1602(u8 dat)
  73. {
  74. u8 tmp,mmp;
  75. IICStart();
  76. IICSend(WriteADDR);
  77. if(!IICCheckAck()){return(0);}
  78. tmp=dat&0xf0;
  79. IICSend(CSReset|DATSet);       //EN=0 RS.RW=0 无数据
  80. if(!IICCheckAck()){return(0);}
  81. mmp=tmp|CSReset|DATSet;
  82. IICSend(mmp);                  //EN=0 RS.RW=0 有数据(高四位)
  83. if(!IICCheckAck()){return(0);}
  84. mmp|=CSSet;                    //EN=1 RS.RW=0 有数据(高四位)
  85. IICSend(mmp);
  86. if(!IICCheckAck()){return(0);}
  87. mmp&=(0xf0|DATSet);            
  88. IICSend(mmp);                  //EN=0
  89. if(!IICCheckAck()){return(0);}

  90. tmp=dat<<4;
  91. mmp=tmp|CSReset|DATSet;
  92. IICSend(mmp);                  //EN=0 RS.RW=0 有数据(低四位)
  93. if(!IICCheckAck()){return(0);}
  94. mmp|=CSSet;                    //EN=1 RS.RW=0 有数据(低四位)
  95. IICSend(mmp);
  96. if(!IICCheckAck()){return(0);}
  97. mmp&=(0xf0|DATSet);            
  98. IICSend(mmp);                  //EN=0
  99. if(!IICCheckAck()){return(0);}

  100. IICStop();
  101. return(1);
  102. }

  103. void PCF1602Init()
  104. {
  105. WriteCom1602(0x28);
  106. delay_ms(15);
  107. WriteCom1602(0x28);
  108. delay_ms(15);
  109. WriteCom1602(0x28);
  110. delay_ms(15);
  111. PCFSendAByte(WriteADDR,0x04);
  112. delay_ms(15);
  113. WriteCom1602(0x28);
  114. WriteCom1602(0x0c);
  115. WriteCom1602(0x01);
  116. delay_ms(5);
  117. }

  118. void SetXY(u8 x,y)
  119. {
  120. u8 addr;
  121. addr=0x80+0x40*y+x;
  122. WriteCom1602(addr);
  123. }

  124. void StrinWrite(u8 x,y,u8 *string)
  125. {
  126. SetXY(x,y);
  127. while(*string)
  128. {
  129. WriteDat1602(*string++);
  130. }
  131. }
复制代码
0.png

所有资料51hei提供下载:
PCF8574 1602.zip (42.4 KB, 下载次数: 151)

评分

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

查看全部评分

回复

使用道具 举报

ID:466381 发表于 2019-4-15 09:44 来自手机 | 显示全部楼层
咋没人(自己抢沙发)
回复

使用道具 举报

ID:363580 发表于 2019-5-5 21:40 | 显示全部楼层
有人啦,虽然看不懂
回复

使用道具 举报

ID:429531 发表于 2019-9-26 10:18 | 显示全部楼层
正在研究这个  拿走研究去咯
回复

使用道具 举报

ID:67274 发表于 2020-3-31 20:09 | 显示全部楼层
stc15f104e应该能用吧?
回复

使用道具 举报

ID:647972 发表于 2020-4-27 09:47 | 显示全部楼层
好复杂啊,有没有简单一点的
回复

使用道具 举报

ID:510861 发表于 2020-7-30 19:42 | 显示全部楼层
感觉好难
回复

使用道具 举报

ID:795106 发表于 2020-11-30 18:14 | 显示全部楼层
晶振是多少
回复

使用道具 举报

ID:466381 发表于 2021-2-3 11:22 | 显示全部楼层

11.0592M
回复

使用道具 举报

ID:748788 发表于 2021-8-4 17:44 | 显示全部楼层
不错,一次成功,感谢楼主的无私奉献。12m晶振不行
回复

使用道具 举报

ID:1004642 发表于 2022-2-10 15:10 | 显示全部楼层
正在找这玩意,真合适
回复

使用道具 举报

ID:860399 发表于 2022-3-22 13:19 | 显示全部楼层
运行显示错误欸mian.c(26): error C267: 'IICSend': requires ANSI-style prototype
mian.c - 1 Error(s), 3 Warning(s).
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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