在前面C51单片开发章节中已经讲解如果使用显示器,开发只需要将相关的驱动程序一直到HAL中即可通过HAL来使用使用显示器了。

显示屏驱动移植

在本节课配套的工程代码中,有一个“HAL更新”文件夹,如下图所示。
第7章:硬件适配层应用——显示屏 - 图1

笔者已经把前面章节用到的OLED12864和TFT12864彩屏的驱动程序y移植到了HAL,移植后的代码就在hal文件夹中,如下图所示。
第7章:硬件适配层应用——显示屏 - 图2

其使用方法是:

  1. 删除协议栈中的hal文件夹,该文件夹在Z-Stack 3.0.1\Components中
  1. 把HAL更新文件夹中的hal文件夹复制到Z-Stack 3.0.1\Components中,即替换了协议栈中的hal文件夹,如下图所示。
    第7章:硬件适配层应用——显示屏 - 图3
  1. 替换成功后,可以在目录Z-Stack 3.0.1\Components\hal\target\CC2530EB中找到显示器驱动程序,如图所示。
    第7章:硬件适配层应用——显示屏 - 图4
    这些驱动程序与前面章节用到的显示器驱动程序是一样的。
  1. 把驱动程序添加到工程中
    A. 在HAL的Drivers下创建3个工程组,分别是Common、HW_LCD和SPI,如图所示。
    第7章:硬件适配层应用——显示屏 - 图5
    B. 把相关的驱动程序添加进来,如图所示。
    第7章:硬件适配层应用——显示屏 - 图6
  1. 添加路径到工程,下文将会详细说明。

驱动程序说明

上图中的SPI是前面章节讲解过的通用SPI驱动程序,Common中存放了延时函数和通用的IO配置程序,HW_LCD中存放了字库、LCD的SPI适配程序和显示器的驱动。笔者移植过来的时候做了一些变量类型的兼容,主要是uint8和uint8_t、uint16和uint_16等类型兼容。

HW_LCD的详细内容如下图所示。
第7章:硬件适配层应用——显示屏 - 图7

添加路径到工程

最后,需要把驱动程序的路径添加到工程中。在下图中的Preprocessor中输入以下代码:

  1. $PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\Common
  2. $PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\SPI
  3. $PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\Font
  4. $PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\HAL_LCD_SPI
  5. $PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\HAL_OLED
  6. $PROJ_DIR$\..\..\..\..\..\Components\hal\target\CC2530EB\HW_LCD\HAL_TFT

第7章:硬件适配层应用——显示屏 - 图8

至此,已经把显示器驱动程序移植到了HAL中了,然后可以使用HAL为开发者准备的LCD API了。

HAL LCD API

HAL提供了完善的显示器驱动API,其定义在hal_lcd.h和hal_lcd.c中,如图所示。
第7章:硬件适配层应用——显示屏 - 图9
第7章:硬件适配层应用——显示屏 - 图10

打开hal_lcd.h文件,可以找到如下显示器API:

  1. /**
  2. * 在指定的行中显示字符串
  3. *
  4. * @param str - 待显示的字符串
  5. * @param option - 在哪一行显示数据
  6. *
  7. */
  8. void HalLcdWriteString ( char *str, uint8 option);
  9. /**
  10. * 在指定行用指定进制显示数值
  11. *
  12. * @param value - 待显示的数值
  13. * @param radix - 指定的进制
  14. * @param option - 在哪一行显示数据
  15. *
  16. */
  17. void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option);

如果需要在在屏幕第一行显示”Hello World!”,可按如下方式调用HalLcdWriteString:

  1. HalLcdWriteString( Hello World!”, HAL_LCD_LINE_1 );

如果需要第一行用10进制显示一个变量的数值,可按如下方式调用HalLcdWriteValue:

  1. 1.uint8 val = 100;
  2. 2.HalLcdWriteValue ( val, 10, HAL_LCD_LINE_1 );

启用 LCD 功能

使用显示器功能前,需要先开启宏,HAL_LCD。
1.如果使用的是配套的0.96寸OLED屏幕,在下图中的Defined sybols中输入以下代码。

  1. HAL\_LCD=TRUE
  2. HAL\_LCD\_OLED12864

2.如果使用使用的是配套的0.96寸TFT屏幕,则输入

  1. HAL\_LCD=TRUE

如下图所示。
第7章:硬件适配层应用——显示屏 - 图11

如何鉴别屏幕类型?请参考:显示器实验

调试仿真

编译整个工程,然后把程序烧录到开发板中并全速运行,可以看到屏幕显示了Z-Stack相关的调试信息。