尽管饭盒派在开发板上提供了2款OLED屏的接口,但并没有提供相应的OLED屏,为此只好使用手头现有的OLED屏来测试。
板载的OLED屏接口见图1所示,而所用的OLED屏却与该接口有一定的差别,不能以直接插入的方式来使用。为克服这种不便,故所用的连接接口为J9的接口,见图2所示。
图1 OLED屏接口
图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所示。
图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);
}
图4 显示效果
有了OLED屏的显示功能,在遇到显示问题时就方便了许多,后面可以让OLED屏与RTC的日历功能相配合来制作电子时钟或是让OLED屏与ADC的数据采集功能相配合来制作数字式电压表,总之OLED屏的显示功能还是有广泛用途的。