一.轮询方式处理按键
参考 E:\Linux\8.key_open
//按键的初始化
void key_init(void)
{
// GPH0CON的bit8~15全部设置为0,即为输入模式
rGPH0CON &=~(0xff<<8);
// GPH2CON的bit0~15全部设置为0,即为输入模式
rGPH2CON &= ~(0xFFFF<<0);
}
void key_polling(void)//轮询方式
{
// 依次,挨个去读出每个GPIO的值,判断其值为1还是0.如果为1则按键按下,为0则弹起
// 轮询的意思就是反复循环判断有无按键,隔很短时间
// 对应开发板上标着LEFT的那个按键
while(1)
{
if (rGPH0DAT & (1<<2))
{
// 为1,说明没有按键
led_off();
printf("key left.\n");
}
else
{
// 添加消抖
// 第一步,延时
delay20ms();
// 第二步,再次检验按键状态
if (!(rGPH0DAT & (1<<2)))
{
// 为0,说明有按键
led1();
printf("key down.\n");
}
}
// 对应开发板上标着DOWN的那个按键
if(rGPH0DAT &(1<<3)) // 为1,说明没有按键
{
led_off();
printf("key down.\n");
}
else // 为0,说明有按键
{
// 添加消抖
// 第一步,延时
delay20ms();
// 第二步,再次检验按键状态
if (!(rGPH0DAT & (1<<3)))
{
// 为0,说明有按键
led1();
printf("key down.\n");
}
}
// 对应开发板上标着UP的那个按键
if (rGPH2DAT & (1<<0))
{
// 为1,说明没有按键
led_off();
printf("key down.\n");
}
else
{
// 添加消抖
// 第一步,延时
delay20ms();
// 第二步,再次检验按键状态
if (!(rGPH2DAT & (1<<0)))
{
// 为0,说明有按键
led3();
printf("key down.\n");
}
}
}
}
二.中断系统 2017/11/21 23:30
1.异常向量表分析:
(1)、复位(RESET)
a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令
当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断
这是一个由用户定义的中断指令(SWI)。
该异常由执行
SWI
指令产生,
可用于用户模式下的程序调用特权操作指令。在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)
如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)
如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。