LP-MSPM0L1306开发板试用体验---I2C接口LCD1602显示屏驱动篇

[复制链接]
 楼主| jinglixixi 发表于 2023-10-12 10:01 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-10-12 10:05 编辑

#申请原创#
由于MSPM0L1306开发板没有配置相应的显示器件,故为它配置了一款I2C接口的LCD1602显示模块,从而使它能够有效地增强信息输出能力。
该显示模块是以PCF8574为核心处理芯片,经它处理将I2C信号转化为并行信号来驱动LCD1602显示。
PCF8574 采用CMOS电路设计,通过两条双向总线(I2 C)来使大多数 MCU 实现远程 I/O 口扩展。该器件包含一个 8 位准双向口和一个 I 2 C 总线接口。PCF8574 电流消耗很低,且具有较大的电流驱动能力,可直接驱动 LED。
对于该显示模块,其LCD1602实际上是采用4位的数据驱动方式,而非常规的8位数据驱动方式。
该显示模块与开发板的连接关系为:
SCL---PA26
SDA---PA27
在GPIO口模拟I2C的情况下,其输出高低电平的语句定义为:
#defineSCL_high       DL_GPIO_setPins(GPIOA,DL_GPIO_PIN_26)
#defineSCL_low        DL_GPIO_clearPins(GPIOA,DL_GPIO_PIN_26)
#defineSDA_high       DL_GPIO_setPins(GPIOA,DL_GPIO_PIN_27)
#defineSDA_low        DL_GPIO_clearPins(GPIOA,DL_GPIO_PIN_27)

模拟I2C开始与结束的函数为:
  1. void start()
  2. {
  3.         SDA_high;
  4.         delay_cycles(10);
  5.         SCL_high;
  6.         delay_cycles(10);
  7.         SDA_low;
  8.         delay_cycles(10);
  9. }

  10. void stop()
  11. {
  12.         SDA_low;
  13.         delay_cycles(10);
  14.         SCL_high;
  15.         delay_cycles(10);
  16.         SDA_high;
  17.         delay_cycles(10);
  18. }
模拟I2C方式字节数据的函数为:
  1. void write_byte(uint8_t date)
  2. {
  3.         uint8_t i,temp,m;
  4.         temp=date;
  5.         for(i=0;i<8;i++)
  6.         {
  7.            SCL_low;
  8.            delay_cycles(10);
  9.            m=temp;
  10.            m=m&0x80;
  11.            if(m==0x80)
  12.           {
  13.                 SDA_high;
  14.           }
  15.           else  SDA_low;
  16.           temp=temp<<1;
  17.           delay_cycles(10);
  18.           SCL_high;
  19.           delay_cycles(10);
  20.         }
  21.         SCL_low;
  22.         delay_cycles(10);
  23.         SDA_high;
  24.         delay_cycles(10);
  25. }
进行应答处理判别的函数为:
  1. void look()
  2. {
  3.     uint8_t i,sda;
  4.     DL_GPIO_initDigitalInput(IOMUX_PINCM28);
  5.     i=0;
  6.     sda=DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_27);
  7.     while((sda==1)&&(i<250)) i++;
  8.     DL_GPIO_initDigitalOutput(IOMUX_PINCM28);
  9. }

  10. void respons()
  11. {
  12.       uint8_t i;
  13.       SCL_high;
  14.       delay_cycles(10);
  15.       look();
  16.       SCL_low;
  17.       delay_cycles(10);
  18. }
向指定地址发送数据的函数为:
  1. Void write_add(uint8_t date1)
  2. {
  3.         start();
  4.         if(M_8574==0)
  5.         write_byte(0x4e);
  6.         elseif(M_8574==1)
  7.         write_byte(0x7e);
  8.         elseif(M_8574==2)
  9.         write_byte(0x27);
  10.         elseif(M_8574==3)
  11.         write_byte(0x3f);
  12.         respons();
  13.         write_byte(date1);
  14.         respons();
  15.         stop();
  16. }
对LCD1602进行初始化的函数为:
  1. void init_lcd()
  2. {
  3.         SDA_high;
  4.         delay_cycles(10);
  5.         SCL_high;
  6.         delay_cycles(10);
  7.         write_add(0x08);
  8.         write_com(0x0f);
  9.         write_com(0x28);
  10.         write_add(0x0c);
  11.         write_add(0x08);
  12.         write_com(0x28);
  13.         write_com(0x01);
  14.         write_com(0x0c);
  15.         write_com(0x06);
  16. }
用于显示处理的函数为:
  1. Void display()
  2. {
  3.         uint8_t i;
  4.         write_com(0x80);
  5.         for(i=0;i<16;i++)
  6.         {
  7.                 write_date(t0[i]);
  8.                 delay_cycles(10);
  9.         }
  10.         write_com(0x80+0x40);
  11.         for(i=0;i<16;i++)
  12.         {
  13.                 write_date(t1[i]);
  14.                 delay_cycles(10);
  15.         }

  16.         if(M_8574==0)
  17.         {
  18.                 write_date('4');
  19.                 write_date('E');
  20.         }
  21.         elseif(M_8574==1)
  22.         {
  23.                 write_date('7');
  24.                 write_date('E');
  25.         }
  26.         elseif(M_8574==2)
  27.         {
  28.                 write_date('2');
  29.                 write_date('7');
  30.         }
  31.         elseif(M_8574==3)
  32.         {
  33.                 write_date('3');
  34.                 write_date('F');
  35.         }
  36. }
进行显示测试的主程序为:
  1. int main(void)
  2. {
  3.     SYSCFG_DL_init();
  4.     init_lcd();
  5.     while(1)
  6.     {
  7.           display();
  8.           delay_cycles(1000);
  9.           init_lcd();
  10.           M_8574++;
  11.           if(M_8574>=4)
  12.           {
  13.               M_8574=0;
  14.           }
  15.     }
  16. }

A.jpg
显示效果图

xyz549040622 发表于 2023-10-12 21:27 | 显示全部楼层
还是模拟IC接口的,我试试硬件IC驱动试试,是不是没有加上拉电阻的原因呢?
 楼主| jinglixixi 发表于 2023-10-13 08:44 | 显示全部楼层
xyz549040622 发表于 2023-10-12 21:27
还是模拟IC接口的,我试试硬件IC驱动试试,是不是没有加上拉电阻的原因呢? ...

用过PA0和PA1,它有上拉电阻。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部