- void APM_MINI_OLEDInit(void)
- {
- GPIO_Config_T configStruct;
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
- configStruct.pin = GPIO_PIN_5|GPIO_PIN_6;
- configStruct.mode = GPIO_MODE_OUT_PP;
- configStruct.speed = GPIO_SPEED_50MHz;
- GPIO_Config(GPIOA, &configStruct);
- }
实现引脚异或处理的函数为:
- void APM_MINI_OLEDToggle(void)
- {
- GPIOA->ODATA ^= GPIO_PIN_5;
- GPIOA->ODATA ^= GPIO_PIN_6;
- }
实现测试的主程序为:
- int main(void)
- {
- APM_MINI_OLEDInit();
- while (1)
- {
- Delay();
- APM_MINI_OLEDToggle();
- }
- }
经测试程序正确,实现了LED灯闪烁的效果。
在完成LED模块测试的基础上,就可以进行OLED屏的测试了,该显示屏是一款0.96寸的双色屏,其显示分辨率为128*64像素点。
该显示屏采用I2C接口,其引脚与开发板的连接关系为:
SCL---PA5
SDA---PA6
其实现高低电平输出的语句定义为:
#define SCL_high GPIOA->BSC = GPIO_PIN_5
#define SCL_low GPIOA->BC = GPIO_PIN_5
#define SDA_high GPIOA->BSC = GPIO_PIN_6
#define SDA_low GPIOA->BC = GPIO_PIN_6
对OLED屏进行初始化的函数为:
- void OLED_Init(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);
- }
以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;
- Delay_us(100);
- SCL_high;
- Delay_us(100);
- SCL_low;
- Delay_us(100);
- }
- }
为进行OLED屏的驱动测试,特将清屏函数改造为直线的绘制函数,其内容如下:
- void OLED_line(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(0xf0,OLED_DATA);
- }
- }
经编译和下载,其测试效果如图2所示。
图2 显示直线
在以上测试的基础上,通过添加字符串和汉字显示函数就可实现图3的显示效果。
图3 显示汉字与字符串
所配置的字符串显示函数为:图3 汉字与字符串显示效果
所配置的字符串显示函数为:
- 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;
- }
- }
实现显示效果的主程序为:
- int main(void)
- {
- APM_MINI_LEDInit(LED2);
- APM_MINI_LEDInit(LED3);
- APM_MINI_OLEDInit();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"APM32F107",16);
- OLED_ShowCHinese(20,2,3);
- OLED_ShowCHinese(36,2,4);
- OLED_ShowCHinese(52,2,5);
- OLED_ShowString(20,4,"jinglixixi",16);
- while (1)
- {
- Delay();
- APM_MINI_LEDToggle(LED2);
- APM_MINI_LEDToggle(LED3);
- }
- }
这样在有显示的任务,就可以交由OLED屏来完成啦!