您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页实现8个LED流水灯汇编语言程

实现8个LED流水灯汇编语言程

来源:五一七教育网


START: MOV ACC,#0FEH ;ACC中先装入LED1亮的数据(二进制的11111110) MOV P1,ACC ;将ACC的数据送P1口

MOV R0,#7 ;将数据再移动7次就完成一个8位流水过程 LOOP: RL A ;将ACC中的数据左移一位 MOV P1,A ;把ACC移动过的数据送p1口显示 ACALL DELAY ;调用延时子程序 DJNZ R0,LOOP ;没有移动够7次继续移动

AJMP START ;移动完7次后跳到开始重来,以达到循环流动效果 ;----- 延时子程序 -----

DELAY: MOV D1: MOV DJNZ DJNZ RET END 1

R0,#255 R1,#255 R1,$ R0,D1

;延时一段时间 ;子程序返回 ;程序结束

START: CLR P1.0 ;P1.0输出低电平,使LED1点亮 ACALL DELAY ;调用延时子程序

SETB P1.0 ;P1.0输出高电平,使LED1熄灭 CLR P1.1 ;P1.1输出低电平,使LED2点亮 ACALL DELAY ;调用延时子程序

SETB P1.1 ;P1.1输出高电平,使LED2熄灭 CLR P1.2 ;P1.2输出低电平,使LED3点亮 ACALL DELAY ;调用延时子程序

SETB P1.2 ;P1.2输出高电平,使LED3熄灭 CLR P1.3 ACALL DELAY SETB P1.3 CLR P1.4 ACALL DELAY SETB P1.4 CLR P1.5 ACALL DELAY SETB P1.5 CLR P1.6 ACALL DELAY SETB P1.6 CLR P1.7 ACALL DELAY SETB P1.7 ACALL DELAY AJMP START ;----- 延时子程序 -----

DELAY: MOV R0,#255 D1: MOV R1,#255 DJNZ R1,$ DJNZ R0,D1

RET END 2

;P1.3输出低电平,使LED4点亮 ;调用延时子程序

;P1.3输出高电平,使LED4熄灭 ;P1.4输出低电平,使LED5点亮 ;调用延时子程序

;P1.4输出高电平,使LED5熄灭 ;P1.5输出低电平,使LED6点亮 ;调用延时子程序

;P1.5输出高电平,使LED6熄灭 ;P1.6输出低电平,使LED7点亮 ;调用延时子程序

;P1.6输出高电平,使LED7熄灭 ;P1.7输出低电平,使LED8点亮 ;调用延时子程序

;P1.7输出高电平,使LED8熄灭 ;调用延时子程序

;8个LED流了一遍后返回到标号START处再循环 ;延时一段时间 ;子程序返回 ;程序结束

ORG 0000H ;上电复位,程序从0000H开始执行 START: MOV SP,#60H ;堆栈初始化为60H

MOV DPTR,#LIU_TAB ;流水花样表首地址送DPTR LOOP: CLR A

MOVC A,@A+DPTR

CJNE A,#0FFH,SHOW ;检查流水结束标志

AJMP START ;所有花样流完,则从头开始重复流 SHOW: MOV P1,A ;将数据送到P1口 ACALL DELAY INC DPTR AJMP LOOP ;----- 延时子程序 -----

DELAY: MOV R0,#255 ;延时一段时间 D1: MOV R1,#255 DJNZ R1,$ DJNZ R0,D1

RET ;子程序返回

;----- 下面是流水花样数据表 ----- LIU_TAB:

DB 01111111B ;二进制表示的流水花样数据 DB 10111111B DB 11011111B DB 11101111B DB 11110111B DB 11111011B DB 11111101B DB 11111110B DB 11111110B DB 11111101B DB 11111011B DB 11110111B DB 11101111B DB 11011111B DB 10111111B DB 01111111B

DB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;十六进制表示 DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH DB 7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H

DB 0FFH ;流水花样结束标志0FFH

END ;程序结束

3

延时子程序,12M晶振延时约250毫秒

DELAY: MOV R4,#2

L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET

org 00h ;程序上电从00h开始

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main:

mov a,#0feh ;给A赋值成11111110

loop:

mov p1,a ;将A送到P1口,发光二极管低电平点亮

lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay:

mov r3,#20 ;最外层循环二十次 d1:

mov r4,#80 ;次外层循环八十次 d2:

mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S

djnz r4,d2 djnz r3,d1 ret end

4

如何精确计算延时子程序的执行时间?

汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要! ;延时子程序,12M晶振延时约253毫秒

DELAY:

MOV R4,#2------执行1个机器周期,耗时1微秒 L3: MOV R2 ,#250---执行1个机器周期,耗时1微秒 L1: MOV R3 ,#251---执行1个机器周期,耗时1微秒

L2: DJNZ R3 ,L2---执行2个机器周期,反复执行251次(2x251)=

502微秒)

DJNZ R2 ,L1-----执行2个机器周期,反复执行250次(1+502+

2)*250=126250微秒)

DJNZ R4 ,L3-----执行2个机器周期,反复执行2次

(1+1+502+126250+2)*2=253512微秒) RET

delay 加上第一条总共延时1+253512=253513微秒

5

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务