在AT32F421开发板上,配置有Arduino接口,这就为外设及功能扩展通过了极大的方便, 比如我们可以利用其I2C接口来驱动OLED屏的显示,其显示效果如图所示。
由于板上的I2C接口与OLED屏的引脚连接错位的,故用GPIO来模拟I2C即可分分钟地解决问题。
OLED屏显示效果
OLED屏与MCU的连接关系为:
SCL---PB9
SDA-- PB8
引脚输出高低电平的相关定义语句如下:
#define OLED_SCLK_Set() GPIOB->BSRE = GPIO_Pins_9
#define OLED_SCLK_Clr() GPIOB->BRE = GPIO_Pins_9
#define OLED_SDIN_Set() GPIOB->BSRE = GPIO_Pins_8
#define OLED_SDIN_Clr() GPIOB->BRE = GPIO_Pins_8
OLED屏的引脚输出功能设置函数为:
void AT32_OLED_Init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8|GPIO_Pins_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP;
GPIO_InitStructure.GPIO_Pull = GPIO_Pull_NOPULL;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
相应的字符串输出函数为:
void OLED_ShowCHinese(uint8_t x, uint8_t y, uint8_t no)
{
uint8_t t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
实现字符串显示的主程序为:
int main(void)
{
AT32_Board_Init();
AT32_OLED_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT32F421 TEST",16);
OLED_ShowString(0,2,"OLED DISPLAY",16);
for(;;)
{
AT32_LEDn_Toggle(LED2);
Delay_ms(200);
AT32_LEDn_Toggle(LED3);
Delay_ms(200);
AT32_LEDn_Toggle(LED4);
Delay_ms(200);
}
}
引用: soso 发表于 2021-4-12 09:30 不错,看来Arduino接口有必要。
是呀,与外设好配合使用。
引用: bqgup 发表于 2021-4-12 11:35 显示屏的显示可以竖着显示吗?就像手环那样的显示方式
这个应该没问题,把字模显示转置一下就可以了。
不错,IIC驱动真好~
引用: Jacktang 发表于 2021-4-12 22:44 I2C接口与OLED屏的引脚连接错位 是板子设计的小错误么
这到不是,主要是因为OLED屏的引脚排列不太适合Arduino接口的特点。
Albert.G 发表于 2021-4-13 08:41 听说STM32的本身的IIC有些许问题,不知道雅特力的怎么样。楼主有遇到过吗?
我为了使用引脚的方便性,很少直接用硬件的I2C驱动外设,使用习惯不同罢了,但能实现自己需要的功能就好。
本帖最后由 jinglixixi 于 2021-4-14 08:14 编辑引用: freebsder 发表于 2021-4-12 22:41 谢谢分享,i2c不复杂,算是一个练手的必备项目。
不错,OLED屏这种小玩意儿的使用是仅次于LED点灯的GPIO口测试方式,但较LED的用途更强些。
引用: w494143467 发表于 2021-4-12 16:28 不错,IIC驱动真好~
是呀,比LED仅多用一个引脚,但在信息表现力上却强许多。