OLED模块(0.96inch)
驱动方式
OLED模块的外形大家都很清除了,能够找到这里的小伙伴,手上应该都有这样的一个模块。
本文用的通信方式是软件模拟4线SPI方式,优点就是可以随意选择IO口连接,特方便。
具体的驱动原理可以参考以下博文:
OLED(经典0.96英寸)_4SPI_SSD1306控制原理(含常用芯片_oled例程)
还有这篇:【常用模块】OLED显示模块(原理讲解、STM32实例操作)
以上两篇博文里面提到的工程都是以stm32为例的,可以下载把看看里面的oled.c和oled.h文件
工程创建
工程模板
模板1_链接1:
https://download.youkuaiyun.com/download/LiangWF22/14753847
模板1_链接2:
https://leoeinstein.lanzous.com/i5ZwLkbbe8j
模板2_链接1:
https://leoeinstein.lanzous.com/iAvS0kk79ij
oled文件添加
如果感觉下面步骤麻烦的小伙伴,请移步到文末,那里有完整的工程链接,下载即可用。
右键点击工程列表里的工程文件、在弹出框点击Manager Project Items、如下图添加oled文件项目。
出现如上图所示的OLED项目文件项就可以往里面添加oled.c 文件了。在模板2_链接1下载里面的文件之后,打开 “HARDWARE” 复制里面的OLED文件夹到模板1的 Hardware 里面,注意!是整个文件夹一起复制!
复制完成之后,在Keil的工程列表里面双击OLED,往里面添加oled.c文件,出现如下图所示即可。
最后点击“魔术棒”,选择“C/C++”在"Include Paths"里面添加刚刚复制过来的oled文件夹路径,点击“OK”即可。
代码实现
在oled.h文件下面修改oled链接的IO口,然后在oled.c里面修改oled的初始化函数,把它修改成符合合泰芯片IO初始化即可。其实和stm32的大同小异,一样的都需要启动时钟、IO输出/输入定义。
哦,对了,模板1里面是没有延时函数的,需要自己添加。
这篇博文里面有讲到怎么通过定时器延时的,大伙可以参考一下:合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(二)
oled.h
#ifndef __OLED_H
#define __OLED_H
//#include "ht32.h"
#include "sys.h"
#include "stdlib.h"
#include "ht32f5xxxx_ckcu.h"
#include "ht32f5xxxx_gpio.h"
//-----------------OLED端口定义----------------
#define OLED_SCLK_Clr() GPIO_ClearOutBits(HT_GPIOC,GPIO_PIN_2);//SCL
#define OLED_SCLK_Set() GPIO_SetOutBits(HT_GPIOC,GPIO_PIN_2);
#define OLED_SDIN_Clr() GPIO_ClearOutBits(HT_GPIOC,GPIO_PIN_9);//SDA
#define OLED_SDIN_Set() GPIO_SetOutBits(HT_GPIOC,GPIO_PIN_9);
#define OLED_RES_Clr() GPIO_ClearOutBits(HT_GPIOC,GPIO_PIN_5);//RES
#define OLED_RES_Set() GPIO_SetOutBits(HT_GPIOC,GPIO_PIN_5);
#define OLED_DC_Clr() GPIO_ClearOutBits(HT_GPIOC,GPIO_PIN_8);//DC
#define OLED_DC_Set() GPIO_SetOutBits(HT_GPIOC,GPIO_PIN_8);
#define OLED_CS_Clr() GPIO_ClearOutBits(HT_GPIOC,GPIO_PIN_0);//CS
#define OLED_CS_Set() GPIO_SetOutBits(HT_GPIOC,GPIO_PIN_0);
#define OLED_IO GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_9
#define AFIO_OLED_IO AFIO_PIN_0|AFIO_PIN_2|AFIO_PIN_5|AFIO_PIN_8|AFIO_PIN_9
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define u8 unsigned char
#define u32 unsigned int
void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
void OLED_WR_Byte(u8 dat,u8 cmd);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1);
void OLED_ScrollDisplay(u8 num,u8 space);
void OLED_WR_BP(u8 x,u8 y);
void OLED_ShowPicture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[]);
void OLED_Init(void);
#endif
oled初始化函数
void OLED_Init(void)
{
//GPIO_InitTypeDef GPIO_InitStructure;
//HT_GPIO_TypeDef GPIO_InitStructure;
CKCU_PeripClockConfig_TypeDef CLOCK={{0}};
CLOCK.Bit.PC=1;
//CLOCK.Bit.AFIO=1;
CKCU_PeripClockConfig(CLOCK,ENABLE);
//AFIO_GPxConfig(GPIO_PC,AFIO_WIFI_IO,AFIO_MODE_DEFAULT);
GPIO_PullResistorConfig(HT_GPIOC,OLED_IO,GPIO_PR_UP);
// GPIO_DriveConfig(HT_GPIOC,OLED_IO,GPIO_DV_8MA);
GPIO_DirectionConfig(HT_GPIOC,OLED_IO,GPIO_DIR_OUT);
OLED_RES_Clr();
delay_ms(200);
OLED_RES_Set();
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0xAF,OLED_CMD);
OLED_Clear();
}
图片取模
取模软件&字符码
非常好用的字符/图片取模软件:https://leoeinstein.lanzouo.com/iAPXvz5baef
在“模式”里面我们可以选择,是图片取模还是字符取模;
然后在“设置”里面按照下图2的一样的设置就行;
设置完成之后,选择一张bmp图片,点击生成字模;
复制字模数据到工程里的bmp.h文件里面就行。
实现效果
工程链接
工程链接:
https://download.youkuaiyun.com/download/LiangWF22/14753777
备份链接:
https://leoeinstein.lanzouo.com/iWuW9kjmtte
2021年1月19日,星期二