最近学习stm32,在从标准库转HAL库的过程中,发现现在很多OLED的驱动还是标准库的。于是就想着自己把原来的驱动改一下,在HAL库也可以运行。原来的文件是购买中景园电子的oled屏时买家提供的。

oled.h:

#ifndef __OLED_H__
#define __OLED_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "main.h"
#include "stdlib.h"
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */
#define OLED_MODE 0
#define SIZE 8
#define XLevelL		0x00
#define XLevelH		0x10
#define Max_Column	128
#define Max_Row		64
#define	Brightness	0xFF 
#define X_WIDTH 	128
#define Y_WIDTH 	64	    						  					   

#define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET)//CLK
#define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET)

#define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET)//DIN
#define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET)

#define OLED_RST_Clr() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_RESET)//RES
#define OLED_RST_Set() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_SET)
 		     
#define OLED_CMD  0	
#define OLED_DATA 1	
/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

void OLED_WR_Byte(unsigned dat,unsigned cmd);  
void OLED_Display_On(void);
void OLED_Display_Off(void);	   							   		    
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);
void OLED_Fill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot);
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size);
void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size);
void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p,uint8_t Char_Size);	 
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
void Delay_50ms(unsigned int Del_50ms);
void Delay_1ms(unsigned int Del_1ms);
void fill_picture(unsigned char fill_Data);
void Picture(void);
void IIC_Start(void);
void IIC_Stop(void);
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);

void IIC_Wait_Ack(void);
/* USER CODE BEGIN Prototypes */

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif
#endif /*__ OLED_H__ */

这里就是把几个 GPIO_ResetBitsGPIO_SetBits改成HAL_GPIO_WritePin,还有就是几个u8u32在HAL库中并没有定义,不过都很好理解这些东西都是些什么。在C51中这些也都是自己typedef

u8 –> unsigned char | 8就是8位的数据,也就是一个字节,在c语言中就是char类型

u32也一样的

在stdint.h中:

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

typedef unsigned long uint32_t;

在stm32f10x.h 中:

typedef uint32_t u32;

typedef uint16_t u16;

typedef uint8_t u8;

oled.c

这个文件其实没改什么,不过我自己写了一个显示浮点数的函数(方法很笨,不要嘲笑),就是一个简单的把float类型数据保存到数组,并且把对应数字转为ascii,然后用oled_showstring显示

uint8_t getlength(uint8_t num)
{
	int i = 0;
	while(num > 0)
	{
		i++;
		num /= 10; 
	}
	return i;
}

//x,y分别为列、横坐标, num为浮点数,len设定的小数部分长度
void OLED_ShowFloat(uint8_t x,uint8_t y,float num, uint8_t len, uint8_t Size)
{
	uint8_t i = 0;
	uint8_t len_a = 0; //整数部分的长度
	uint8_t a = (int)num; //整数部分
	float_t b = num - a;  //小数部分
	len_a = getlength(a);
	uint8_t num_s[10];
	for(i = 0; i <= len + len_a; ++i)
	{
		if(i < len_a){
			num_s[len_a - i - 1] = '0' + a % 10;
			a /= 10;
		}else if(i == len_a) num_s[i] = '.';
		else{
			num_s[i] = '0' + b * 10;
			b = b*10 - (int)(b*10);
		}
	}
	num_s[i] = '\0';
	OLED_ShowString(x, y, num_s, Size);
}

就这样吧,自己独立搞了这么一下,感觉对HAL库更加的熟练了,也是一种不错的学习方式吧。