【MM32 eMiniBoard测评】+彩色OLED屏的显示驱动
[复制链接]
前面介绍了双色OLED屏的显示,那MM32 eMiniBoard开发板是否能驱动彩色OLED屏呢?
答案是肯定的,其显示效果见图1和图2所示。
图1 字符串及汉字显示
图2 图标显示
有别于I2C接口的双色屏,彩色屏所采用的接口是SPI,故要比双色屏占用更多的I/O口。
那使用哪些引脚呢?
这里OLED屏与MCU的连接关系为:
SCK --PB13 CL
MISO--PB14 SDA
MOSI--PB15 RST
SS --PB12 DC
LD1 --PA15 CS
LD2 --PB3 BLK
本想粘一下Arduino接口的光,无奈的是不知何时现在出产的OLED屏都任GND做老大了!
弄的一个好好的Arduino接口,却无法直插OLED屏来使用,真不知他们为何这样居心叵测!
没办法,胳膊拧不过大腿呀!
还是用杜邦线来交换线序吧。
定义相关引脚输出高低电平的语句如下:
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_13) //CLK
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_14) //DIN
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define OLED_RST_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_15) //RES
#define OLED_RST_Set() GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define OLED_DC_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_12) //DC
#define OLED_DC_Set() GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define OLED_CS_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_15) //CS
#define OLED_CS_Set() GPIO_SetBits(GPIOA,GPIO_Pin_15)
#define OLED_BLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_3) //BLK
#define OLED_BLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_3)
配置引脚为输出功能的函数为:
void APP_OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15| GPIO_Pin_12| GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
完成字符串显示的函数为:
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)
{
while(*p!='\0')
{
if(x>LCD_W-16){x=0;y+=16;}
if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
LCD_ShowChar(x,y,*p,0,color);
x+=8;
p++;
}
}
实现图标显示的函数为:
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2)
{
int i;
LCD_Address_Set(x1,y1,x2,y2);
for(i=0;i<1600;i++)
{
LCD_WR_DATA8(image[i*2+1]);
LCD_WR_DATA8(image[i*2]);
}
}
实现图1和图2显示效果的主程序为:
s32 main(void)
{
u8 i;
LED_Init();
DELAY_Init();
APP_OLED_Init();
OLED_BLK_Set();
Lcd_Init();
LCD_Clear(BLACK);
BACK_COLOR=BLACK;
LCD_ShowChinese(28,0,0,32,YELLOW);
LCD_ShowChinese(60,0,1,32,YELLOW);
LCD_ShowChinese(92,0,2,32,YELLOW);
LCD_ShowChinese(20,40,0,16,YELLOW);
LCD_ShowChinese(36,40,1,16,YELLOW);
LCD_ShowChinese(52,40,2,16,YELLOW);
LCD_ShowChinese(68,40,3,16,YELLOW);
LCD_ShowChinese(84,40,4,16,YELLOW);
LCD_ShowChinese(100,40,5,16,YELLOW);
LCD_ShowChinese(116,40,6,16,YELLOW);
LCD_ShowString(0,60,"0.96 TFT SPI",YELLOW);
DELAY_Ms(1000);
LCD_Clear(BLACK);
LCD_ShowString(10,0,"LCD_W:",RED);
LCD_ShowNum(70,0,LCD_W,3,RED);
LCD_ShowString(10,20,"LCD_H:",RED);
LCD_ShowNum(70,20,LCD_H,2,RED);
for(i=0;i<4;i++)
{
LCD_ShowPicture(i*40,40,39+i*40,79);
}
while(1);
}
|