本帖最后由 jinglixixi 于 2020-10-18 10:47 编辑
原打算是在U盘读写的功能上添加彩色OLED屏的以实现数码相框的功效,无奈在U盘读写方面消耗的时间较多也没有太大的进展,现在就只能让彩色OLED屏唱独角戏了,汉字能显、图标能显,就是大写的图片不能显,因为MCU的容量不允许,只能借助外部的否则存储器件。
汉字及图标的显示效果如图1和图2所示。
图1 显示汉字
图2 显示 图标
由于该彩色OLED屏是采用SPI接口的,故比I2C接口的OLED屏要多消耗些I/O资源。
OLED屏与MCU的连接关系为:
CLK---PB0
DIN---PB1
RES---PB2
DC---PB3
CS ---PB6
相关引脚为驱动OLED屏输出高低电平的语句定义如下:
#define OLED_SCLK_Clr() GPIOB_ResetBits( GPIO_Pin_0 )//CLK
#define OLED_SCLK_Set() GPIOB_SetBits( GPIO_Pin_0 )
#define OLED_SDIN_Clr() GPIOB_ResetBits( GPIO_Pin_1 )//DIN
#define OLED_SDIN_Set() GPIOB_SetBits( GPIO_Pin_1 )
#define OLED_RST_Clr() GPIOB_ResetBits( GPIO_Pin_2 ) //RES
#define OLED_RST_Set() GPIOB_SetBits( GPIO_Pin_2 )
#define OLED_DC_Clr() GPIOB_ResetBits( GPIO_Pin_3 ) //DC
#define OLED_DC_Set() GPIOB_SetBits( GPIO_Pin_3 )
#define OLED_CS_Clr() GPIOB_ResetBits( GPIO_Pin_6 ) //CS
#define OLED_CS_Set() GPIOB_SetBits( GPIO_Pin_6 )
该OLED屏的初始化函数为:
void OLED_Init(void)
{
GPIOB_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
GPIOB_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
GPIOB_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA );
GPIOB_ModeCfg( GPIO_Pin_3, GPIO_ModeOut_PP_5mA );
GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );
GPIOB_ModeCfg( GPIO_Pin_5, GPIO_ModeOut_PP_5mA );
OLED_RST_Clr();
mDelaymS(200);
OLED_RST_Set();
mDelaymS(200);
LCD_WR_REG(0x11);
mDelaymS(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); /*VCOM*/
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);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78);
else LCD_WR_DATA8(0xA8);
LCD_WR_REG(0x29);
}
实现图1和图2的主要程序为:
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);
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);
}
虽然测评的时间已近尾声,但对CH579M的调试之路还会在继续,其实它的无线通讯、网络通讯功能等也都有非常不错的用途,只是CH579M的U盘读写功能应为大家提供一个便于参考进而能扩展自己应用的例程。
|