芯源半导体CW32
直播中

jinglixixi

8年用户 1552经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注
[经验]

【CW32饭盒派开发板试用体验】+ OLED屏显示驱动

尽管饭盒派在开发板上提供了2款OLED屏的接口,但并没有提供相应的OLED屏,为此只好使用手头现有的OLED屏来测试。

板载的OLED屏接口见图1所示,而所用的OLED屏却与该接口有一定的差别,不能以直接插入的方式来使用。为克服这种不便,故所用的连接接口为J9的接口,见图2所示。

image.png

image.png

图1 OLED屏接口

image.png

图2 J9接口

该OLED屏是一款准双色屏,其分辨率为160*80像素点,它与开发板的连接关系为:

SCL---PB6

SDA---PB7

相应引脚输出高低电平的语句定义为:

#define SCL_high GPIO_WritePin(CW_GPIOB,
GPIO_PIN_6,GPIO_Pin_SET)

#define SCL_low GPIO_WritePin(CW_GPIOB,
GPIO_PIN_6,GPIO_Pin_RESET)

#define SDA_high GPIO_WritePin(CW_GPIOB,
GPIO_PIN_7,GPIO_Pin_SET)

#define SDA_low GPIO_WritePin(CW_GPIOB,
GPIO_PIN_7,GPIO_Pin_RESET)

对所用引脚的配置函数为:

void OLED_gpio(void)
{   
GPIO_InitTypeDef GPIO_InitStruct; __RCC_GPIOB_CLK_ENABLE();   
GPIO_InitStruct.IT = GPIO_IT_NONE;   
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   
GPIO_InitStruct.Pins = GPIO_PIN_6|GPIO_PIN_7;   
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;   
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}

通过GPIO口模拟I2C发送字节数据的函数为:

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;       
SCL_high;       
SCL_low;
}
}

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

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++;
}
}

实现汉字显示的函数为:

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;
}
}

所用的汉字字模由工具软件来提取,其工作界面如图3所示。

image.png

图3 字模提取

实现图4所示效果的主程序为:

int32_t main(void)
{   
GPIO_InitTypeDef GPIO_InitStruct;   
RCC_HSI_Enable(RCC_HSIOSC_DIV6); 
OLED_gpio();
OLED_Init();   
OLED_Clear();  
OLED_ShowString(28,0,"CW32F030",16);   
OLED_ShowCHinese(28,2,0);
OLED_ShowCHinese(48,2,1);
OLED_ShowCHinese(68,2,2);     
OLED_ShowString(88,2,"Test",16);    
OLED_ShowString(28,6,"jinglixixi",16);
while(1);
}

image.png

图4 显示效果

有了OLED屏的显示功能,在遇到显示问题时就方便了许多,后面可以让OLED屏与RTC的日历功能相配合来制作电子时钟或是让OLED屏与ADC的数据采集功能相配合来制作数字式电压表,总之OLED屏的显示功能还是有广泛用途的。

更多回帖

发帖
×
20
完善资料,
赚取积分