#申请原创# @21小跑堂
该开发板自带了一片0.91寸OLED,分辨率为128×32,不过厂家好像没提供例程和芯片介绍,经查找资料,发现应该是SSD1306驱动的。
因此我们可以找到SSD1306的驱动程序,稍加修改以适配该显示屏。
由于我手上之前做过128×64的,因此只要稍加修改就可以了。
根据开发板原理图,先定义出OLED所用的IIC接口的管脚
#define SCL_PORT (PortD)
#define SCL_PIN (Pin00)
#define SDA_PORT (PortD)
#define SDA_PIN (Pin01)
只要用到的文件都复制一份,这样阅读代码更方便
在oled.h
定义如下内容
//-----------------OLED端口定义----------------
#define OLED_SCL_Clr() PORT_ResetBits(SCL_PORT,SCL_PIN)
#define OLED_SCL_Set() PORT_SetBits(SCL_PORT,SCL_PIN)
#define OLED_SDA_Clr() PORT_ResetBits(SDA_PORT,SDA_PIN)
#define OLED_SDA_Set() PORT_SetBits(SDA_PORT,SDA_PIN)
这样就对应上原来的库函数了。
接下来修改原来的SSD1315的初始化代码,来对应SSD1306的驱动器
//初始化
void OLED_Init(void)
{
OLED_WR_Byte(0xAE,OLED_CMD);//--display off
OLED_WR_Byte(0x40,OLED_CMD);//--setstart line address
OLED_WR_Byte(0xB0,OLED_CMD);//--setpage address
OLED_WR_Byte(0xC8,OLED_CMD);//Comscan direction
OLED_WR_Byte(0x81,OLED_CMD);// contract control
OLED_WR_Byte(0xFF,OLED_CMD);//--128
OLED_WR_Byte(0xA1,OLED_CMD);//setsegment remap
OLED_WR_Byte(0xA6,OLED_CMD);//--normal/ reverse
OLED_WR_Byte(0xA8,OLED_CMD);//--setmultiplex ratio(1 to 64)
OLED_WR_Byte(0x1F,OLED_CMD);//--1/32duty
OLED_WR_Byte(0xD3,OLED_CMD);//-setdisplay offset
OLED_WR_Byte(0x00,OLED_CMD);//
OLED_WR_Byte(0xD5,OLED_CMD);//setosc division
OLED_WR_Byte(0xf0,OLED_CMD);//
OLED_WR_Byte(0xD9,OLED_CMD);//SetPre-Charge Period
OLED_WR_Byte(0x22,OLED_CMD);//
OLED_WR_Byte(0xDA,OLED_CMD);//setcom pin configuartion
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0xDB,OLED_CMD);//setVcomh
OLED_WR_Byte(0x49,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//setcharge pump enable
OLED_WR_Byte(0x14,OLED_CMD);//
OLED_WR_Byte(0xAF,OLED_CMD);//--turnon oled panel
OLED_Clear();
OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
}
接下来完成PIN管脚的初始化配置
依葫芦画瓢,设置为输出开漏模式
void oled_pin_init(void)
{
stc_port_init_t stcPortInit;
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enPinOType = Pin_OType_Od;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
PORT_Init(SCL_PORT, SCL_PIN, &stcPortInit);
PORT_Init(SDA_PORT, SDA_PIN, &stcPortInit);
}
然后差不多了,该包含的头文件包含进来后。编译,通过,ISP烧录,重启运行,OK
运行效果还是很不错的。
烧录上需要注意,开发板本身的串口竟然是不能用的,需要额外提供一个串口,然后用跳线连接到ISP接口。选择这个额外的串口进行烧录,同时复位按键上面的
J7跳线帽应短接,点执行后,按下复位键,即可完成烧录,重启需要去掉短接的跳线帽,然后按复位即可。有点小麻烦。
打包的完整工程,以供大家测试。
GPIO_LED.rar
(453.54 KB)
开发板相关资料
HC32F460 EVB Introduction.pdf
(932.55 KB)
HC32F460系列的MCU开发工具用户手册Rev1.0.pdf
(759.45 KB)
|