本想以I2C接口来驱动一个0.96寸的OLED显示屏,没想到其结果并不理想,其显示实物亮度非常低,见图1所示。
图1 OLED显示
为此,只好放弃该显示方案,改为测试串行数码管显示模块。
该数码管模块以MAX7219为处理芯片,可将串行数据转换为并行信号输出,故可有效节省GPIO口的数量。
该数码管模块与开发板的连接关系为:
CLK---PF7
DIN--- PF8
CS --- PF9
实现所用引脚输出高低电平的语句定义为:
#define CLK_SetHigh() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET)
#define CLK_SetLow() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET)
#define DIN_SetHigh() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET)
#define DIN_SetLow() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET)
#define CS_SetHigh() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET)
#define CS_SetLow() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET)
对所用引脚进行工作模式配置的函数为:
void DZMK_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOF_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
实现Max7219向指定地址发送数据的函数为:
void Write_Max7219(char address,char dat)
{
CS_SetLow();
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
}
对Max7219进行初始化的函数为:
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x02);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
实现显示测试的主程序为:
int main(void)
{
SystemClock_Config();
DZMK _Init();
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,2);
Write_Max7219(3,3);
Write_Max7219(4,4);
Write_Max7219(5,5);
Write_Max7219(6,6);
Write_Max7219(7,7);
Write_Max7219(8,8);
while(1);
}
经程序的编译与下载,其显示效果如图2所示,这样再有数据显示的要求,就可通过该显示模块来完成。
图2 显示效果
老师的这个模块,用得太好了,多谢分享!
引用: dcexpert 发表于 2023-9-24 13:18 OLED有个设对比度的命令,是不是忘记设置了?
已设置最亮,可与该芯片的驱动能力有关。
引用: lugl4313820 发表于 2023-9-23 21:41 老师的这个模块,用得太好了,多谢分享!
哈哈,用它做一下驱动测试还是比较有效的。