打印
[RISC-V MCU 应用开发]

【原创】【RISC-V MCU CH32V103测评】彩色OLED屏显示驱动

[复制链接]
919|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2021-3-6 21:49 编辑

OLED屏有多种类型,其中的参数屏要比单色屏和双色屏更具色彩表现力,在设计小游戏时,彩色屏将是不错的选择,假如用单色屏来完成俄罗斯方块的话,那就只剩下方块了,相对来讲彩色屏会更具优势。
目前来看,似乎还没见到有I2C接口的彩色屏,因此就只有多牺牲几个I/O口来驱动彩色屏了!
在彩色屏与CH32V103的连接方面,其关系如下:
CLK--PA2
DIN--PA3
RST--PB3
DC --PB4
CS --PB5
BLK--PB6

定义引脚输出高低电平的语句为:
#define OLED_SCLK_Set()  GPIO_WriteBit(GPIOA, GPIO_Pin_2,Bit_SET)
#define OLED_SCLK_Clr()  GPIO_WriteBit(GPIOA, GPIO_Pin_2,Bit_RESET)

#define OLED_SDIN_Set()  GPIO_WriteBit(GPIOA, GPIO_Pin_3,Bit_SET)
#define OLED_SDIN_Clr()  GPIO_WriteBit(GPIOA, GPIO_Pin_3,Bit_RESET)

#define OLED_RST_Set()    GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_SET)
#define OLED_RST_Clr()     GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_RESET)

#define OLED_DC_Set()     GPIO_WriteBit(GPIOB, GPIO_Pin_4,Bit_SET)
#define OLED_DC_Clr()      GPIO_WriteBit(GPIOB, GPIO_Pin_4,Bit_RESET)

#define OLED_CS_Set()     GPIO_WriteBit(GPIOB, GPIO_Pin_5,Bit_SET)
#define OLED_CS_Clr()      GPIO_WriteBit(GPIOB, GPIO_Pin_5,Bit_RESET)

#define OLED_BLK_Set()    GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_SET)
#define OLED_BLK_Clr()    GPIO_WriteBit(GPIOB, GPIO_Pin_6,Bit_RESET)

相关引脚输出功能的配置函数为:
void App_OledInit(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;                                 //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能与LED相关的GPIO端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; //配置GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //设置GPIO模式为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //设置GPIO口输出速度
GPIO_Init(GPIOB, &GPIO_InitStructure);                              //调用库函数,初始化GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能与LED相关的GPIO端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;     //配置GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //设置GPIO模式为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //设置GPIO口输出速度
GPIO_Init(GPIOA, &GPIO_InitStructure);                             //调用库函数,初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);                   //设置引脚输出高电平
}

图片显示的函数为:
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)
{
u8 i=0;
u8 j=0;
Delay_Init();   //延时函数初始化
LED_Init();     //LED初始化
App_OledInit();
OLED_Init();
Delay_Ms(200);
LCD_Clear(BLACK);
BACK_COLOR=BLACK;
LCD_ShowString(10,0,"CH32V103 TEST",RED);
LCD_ShowString(10,20,"OLED Display",RED);
LCD_ShowString(10,40,"jinglixixi",RED);
LCD_ShowString(10,60,"2020.10.28",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);
}

经编译,程序对系统资源的占用情况如图1所示。
图1

程序下载后的运行效果见图2~图4所示。
图2

图3

图4

若单显示图片,则系统资源资源情况为:
图5

程序下载后面,其运行效果如图6所示。
图6


使用特权

评论回复
评论
大头哥 2020-11-21 18:49 回复TA
NEWB 

相关帖子

沙发
jinglixixi|  楼主 | 2020-11-21 18:54 | 只看该作者
感谢支持!

使用特权

评论回复
板凳
yujielun| | 2021-2-21 20:29 | 只看该作者
这个不带TFT的驱动吗?   

使用特权

评论回复
地板
xinpian101| | 2021-2-22 10:15 | 只看该作者
给力啊,都是硬货,下载。

使用特权

评论回复
5
jinglixixi|  楼主 | 2021-2-22 11:17 | 只看该作者
xinpian101 发表于 2021-2-22 10:15
给力啊,都是硬货,下载。

使用特权

评论回复
6
真爱吴迪迪| | 2021-2-23 15:49 | 只看该作者
这个是OLED还是LCD?
有没有OLED的驱动?

使用特权

评论回复
7
jinglixixi|  楼主 | 2021-2-23 16:40 | 只看该作者
真爱吴迪迪 发表于 2021-2-23 15:49
这个是OLED还是LCD?
有没有OLED的驱动?

是OLED,但在商家提供的驱动中要选LCD的。

使用特权

评论回复
8
usysm| | 2021-3-6 21:37 | 只看该作者
oled显示屏对驱动电流有要求吗?

使用特权

评论回复
9
jkl21| | 2021-3-6 21:38 | 只看该作者
驱动SSD1322   

使用特权

评论回复
10
wwppd| | 2021-3-6 21:38 | 只看该作者
学习一下驱动OLED显示屏的相关程序

使用特权

评论回复
11
maqianqu| | 2021-3-6 21:38 | 只看该作者
OLED有源驱动和TFT-LCD的驱动一样吗

使用特权

评论回复
12
dspmana| | 2021-3-6 21:39 | 只看该作者
用 单片机控制OLED 显示屏  

使用特权

评论回复
13
eefas| | 2021-3-6 21:39 | 只看该作者
OLED屏幕的IIC驱动程序  

使用特权

评论回复
14
pl202| | 2021-3-6 21:39 | 只看该作者
谢谢楼主的资料。   

使用特权

评论回复
15
typeof| | 2021-3-6 21:40 | 只看该作者
是SSD1306吗  

使用特权

评论回复
16
yujielun| | 2021-3-6 21:40 | 只看该作者
没有初始化的代码吗  

使用特权

评论回复
17
htmlme| | 2021-3-6 21:41 | 只看该作者
这个7口的oled吧  

使用特权

评论回复
18
dspmana| | 2021-3-6 21:41 | 只看该作者
可以走gui吗   

使用特权

评论回复
19
maqianqu| | 2021-3-6 21:41 | 只看该作者
OLED屏SSD1306驱动   

使用特权

评论回复
20
wwppd| | 2021-3-6 21:41 | 只看该作者
怎样才能同时驱动OLED和LCD两个屏

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝