默れ

BF533中断等寄存器的初始化

0
阅读(1987)
#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;
}
/****************************************************************************
* 名称 :keydecode
* 功能 :打印键盘键值
* 入口参数 :flag   按键标志
*			 keydat 键值
* 出口参数 :无
****************************************************************************/
void keydecode(int_t flag ,uint8_t keydat)
{
	if(flag == 1){
		switch (keydat)
		{
			case 0x7e: printf("The kb is F\n\r");  			break;
			case 0xbe: printf("The kb is E\n\r");  			break;
			case 0xde: printf("The kb is D\n\r");  			break;
			case 0xee: printf("The kb is C\n\r");  			break;
			case 0x7d: printf("The kb is B\n\r");  			break;
			case 0xbd: printf("The kb is A\n\r");  			break;
			case 0xdd: printf("The kb is 0\n\r");  			break;
			case 0xed: printf("The kb is 9\n\r");  			break;
			case 0x7b: printf("The kb is 8\n\r");  			break;
			case 0xbb: printf("The kb is 7\n\r");  			break;
			case 0xdb: printf("The kb is 6\n\r");  			break;
			case 0xeb: printf("The kb is 5\n\r");  			break;
			case 0x77: printf("The kb is 4\n\r");  			break;
			case 0xb7: printf("The kb is 3\n\r");  			break;
			case 0xd7: printf("The kb is 2\n\r");  			break;
			case 0xe7: printf("The kb is 1\n\r");  			break;
			default:							break;
		}
		
	flag = 0;
	}
}
/****************************************************************************
* 名称 :scankb
* 功能 :键盘初始化
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void scankb(void)
{
	Init_timer0_Interrupts();
	Init_Timers();
    Init_Platform_KBD();