BF533中断等寄存器的初始化
0赞
发表于 1/7/2012 3:26:14 PM
阅读(3123)
#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();
