求个89c51单片机 汇编语言设计的LED跑马灯的程序
8个LED灯轮流点亮,点亮间隔为1秒。定时方法采用8051定时器,分别使用查询和中断编写两个程序。P1作输出端口,接LED灯。一定要用汇编语言的...
8个LED灯轮流点亮,点亮间隔为1秒。
定时方法采用8051定时器,分别使用查询和中断编写两个程序。
P1作输出端口,接LED灯。
一定要用汇编语言的 展开
定时方法采用8051定时器,分别使用查询和中断编写两个程序。
P1作输出端口,接LED灯。
一定要用汇编语言的 展开
3个回答
展开全部
查询方式:
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(时间此处可自行设置)
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(时间此处可自行设置)
展开全部
我只有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;
}
}
#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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询