STM32驱动0.96寸OLED液晶屏

时间:2024-04-04 21:43:50

    在网上购买到0.96寸oled液晶屏之后找店家要相关的资料,店主一般会给你一个链接,意思是让你自己去下载。下载下来的有各种型号的单片机的驱动程序和历程,但是作为单片机小白,要从这些原始资料中找出我们要用的程序,并且在我们的设计上正常运行着实要花一点功夫。当我们移植过一次程序之后,后面我们再用的话就会快很多。

  首先在原始文件中找到文件“0.96OLED显示屏_STM32系列_SPI_例程”。下载地址:https://pan.baidu.com/s/1fR2qKloPxFDLqDl1hg3kog提取,提取码为:0igb。

  首先,我们拿到的0.96寸OLED液晶屏上面有7个引脚,分别是GND、VCC、D0、D1、RES、DC、CS。打开历程文件,找到oled.c、oled.h和oledfont.h三个文件。其中需要修改的文件是oled.h,找到本文件中这几行代码。

 1 //-----------------OLED端口定义----------------                         
 2 #define OLED_CS_Clr()  GPIO_ResetBits(GPIOD,GPIO_Pin_3)//CS
 3 #define OLED_CS_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_3)
 4 
 5 #define OLED_RST_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_4)//RES
 6 #define OLED_RST_Set() GPIO_SetBits(GPIOD,GPIO_Pin_4)
 7 
 8 #define OLED_DC_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_5)//DC
 9 #define OLED_DC_Set() GPIO_SetBits(GPIOD,GPIO_Pin_5)
10 
11 #define OLED_WR_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_14)
12 #define OLED_WR_Set() GPIO_SetBits(GPIOG,GPIO_Pin_14)
13 
14 #define OLED_RD_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_13)
15 #define OLED_RD_Set() GPIO_SetBits(GPIOG,GPIO_Pin_13)
16 
17 
18 
19 //PC0~7,作为数据线
20 #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  
21 //使用4线串行接口时使用 
22 
23 #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_6)//CLK
24 #define OLED_SCLK_Set() GPIO_SetBits(GPIOD,GPIO_Pin_6)
25 
26 #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_7)//DIN
27 #define OLED_SDIN_Set() GPIO_SetBits(GPIOD,GPIO_Pin_7)

 

  一、 先搞清楚对应关系

  CS -> CS | RES -> RES | DC -> DC | CLK -> D0 | DIN -> D1 

  这几个端口怎么改?程序中看出这里的CS、RST、DC、WR和RD分别设定为GPIOD_3、GPIOD_4、GPIOD_5、GPIOG_14、GPIOG_13。这里一般是要修改的,其中WR和RD可以删除,不影响效果,依据你自己的硬件上的OLED端口与单片机的连接图来修改,需要配置的有RES、DC、CLK、DIN四个引脚,接线CS可不接,例如下图所示的连接图:

                  STM32驱动0.96寸OLED液晶屏                   STM32驱动0.96寸OLED液晶屏          

  二、修改端口号

  根据上述电路图,至于上面的网络标号(红色字体的标记)是什么我们可以不管,只要引脚号对了就可以了,例如根据上述电路,我们只需要将RST、DC分别设定为GPIOB_14、GPIOB_12,CLK和DIN要修改为GPIOB_13和GPIOB_15。程序如下所示:

 1 //-----------------OLED端口定义----------------                         
 2 #define OLED_CS_Clr()  GPIO_ResetBits(GPIOA,GPIO_Pin_8)    //CS
 3 #define OLED_CS_Set()  GPIO_SetBits(GPIOA,GPIO_Pin_8)
 4 
 5 #define OLED_RST_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_14)    //RES
 6 #define OLED_RST_Set() GPIO_SetBits(GPIOB,GPIO_Pin_14)
 7 
 8 #define OLED_DC_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_12)    //DC
 9 #define OLED_DC_Set() GPIO_SetBits(GPIOB,GPIO_Pin_12)
10 
11 #define OLED_WR_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_14)
12 #define OLED_WR_Set() GPIO_SetBits(GPIOG,GPIO_Pin_14)
13 
14 #define OLED_RD_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_13)
15 #define OLED_RD_Set() GPIO_SetBits(GPIOG,GPIO_Pin_13)
16 
17 //PC0~7,作为数据线
18 #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  
19 //使用4线串行接口时使用 
20 
21 #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_13)//CLK
22 #define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_13)
23 
24 #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_15)//DIN
25 #define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_15)

  除了修改这里的端口之外们还要修改oled.c文件里面的初始化函数,如下所示:

 

1 GPIO_InitTypeDef  GPIO_InitStructure;
2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);//使能PC,D,G端口时钟
3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//PD3,PD6推挽输出  
4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
5 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
6 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOD3,6
7 GPIO_SetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);

 

 

 

  将oledfont.h文件中的函数Hzk[][32]中的内容改为:

 1 char Hzk[][32]={
 2 {0x00,0x00,0x00,0x80,0x38,0x60,0xE0,0x1E,0x10,0xF0,0x10,0x8C,0x80,0x00,0x00,0x00},
 3 {0x00,0x02,0x02,0x3F,0x22,0x3F,0x41,0x21,0x11,0x0E,0x09,0x11,0x20,0x20,0x00,0x00},/*"嵌",0*/
 4 {0x00,0x00,0x00,0x00,0x00,0x08,0xC8,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
 5 {0x00,0x00,0x10,0x08,0x04,0x03,0x00,0x00,0x00,0x01,0x06,0x0C,0x18,0x10,0x10,0x00},/*"入",1*/
 6 {0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x4C,0xF0,0x20,0x24,0x04,0x00,0x00,0x00,0x00},
 7 {0x00,0x00,0x00,0x12,0x12,0x16,0x09,0x09,0x00,0x03,0x0C,0x18,0x20,0x60,0x60,0x00},/*"式",2*/
 8 {0x00,0x00,0x00,0x00,0x48,0x68,0x68,0xD8,0x4C,0x24,0x36,0x00,0x00,0x00,0x00,0x00},
 9 {0x00,0x00,0x00,0x30,0x1A,0x03,0x03,0xC2,0x3E,0x02,0x09,0x1B,0x10,0x00,0x00,0x00},/*"系",3*/
10 {0x00,0x00,0xC0,0xA0,0x9C,0x40,0x20,0x20,0xA0,0x64,0x2C,0x90,0x10,0x00,0x00,0x00},
11 {0x00,0x00,0x10,0x13,0x0A,0x2A,0x14,0x0A,0x05,0x03,0x1F,0x20,0x21,0x20,0x30,0x00},/*"统",4*/
12 };

  主函数代码修改如下所示:

 1 #include "stm32f10x.h"
 2 #include "sys.h"
 3 #include "stdio.h"
 4 #include "delay.h"
 5 #include "usart.h"
 6 #include "oled.h"
 7 
 8 //配置系统时钟,使能各外设时钟
 9 void RCC_Configuration(void)
10 {
11     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
12                                                  RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO |RCC_APB2Periph_SPI1,ENABLE );
13   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 | RCC_APB1Periph_I2C1| RCC_APB1Periph_TIM3, ENABLE );
14 }
15 
16 int main(void)
17 {
18     RCC_Configuration();    //时钟使能
19     SysTick_Config(SystemCoreClock / 1000);    //系统滴答时钟 1ms发生一次中断
20     _g_Init_sys(); //15ms中断处理,详情请见SYS.C
21     OLED_Init();
22     OLED_Clear();
23     OLED_ShowCHinese(4 ,3,0); //(列数,行数,字序)
24     OLED_ShowCHinese(20,3,1);
25     OLED_ShowCHinese(36,3,2);
26     OLED_ShowCHinese(52,3,3);
27     OLED_ShowCHinese(68,3,4);
28     while(1);
29 }

  显示效果如下所示:

STM32驱动0.96寸OLED液晶屏

 

  备注:字模取字工具的配置:

 STM32驱动0.96寸OLED液晶屏       STM32驱动0.96寸OLED液晶屏

  字模软件工具:

  链接:https://pan.baidu.com/s/13NBn9KOmJFsAGdjLlExAMQ      提取码:lyhc