求个89c51单片机 汇编语言设计的LED跑马灯的程序

8个LED灯轮流点亮,点亮间隔为1秒。
定时方法采用8051定时器,分别使用查询和中断编写两个程序。
P1作输出端口,接LED灯。
一定要用汇编语言的

查询方式:
ORG 0000H
AJMP MAIN
MAIN:
MOV P1,#01H
MOV R0,#8
MOV A,P1
XU: RL A
MOV P1,A
ACALL DELAY
DJNZ R0,XU
AJMP MAIN

DELAY:
MOV R0,#0FFH
ONE:MOV R1,#0FFH
TWO:MOV R2,#02H
THE:DJNZ R2,THE
DJNZ R1,TWO
DJNZ R0,ONE(将近1S)
RET
END
中断方式:
org 0000h ;程序从0000开始运行
jmp init;跳到主程序
init:
mov ie,#10000001b ;中断使能
mov ip,#00000001b ;中断优先
mov tcon,#0000000b ;中断为电平触发
main: ;主程序循环点亮
mov p1,#00h ;全亮
lcall delay ;延时一段时间
mov a,#0feh ;每次只亮一个灯。
loop: mov p1,a ;输出到p1
lcall delay ; 延时
rl a ;循环左移。
ajmp loop ; 跳转main继续循环

delay: mov r5,#20 ;延时子程序1闪烁灯调用
d1:mov r6,#20
d2: mov r7,#250
djnz r7,$
djnz r6,d2
djnz r5,d1(时间此处可自行设置)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-10
我只有C语言编写的,你可以借鉴下!
#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

sbit DAT164 =P2^5;
sbit CLK164 =P2^4;
sbit b0=P0^0;
sbit b1=P0^1;

uchar sec,sec1,sec2,LED,a;

uchar code LEDMAP[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E
};//定义显示数组

void delay(uchar z)//延时子程序
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void send164(void) //往164中送数据
{
uchar data j;
for (j = 0; j < 8; j++)
{
if (LED & 0x80)
DAT164 = 1;
else DAT164 = 0;
CLK164 = 1;
CLK164 = 0;
LED <<= 1;
}
}

void init(void)//程序初始化
{
TMOD=0x01;
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
IE=0x82;
TR0=1;
sec=0;
sec1=0;
sec2=0;
a=0;
}

void display(void)//显示子程序
{

LED=LEDMAP[sec2];//十位显示
send164();
b0=0;
delay(5);
b0=1;

LED=LEDMAP[sec1];//个位显示
send164();
b1=0;
delay(5);
b1=1;
}

void main(void)//主程序
{
init();
while(1)
display();

}

void time() interrupt 1 using 3//定时10毫秒
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
a++;
if(a==10)//如果到100毫秒
{
a=0;
sec++;//分加
sec1=sec%10;//送给秒个位
sec2=sec/10;//送给秒十位
if(sec==99)//如过到99则为0
sec=0;
}

}
相似回答