AT89C51 双按键控制八个流水灯代码示例
以下是 AT89C51 控制八个流水灯的代码:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code LedCode[] = { 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE }; // 七段数码管编码表
uchar ledStatus = 0; // 记录当前流水灯状态
uchar button1, button2; // 记录按键状态
void delay(uint t) // 延时函数
{
while (t--);
}
void displayLed() // 显示流水灯
{
P2 = LedCode[ledStatus]; // 显示当前状态对应的编码
}
void main()
{
while (1)
{
button1 = P1 & 0x01; // 读取按键1状态
button2 = P1 & 0x02; // 读取按键2状态
if (button1 && !button2) // 按键1按下
{
ledStatus++; // 流水灯向下移动一位
if (ledStatus > 7) ledStatus = 0; // 如果已经到最后一位,回到第一位
displayLed(); // 显示流水灯
delay(10000); // 延时一段时间,控制流水灯速度
}
else if (button2 && !button1) // 按键2按下
{
ledStatus--; // 流水灯向上移动一位
if (ledStatus < 0) ledStatus = 7; // 如果已经到第一位,回到最后一位
displayLed(); // 显示流水灯
delay(10000); // 延时一段时间,控制流水灯速度
}
else if (button1 && button2) // 两个按键同时按下
{
for (uchar i = 0; i < 8; i += 2) // 交替亮灯
{
ledStatus = i;
displayLed();
delay(10000);
ledStatus = i + 1;
displayLed();
delay(10000);
}
}
else // 两个按键都没按
{
for (uchar i = 0; i < 4; i++) // 中间向两边亮灯
{
ledStatus = 1 << i;
displayLed();
delay(10000);
}
for (uchar i = 2; i >= 0; i--)
{
ledStatus = 1 << i;
displayLed();
delay(10000);
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/nQxP 著作权归作者所有。请勿转载和采集!