打印

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

[复制链接]
383|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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开始与结束的函数为:
void start()
{
        SDA_high;
        delay_cycles(10);
        SCL_high;
        delay_cycles(10);
        SDA_low;
        delay_cycles(10);
}

void stop()
{
        SDA_low;
        delay_cycles(10);
        SCL_high;
        delay_cycles(10);
        SDA_high;
        delay_cycles(10);
}
模拟I2C方式字节数据的函数为:
void write_byte(uint8_t date)
{
        uint8_t i,temp,m;
        temp=date;
        for(i=0;i<8;i++)
        {
           SCL_low;
           delay_cycles(10);
           m=temp;
           m=m&0x80;
           if(m==0x80)
          {
                SDA_high;
          }
          else  SDA_low;
          temp=temp<<1;
          delay_cycles(10);
          SCL_high;
          delay_cycles(10);
        }
        SCL_low;
        delay_cycles(10);
        SDA_high;
        delay_cycles(10);
}
进行应答处理判别的函数为:
void look()
{
    uint8_t i,sda;
    DL_GPIO_initDigitalInput(IOMUX_PINCM28);
    i=0;
    sda=DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_27);
    while((sda==1)&&(i<250)) i++;
    DL_GPIO_initDigitalOutput(IOMUX_PINCM28);
}

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

        if(M_8574==0)
        {
                write_date('4');
                write_date('E');
        }
        elseif(M_8574==1)
        {
                write_date('7');
                write_date('E');
        }
        elseif(M_8574==2)
        {
                write_date('2');
                write_date('7');
        }
        elseif(M_8574==3)
        {
                write_date('3');
                write_date('F');
        }
}
进行显示测试的主程序为:
int main(void)
{
    SYSCFG_DL_init();
    init_lcd();
    while(1)
    {
          display();
          delay_cycles(1000);
          init_lcd();
          M_8574++;
          if(M_8574>=4)
          {
              M_8574=0;
          }
    }
}

显示效果图

使用特权

评论回复
沙发
xyz549040622| | 2023-10-12 21:27 | 只看该作者
还是模拟IC接口的,我试试硬件IC驱动试试,是不是没有加上拉电阻的原因呢?

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2023-10-13 08:44 | 只看该作者
xyz549040622 发表于 2023-10-12 21:27
还是模拟IC接口的,我试试硬件IC驱动试试,是不是没有加上拉电阻的原因呢? ...

用过PA0和PA1,它有上拉电阻。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝