1.支持连按的书写
对上一讲的知识我们再补充一下支持连按的代码以此加深理解。
实验现象就是按着按键不放,那么“key=1;”出现的频率就会比不支持连按代码的时候多,所以就会有左右不断流水的现象,按键的功能代码大家自己去分析了。#include
#include
#define TIMES 2000 //让流速慢一点
sbit KEY4 = P2^7;
u8 KEY4_Scan()
{
static u8 key_up=1;
static u16 times;
if(key_up==0)
{
times++;
if(times>=TIMES)
{
times=0;
return 1;
}
}
key_up=KEY4;
return 0;
}
void main()
{
u8 key; //用来读取按键动作的返回值
u8 i=0,dir; //dir是作为切换流水方向
LED_Init(); //初始化LED硬件模块
P2=0xF7; //让K4能具备有被拉低的条件先
P0=0xFE; //先点亮LED2
while(1)
{
key=KEY4_Scan();
if(key==1)//执行功能代码
{
i++;
if(i>=15)i=1;//让i一直在1~14之间变化
if(i<8)dir=0;//向左移
if(dir==0)P0=~(0x01<
if(i>=8)dir=1;//向右移
if(dir==1)P0=~( 0x80>>(i-7) );//当i大于等于8之后,(i-7)其实也还是在1~7之间变化
}
}
}
2.常用按键
之前我们讲解了很多按键处理功能的代码,一步步地深入了解了硬件与软件的结合,然而我们举例过的这些按键例程都不算完美,我们参考了正点原子团队开发的按键代码,发现他们执行的效率更高。又因为初学者还没有足够能力去理解人家团队书写的代码,所以笔者才一步步地讲解前面的代码来为此次的最终按键程序打下基础。
考虑到我们最常用的按键是K4,K8,K12,K16
所以只有P2.7输出低电平之后,对应的4个按键的IO端口才有被拉低的条件。
也就是说,按键的初始化函数我们规定这样写void KEY_Init()
{
P2=0X7F;//让P2.7输出低电平,其他IO端口输出高电平,这样就可以使能4个按键了
}
由于篇幅有限,我们下一讲再细说最终的按键程序。