时隔一个星期我终于又继续自学了,先夸夸我自己😁
先强调一下,横线划掉的部分是瞎扯,先记录一下,等我有缘知道了再回来😈
好了,先上个单片机开发板上独立按键的图(我的有四个):
上述按键中23之间,14之间(即引脚之间距离长的)本来就是连通的,按下按键后1和2,3和4连通,如果想让按键连接两支路则可把两支路分别连到1,2或分别连到3,4(我觉得连到任两引脚都可)。
开发板原理图上独立按键模块:
GND为接地即低电压,如果按键k1按下则接通相当于一条导线,那么对应的P3^1也为低电压。
抖动现象:一般持续时间为5ms~10ms
按下按键后
在程序中判断P3^1或其他三个口电压是否为低电压,即0时由于存在抖动,可能造成错误,所以要消除抖动。
为了消除抖动现象,有两种方法,一是硬件消抖,二是软件消抖。本质都是延时(这个本质是我自己方便理解说的,也不知道对不对,后来如果发现不对,再来改)
硬件消抖就是把硬件电路设计成下图:
硬件消抖一般只用于按键数少的,其他时候还是用软件消抖。
按键未按下时,电容接在高低电位之间,充好了电,当按键按下时按键和电容构成回路,按键上有电流,在电容放电这段时间KeyIn1电压还是高电压,放完电了,按键上电流为0,KeyIn1电压为0,按下抖动消除了。键盘松开时,5v高电压给电容充电,又花费一段时间,释放抖动就消除了。这样就消抖了。
软件消抖:
就是延时,还能通过定时器,不过我还不会😅
下面是我编的一个程序:
注:1.其中为了方便理解对四个按键是否按下的判断都粗暴地直接写出来了,所以程序比较啰嗦?
2.我的第一个灯是从右往左的
3.最后一行程序led=0xaa;没有延时,所以如果一直按住一个按键会造成亮暗亮暗亮暗亮暗(从右往左)效果快速闪过,而该按键对应两个led一直亮。
#include<reg52.h>
#define led P2 //宏定义
sbit key1=P3^1; //sbit为位定义
sbit key2=P3^0;
sbit key3=P3^2;
sbit key4=P3^3;
void delay(unsigned int i) //unsigned int为数据类型名,无符号整型;此为C语言知识
{
while(i--);
}
void keypros() //定义keypros函数,C语言知识
{
if(key1==0) //如果()内成立则执行{}内语句
{
delay(1000); //调用delay函数延时,我这里括号内为1000则大概延时10ms,目的是软件消抖
if(key1==0) //延时后key1还是0,即该独立按键真的被按下去了,则执行{}内语句;如果按键按下时间太短即延时后按键已松开,则key1不等于零,灯无变化
{
led=0x3f; //0x3f为十六进制,转换成二进制:00111111,即第一二个灯亮(我的led是0亮1暗)
}
}
if(key2==0)
{
delay(1000);
if(key2==0)
{
led=0xcf; // 11001111,第三四个灯亮
}
}
if(key3==0)
{
delay(1000);
if(key3==0)
{
led=0xf3; //111110011,第五六个灯亮
}
}
if(key4==0)
{
delay(1000);
if(key4==0)
{
led=0xfc; //11111100,第七八个灯亮
}
}
delay(50000); //此处调用delay函数目的是延时,如果按键按下会使相应灯亮效果维持一段时间,还可消除释放抖动
}
void main()
{
while(1) //死循环,一直执行{}内语句
{
keypros(); //调用keypros函数
led=0xaa; //10101010,即8个led亮暗相间;即使按键按下,产生的效果也会在上面delay(50000)延时结束后恢复成10101010效果
}
}
不按按键:
按住key1:
按住key2:
按住key3:
按住key4:
一直按住key1:(抓拍到的一张闪烁图,左边三个图中亮着的灯其实是一直闪的)
这一次笔记到这就结束了🤓