目录
1.显示原理
2.接口配置
8080并行接口模式
spi四线
3.程序控制
1.显示原理
基于stm32的oled显示(以ALINETEK0.96寸OLED模块为例)
ALINETEK0.96寸OLED模块由SSD1306驱动芯片控制:
SSD1306的显存总共为128*64bit大小,分为八页,每页为128个字节,共计128*68位,以此对应屏幕的168*64像素,将显存的各位置0或置1即可控制像素点的亮灭。
使用时在stm32内建立一个缓存,大小为128*8字节,在每次修改时先修改stm32的缓存,在修改完成后,一次性地将stm32上的缓存写入OLED的GRAM来更新显示
2.接口配置
单片机与SSD1306的通信可以采用8080并口、6800并口、SPI、IIC四种方式,这里介绍8080与SPI两种
8080并行接口模式
8080 并行接口被广泛应用于各类液晶显示器, ALIENTEK OLED 模块也提供了这种接口,使得 MCU 可以快速的访问 OLED。
8080 接口方式需要如下一些信号线:
CS: OLED 片选信号。
WR:向 OLED 写入数据。
RD:从 OLED 读取数据。
D[7: 0]: 8 位双向数据线。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令; 1,读写数据)。
读数据:在 RD 的上升沿, 使数据锁存到数据线(D[7: 0])上;
写数据:在 WR 的上升沿,使数据写入到 SSD1306 里面;
在正点原子例程中对8080接口的初始化如下
#if OLED_MODE==1 //使用8080并口模式
//GPIO初始化设置
GPIO_Initure.Pin=GPIO_PIN_4; //PA4
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化
//PB6,7
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;
HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化
//PC6,7,8,9,11
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化
//PD6,7
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;
HAL_GPIO_Init(GPIOD,&GPIO_Initure);//初始化
//PE5,6
GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6;
HAL_GPIO_Init(GPIOE,&GPIO_Initure);//初始化
//PG15
GPIO_Initure.Pin=GPIO_PIN_15;
HAL_GPIO_Init(GPIOG,&GPIO_Initure);//初始化
OLED_WR=1;
OLED_RD=1;
#else //使用4线SPI 串口模式
8080写字节:
#if OLED_MODE==1 //8080并口
//通过拼凑的方法向OLED输出一个8位数据
//data:要输出的数据
void OLED_Data_Out(u8 data)
{
u16 dat=data&0X0F;
GPIOC->ODR&=~(0XF<<6); //清空6~9
GPIOC->ODR|=dat<<6; //D[3:0]-->PC[9:6]
GPIOC->ODR&=~(0X1<<11); //清空11
GPIOC->ODR|=((data>>4)&0x01)<<11;
GPIOB->ODR&=~(0X1<<6); //清空6
GPIOB->ODR|=((data>>5)&0x01)<<6;
GPIOE->ODR&=~(0X3<<5); //清空5,6
GPIOE->ODR|=((data>>6)&0x01)<<5;
GPIOE->ODR|=((data>>7)&0x01)<<6;
}
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
OLED_Data_Out(dat);
OLED_RS=cmd;
OLED_CS=0;
OLED_WR=0;
OLED_WR=1;
OLED_CS=1;
OLED_RS=1;
}
spi四线
SPI介绍:STM32 SPI介绍及CubeMX配置
在正点原子例程中对SPI接口的初始化如下
#else //使用4线SPI 串口模式
//GPIO初始化设置
GPIO_Initure.Pin=GPIO_PIN_7; //PB7
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
//PC6,7
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化
//PD6
GPIO_Initure.Pin=GPIO_PIN_6;
HAL_GPIO_Init(GPIOD,&GPIO_Initure);//初始化
//PG15
GPIO_Initure.Pin=GPIO_PIN_15;
HAL_GPIO_Init(GPIOG,&GPIO_Initure);//初始化
OLED_SDIN=1;
OLED_SCLK=1;
#endif
SPI写字节:
//向SSD1306写入一个字节。
//dat:要写入的数据/命令
//cmd:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
OLED_RS=cmd; //写命令
OLED_CS=0;
for(i=0;i<8;i++)
{
OLED_SCLK=0;
if(dat&0x80)OLED_SDIN=1;
else OLED_SDIN=0;
OLED_SCLK=1;
dat<<=1;
}
OLED_CS=1;
OLED_RS=1;
}
3.程序控制
通过指令可以修改OLED对比度、显示开关及修改缓存
SSD1306有下列指令:
初始化OLED过程为 复位SSD1306→驱动IC初始化代码→开启显示→请0显存→开始显示
初始化完成后,修改单片机内缓存数据并上传至SSD1306即可更新更新OLED显示画面
例程中定义了以下函数可供使用:文章来源:https://www.toymoban.com/news/detail-446157.html
//OLED控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size);
用以上函数修改缓存后调用OLED_Refresh_Gram()函数就可以更新OLED画面文章来源地址https://www.toymoban.com/news/detail-446157.html
到了这里,关于基于stm32的oled显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!