OLED移植到STM32F407ZET的详细步骤

OLED移植到STM32F407ZET的详细步骤

一:说明
开发板:STM32F407
开发平台:Keil uVision5
模块:0.96寸7针oled显示屏<资料由淘宝卖家提供>
图为OLED模块与开发板的原理图连接
实物图连接
移植的源代码是
中景园电子0.96OLED显示屏_STM32ZET系列_SPI_例程
中景园电子0.96OLED显示屏_STM32ZET系列_SPI_例程
二:oled显示屏所对应的引脚功能

  1. GND: 电源地
  2. VCC: 电源正(3~5.5V)
  3. D0: OLED 的 D0 脚,在 SPI 和 IIC 通信中为时钟管脚
  4. D1 :OLED 的 D1 脚,在 SPI 和 IIC 通信中为数据管脚
  5. RES :OLED 的 RES#脚,用来复位(低电平复位)
  6. DC :OLED 的 D/C#E 脚,数据和命令控制管脚
  7. CS :OLED 的 CS#脚,也就是片选管脚
    注意:模块只支持向模块写数据不能读数据,所以只需要写SPI发送即可,即将所有引脚配置为输出功能,输出引脚自选板子可用外接引脚即可,无特殊要求

三:oled写数据时序图
oled写数据时序图

四:移植步骤
(1)将例程代码中的oled文件夹中的所有文件copy带自己的工程路径下
bmp.h / oled.c / oled.h / oledfont.h
(2)先编译
编译
原因:F1和F4的时钟总线不一样

(3)修改oled.c文件中的代码,如oled_init(),延时函数,添加本开发芯片所对应的头文件(#include “stm32f4xx.h”)

//初始化SSD1306
void OLED_Init(void)
{ 	
 	GPIO_InitTypeDef  GPIO_InitStructure;
	//根据上图配置可知:使用的引脚 :PC6 PC8 PC11 PD6 PD7
 	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);	 //使能C端口时钟
 	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);	 //使能D端口时钟
	
	//PC6  PC11 PC8 输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_11| GPIO_Pin_8;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 	 	//输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
 	GPIO_Init(GPIOC, &GPIO_InitStructure);	 		 	//初始化GPIOC6  GPIOC11 GPIOC8

	//PD6 D7输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 	 	//输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
 	GPIO_Init(GPIOD, &GPIO_InitStructure);	 		 	//初始化GPIOD6  GPIOD7

    //空闲时置高电平
	PDout(6) = 1;
	PDout(7) = 1;
	PCout(6) = 1;
	PCout(8) = 1;
	PCout(11) = 1;

//-----------------------------以下代码不用修改-------------------------------------------------
	OLED_RST_Set();
	delay_ms(500);
	OLED_RST_Clr();
	delay_ms(500);
	OLED_RST_Set(); 
					  
	OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
	OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
	OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
	OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
	OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WR_Byte(0x00,OLED_CMD);//-not offset
	OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
	OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
	OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
	OLED_WR_Byte(0x12,OLED_CMD);
	OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
	OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
	OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//
	OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
	OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
	OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
	
	OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ 
	OLED_Clear();
	OLED_Set_Pos(0,0); 	
}
3)修改oled.h文件中的代码,如下
//-----------------测试LED端口定义---------------- 
#define LED_ON GPIO_ResetBits(GPIOF,GPIO_Pin_9)	//开发板LED1亮
#define LED_OFF GPIO_SetBits(GPIOF,GPIO_Pin_9)	//开发板LED1灭
//-----------------OLED端口定义----------------  					   
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_11)//CLK  	PC11
#define OLED_SCLK_Set() GPIO_SetBits(GPIOC,GPIO_Pin_11)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_8)//DIN(D1)	PC8
#define OLED_SDIN_Set() GPIO_SetBits(GPIOC,GPIO_Pin_8)

#define OLED_RST_Clr() GPIO_ResetBits(GPIOC,GPIO_Pin_6)//RES		PC6
#define OLED_RST_Set() GPIO_SetBits(GPIOC,GPIO_Pin_6)

#define OLED_DC_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_7)//DC			PD7
#define OLED_DC_Set() GPIO_SetBits(GPIOD,GPIO_Pin_7)
 		     
#define OLED_CS_Clr()  GPIO_ResetBits(GPIOD,GPIO_Pin_6)//CS			PD6
#define OLED_CS_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_6)4)main函数添加oled初始化即可

int main()
{
	u8 t;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		//优先级分组
	
	delay_init();		//延时函数	
	led_init();
	OLED_Init();	
	OLED_Clear(); 
	
	t=' ';
	while(1){
		OLED_Clear();
		LED_ON;
		OLED_ShowCHinese(0,0,0);//中
		OLED_ShowCHinese(18,0,1);//景
		OLED_ShowCHinese(36,0,2);//园
		OLED_ShowCHinese(54,0,3);//电
		OLED_ShowCHinese(72,0,4);//子
		OLED_ShowCHinese(90,0,5);//科
		OLED_ShowCHinese(108,0,6);//技
		OLED_ShowString(0,3,"1.3' OLED TEST");
		//OLED_ShowString(8,2,"ZHONGJINGYUAN");  
	 //	OLED_ShowString(20,4,"2014/05/01");  
		OLED_ShowString(0,6,"ASCII:");  
		OLED_ShowString(63,6,"CODE:");  
		OLED_ShowChar(48,6,t);//显示ASCII字符	   
		t++;
		if(t>'~')t=' ';
		OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值 	
			
		delay_s(2);
	}
}

(5)运行程序

移植测试成功

感谢ZJH的倾心帮助!!!!

  • 14
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗老番茄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值