
5只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
;用最直接的方式实现流水灯
ORG 0000H
START:MOV P1,#01111111B ;最下面的LED点亮
LCALL DELAY ;延时60秒
LCALL DELAY ;延时60秒
MOV P1,#10111111B ;最下面第二个的LED点亮
LCALL DELAY ;延时60秒
LCALL DELAY ;延时60秒
MOV P1,#11011111B ;最下面第三个的LED点亮 (以下省略)
LCALL DELAY
LCALL DELAY ;延时60秒
MOV P1,#11101111B
LCALL DELAY
LCALL DELAY ;延时60秒
MOV P1,#11110111B
LCALL DELAY
LCALL DELAY ;延时60秒
MOV P1,#11111011B
LCALL DELAY ;延时60秒
LCALL DELAY ;延时60秒
LCALL DELAY ;延时60秒
LCALL DELAY ;延时60秒
LCALL DELAY ;完成第一次循环点亮,延时约025秒
AJMP START ;反复循环
;延时子程序,12M晶振延时约250毫秒
DELAY: ;大约值:2us2562562=260ms,也可以认为为250ms
PUSH PSW ;现场保护指令(有时可以不加)
MOV R4,#240
L3: MOV R2 ,#00H
L1: MOV R3 ,#00H
L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2)
DJNZ R2 ,L1 ; 中层循环:256次
DJNZ R4 ,L3 ;外层循环:240次
POP PSW
RET
END
随便改了一个
#include<reg52h>
sbit LED1=P2^0;
//1ms延时程序
void delayms(unsigned int i)
{ unsigned int j;
while(i--)
{
for(j=0;j<115;j++)
;
}
}
void main()
{
LED1=0;
while(1)
{
delayms(1000);
LED1=~LED1;
};
}
假设P0口接LED,高电平点亮
#include
0;i--)
for(j=110j>0;j--)
for(k=125;k>0;k--);
}
void main()//主程序
{
while(1)
{
P0=0X01; delayms(500);
P0=0X04; delayms(500);
P0=0X10; delayms(500);
P0=0X40; delayms(500);
P0=0X80; delayms(500);
P0=0X20; delayms(500);
P0=0X08; delayms(500);
P0=0X02; delayms(500);
}
}
#include <reg51h>
#include<intrinsh>
#define uchar unsigned char
uchar j,temp;
void delay(unsigned int ms)
{
uchar t;
while(ms--)
for(t=0;t<123;t++);
}
void main()
{
P1=0xff;
delay(500);
temp=0xfe; //有点怪,led接在P23~P26
for(j=0;j<4;j++)
{
P1=temp;
delay(500);
temp=_crol_(temp,1);
}
P1=0xff;
while(1);
}
#include<reg52h>
#include <intrinsh>
void delayms(unsigned char ms) // 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
main()
{
unsigned char LED;
LED = 0xff;
P0 = LED;
while(1)
{
delayms(1000);
LED = LED<<1; //循环右移1位,点亮下一个LED
if(LED==0x00)
{
LED=0xff;
}
P0 = LED;
}
}
#include<reg51h>
#include<intrinsh>
#define
uchar
unsigned
char
sbit
button=P1^0;
uchar
press=0;
void
Delay(uchar
z)
{
uchar
x,y;
for(x=z;x>0;x--)
for(y=255;y>0;y--);
}
void
Led_Continue()
{
P2=0xfe;
while(press==0|press==2)
{
P2=_crol_(P2,1);
Delay(255);
}
}
void
Led_Stop()
{
P2=0xff;
}
void
Keyscan()
{
if(button==0)
{
Delay(20);
if(button==0)
{
press+=1;
if(press==1)
{
Led_Stop();
}
if(press==2)
{
press=0;
}
}
}
}
void
main()
{
while(1)
{
Keyscan();
Led_Continue();
}
}
试试这个,在mian中要一直去扫描,否则就扫描一次不能达到目的。
然后你问用中断怎么完成,告诉你中断更简单,定时器用作延时用,键盘只需要写当这个按键按下时
TRx=~TRx
就是每一次按下,定时器开关都和上一次状态不一样,这样每按一次都会停止、开始、停止、开始
希望我的回答能帮助到你。
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:
ORG 0000H ;复位启动
AJMP START ;
ORG 001BH ;T1中断
AJMP T1INT ;
;定义变量========================
YSJS EQU 30H;延时计数器
LED EQU 31H;LED控制缓冲器
;主程序==========================
START: MOV LED,#0FEH ;初始化数据
MOV YSJS,#0 ;
MOV TMOD,#10H ;定时器1工作于方式1,16位定时器
MOV TL1,#0B0H ;设置定时初值
MOV TH1,#3CH ;定时时间=50mS
SETB ET1 ;使能定时器1中断
SETB TR1 ;启动定时器1
SETB EA ;开总中断
MOV P1,LED ;初始化流水灯
LOOP: JMP LOOP ;循环等待中断
T1INT: PUSH PSW ;定时器1中断程序
PUSH ACC ;保护现场
MOV TH1,#3CH ;定时时间=50mS
MOV TL1,#0B0H ;
INC YSJS ;
PUSH ACC ;保护ACC
MOV A,YSJI ;
CJNE A,#2,QT1 ;50mS2=100mS
MOV P1,LED ;
MOV A,LED ;
RL A ;累加器A的值循环左移1位
MOV LED,A ;
MOV YSJS,#0 ;
QT1: POP ACC ;恢复现场
POP PSW ;
RETI ;返回主程序
END ;汇编程序结束
扩展资料:
实现流水灯的三个方法:
第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P10口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。
第三种,库函数实现流水灯。利用左移函数进行。
以上就是关于急!急!急!单片机流水灯汇编语言程序全部的内容,包括:急!急!急!单片机流水灯汇编语言程序、51单片机用keil4写LED流水灯程序,要求亮两秒,再过两秒又亮。假设LED1=P2^0。、单片机流水灯1357亮,然后2468亮,求程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)