在网上购买到0.96寸oled液晶屏之后找店家要相关的资料,店主一般会给你一个链接,意思是让你自己去下载。下载下来的有各种型号的单片机的驱动程序和历程,但是一开始要从这些原始资料中找出我们要用的程序,并且在我们的设计上正常运行着实要花一点功夫。
首先在原始文件中找到文件“0.96OLED显示屏_STM32系列_SPI_例程”。若没有可到在网址https://pan.baidu.com/s/1fR2qKloPxFDLqDl1hg3kog提取,提取码为:0igb。里面对OLED显示起较大作用的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、RST、DC、WR和RD分别设定为GPIOD_3、GPIOD_4、GPIOD_5、GPIOG_14、GPIOG_13。这里一般是要修改的,依据你自己的硬件上的OLED端口与单片机的连接图来修改,例如下图所示的连接图:
根据上述电路图,只需要将RST、DC分别设定为GPIOB_14、GPIOB_12。WR和RD都可不管,删掉没有影响,CLK和DIN要修改为GPIOD_6和GPIOD_7。程序如下所示:
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)
将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
如何用stm32f103驱动0.96寸OLED液晶屏(12864液晶屏)及字模工具配置
原文:https://www.cnblogs.com/ningmeng484/p/10406590.html