小磷光一

BF533对键盘功能的初始化

0
阅读(2838)

 

#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;
}