在网上购买到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可不接,例如下图所示的连接图:
二、修改端口号
根据上述电路图,至于上面的网络标号(红色字体的标记)是什么我们可以不管,只要引脚号对了就可以了,例如根据上述电路,我们只需要将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 }
显示效果如下所示:
备注:字模取字工具的配置:
字模软件工具:
链接:https://pan.baidu.com/s/13NBn9KOmJFsAGdjLlExAMQ 提取码:lyhc