您的位置:首页 > 其它

ZigBee学习笔记_HalDriverInit()_3

2013-01-21 10:18 363 查看
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;
else LCD_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()函数就查看到这吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: