4、蓝桥杯单片机之按键优化(定时器扫描按键)

85af97000b2e4b21a956e9a16542d264.jpeg81a56bb082ae4ff99cd0c62ecf0a8bc8.png蓝桥杯单片机开发板的独立按键和矩阵按键用的时候根据题目要求二选一,开发板上有个跳线帽,用到哪个连哪个。同样这里也摒弃了使用延时和死循环,采用定时器扫描按键状态,避免浪费CPU运行时间。

先以独立按键为例(其实独立按键和矩阵按键都一样,原理相同)

使用独立按键需要用跳线帽连接原理图2、3两端,开发板也有文字说明。

unsigned char Key(void)
{
		unsigned char KeyNumber=0;
		if(P33==0){KeyNumber=4;}
		if(P32==0){KeyNumber=5;}
		if(P31==0){KeyNumber=6;}
		if(P30==0){KeyNumber=7;}
		return KeyNumber;
}

void Key_Deal(void)
{
		unsigned char Key_Temp,Key_Down=0;
		static unsigned char Key_Old=0;
		Key_Temp=Key();
		Key_Down=Key_Temp&(Key_Temp^Key_Old);
		Key_Old=Key_Temp;
}
void Timer1_Init(void)		//2ms@12.000MHz
{
	AUXR &= 0xBF;			//定时器时钟12T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0x30;				//设置定时初始值
	TH1 = 0xF8;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
	EA=1;
}
void Timer1_Isr(void) interrupt 3     //2ms进入一次
{
    static unsigned int Count_1=0;
    Count_1++;
	if(Count_1>=5)   //10ms扫描一次
	{
		Count_1=0;
		Key_Deal();    //这里可以设置一个标志位,避免在中断执行太多代码了,我这里为了方便就不 
                         改了
	}
}

这里面的核心就是这个函数

void Key_Deal(void)
{
        unsigned char Key_Temp,Key_Down=0;
        static unsigned char Key_Old=0;
        Key_Temp=Key();
        Key_Down=Key_Temp&(Key_Temp^Key_Old);
        Key_Old=Key_Temp;
}

我们来详细分析一下:

Key_Temp=Key();    //每10ms读取一次按键状态,并将它赋值给Key_Temp

Key_Down=Key_Temp&(Key_Temp^Key_Old);  //这是最关键的一行代码,一个按位与,一个按位异或。(&  两个都为1,才为1,否则为0;^  相同为0,不同为1)a111d2703348431c96831274a56f6f73.png Key_Old=Key_Temp;   //Key_Old为静态局部变量,离开函数,值仍保留:数据存储在静态存储区,在程序整个运行期间都不释放,且只能在该函数中调用。将这次读取到的临时按键值Key_Temp更新到Key_Old中,作为下一次的旧的按键值;

注意!!!!!!!!!!!!!!

如果我们要使用哪个按键就判断Key_Down的状态,注意Key_Down是局部变量,判断Key_Down不要放在函数外面!

 

 

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值