如何用stm32f103驱动0.96寸OLED液晶屏(12864液晶屏)及字模工具配置

   在网上购买到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

猜你喜欢

转载自www.cnblogs.com/ningmeng484/p/10406590.html