找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21417|回复: 43
收起左侧

单片机加个PCF8574模块,实现IIC方式驱动LCD1602

  [复制链接]
ID:71233 发表于 2019-3-4 18:51 | 显示全部楼层 |阅读模式
PCF8574模块使实现IIC驱动LCD1602成为现实。

下图是PCF8574模块与1602的连接电路图:

实物接法如下:
想要使用PCF8574模块来实现IIC驱动LCD1602,首先非常必要弄清楚IIC的时序、PCF8574设备地址、四线控制LCD1602方法。
下面是两个重要的h文件。通过修改这两个h文件中的部分代码(接线有所不同)即可移植到你的程序中去。

单片机源程序如下:
  1. void delay1(uchar x)
  2. {
  3.         uchar a,b;
  4.         for(a=x;a>0;a--)
  5.          for(b=200;b>0;b--);
  6. }

  7. void write_com(uchar com)                //写命令函数
  8. {        uchar com1,com2;
  9.         com1=com|0x0f;
  10.         write_add(com1&0xfc);
  11.         delay1(2);
  12.     write_add(com1&0xf8);
  13.         com2=com<<4;
  14.         com2=com2|0x0f;
  15.         write_add(com2&0xfc);
  16.         delay1(2);
  17.     write_add(com2&0xf8);
  18.        
  19. }

  20. void write_date(uchar date)                //写数据函数
  21. {
  22.         uchar date1,date2;
  23.         date1=date|0x0f;
  24.         write_add(date1&0xfd);
  25.         delay1(2);
  26.         write_add(date1&0xf9);
  27.         date2=date<<4;
  28.         date2=date2|0x0f;
  29.         write_add(date2&0xfd);
  30.         delay1(2);
  31.         write_add(date2&0xf9);
  32.                
  33. }

  34. void init_lcd()                                        //初始化函数
  35. {                                                                                                 
  36.         write_com(0x33); //显示模式设置
  37.         delayms(6);
  38.         write_com(0x32); //显示模式设置
  39.         delayms(6);
  40.         write_com(0x28); //4位总线,双行显示,显示5×7的点阵字符
  41.         delayms(6);
  42.         write_com(0x01); //清屏
  43.         delayms(6);
  44.         write_com(0x06); //字符进入模式:屏幕不动,字符后移
  45.         delayms(6);
  46.         write_com(0x0c); //显示开,关光标
  47.         //write_LCD_Command(0x0f); //显示开,开光标,光标闪烁
  48.         delayms(6);
  49. }

  50. //显示字符串:第x行第y列显示什么内容
  51. void ShowString(unsigned char x,unsigned char y,unsigned char *str)
  52. {
  53.        
  54.         if(x == 1)
  55.         {
  56.                 write_com(0x80 | y-1);
  57.         }
  58.         if(x == 2)
  59.         {
  60.                 write_com(0xc0 | y-1);
  61.         }
  62.         //输出字符串
  63.        
  64.         while(*str!='\0')
  65.         {
  66.                 write_date(*str);
  67.                 str++;
  68.         }

  69. }
复制代码

所有资料51hei提供下载:
PCF8574 LCD1602_4.rar (685 Bytes, 下载次数: 633)

评分

参与人数 3黑币 +160 收起 理由
peiyingxuan + 30 赞一个!
xinyu0000 + 30 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:674764 发表于 2019-12-26 17:51 | 显示全部楼层
我测试成功了,感谢楼主!
分享下经验:如果是8574 写入的地址是0X27<<1 ,如果是8574A,写入的地址是0X3F<<1
(write_add 里面指代的是8574A)
iic的sart,stop,ack 。。。 都是通用的
回复

使用道具 举报

ID:71233 发表于 2019-3-5 10:28 | 显示全部楼层
补个实物连接图:
回复

使用道具 举报

ID:216839 发表于 2019-4-19 17:26 | 显示全部楼层
看到里面的内容了,一个函数一个压缩包
回复

使用道具 举报

ID:465596 发表于 2019-6-23 17:09 | 显示全部楼层
谢谢分享,不好一点就是分成两包
回复

使用道具 举报

ID:66287 发表于 2019-6-24 08:17 | 显示全部楼层
谢谢楼主分享,但实际中毫无意义。淘宝上IIC方式驱动的LCD1602屏就8元多,比这个模块贵不了多少。好用多了!
回复

使用道具 举报

ID:568561 发表于 2019-7-9 22:05 | 显示全部楼层
void delay1(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
         for(b=200;b>0;b--);
}

void write_com(uchar com)                //写命令函数
{        uchar com1,com2;
        com1=com|0x0f;
        write_add(com1&0xfc);
        delay1(2);
    write_add(com1&0xf8);
        com2=com<<4;
        com2=com2|0x0f;
        write_add(com2&0xfc);
        delay1(2);
    write_add(com2&0xf8);
       
}

void write_date(uchar date)                //写数据函数
{
        uchar date1,date2;
        date1=date|0x0f;
        write_add(date1&0xfd);
        delay1(2);
        write_add(date1&0xf9);
        date2=date<<4;
        date2=date2|0x0f;
        write_add(date2&0xfd);
        delay1(2);
        write_add(date2&0xf9);
               
}

void init_lcd()                                        //初始化函数
{                                                                                                 
        write_com(0x33); //显示模式设置
        delayms(6);
        write_com(0x32); //显示模式设置
        delayms(6);
        write_com(0x28); //4位总线,双行显示,显示5×7的点阵字符
        delayms(6);
        write_com(0x01); //清屏
        delayms(6);
        write_com(0x06); //字符进入模式:屏幕不动,字符后移
        delayms(6);
        write_com(0x0c); //显示开,关光标
        //write_LCD_Command(0x0f); //显示开,开光标,光标闪烁
        delayms(6);
}

//显示字符串:第x行第y列显示什么内容
void ShowString(unsigned char x,unsigned char y,unsigned char *str)
{
       
        if(x == 1)
        {
                write_com(0x80 | y-1);
        }
        if(x == 2)
        {
                write_com(0xc0 | y-1);
        }
        //输出字符串
       
        while(*str!='\0')
        {
                write_date(*str);
                str++;
        }

}
这就是 高级货
回复

使用道具 举报

ID:564867 发表于 2019-7-10 03:12 | 显示全部楼层
厲害 高手
回复

使用道具 举报

ID:282095 发表于 2019-7-10 09:18 | 显示全部楼层
I2C通讯啊
回复

使用道具 举报

ID:198286 发表于 2019-7-30 11:40 | 显示全部楼层
正要做这个,软件很好
回复

使用道具 举报

ID:104472 发表于 2019-10-20 21:41 | 显示全部楼层
能驱动就好,麻烦能告诉下,哪句是PCF8574地址句。
回复

使用道具 举报

ID:461060 发表于 2019-12-1 19:25 | 显示全部楼层
write_add函数没有啊
回复

使用道具 举报

ID:343874 发表于 2019-12-12 21:10 | 显示全部楼层
淘宝店家给的例程是arduino的,直接调用现成的库,也是醉了,到论坛里来看看有没有能用的程序
回复

使用道具 举报

ID:674764 发表于 2019-12-26 17:34 | 显示全部楼层
这段代码可行吗,有人成功吗?
里面的 write_byte 有疑问
回复

使用道具 举报

ID:684573 发表于 2020-1-10 13:16 | 显示全部楼层
先看看,正在用这个模块。
回复

使用道具 举报

ID:684573 发表于 2020-1-20 09:34 | 显示全部楼层
有现成的,懒得自己写协议转换程序了。
回复

使用道具 举报

ID:159575 发表于 2020-2-28 14:53 来自手机 | 显示全部楼层
bhjyqjs 发表于 2019-6-24 08:17
谢谢楼主分享,但实际中毫无意义。淘宝上IIC方式驱动的LCD1602屏就8元多,比这个模块贵不了多少。好用多了 ...

那个宝上买的就是这个东西的成品。
回复

使用道具 举报

ID:224006 发表于 2020-3-5 21:32 | 显示全部楼层
2个文件都需要?
回复

使用道具 举报

ID:71233 发表于 2020-3-25 08:11 | 显示全部楼层
jiajuntao 发表于 2019-10-20 21:41
能驱动就好,麻烦能告诉下,哪句是PCF8574地址句。

void write_iic(uchar date1)//写入数据到IO    中的
      write_byte(0x7e); //8574A地址,写数据

uchar read_iic()//向IO读取数据  中的
      write_byte(0x7f); //8574A地址,写数据
回复

使用道具 举报

ID:67274 发表于 2020-4-1 00:51 | 显示全部楼层
确实不错,void write_add(uchar date1)//写入数据到IO
{
        start();
//        write_byte(0x7e); 0X3F<<1   0x7e 8574A芯片
        write_byte(0x4e); //bin(0x27<<1) 0x4e 8574 芯片
        respons();
        write_byte(date1);
        respons();
        stop();
}
回复

使用道具 举报

ID:723160 发表于 2020-4-6 10:55 | 显示全部楼层
真好用感谢感谢
回复

使用道具 举报

ID:89217 发表于 2020-4-20 21:14 | 显示全部楼层
真好,要啥来啥,我都怀疑我被监控了,谢谢
回复

使用道具 举报

ID:733339 发表于 2020-5-10 14:27 来自手机 | 显示全部楼层
这个是只需要该pcf8574的地址然后直接运行就可以了吗
回复

使用道具 举报

ID:751512 发表于 2020-5-14 16:34 | 显示全部楼层
STC12C5A60S2 打死也调试不出来。疯了
回复

使用道具 举报

ID:60263 发表于 2020-5-22 14:46 | 显示全部楼层
刚买子这个模块测试下
回复

使用道具 举报

ID:769393 发表于 2020-6-4 20:09 | 显示全部楼层
ytzmoonunit 发表于 2019-12-26 17:51
我测试成功了,感谢楼主!
分享下经验:如果是8574 写入的地址是0X27

还好你提醒,要不然我怎么都调试不通。
回复

使用道具 举报

ID:510861 发表于 2020-7-30 19:40 | 显示全部楼层
1602  老是搞不定   不知道哪里问题
回复

使用道具 举报

ID:760449 发表于 2020-8-19 17:01 | 显示全部楼层
感谢楼主分享,现在就试一下
回复

使用道具 举报

ID:878236 发表于 2021-1-16 21:21 | 显示全部楼层
感谢楼主分享,刚入了这转接板,现在就试一下
回复

使用道具 举报

ID:89528 发表于 2021-2-16 22:09 | 显示全部楼层
借用楼主程序,用STC15W408单片机测试了一下,现把完整的测试工程文件分享一下

PCF8574+1602.rar

28.43 KB, 下载次数: 75, 下载积分: 黑币 -5

回复

使用道具 举报

ID:748788 发表于 2021-2-17 16:03 | 显示全部楼层
请问pcf8574+1602可以用proteus仿真吗?
回复

使用道具 举报

ID:471579 发表于 2021-4-28 12:21 | 显示全部楼层
正在看这个,但是没有点亮,在找找看是啥原因
回复

使用道具 举报

ID:837828 发表于 2021-4-28 12:29 | 显示全部楼层
谢谢,51hei真好用
回复

使用道具 举报

ID:947166 发表于 2021-6-30 16:42 | 显示全部楼层
hunterfox 发表于 2020-5-14 16:34
STC12C5A60S2 打死也调试不出来。疯了

老哥,我也用的60s2,同样调不出来,你知道什么问题了吗
回复

使用道具 举报

ID:947166 发表于 2021-6-30 16:43 | 显示全部楼层
tomsmiss123 发表于 2021-4-28 12:21
正在看这个,但是没有点亮,在找找看是啥原因

找到原因了么,我也是没有输出显示
回复

使用道具 举报

ID:947166 发表于 2021-6-30 16:46 | 显示全部楼层
请教一下,我也用的这个模块,单片机用的stc12C5A60S2, lcd是1602A,用您的程序调试,没用结果,地址我改的0x27,不过换了其他的也没用
回复

使用道具 举报

ID:137736 发表于 2021-7-2 23:23 | 显示全部楼层
谢谢楼主,有用
回复

使用道具 举报

ID:994649 发表于 2021-12-20 14:12 | 显示全部楼层
不是SCL对应15,SDA对应14吗
回复

使用道具 举报

ID:383215 发表于 2022-9-5 13:03 | 显示全部楼层
非常感谢楼主的无私奉献!按照楼主的程序,稍加修改,立即成功!
之前用一片CD4094成功驱动LCD1602,这次我只要把8574驱动I/O口的试验做成功就可以了。
01.jpg
02.jpg

拆掉洞洞板之前做试验的两片74HC595,留下LED和电阻,加上8574,我用的是双列直插PCF8574P,经过试验发现,PCF8574P的I/O口驱动能力较弱,通过1K电阻驱动LED,亮度只有一点点,远远达不到CD4094和74HC595的驱动能力,估计驱动LCD1602问题不大,毕竟PCF8574P的I/O口是双向I/O口。之所以用PCF8574P,是因为PCF8574P才一块多钱一片,需要注意的是,PCF8574P 13脚INT不能直接接VCC,必须通过电阻才能接VCC,否则芯片发烫!!!
单片机用的是STC8H1K08,PCF8574P双列直插的写地址是0x40,STC8H1K08用的IRC是1.2M,注释掉所有的delay( ),程序运行照样正常,经过试验,IRC为5M,程序正常,IRC为6M,程序不正常, delay( )替换成一个_nop_ ( ) 应该就可以了,那么IRC为12M,估计要替换两个到三个nop,程序才能正常。另外,应答部分的程序代码没有完全看懂,等以后用到的时候再慢慢研究和改进了。

回复

使用道具 举报

ID:1049498 发表于 2022-10-28 01:19 | 显示全部楼层
hunterfox 发表于 2020-5-14 16:34
STC12C5A60S2 打死也调试不出来。疯了

我也是,请问调试出来了么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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