感悟网 导航

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

作者&投稿:谢晴 (若有异议请与网页底部的电邮联系)
用汇编语言怎么编写跑马灯程序?~

跑马灯程序用汇编是很好实现的,只要用好循环移位指令就可以,以下是程序。
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH

LOOP:
MOV P1,A ;将控制字送端口

RL A ;控制字循环左移

LCALL DELAY ;延时

SJMP LOOP

DELAY: ;延时大概1秒
MOV R2,#10

DLY1:
MOV R3,#200
DLY2:
MOV R4,#250

DJNZ R4,$

DJNZ R3,DLY2

DJNZ R2,DLY1

RET

END

给个你参考
*******
/* 实验目的:初步了解单片机I/O口的工作原理,进一步掌握51单片机的汇编指令。
* 实验内容:用汇编指令对单片机I/O口进行编程,控制8个发光二极管的流水亮灭。
*/
/* 程序详细功能介绍:
*做单一灯的左移右移,八个发光二极管L0-L7分别接在单片机的P0.0-P0.7接口上,
*输出“0”时,发光二极管亮,开始时P0.0→P0.1→P0.2→P0.3→┅→P0.7→P0.6→┅→P0.0亮,重复循环。
*/
ORG 0000H
LJMP START
ORG 0030H
START:
MOV R2,#8 ;左移次数
MOV A,#0FEH ;A的初始值,即 P0.0的L0 点亮
SETB C
LOOP: MOV P0,A
LCALL DELAY
RLC A ;左移流水灯(带进位的左移),即亮点向P0口的高位移动
DJNZ R2,LOOP


MOV R2,#8 ;右移次数
LOOP1: RRC A ;右移流水灯
MOV P0,A
LCALL DELAY
DJNZ R2,LOOP1
LJMP START

DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END

查询方式:
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;
}

}

参考一下这里:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/7f5d2259de6fa78d810a18da.html

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5adeb99112822680a877a415.html

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/3aec3b946647c546d1135e97.html

   

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