赞
踩
OLED模块的外形大家都很清除了,能够找到这里的小伙伴,手上应该都有这样的一个模块。
本文用的通信方式是软件模拟4线SPI方式,优点就是可以随意选择IO口连接,特方便。
具体的驱动原理可以参考以下博文:
OLED(经典0.96英寸)_4SPI_SSD1306控制原理(含常用芯片_oled例程)
还有这篇:【常用模块】OLED显示模块(原理讲解、STM32实例操作)
以上两篇博文里面提到的工程都是以stm32为例的,可以下载把看看里面的oled.c和oled.h文件
模板1_链接1:
https://download.csdn.net/download/LiangWF22/14753847
模板1_链接2:
https://leoeinstein.lanzous.com/i5ZwLkbbe8j
模板2_链接1:
https://leoeinstein.lanzous.com/iAvS0kk79ij
如果感觉下面步骤麻烦的小伙伴,请移步到文末,那里有完整的工程链接,下载即可用。
右键点击工程列表里的工程文件、在弹出框点击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.csdn.net/download/LiangWF22/14753777
https://leoeinstein.lanzouo.com/iWuW9kjmtte
2021年1月19日,星期二
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。