通过独立按键控制LED灯
三个例程都来自 2020版 全网最清晰易懂的51单片机入门教程 |B站 江科大自动化协会
原理图
从DOC88下载的 HC6800-MS原理图 - 道客巴巴 (doc88.com)
独立按键
led
1 简单开关
按下 K1 P1_4 就是低电平
令 P2_0 = P1_4 即能够使K1按下时,D1灯亮
代码
#include <REGX52.H>
void main(void)
{
while(1)
{
P2_0 = P1_4;
}
}
2 状态切换
按下K1,灯D1的状态会切换。
需要用到延时。
抖动消除
一般按键按下时,由于物理器件的特性会产生5-10ms左右的电压不稳定
代码
#include <REGX52.H>
#include "delay.h"
void main(void)
{
while(1)
{
if (!P1_4)
{
Delay1ms(10);
while(!P1_4);
Delay1ms(10);
P2_0 = ~P2_0;
}
}
}
3 方向控制
移位注意符号
如果按键是在Delay时按下,便无法识别
这个暂时无法解决。
代码
#include <REGX52.H>
#include "delay.h"
#define LEFT_BTN P1_7 // register bit for button K4
#define RIGHT_BTN P1_5 // register bit for button K2
#define LED P2 // register for LED
#define LEFT 0
#define RIGHT 1
#define LEFT_ROTATE(curr)((curr) << 1 | (curr) >> 7)
#define RIGHT_ROTATE(curr) ((curr) >> 1 | (curr) << 7)
#define MOVE(curr, d) ((d)==LEFT ? LEFT_ROTATE(curr) : RIGHT_ROTATE(curr))
void main(void)
{
unsigned char direction = LEFT;
unsigned char curr = 1;
LED = ~curr;
while(1)
{
Delay1ms(1000);
curr = MOVE(curr, direction);
//curr = curr << 1 | curr >> 7;
//curr = curr << 1 > 0 ? curr << 1 : 1;
LED = ~curr;
if (LEFT_BTN == 0)
{
Delay1ms(10);
while(LEFT_BTN == 0);
Delay1ms(10);
direction = LEFT;
}
if (RIGHT_BTN == 0)
{
Delay1ms(10);
while(RIGHT_BTN == 0);
Delay1ms(10);
direction = RIGHT;
}
}
}