BF533对键盘功能的初始化
0赞
发表于 4/8/2012 9:15:57 AM
阅读(2835)
#include "dm_bf5xx.h"
#include "dm_keyb.h"
/***************************************************************************
PROTOTYPES
***************************************************************************/
EX_INTERRUPT_HANDLER(keybord_ISR);
static uint8_t cur_key=0xff;
static inline void Init_PF(void)
{
/*0x20300000+0x00060000*/
*pCtrIner_Flag_OE =~KEY_SW_OE;//KEY_SW_OE=0
/*0x20300000+0x000A0000*/
*pCtrOut_Flag_C = KEY_SW ;//KEY_SW=1
mdelay(200);
}
void Init_Platform_KBD(void)
{
Init_PF();
}
void Init_Timers(void)
{
*pTIMER0_CONFIG = 0x0019;
*pTIMER0_PERIOD = 0x00008FFF;
*pTIMER0_WIDTH = 0x00800000;
*pTIMER_ENABLE |= 0x0001;
}
/****************************************************************************
* 名称 :Init_timer0_Interrupts
* 功能 :开中断,注册中断服务程序
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Init_timer0_Interrupts(void)
{
*pSIC_IAR0 &= 0xffffffff;
*pSIC_IAR1 &= 0xffffffff;
*pSIC_IAR2 &= 0xfffffff4;
register_handler(ik_ivg11, keybord_ISR);
*pSIC_IMASK |= 0x00010000;
}
EX_INTERRUPT_HANDLER(keybord_ISR)
{
*pTIMER_STATUS &=0xefff;
scanfkb();
}
void keydecode(int_t flag ,uint8_t keydat);
/****************************************************************************
* 名称 :scanfkb
* 功能 :扫描键盘键值
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void scanfkb(void)
{
int_t keypressflag ;
uint8_t oldkbdat,kbdat;
int_t i;
uint8_t row=0x1;
for(i = 0;i < 4;i++){
*pCtrIn_Kb = ~row; //列线循环输出1110,1101,1011,0111
mdelay(50);
oldkbdat = *pCtrIn_Kb; //读取扫描数据
row = row << 1; //准备输出下一个列线值
if((oldkbdat&0xf0)!=0xf0){ //判断行线输入是否有低电平
kbdat = *pCtrIn_Kb;
keypressflag = 1;
if(oldkbdat == kbdat){
do{
kbdat = *pCtrIn_Kb;
}while ((kbdat&0xf0)!=0xf0); //等待按键被释放
keydecode(keypressflag,oldkbdat);
keypressflag = 0;
}
}
}
row = 0x01;
}
