📄 key.c
字号:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define KEY_ALL 0xff00 //使用IOA8~IOA15作为键盘输入口
//=============================================================
// 函数名称: GetKey()
// 日期: 20040816
// 功能描述: 等待直到有键按下并抬起,返回键值,没有去抖处理
// 输入: 无
// 输出: 返回16位键值
//=============================================================
unsigned GetKey(void)
{
unsigned KeyValue;
//初始化IOA的相应端口为上拉输入
*P_IOA_Dir&=~KEY_ALL; //"~"先把KEY_ALL即0xff00取反,变成0x00ff,然后和P_IOA_Dir与,再赋给P_IOA_Dir
*P_IOA_Attrib&=~KEY_ALL; //和上面一样道理,主要是保护一下IO口,直接给P_IOA_Dir、P_IOA_Attrib写0x00ff也可以
*P_IOA_Buffer|=KEY_ALL; //KEY_ALL即0xff00和P_IOA_Buffer相或后再赋给P_IOA_Buffer,主要是为了保护没有用到的IOA低8位
//下面的循环是等待按键按下,按下对应 IOA口的对应值变为0
while(KeyValue==0)
{
KeyValue=(*P_IOA_Data & KEY_ALL)^KEY_ALL;
*P_Watchdog_Clear=1; //清看门狗
}
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL; //"^"是异或,如果两位相同就为0,不同为1。如果没有按键按下,KeyValue=0;假设IOA8按下P_IOA_Data高8位就变为01,再和KEY_ALL与后就变成0x0100,所以KeyValue=0x0100;
//下面的循环是等待按键抬起
while((*P_IOA_Data&KEY_ALL)^KEY_ALL) //如果(*P_IOA_Data&KEY_ALL)^KEY_ALL =1就开始这个循环,即当有按键按下时就开始这个循环。
{
*P_Watchdog_Clear=1;
}
return KeyValue; //返回键值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -