通過獨立按鍵控制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;
}
}
}