本帖最后由 jinglixixi 于 2022-5-19 16:47 编辑
CH32V307开发板为便于扩展,向用户提供了Arduino接口,通过它可减少许多连线的操作。 这里是将一个I2C接口的OLED插入该接口,并通过相应的程序设计来驱动其显示,其显示效果如图1所示。
图1测试效果
为便于直接驱动显示屏,这里没有使用相应的SDA和SCL引脚,而是以模拟的方式,由PB13和PB14来代替SDA和SCL的引脚作用。
使用PB13和PB14输出高低电平的语句定义为:
#define OLED_SCLK_Set() GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET)
#define OLED_SCLK_Clr() GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET)
#define OLED_SDIN_Set() GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET)
#define OLED_SDIN_Clr() GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET)
对引脚的功能配置函数为:
- void oled_pin_INIT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure = {0};
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
实现显示效果的主程序为:
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Delay_Init();
- oled_pin_INIT();
- OLED_Init();
- OLED_Clear();
- OLED_ShowCHinese(20,0,0);
- OLED_ShowCHinese(40,0,1);
- OLED_ShowString(60,0,"V307",16);
- OLED_ShowString(20,2,"OLED test",16);
- while(1);
- }
其中,实现字符串显示的函数为:
- void OLED_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所示。
图2提取字模
配合该字模结构的显示函数为:
- 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;
- }
- }
这样我们就为CH32V307开发板提供了一个既节省引脚资源,又显示表现力强的显示方式。