对于灵动 Mini-G0001这款小巧的开发板,是否能为它配置一个同样小巧的显示屏呢?
答案是肯定的,这里是为它配置了一块SPI接口的LCD显示屏,其分辨率率为160*80像素点,能够显示精彩的图像效果。
该显示屏与开发板的连接方式如下图所示,受 Mini-G0001内存的选择,这里是用来显示字符信息,若显示图像内容,则需要将图像数据直接存放到板载的FLASH闪存中,否则是无法在程序存储空间存放那样多的数据。
显示效果图
LCD与开发板的具体连接关系为:
SCL---PA0
SDA---PA4
RST---PA9
DC ---PA2
CS ---PA15
BL ---PA8
在使用GPIO模拟SPI的方式下,所用引脚输出高低电平的语句定义为:
#define OLED_SCLK_Set() GPIO_SetBits(GPIOA, GPIO_Pin_0) //CLK
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_0)
#define OLED_SDIN_Set() GPIO_SetBits(GPIOA, GPIO_Pin_4) //DIN
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define OLED_RST_Set() GPIO_SetBits(GPIOA, GPIO_Pin_9) //RES
#define OLED_RST_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_9)
#define OLED_DC_Set() GPIO_SetBits(GPIOA, GPIO_Pin_2) //DC
#define OLED_DC_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_2)
#define OLED_CS_Set() GPIO_SetBits(GPIOA, GPIO_Pin_15) //CS
#define OLED_CS_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_15)
#define OLED_BLK_Set() GPIO_SetBits(GPIOA, GPIO_Pin_8) //BLK
#define OLED_BLK_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_8)
对所用引脚的工作模式配置函数为:
void Lcd_gpio(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_8 | GPIO_Pin_8| GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
复制代码实现串行发送字节数据的函数为:
void LCD_Writ_Bus(u8 dat)
{
u8 i;
OLED_CS_Clr();
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set();
}
复制代码对LCD显示屏的初始化函数为:
void Lcd_Init(void)
{
OLED_RST_Clr();
__delay_ms(200);
OLED_RST_Set();
__delay_ms(200);
LCD_WR_REG(0x11);
__delay_ms(100);
LCD_WR_REG(0x21);
LCD_WR_REG(0xB1);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_REG(0xB3);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x3A);
LCD_WR_DATA8(0x3A);
LCD_WR_REG(0xB4);
LCD_WR_DATA8(0x03);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x62);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x04);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0xC0);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0x6A);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0xEE);
LCD_WR_REG(0xC5);
LCD_WR_DATA8(0x0E);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x37);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x0F);
LCD_WR_DATA8(0x06);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x78);
LCD_WR_REG(0x29);
OLED_BLK_Set();
}
复制代码为进行LCD屏的驱动测试,可实现色彩清屏函数来进行,其具体内容为:
void LCD_Clear(u16 Color)
{
u16 i,j;
LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i<LCD_W;i++)
{
for (j=0;j<LCD_H;j++)
{
LCD_WR_DATA(Color);
}
}
}
复制代码在确保LCD屏驱动有效的情况下,再添加字符显示函数就可保证其功能的显示。
实现字符串显示功能的函数为:
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++;
}
}
复制代码有了字符串显示函数,要实现图示效果,其主程序为:
int main(void)
{
Lcd_gpio();
Lcd_Init();
BACK_COLOR=RED;
LCD_Clear(RED);
LCD_ShowString(20,10,"MM32G0001 TEST",YELLOW);
LCD_ShowString(20,36,"jinglixixi",YELLOW);
while (1);
}
复制代码这样,Mini-G0001开发板就有了精彩的显示表现力。