ZigBee学习笔记_HalDriverInit()_3

来源:互联网 发布:淘宝男装潮流店铺 编辑:程序博客网 时间:2024/05/22 11:47

HalDriverInit()终于快要看完了,这次查看的是按键初始化函数HalKeyInit()函数

void HalKeyInit( void ){  /* Initialize previous key to 0 */  halKeySavedKeys = 0;  HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT);    /* Set pin function to GPIO */  HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT);    /* Set pin direction to Input */    HAL_KEY_SW_7_SEL &= ~(HAL_KEY_SW_7_BIT);    /* Set pin function to GPIO */  HAL_KEY_SW_7_DIR &= ~(HAL_KEY_SW_7_BIT);    /* Set pin direction to Input */ // HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin function to GPIO *///  HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin direction to Input */  /* Initialize callback function */  pHalKeyProcessFunction  = NULL;  /* Start with key is not configured */  HalKeyConfigured = FALSE;}

首先是一个halKeySaveKeys变量,注释上说是先前的按键状态在上拉模式下,宏定义如下

#define HAL_KEY_SW_6_SEL    P0SEL#define HAL_KEY_SW_6_DIR    P0DIR#define HAL_KEY_SW_7_SEL    P0SEL#define HAL_KEY_SW_7_DIR    P0DIR#define HAL_KEY_SW_6_BIT    BV(5)#define HAL_KEY_SW_7_BIT    BV(4)

前面说过一次按键配置,有关中断的配置,这次初始化的还是这两个按键,首先将他们设置为通用I/O口并且是输入引脚,回调函数设置为空,按键的配置为FALSE。

就剩下最后一个LCD初始化了,进入HalLcdInit()函数

void HalLcdInit(void){        delay_us(10000);        P1DIR |= 0xFC;        P2DIR |= 0x01;        P0DIR |= 0x02;        P1_2 = 0;delay_us(100);WriteLCD(COMMAND , 0xE2);//复位delay_us(100);WriteLCD(COMMAND , 0xA3);delay_us(100);WriteLCD(COMMAND , 0xA0);delay_us(100);WriteLCD(COMMAND , 0xC8);delay_us(100);WriteLCD(COMMAND , 0x24);delay_us(100);WriteLCD(COMMAND , 0x81);delay_us(100);WriteLCD(COMMAND , 0x14);delay_us(100);WriteLCD(COMMAND , 0x2F);delay_us(100);WriteLCD(COMMAND , 0x40);//从第一列开始显示delay_us(100);WriteLCD(COMMAND , 0xB0);delay_us(100);WriteLCD(COMMAND , 0x10);delay_us(100);WriteLCD(COMMAND , 0x00);delay_us(100);WriteLCD(COMMAND , 0xAF);WriteLCD(COMMAND , 0x81);WriteLCD(COMMAND , 0x1b);        delay_us(100);        SetContrast(iIntRegValuea,ContrastValue);ClearScreen();       // HalLcdWriteString("IEEE:",1);       // HalLcdWriteString("Init lcd",2);      // HalLcdWriteString("Init lcd",3);      //  PrintCh8(30,30,'O',1);}

这些个指令得看OCM12864-9的数据手册了,是一些基本设置,如下


下面看下板子与LCD的线路


P1_2口是LCD的背光口,置低即可。可以看到51芯片并不是直接控制LCD模块,而是通过一个串口转并口来控制,节省了接口资源,WriteLCD()函数的实现就设计到LCD模块的时序以及串行转并行模块时序(看代码貌似是595模块),

void WriteLCD(uint8 fs, uint8 da){delay1(2);LCD_CS1 = 0;LCD_RW = 0;//写操作//delay1(0);if(fs){LCD_RS = 1;}else{LCD_RS = 0;}       // delay1(0);        Write595(da);LCD_E = 1;// = 1;        delay1(2);LCD_E = 0;// = 0;//delay1(0);LCD_CS1 = 1;}

首先是判断写命令还是写数据,然后是通过串行转并行,输出数据到LCD模块上

void Write595(uint8 dat){uint8 ii;for(ii = 0 ; ii < 8; ii++){if(dat & 0x80) LCD_595_DAT = 1;elseLCD_595_DAT = 0;dat <<= 1;LCD_595_CK = 1;LCD_595_CK = 0;}LCD_595_LD = 1;LCD_595_LD = 0;}

对LCD设置完成之后,有个清屏操作,

void ClearScreen(void){ uint8 x,y;for(x = 0;x < 8 ;x++){          SetRamAddr(x , 0);  for(y = 0 ; y < 128 ; y++){    WriteLCD(DATA , 0x00);}}}

更多LCD操作还是看下他给的基础例程结合QCM12864-9数据手册即可,HalDriverInit()函数就查看到这吧。