第19集
本集实现了多功能按键(单击,双击,长安),程序采用了模块化设计,需要新建C文件及相应的H文件,主函数中,需要增加调用新建的H头文件。
unsigned char key_multi(void); //带有char型返回函数的格式。
static//为静态变量,只运行一次。
if与else ifd的用法
swith case 用法中,记得一定要加break,不然会一直执行
return//返回关键字
以下为多功能按键的扫描函数
unsigned char key_multi(void)//key_return
{
unsigned char key_state;
static unsigned int key_time;
static unsigned char key_press_nums;
static unsigned int key_time_double;
static unsigned char keynum;
static unsigned char new_keynum;
unsigned char key_press, key_return;
key_return = None_click;
key_delayms(10);
switch(keyscan())
{
case 1:key_press = KEY1;new_keynum = 1;break;
case 2:key_press = KEY2;new_keynum = 2;break;
case 3:key_press = KEY3;new_keynum = 3;break;
case 4:key_press = KEY4;new_keynum = 4;break;
default:key_press = 1;break;
}
if(key_press_nums > 0)
{
key_time_double++;
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) key_state = KEY_STATE_2;
witch (key_state)
{
case KEY_STATE_0:
{
if (!key_press)
{
key_time = 0;
key_state = KEY_STATE_1;
}
}break;
case KEY_STATE_1:
{
if (!key_press)
{
key_time++;
if(key_time>=SINGLE_KEY_TIME)
{
key_state = KEY_STATE_2;
key_press_nums++;
}
}
else key_state = KEY_STATE_0;
}break;
case KEY_STATE_2:
{
if(key_press)
{
if(key_time_double < DOUBLE_KEY_TIME ) key_state = KEY_STATE_0;
if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME)
{
if(key_press_nums == 1) key_return = Single_click + new_keynum*10;
else if(key_press_nums ==2 && new_keynum == keynum) key_return = Double_click + new_keynum*10;
key_state = KEY_STATE_0;
key_press_nums = 0;
key_time_double = 0;
}
}
else
{
key_time++;
if(key_time >= LONG_KEY_TIME)
{
key_return = Long_click + new_keynum*10;
key_state = KEY_STATE_3;
}
}
}break;
case KEY_STATE_3:
{
if (key_press)
{
key_state = KEY_STATE_0;
key_press_nums = 0;
key_time_double = 0;
}
}break;
default:key_state = KEY_STATE_0;break;
}
keynum = new_keynum;
return key_return;
}
第20集
这一章节讲的是利用翻转发扫描16个矩阵按键
u8 Matrix_key()
{
u8 temp,keyvalue;
u8 keystate;
P2 = 0xF0;
if(P2 != 0xF0 && keystate == 0)
{
delayms(5);
if(P2 != 0xF0 && keystate == 0)
{
keystate = 1;
temp = P2;
switch(temp)
{
case 0xE0:keyvalue = 1;break;
case 0xD0:keyvalue = 2;break;
case 0xB0:keyvalue = 3;break;
case 0x70:keyvalue = 4;break;
}
P2 = 0x0F;
if(P2 != 0x0F)
{
temp = P2;
switch(temp)
{
case 0x07:keyvalue += 0;break;
case 0x0B:keyvalue += 4;break;
case 0x0D:keyvalue += 8;break;
case 0x0E:keyvalue += 12;break;
}
}
}
}
if(P2 == 0xF0) keystate = 0;
return keyvalue;
}
1.让8个i/o口中,4列为高电平,然后读取到低电平端口,说明有按键按下了
2.8个i/o口,高低电平翻转输出,行为低电平,列为高电平,只有就能得出按键按下的是哪个按键了,返回对应的按键值