⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm_init_kb.c

📁 采用美国adi公司的bf系列
💻 C
字号:
/************************************************************************** 
文件名称: dm_init_kb.c
作者: Andy
版本: 0.1 
创建时间 : 2007-04 
描述: 
	文件实现了在使用键盘功能时,ADSP-BF533的中断等寄存器的初始化
修改历史: 
****************************************************************************/ 
#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(); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -