外设驱动库开发笔记34:OLED显示屏驱动 (3)

  声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:

  OledObjectType *oled, //OLED对象

  OledPortType port, //通讯端口

   uint8_t address, //I2C设备地址

  OledWrite write, //写数据函数

  OledChipReset rst, //复位信号操作函数指针

  OledDCSelcet dc, //DC信号控制函数指针

  OledChipSelcet cs, //SPI片选信号函数指针

  OledDelayms delayms //毫秒延时函数指针

  对于这些参数,对象变量我们已经定义了。所使用的通讯接口方式为枚举,根据实际情况选择就好了。而从站地址对于OLED来说,有几种选择,根据实际情况输入就可。主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型如下:

/*向OLED下发指令,指令格式均为1个字节*/ typedef void (*OledWrite)(OledObjectType *oled,uint8_t *wData,uint16_t wSize); /*复位信号操作函数指针*/ typedef void (*OledChipReset)(OledRSTType rst); /*数据命令,用于SPI接口*/ typedef void (*OledDCSelcet)(OledDCType dc); /*片选信号,用于SPI接口*/ typedef void (*OledChipSelcet)(OledCSType en); /*毫秒秒延时函数*/ typedef void (*OledDelayms)(volatile uint32_t nTime);

  对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。片选操作函数用于多设备需要软件操作时,如采用硬件片选可以传入NULL即可。具体函数定义如下:

void WriteDataToLED(struct OledObject *oled,uint8_t *wData,uint16_t wSize) { HAL_I2C_Master_Transmit(&oledhi2c,oled->devAddress,wData,wSize,1000); } void OLedChipResetf(OledRSTType rst) { HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,(GPIO_PinState)rst); }

  对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下:

/*OLED显示屏对象初始化*/ OledInitialization(&oled, //OLED对象 OLED_I2C, //通讯端口 0x78, //I2C设备地址 WriteDataToLED, //写数据函数 OLedChipResetf, //复位信号操作函数指针 NULL, //DC信号控制函数指针 NULL, //SPI片选信号函数指针 HAL_Delay //毫秒延时函数指针 );

  因在I2C接口模式下,片选信号和数据命令选择信号并不需要控制所以以NULL输入即可。

3.2、基于对象进行操作

  我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经针对不同的字体大小设置了不同的操作函数,接下来我们使用这一驱动开发我们的应用实例。

/*OLED显示信息*/ void OledDisplayMessage(void) { /* 世(0) 界(1) 你(2) 好(3)*/ uint8_t chinChar[4][32]={ {0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00, 0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00},//"世",0 {0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00, 0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00},//"界",1 {0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00, 0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00},//"你",2 {0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00, 0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00}//"好",3 }; char pStr[]="Hello, World!"; float x=1.1; float y=2.2; float z=3.3; //显示16x16的汉字 OledShow16x16Char(&oled,0,32,chinChar[0]); OledShow16x16Char(&oled,0,48,chinChar[1]); OledShow16x16Char(&oled,0,64,chinChar[2]); OledShow16x16Char(&oled,0,80,chinChar[3]); //显示8x16的ASCII字符 OledShowString(&oled,OLED_FONT_8x16,2,32,pStr); //显示8x16的ASCII字符 OledShowString(&oled,OLED_FONT_8x16,4,20,"X%0.1f,Y%0.1f,Z%0.1f",x,y,z); } 4、应用总结

  在本篇中,我们设计并实现了0.96英寸的OLED128x64显示屏的驱动,并设计了一个简单的验证应用来验证这一驱动程序。在我们的验证应用中使用OLED显示了16下6点阵的中文字符,以及8x16点阵的ASCII字符,其显示效果与我们预期一致。

  在使用驱动时需注意,0.96英寸的OLED128x64显示屏支持SPI和I2C两种接口,而且SPI也支持3线和4线模式,但我们在测试应用中只使用了I2C接口,在I2C接口时,不需要控制片选信号和数据命令选择信号,所以在初始化时传递NULL值就可以了。

  在使用驱动时需注意,采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的,我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。在使用SPI接口时,支持SPI模式0(CPOL=CPHA=0)和模式3(CPOL=CPHA=1)。

欢迎关注:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyyyy.html