单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7069|回复: 30
收起左侧

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

  [复制链接]
新新科技 发表于 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, 下载次数: 310)

评分

参与人数 2黑币 +130 收起 理由
xinyu0000 + 30 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

ldshen00 发表于 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++;
        }

}
这就是 高级货
回复

使用道具 举报

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

使用道具 举报

鹏博士PBs 发表于 2019-7-10 09:18 | 显示全部楼层
I2C通讯啊
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

zyt心有所寄 发表于 2020-1-8 01:26 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

zongyu1119 发表于 2020-2-26 10:00 | 显示全部楼层
看着很不错。
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

布吉岛, 发表于 2020-3-6 07:23 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

超级流氓兔 发表于 2020-3-7 16:36 | 显示全部楼层
感谢楼主的分享
回复

使用道具 举报

 楼主| 新新科技 发表于 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地址,写数据
回复

使用道具 举报

a461624201 发表于 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();
}
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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