请基于AT89C51设计5个按键实现对8个LED的控制并利用数码管显示按下的按键号5个按键对应的功能为:1号键:此键按下对应所有的灯都熄灭;2号键:此键按下LED1----LED8流动点亮;3号键:此键按下LED1----LED8依次点亮;4号键:此键按下LED1、LED3、LED5、LED7和LED2、LED4、LED6、LED8轮流点亮。5号键:此键按下LED1——LED8闪烁。
以下是基于AT89C51的5个按键实现对8个LED的控制的程序:
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
sbit KEY5 = P3^4;
sbit D1 = P2^0;
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
void delay(unsigned int time) //延时函数
{
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 125; j++);
}
void display(int num) //数码管显示函数
{
switch(num)
{
case 1:
D1 = 1;
D2 = 0;
D3 = 0;
D4 = 0;
break;
case 2:
D1 = 0;
D2 = 1;
D3 = 0;
D4 = 0;
break;
case 3:
D1 = 0;
D2 = 0;
D3 = 1;
D4 = 0;
break;
case 4:
D1 = 0;
D2 = 0;
D3 = 0;
D4 = 1;
break;
}
}
void main()
{
int keynum = 0;
int flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0; //标志位
while(1)
{
if(KEY1 == 0) //1号键按下
{
flag1 = 1;
flag2 = 0;
flag3 = 0;
flag4 = 0;
flag5 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
keynum = 1;
}
if(KEY2 == 0) //2号键按下
{
flag1 = 0;
flag2 = 1;
flag3 = 0;
flag4 = 0;
flag5 = 0;
for(int i = 0; i < 8; i++)
{
LED1 = 1;
delay(100);
LED2 = 1;
delay(100);
LED3 = 1;
delay(100);
LED4 = 1;
delay(100);
LED5 = 1;
delay(100);
LED6 = 1;
delay(100);
LED7 = 1;
delay(100);
LED8 = 1;
delay(100);
}
keynum = 2;
}
if(KEY3 == 0) //3号键按下
{
flag1 = 0;
flag2 = 0;
flag3 = 1;
flag4 = 0;
flag5 = 0;
LED1 = 1;
delay(100);
LED2 = 1;
delay(100);
LED3 = 1;
delay(100);
LED4 = 1;
delay(100);
LED5 = 1;
delay(100);
LED6 = 1;
delay(100);
LED7 = 1;
delay(100);
LED8 = 1;
delay(100);
LED1 = 0;
delay(100);
LED2 = 0;
delay(100);
LED3 = 0;
delay(100);
LED4 = 0;
delay(100);
LED5 = 0;
delay(100);
LED6 = 0;
delay(100);
LED7 = 0;
delay(100);
LED8 = 0;
keynum = 3;
}
if(KEY4 == 0) //4号键按下
{
flag1 = 0;
flag2 = 0;
flag3 = 0;
flag4 = 1;
flag5 = 0;
for(int i = 0; i < 8; i++)
{
if(i % 2 == 0) //偶数个LED点亮
{
LED1 = 1;
LED3 = 1;
LED5 = 1;
LED7 = 1;
LED2 = 0;
LED4 = 0;
LED6 = 0;
LED8 = 0;
}
else //奇数个LED点亮
{
LED1 = 0;
LED3 = 0;
LED5 = 0;
LED7 = 0;
LED2 = 1;
LED4 = 1;
LED6 = 1;
LED8 = 1;
}
delay(100);
}
keynum = 4;
}
if(KEY5 == 0) //5号键按下
{
flag1 = 0;
flag2 = 0;
flag3 = 0;
flag4 = 0;
flag5 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
delay(500);
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
delay(500);
keynum = 5;
}
if(flag1 == 1)
display(1);
if(flag2 == 1)
display(2);
if(flag3 == 1)
display(3);
if(flag4 == 1)
display(4);
if(flag5 == 1)
display(5);
}
}
其中,sbit定义了LED和按键的引脚,delay函数实现了延时,display函数实现了数码管的显示。在主函数中,通过不断检测按键的状态,实现了对8个LED的控制和数码管的显示。不同的按键对应不同的功能,flag1~flag5是标志位,用于记录当前按下的是哪个按键。当flag1~flag5中有一个为1时,数码管会显示对应的按键号
原文地址: https://www.cveoy.top/t/topic/hucH 著作权归作者所有。请勿转载和采集!