目录
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; //PA4GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST; //快速HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化//PB6,7GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7; HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化//PC6,7,8,9,11GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11; HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化 //PD6,7GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7; HAL_GPIO_Init(GPIOD,&GPIO_Initure);//初始化 //PE5,6GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6; HAL_GPIO_Init(GPIOE,&GPIO_Initure);//初始化 //PG15GPIO_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~9GPIOC->ODR|=dat<<6; //D[3:0]-->PC[9:6]GPIOC->ODR&=~(0X1<<11); //清空11GPIOC->ODR|=((data>>4)&0x01)<<11;GPIOB->ODR&=~(0X1<<6); //清空6GPIOB->ODR|=((data>>5)&0x01)<<6;GPIOE->ODR&=~(0X3<<5); //清空5,6GPIOE->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; //PB7GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化//PC6,7GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7; HAL_GPIO_Init(GPIOC,&GPIO_Initure);//初始化//PD6GPIO_Initure.Pin=GPIO_PIN_6; HAL_GPIO_Init(GPIOD,&GPIO_Initure);//初始化 //PG15GPIO_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显示画面
例程中定义了以下函数可供使用:
//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画面