上一篇搞定了字库的生成,今天这一篇就考虑驱动的编写了,根据开发板现有的电路图,OLED接口的引脚为:
命名 | 描述 | 占用引脚 |
---|---|---|
GND | 接地线 | |
VCC | 3.3V供电 | |
CLK | 时钟 | P1_2 |
DIN | 数据 | P1_3 |
RST | 重置 | P1_7 |
D/C | 命令/数据 | P0_0 |
由于CC2530没有专用的通信接口可以和这玩意通信,因此需要使用以上几个GPIO口进行软实现完成数据的通信,本着拿来主义的精神,结合本人懒的个性,首先我就把使用到的引脚先定义起来。
#define HAL_LCD_CLK_PORT 1
#define HAL_LCD_CLK_PIN 2
#define HAL_LCD_DIN_PORT 1
#define HAL_LCD_DIN_PIN 3
#define HAL_LCD_RESET_PORT 1
#define HAL_LCD_RESET_PIN 7
#define HAL_LCD_DC_PORT 0
#define HAL_LCD_DC_PIN 0
再结合于此和Zstack中的例子,实现以下几个宏定义
//设置IO引脚的电平为高或者低
#define HAL_IO_SET(port, pin, val) HAL_IO_SET_PREP(port, pin, val)
#define HAL_IO_SET_PREP(port, pin, val) st(P##port##_##pin = val;)
//配置对应的引脚为通用输出引脚
#define HAL_CONFIG_IO_OUTPUT(port, pin, val) HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val)
#define HAL_CONFIG_IO_OUTPUT_PREP(port, pin, val) st(P##port##SEL &= ~BV(pin); \
P##port##_##pin = val; \
P##port##DIR |= BV(pin);)
//重置和D/C的选择
#define LCD_ACTIVATE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 0);
#define LCD_RELEASE_RESET() HAL_IO_SET(HAL_LCD_RESET_PORT, HAL_LCD_RESET_PIN, 1);
#define LCD_SEND_DATA() HAL_IO_SET(HAL_LCD_DC_PORT,HAL_LCD_DC_PIN,1);
#define LCD_SEND_COMMAND() HAL_IO_SET(HAL_LCD_DC_PORT,HAL_LCD_DC_PIN,0);
//操作时钟和数据引脚
#define LCD_DATA_HIGH() HAL_IO_SET(HAL_LCD_DIN_PORT,HAL_LCD_DIN_PIN,1)
#define LCD_DATA_HIGH() HAL_IO_SET(HAL_LCD_DIN_PORT,HAL_LCD_DIN_PIN,0)
至此IO引脚的功能就已经完成了,剩下要做的,就是使用这些IO引脚来完成各种通信了
比如实现了以下两个函数,用于向LCD驱动芯片发送指令或者是数据
void HalLcd_HW_Control(uint8 cmd);
void HalLcd_HW_Write(uint8 data);
后面的部分,就是如何去驱动液晶屏了