我想知道这个单片机花样流水灯正确的的C语言程序,你能发给我吗?

一、设计要求
单片机的p2口上接有8只发光LED组成的花样流水灯。输入引脚p3.3接有一只按键开关K。K未按下时,单片机利用p2口的输出,控制花样灯左右循环流水点亮;K按下时,控制发光二极管交替点亮;当K松开时,花样灯恢复至左右循环流水点亮。
二、原理说明
编程考虑:在正常情况下,通过设给寄存器A初值,利用寻移指令和延迟环节,使8个LED灯呈现正反向循环流水点亮。当按下开关,是外部中断请求1引脚呈低电平,触发外部中断1,在中断处理程序中将寄存器A赋值0xaa,再通过环移指令和延时环节,使LED灯交替点亮,松开开关后,跳出外部中断处理,恢复先前的正反向循环流水点亮。
下面是仿真图,求大神帮我
上图有点乱,,不好意思。这个图比较好点

#include<reg51.h>
#define uchar unsigned char
sbit key=P3^3;
uchar led=0x01;
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
while(1)
{
while(key==0)
{
P2=0x55;
delay(100);
P2=0xaa;
delay(100);
}

while(key==1)
{
P2=led;
led=led<<1;
if(led=0x00)led=0x01;
delay(100);
}

}

}追问

K键断开的时候led没有任何反应。

该怎么修改一下程序呢?

追答

#include
#define uchar unsigned char
sbit key=P3^3;
uchar led=0x01;
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
while(1)
{
while(key==0)
{
P2=0x55;
delay(100);
P2=0xaa;
delay(100);
}
while(key==1)
{
P2=led;
led=led<<1;
if(led==0x00)led=0x01; //这里有点错,改了。
delay(100);
}

}

}

追问

虽然K按下时,控制发光二极管交替点亮;但是当K断开时,花样灯左右循环流水点亮没有实现,只是从p2.0到p2.7一直这样循环点亮。没有p2.0到p2.7依次点亮,然后p2.7到p2.0依次点亮这样 左 右 循环的效果。请您再帮我改一下下 可以不?25积分必定给你

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-06-09
用低电平来驱动 LED 发光,才合理。
相似回答