- 打卡等级:常住居民III
- 打卡总天数:130
- 最近打卡:2025-05-07 18:17:53
中级会员
- 积分
- 375
|
发表于 2024-8-27 09:56:21
|
显示全部楼层
本帖最后由 阿杰爱学单片机 于 2024-8-27 10:40 编辑
第七集 学习记录
按键的应用,按键在生活中极为广泛是人与计算机进行交互的媒介,就比如电脑上的键盘
但在实际引用中,因为按键是机械元件,开关都会有抖动,如下图所示,此时我们就要滤除这些不必要的抖动,以免对程序效果产生影响。
按键的消抖分为软件消抖和硬件消抖
软件消抖的本质就是不读取抖动的电平,加延时耗过去。
而硬件消抖对硬件要求太高,会很麻烦,实际应用不多。
在实验中我发现冲哥的代码有一些小瑕疵,冲哥的代码只对按键按下去除抖动,而按键松开没有进行延时去抖。
就导致了有时按键松开会执行两次按键按下的语句,造成一点小影响,虽然影响不大,到我觉得保险起见,按键松手时也加入延时代码,使按键检测更准确
就如下所示这样书写。
if(Key1 == 0) //如果按键1按下
{
delay_ms(10); //延时消抖
while(Key1 == 0);//如果按键1按下死循环,等待松手
delay_ms(10); //延时消抖
LED1=!LED1; //LED1状态取反
printf("按键1按下LED取反%\r\n");
}
串口打印小细节,不能显示中文的改一下串口设置,打开串口,点击更多设置,点击编码格式,选择UTF8就可以打印中文了
再提一点,按键控制LED左移其实有个更简单的方法
前面不是学过<<,>>,~,左移右移还有取反的运算符吗,把这些应用在一起如下
u8 i;
if(Key==0)
{
delay_ms(10);
while(Key==0);
delay_ms(10);
P2=~(0x01<<++i);
if(i==9)i=1;
}
这句代码啥意思呢,意思就是,按键按下i++;0x80左移i位,简化一下就是按键按下几次0x01就移几位,
那0x01是啥呢,0x01换算成2进制就是0000 0001,又因为左移会把高位忽略,低位补0,所以效果就是
0000 0001
0000 0010
0000 0100
0000 1000
0001 0000.......
我们发现这个一是一只向左移的,那如果用这个一点亮LED那不就是流水灯的效果了吗。
但是我们知道开发板上的LED都是接低电平才会点亮也就是0,那用这个代码不全反了啊
这时候我们只用~这个符号,取反一下,0就变成1,1就变成0,程序就对了,最后再把这个值赋值给P2口就可以了
至于那个 if(i==9)i=1;是防止越界的,这个u8 i;是一个无符号char型数据,需要定义为全局变量,也就是写在void main上面。
这就是我这节课的感悟
|
|