感悟网 导航

各位单片机达人帮个忙 用汇编语言做一个 发光二极管循环点亮的程序 要求 使八只发光二极管做循环点亮一次 1、P1 口做输出口,接八只发光二极管,编写程序,使发光二极...

作者&投稿:狂永 (若有异议请与网页底部的电邮联系)
跪求单片机c51用汇编语言写的程序,功能为:8只发光二极管依次点亮,从左向右移动,时间间隔0.5秒。~

MAIN: MOV P1, #11111110B ; P1 口 点亮一个发光二极管
ACALL DELAY ; 调用延时子程序
MOV P1, #11111101B ; 从左向右移动 一位
ACALL DELAY
MOV P1, #11111011B
ACALL DELAY
MOV P1, #11110111B
ACALL DELAY
MOV P1, #11101111B
ACALL DELAY
MOV P1, #11011111B
ACALL DELAY
MOV P1, #10111111B
ACALL DELAY
MOV P1, #01111111B
ACALL DELAY
JMP MAIN ; 转移 至 MAIN 循环
DELAY: MOV R5,#250 ; 延时子程序 6.000 M 晶振 约 0.5 秒
D1: MOV R6,#250
D2: DJNZ R6,$
DJNZ R5,D1
RET

#include
#define LED P1 //宏定义,使用LED代替P1口(相当于LED=P1)
#define uchar unsigned char //用uchar代替unsigned char方便操作
#define uint unsigned int
/*------------------time ms延时函数-----------------*/
void delay_ms(uint time)
{
uchar tres;
for(;time>0;time--)
{
tres=150;
while(tres--);
}
}
void main()
{
uchar t;
LED=0X01;//P1=00000001B
while(1)//死循环,不停的点亮和熄灭LED
{
for(t=0;t<8;t++)
{
LED=~LED;//按位取反,点亮一个LED
delay_ms(100);//延时0.1s
LED=~LED;//按位取反
LED<<=1;//左移一位,点亮不同的LED
}
LED=0X80;//P1=10000000B
for(t=0;t<8;t++)
{
LED=~LED;//按位取反,点亮一个LED
delay_ms(100);//延时0.1s
LED=~LED;//按位取反
LED>>=1;//右移一位,点亮不同的LED
}
LED=0X01;//P1=00000001B
}
}

ORG 00H
JMP MAIN
ORG 30H
MAIN: MOV A,#0FFH ;设置左移初值
CLR C ;C=0
MOV R2,#08H ;设置左移次数
LOOP: RLC A ;左移1位
MOV P1,A ;输出到P1
CALL DELAY ;延时
DJNZ R2,LOOP ;左移7次
MOV R2,#07H ;
LOOP1: RRC A ;右移1位
MOV P1,A ;输出到P1
CALL DELAY ;
DJNZ R2,LOOP1 ;右移7次
JMP MAIN
DELAY: MOV R3,#20 ;延时0.2s
D1: MOV R4,#20
D2: MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
END

发光二极管循环点亮

八只发光二极管左循环点亮一次、然后右循环点亮一次。

循环。

仿真试验成功。



;
;
; LED单灯跑动

ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
MOV R0,#9 ;循环九次,8个灯亮及1次灯全灭
START:
MOV P0,A ;输出到P0口连接的 LED灯上
SETB C ;置进位C
RLC A ;带进位左移
CALL DELAY ;延时一段时间
DJNZ R0,START ;反复循环
AJMP MAIN ;重新开始

;延时子程序
DELAY:
MOV R1,#15
D1: MOV R2,#100
D2: MOV R3,#100
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET

END
自己改改吧,不会的话,再说。

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网