OLED移植到STM32F407ZET的详细步骤
一:说明
开发板:STM32F407
开发平台:Keil uVision5
模块:0.96寸7针oled显示屏<资料由淘宝卖家提供>
移植的源代码是
中景园电子0.96OLED显示屏_STM32ZET系列_SPI_例程
二:oled显示屏所对应的引脚功能
- GND: 电源地
- VCC: 电源正(3~5.5V)
- D0: OLED 的 D0 脚,在 SPI 和 IIC 通信中为时钟管脚
- D1 :OLED 的 D1 脚,在 SPI 和 IIC 通信中为数据管脚
- RES :OLED 的 RES#脚,用来复位(低电平复位)
- DC :OLED 的 D/C#E 脚,数据和命令控制管脚
- CS :OLED 的 CS#脚,也就是片选管脚
注意:模块只支持向模块写数据不能读数据,所以只需要写SPI发送即可,即将所有引脚配置为输出功能,输出引脚自选板子可用外接引脚即可,无特殊要求
三: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的倾心帮助!!!!