求写一个单片机控制LED灯程序

以AT89C51单片机为核心,设计一个按键控制LED灯的显示。配置4个按键,K1、K2按下时LED点亮,松开时熄灭;K3、K4按下并放开时LED点亮,再次按下并放开时熄灭。

我给你写个参考程序,看看程序符不符合你的要求,程序如下:
#include "REG52.H"

// LED灯端口定义
sbit GPIO_Exio1 = P0^0;
sbit GPIO_Exio2 = P0^1;
sbit GPIO_Exio3 = P0^2;
sbit GPIO_Exio4 = P0^3;

// 按键输入端口
sbit KEY1_Exitm = P1^0;
sbit KEY2_Exitm = P1^1;
sbit KEY3_Exitm = P1^2;
sbit KEY4_Exitm = P1^3;

/*
* 延时1ms
*/
void Delay_1ms(unsigned int Cnt)
{
unsigned int x, y;

for(x = Cnt; x > 0; x--)
for(y = 120; y > 0; y--);
}

/*
* 按键扫描子函数
*/
void KEY_ScanExtio(void)
{
// 判断K1 、K2其中一个按键按下
if((KEY1_Exitm == 0) || (KEY2_Exitm == 0))
{
Delay_1ms(5);
if((KEY1_Exitm == 0) || (KEY2_Exitm == 0))
{
// 按键按下点亮LED
GPIO_Exio1 = 0;
GPIO_Exio2 = 0;
GPIO_Exio3 = 0;
GPIO_Exio4 = 0;
}
while((KEY1_Exitm == 0) || (KEY2_Exitm == 0)); // 按键松手检测
// 按键松手后LED灭
GPIO_Exio1 = 1;
GPIO_Exio2 = 1;
GPIO_Exio3 = 1;
GPIO_Exio4 = 1;
}

// 判断K3 、K4其中一个按键按下
if((KEY3_Exitm == 0) || (KEY4_Exitm == 0))
{
Delay_1ms(5);
if((KEY3_Exitm == 0) || (KEY4_Exitm == 0))
{

}
while((KEY3_Exitm == 0) || (KEY4_Exitm == 0)); // 按键松手检测
// 按键松手后取反LED
GPIO_Exio1 = ~GPIO_Exio1;
GPIO_Exio2 = ~GPIO_Exio2;
GPIO_Exio3 = ~GPIO_Exio3;
GPIO_Exio4 = ~GPIO_Exio4;
}
}

/*
* 主函数
*/
int main(void)
{
// 初始化IO
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;

while(1)
{
KEY_ScanExtio();
}
}追问

单片机51和52有什么区别?我们是要求用51的,用KeilC51V9.00这个软件做课程设计的。这个可以运行吗?

追答

都文件定义51和52没有区别,运行是可以的,51和52单片机有啥区别,你可以下载数据手册看看不就知道了 吗,51单片机ROM,RAM都比52单片机小,中断也比52单片机少一个,别的都兼容。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-15
#include<reg51.h>
#define uchar unsigned char
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P1^2;
sbit led4=P1^3;
bit flag1,flag2;
main()
{
flag1=0;
flag2=0;
while(1)
{
led1=k1;
led2=k2;
if(k3==0)flag1=~flag1;
if(k4==0)flag2=~flag2;
if(flag1)led3=~led3;
if(flag2)led4=~led4;
}
}
相似回答