本帖最后由 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;
}
}
}
显示效果图
|