778|1

1532

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【ACM32G103RCT6开发板测评】+OLED屏显示驱动篇 [复制链接]

  本帖最后由 jinglixixi 于 2023-12-22 20:47 编辑

前面已经铺平了GPIO使用的电路,这里就用它来驱动一个I2C接口的0.96寸OLED屏,该屏的分辨率为128*64。

之所以选这款显示屏,是因为对于不同的开发板其GPIO口是有较大差异的,别看它们都有输入、输出的工作模式,但却未必都能顺利地驱动起这款显示屏。

为省去飞线的麻烦和不稳定性,决定直接使用Arduino接口的JP4来插接显示屏。接口JP4的引脚连接关系如图1所示,图2是连接及显示效果。

   

图1 JP4接口

 

图2 连接及显示效果

由此可知,显示屏与开发板的连接关系为:

SCK----PA5

SDA----PA6

 

所用引脚输出高低电平的语句定义为:

#define SCL_highHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

#define SCL_lowHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)

#define SDA_highHAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)

#define SDA_lowHAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)

实现引脚输出模式设置的函数为:

voidBSP_OLED_Init(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin  = GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull= GPIO_PULLUP;
GPIO_InitStruct.Drive  = GPIO_DRIVE_LEVEL3;
GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

以GPIO口模拟I2C接口方式字节数据的函数为:

voidWrite_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
SCL_low;
for(i=0;i<8;i++)
{
        m=da;
        m=m&0x80;
        if(m==0x80)
        {
           SDA_high;
        }
        else  SDA_low;
		HAL_DelayUs(1);
        da=da<<1;
        SCL_high;
		HAL_DelayUs(1);
         SCL_low;
		HAL_DelayUs(1);
}
}

这款准双色屏的初始化函数为:

voidInit_OLED(void)
{
OLED_WR_Byte(0xAE,OLED_CMD);
OLED_WR_Byte(0x02,OLED_CMD);
OLED_WR_Byte(0x10,OLED_CMD);
OLED_WR_Byte(0x40,OLED_CMD);
OLED_WR_Byte(0x81,OLED_CMD);
OLED_WR_Byte(0xff,OLED_CMD);
OLED_WR_Byte(0xA1,OLED_CMD);
OLED_WR_Byte(0xC8,OLED_CMD);
OLED_WR_Byte(0xA6,OLED_CMD);
OLED_WR_Byte(0xA8,OLED_CMD);
OLED_WR_Byte(0x3f,OLED_CMD);
OLED_WR_Byte(0xD3,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xd5,OLED_CMD);
OLED_WR_Byte(0x80,OLED_CMD);
OLED_WR_Byte(0xD9,OLED_CMD);
OLED_WR_Byte(0xF1,OLED_CMD);
OLED_WR_Byte(0xDA,OLED_CMD);
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);
OLED_WR_Byte(0x40,OLED_CMD);
OLED_WR_Byte(0x20,OLED_CMD);
OLED_WR_Byte(0x02,OLED_CMD);
OLED_WR_Byte(0x8D,OLED_CMD);
OLED_WR_Byte(0x14,OLED_CMD);
OLED_WR_Byte(0xA4,OLED_CMD);
OLED_WR_Byte(0xA6,OLED_CMD);
OLED_WR_Byte(0xAF,OLED_CMD);
OLED_WR_Byte(0xAF,OLED_CMD);
OLED_Clear();
OLED_Set_Pos(0,0);
}

实现清屏处理及测试的函数为:

voidOLED_Clear(void)
{
    uint8_ti,n;
    for(i=0;i<8;i++)
    {
        OLED_WR_Byte (0xb0+i,OLED_CMD);
        OLED_WR_Byte (0x00,OLED_CMD);
        OLED_WR_Byte (0x10,OLED_CMD);
        for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA);
    }
}

在一般情况下,如果到清屏这一步不能达到效果的话,后续的工作基本就无需再做了,说明此时已无法驱动起该显示屏。

在驱动可行的情况下,实现字符显示的函数为:

voidOLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)
{
unsigned char c=0,i=0;
c=chr-' ';
if(x>Max_Column-1){x=0;y=y+2;}
if(Char_Size ==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else
{
OLED_Set_Pos(x,y);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}

实现字符串显示的函数为:

voidOLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
{
unsigned char j=0;
while (chr[j]!='\0')
{
OLED_ShowChar(x,y,chr[j],Char_Size);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}

实现图2所示的主程序为:

int main(void)
{
	HAL_Init(); 
    SystemClock_Config(); 
	BSP_OLED_Init();
	Init_OLED();
    OLED_Clear();
	OLED_ShowString(20,0,"ACM32G103",16);
	OLED_ShowString(20,2,"OLED Test",16);
	OLED_ShowString(20,5,"jinglixixi",16);
    While(1);
}

有了OLED屏这个显示工具,后续的信息输出就无需完全仰仗串口了。此外,通过显示屏的驱动测试,可以看出该开发板的驱动能力还是较为出色的,比部分NUCLEO系列要顺手些。

最新回复

谢谢分享,期待后续!   详情 回复 发表于 2023-12-21 19:59
点赞 关注(1)
 
 

回复
举报

7671

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

谢谢分享,期待后续!

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表