Ⅰ 单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来
很酷的流水灯
#include <reg51.h>
typedef unsigned char uchar;
#define Ton 40
#define LED P0
sbit leds=P1^4;
sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit LED4 = P0^4;
sbit LED5 = P0^5;
sbit LED6 = P0^6;
sbit LED7 = P0^7;
unsigned char Maikuan=0;
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar Occupy_led; //占空比越大,灯越亮
bit light;
uchar m;
void Inittime()
{
TMOD = 0x02; //定时器0,工作方式2,自动重装
TH0 = 256-Ton;
TL0 = 256-Ton;
ET0 = 1;
EA = 1;
TR0 = 1;
}
//定时器0中断
void time0() interrupt 1 using 0
{
Maikuan++;
}
void main()
{
unsigned char i = 0,j = 0; //初始化i,j
leds=0;
Inittime();
while (1)
{
//第1,3,5,7个灯半亮,其余的全亮。
for(i=254; i>0; i--)
{
while ( Maikuan!=20)
{
LED = 0x00;
}
while ( Maikuan!=200)
{
LED = 0x55;
}
Maikuan = 0;
}
//最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。
for(j = 0;j<=7;j++)
{
i = 0;
while(i!=255) // 由暗变亮
{
if( Maikuan == 0) // 点亮
{
LED = ledon[j];
}
if(Maikuan == i) // 熄灭
{
LED = 0xff;
}
if( Maikuan== 255)
{
i++;
}
}
}
for(j=7;j>=0;j--)
{
i = 0;
while(i!=255) // 由亮变暗
{
if(Maikuan == 0) // 熄灭
{
LED = 0xff;
}
if( Maikuan == i) // 点亮
{
LED = ledon[j];
}
if( Maikuan == 255)
{
i++;
}
}
}
//所有的灯逐渐从暗到全亮,再由全亮到暗。
for (m=254; m>0; m--)
{
while (Maikuan!=Occupy_led)
{
LED = 0x00;
}
while (Maikuan!=127)
{
LED = 0xff;
}
Maikuan = 0;
if (light)
{
Occupy_led++;
}
else
{
Occupy_led--;
}
if (Occupy_led==128)
{
Occupy_led = 127;
light = !light;
}
if (Occupy_led>128)
{
Occupy_led = 0;
light = !light;
}
}
}
}
Ⅱ 单片机C语言编程:让8个LED流水灯以0.2s时间间隔从左到右依次点亮然后重复实现
#include<reg52.h>
#include<intrins.h>
void delay(unsigned int z );
void main()
{
unsigned int a;
unsigned char b=0xfe;
for(a=0;a<8;a++)
{
P1=b;//P1口接8个LED灯
delay(200);
b=_crol_ (b,1);
}
}
void delay(unsigned int z)
{
unsigned int i;
for(;z>0;z--) //延迟时间自己算吧
for(i=110;i>0;i--);
}
用汇编写这个容易点
main: mov a,#0feh
mov r0,#8
loop: mov p1,a
acall delay
rl a
djnz r0,loop
delay:mov r6,#0ffh
loop1: mov r7,#01h
djnz r7,$
djnz r6,loop1
ret
end
好像是这样,延迟时间可能不太准,也是P1口接8个LED灯
Ⅲ 单片机Keil问题
先回答你第一个问题:
DATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
第一条是将A中的内容放入R0所指的地址中,如果R0的数值比较大的话,用单步运行就需要很长时间。有个方法可以解决,即在KEIL调试时,修改R0里的数值,将它变成1或者01H,就可以出循环了。
第二个问题:
你的程序是实现P1循环→P3循环→P2循环→P0循环,然后又返回P1循环,连续往复。
你的程序,我用软件调试了,逻辑上没问题,能实现。
不过建议你用移位指令来完成。这样更简单。
回答完毕,谢谢。