单片机学习之旅 day_2
一、独立按键
先构建空工程,并打开创建HEX文件的选项。
void main(){
}
观察原理图可知K1按键由P31引脚控制,当按下K1时由高电平转为低电平,我们可以通过一个简单的判断语句来判断按键的按下和松开并做出反应,例如:
void main(){
if(P3_1==0){
P2=0xFE;
}
else{
P2=0xFF;
}
}
由于此处的独立按键相当于常闭按钮,所以在编译程序并下载到单片机后我们会发现按键在按下之后松开的瞬间,LED灯就会熄灭。要想实现按下按键让灯常亮,再按下一次按键让灯常灭我们就需要对代码进行适度修改。
这里提供一种思路:引入一个随按键每次按下而改变的值,通过这个值来控制LED灯的亮灭,实现按键的伪自锁(因为按键按下后就会松开,并没有保持按下状态)。
bit key = 0; //引入一个值key void main(){ while(1) //进入死循环 { if(P3_1==0) //判断按键的按下 { while(P3_1==0); //当松开按键后括号内条件不成立运行后续程序 key=!key; //反转引入变量key的值 } if(key) P2_0=0; //点亮LED else P2_0=1; //熄灭LED } }由于单片机的按键存在抖动(由机械触点的弹性及电气特性引起,在按下或释放瞬间会产生短暂的多次开关信号波动)。通常按键在按下沿与释放沿各存在约 5~10ms 的抖动,合计抖动时长约 10~20ms。在此期间,按键电平不稳定,单片机可能会将一次按键操作识别为多次触发,导致受控元件出现频繁通断、状态反复切换的现象。在这里表现为 LED 出现异常闪烁。像LED这样的小电流元器件可能不会造成什么影响,但若控制对象为工业上的继电器、电机等大功率或感性负载,频繁通断则可能造成触点烧蚀、器件过压损坏等不可逆影响。所以一般的类似程序都会对程序进行消抖,用于减少按键抖动的影响。
//对上述程序进行简单的延时消抖后: #include <REGX52.H> #define delay 10 bit key = 0; void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 120; j++); } void main() { while(1) { if(P3_1 == 0) { delay_ms(delay); if(P3_1 == 0) { key = !key; while(P3_1 == 0); delay_ms(delay); } } if(key) P2_0=0; else P2_0=1; } }二、按键控制位移