本帖最后由 jinglixixi 于 2023-9-1 10:49 编辑
#申请原创# @21小跑堂CW32L052R8T6 StartKit 评估板是一款基于Cortex-M0+内核的开发板,配有64KB FLASH和8KB RAM,其主频可达48MHz。此外,它还配有FLASH 芯片CW25Q64A、EEPROM芯片CW24C02AD、蜂鸣器电路及红外收发电路等外设资源。 尽管它在显示方面它配有 4x16段码 LCD 显示屏,但在使用时还是存在诸多的不便,为此便为其配置了一款I2C型的LCD1602显示模块,这样就可大大地增强信息输出的表现了。 图1 显示效果
图2 显示模块
该显示模块是以PCF8574为核心处理芯片,由它将I2C信号转化为并行信号来驱动LCD1602的显示,其电路连接如图3和图4所示。
图3 PCF8574
图4 LCD1602
PCF8574 采用CMOS电路设计。它通过两条双向总线(I 2 C)可使大多数 MCU 实现远程 I/O 口扩展。该器件包含一个 8 位准双向口和一个 I 2 C 总线接口。PCF8574 电流消耗很低,且口输出锁存具有大电流驱动能力,可直接驱动 LED。 由图4可知,LCD1602实际是采用4位的驱动方式,而非常规的8位驱动方式。 显示模块与开发板的连接关系为: SDA ---PA15 CLK ---PC10
对所用引脚的配置函数为: void LCD_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pins = LED1_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pins = LED2_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
}
在GPIO口模拟I2C的情况下,其输出高低电平的语句定义为: defineSDA_high PA15_SETHIGH() defineSDA_low PA15_SETLOW() defineSCL_high PC10_SETHIGH() define SCL_low PC10_SETLOW()
模拟I2C开始与结束的函数为: void start()
{
SDA_high;
delay();
SCL_high;
delay();
SDA_low;
delay();
}
void stop()
{
SDA_low;
delay();
SCL_high;
delay();
SDA_high;
delay();
}
所需的延时函数为: void delay()
{
uint32_t i;
for(i=0;i<200;i++);
}
模拟I2C方式字节数据的函数为: void write_byte(uchar date)
{
uchar i,temp,m;
temp=date;
for(i=0;i<8;i++)
{
SCL_low;
delay();
m=temp;
m=m&0x80;
if(m==0x80)
{
SDA_high;
}
else SDA_low;
temp=temp<<1;
delay();
SCL_high;
delay();
}
SCL_low;
delay();
SDA_high;
delay();
}
进行应答处理判别的函数为: void respons()
{
uchar i;
SCL_high;
delay();
look();
SCL_low;
delay();
}
void look()
{
uchar i,sda;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pins = GPIO_PIN_15;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
i=0;
sda=PA15_GETVALUE();
while((sda==1)&&(i<250)) i++;
GPIO_InitStructure.Pins = GPIO_PIN_15;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
}
向指定地址发送数据的函数为: void write_add(uchar date1)
{
start();
if(M_8574==0)
write_byte(0x4e);
else if(M_8574==1)
write_byte(0x7e);
else if(M_8574==2)
write_byte(0x27);
else if(M_8574==3)
write_byte(0x3f);
respons();
write_byte(date1);
respons();
stop();
}
发送指令的函数为: 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);
}
对LCD1602进行初始化的函数为: void init_lcd()
{
SDA_high;
delay();
SCL_high;
delay();
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()
{
write_com(0x80);
for(i=0;i<16;i++)
{
write_date(t0[i]);
delay1(10);
}
write_com(0x80+0x40);
for(i=0;i<14;i++)
{
write_date(t1[i]);
delay1(10);
}
write_com(0x80+0x40+14);
if(M_8574==0)
{
write_date('4');
write_date('E');
}
else if(M_8574==1)
{
write_date('7');
write_date('E');
}
else if(M_8574==2)
{
write_date('2');
write_date('7');
}
else if(M_8574==3)
{
write_date('3');
write_date('F');
}
}
进行显示测试的主程序为: int32_t main(void)
{
RCC_Configuration();
InitTick( 24000000 );
LCD_Configuration();
delay1(10);
init_lcd();
while(1)
{
display();
delay1(100);
init_lcd();
M_8574++;
if(M_8574>=4)
{
M_8574=0;
}
}
}
经程序的下载测试,其显示效果如图5所示,说明功能正常,这样就有效地提高了显示输出的表现力。 此外,由于是采用GPIO口模拟I2C的处理方式,故它也十分有利于移植到其它的开发板来实现驱动显示。 图5 显示效果
|
hi 大佬 ,很高兴看到您的原创帖子,但咱们论坛申请袁垂昂的文章字数需要达到800哦,目前还差点,你补充完整后可以再次@21小跑堂