对于灵动 Mini-G0001这款小巧的开发板,是否能为它配置一个同样小巧的显示屏呢?
答案是肯定的,这里是为它配置了一块SPI接口的LCD显示屏,其分辨率率为160*80像素点,能够显示精彩的图像效果。
该显示屏与开发板的连接方式如下图所示,受 Mini-G0001内存的选择,这里是用来显示字符信息,若显示图像内容,则需要将图像数据直接存放到板载的FLASH闪存中,否则是无法在程序存储空间存放那样多的数据。

image.png
显示效果图
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开发板就有了精彩的显示表现力。