基于stm32的oled显示

发布于:2023-01-05 ⋅ 阅读:(601) ⋅ 点赞:(0)

目录

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显示画面

例程中定义了以下函数可供使用:

//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画面

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到