本帖最后由 jinglixixi 于 2023-2-21 09:50 编辑
前面解决了GPIO口的使用问题,就为GPIO驱动OLED屏打开了道路,只需控制高低电平的输出及时序的安排即可。
输出高低电平的语句定义如下:
#define SCL_high GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_04);
#define SCL_low GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_04);
#define SDA_high GPIO_SetPins(GPIO_PORT_E, GPIO_PIN_05);
#define SDA_low GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_05);
对所用引脚的配置函数为:
static void OLED_APP(void)
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_04, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_05, &stcGpioInit);
}
实现字节数据发送的函数为:
void Write_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;
da=da<<1;
Delay_us(100);
SCL_high;
Delay_us(100);
SCL_low;
Delay_us(100);
}
}
在不明确驱动效果的情况下,可使用清屏函数加以探测,其函数内容如下:
void OLED_Clear(void)
{
uint8_t i,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(0x00,OLED_DATA);
}
}
当然,在探测时需将OLED_WR_Byte(0x00,OLED_DATA)改为OLED_WR_Byte(0xf0,OLED_DATA),否则可能就啥也探测不到了!
在探测可行的情况下,在添加字符显示函数和汉字显示函数即可实现对应的显示目标。
所添加的字符显示函数为:
void OLED_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);
}
}
添加的汉字显示函数为:
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;
}
}
在下面主程序的控制下,即可达到下图的显示效果。
主程序内容:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_GPIO);
OLED_APP();
LL_PERIPH_WP(LL_PERIPH_GPIO);
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"HC32F4A0SITB",16);
OLED_ShowCHinese(20,2,3);
OLED_ShowCHinese(36,2,4);
OLED_ShowCHinese(52,2,5);
OLED_ShowString(20,4,"jinglixixi",16);
while(1);
}
显示效果图
有了OLED屏的显示功能。后面就不用再完全依赖串口这个调试工具啦!