AT32F403A有1024 K字节的内存和96+128 K字节的SRAM,另外还配有高达16 M字节的SPI闪存,面对这么丰富的存储资源不为它配个彩屏啥的,真有点委屈了它们。
这里就先为其配上一个0.96'的彩色OLED屏,该显示屏采用SPI接口,为此将I2C接口和SPI接口联合起来驱动它。
图1 接口资源
为控制相关引脚的高低电平输出,所定义的语句如下:
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB, GPIO_Pins_8)
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB, GPIO_Pins_8)
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB, GPIO_Pins_9)
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB, GPIO_Pins_9)
#define OLED_RST_Clr() GPIO_ResetBits(GPIOB, GPIO_Pins_11)
#define OLED_RST_Set() GPIO_SetBits(GPIOB, GPIO_Pins_11)
#define OLED_DC_Clr() GPIO_ResetBits(GPIOB, GPIO_Pins_12)
#define OLED_DC_Set() GPIO_SetBits(GPIOB, GPIO_Pins_12)
#define OLED_CS_Clr() GPIO_ResetBits(GPIOB, GPIO_Pins_13)
#define OLED_CS_Set() GPIO_SetBits(GPIOB, GPIO_Pins_13)
#define OLED_BLK_Clr() GPIO_ResetBits(GPIOB, GPIO_Pins_14)
#define OLED_BLK_Set() GPIO_SetBits(GPIOB, GPIO_Pins_14)
OLED屏的引脚功能定义函数为:
void AT32_OLED_Init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins=GPIO_Pins_8|GPIO_Pins_9|GPIO_Pins_11|GPIO_Pins_12|GPIO_Pins_13|GPIO_Pins_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
OLED_BLK_Set();
}
图片的显示函数为:
void LCD_ShowPicturea(u16 x1,u16 y1,u16 x2,u16 y2)
{
int i;
LCD_Address_Set(x1,y1,x2,y2);
for(i=0;i<12800;i++)
{
LCD_WR_DATA8(gImage_moled[i*2]);
LCD_WR_DATA8(gImage_moled[i*2+1]);
}
}
实现显示效果的主程序为:
int main(void) //OLED 0.96 CORLOR
{
uint8_t i;
AT32_Board_Init();
AT32_OLED_Init();
OLED_Init();
Delay_ms(200);
LCD_Clear(BLACK);
BACK_COLOR=BLACK;
LCD_ShowString(10,0,"AT32F403A TEST",RED);
LCD_ShowString(10,20,"OLED Display",RED);
LCD_ShowString(10,40,"jinglixixi",RED);
LCD_ShowString(10,60,"2020.10.5",RED);
Delay_ms(2000);
LCD_Clear(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(20,60,"0.96 TFT SPI",YELLOW);
Delay_ms(2000);
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);
}
Delay_ms(2000);
LCD_ShowPicturea(0,0,159,79);
while(1);
}
编译下载后,所显示的效果如图2~图5所示,怎么样存储资源少的芯片是不敢轻易来直接用数组存放图片数据的。
图2 字符串显示
图3 中文显示
图4 图标显示
图5 图片显示
引用: damiaa 发表于 2020-10-9 09:18 不点屏确实浪费。