生成51单片机c语言六路抢答器的代码
时间: 2023-08-12 07:19:54 浏览: 140
好的,以下是一个基于51单片机的六路抢答器的代码:
```c
#include <reg51.h>
// 定义按键端口和LED端口
sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
sbit key4 = P0^3;
sbit key5 = P0^4;
sbit key6 = P0^5;
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
// 定义变量
unsigned char flag = 0;
unsigned char press = 0;
unsigned char count = 0;
unsigned char temp = 0;
// 延时函数
void delay(unsigned int i)
{
unsigned int j,k;
for (j = i; j > 0; j--)
for (k = 110; k > 0; k--);
}
// 处理按键函数
void keyscan()
{
if (key1 == 0) {
flag = 1;
press = 1;
}
if (key2 == 0) {
flag = 2;
press = 1;
}
if (key3 == 0) {
flag = 3;
press = 1;
}
if (key4 == 0) {
flag = 4;
press = 1;
}
if (key5 == 0) {
flag = 5;
press = 1;
}
if (key6 == 0) {
flag = 6;
press = 1;
}
}
// 主函数
void main()
{
while (1) {
keyscan(); // 处理按键
if (press) { // 如果按键按下
delay(10); // 延时去抖
if (flag == temp) { // 如果是同一个按键
count++; // 计数器加一
if (count > 6) { // 如果计数器大于六
count = 1; // 重置计数器
}
}
else { // 如果不是同一个按键
count = 1; // 重置计数器
}
temp = flag; // 记录当前按键
press = 0; // 清除按键标志
}
// 根据计数器点亮相应的LED
if (count == 1) {
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
}
else if (count == 2) {
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
}
else if (count == 3) {
led1 = 0;
led2 = 0;
led3 = 1;
led4 = 0;
led5 = 0;
led6 = 0;
}
else if (count == 4) {
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 1;
led5 = 0;
led6 = 0;
}
else if (count == 5) {
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 1;
led6 = 0;
}
else if (count == 6) {
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 1;
}
}
}
```
这段代码实现了六路抢答器的功能,按下任意一个按键,会点亮相应的LED,并计数器加一,当计数器大于六时会自动重置为一。
阅读全文