实现8个LED流水灯汇编语言程.docx
《实现8个LED流水灯汇编语言程.docx》由会员分享,可在线阅读,更多相关《实现8个LED流水灯汇编语言程.docx(3页珍藏版)》请在冰豆网上搜索。
实现8个LED流水灯汇编语言程
START:
MOV ACC,#0FEH ;ACC中先装入LED1亮的数据(二进制的) 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 R0,#255 ;延时一段时间D1:
MOV R1,#255 DJNZ R1,$ DJNZ R0,D1 RET ;子程序返回
END ;程序终止
START:
CLR ;输出低电平,使LED1点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED1熄灭 CLR ;输出低电平,使LED2点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED2熄灭 CLR ;输出低电平,使LED3点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED3熄灭 CLR ;输出低电平,使LED4点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED4熄灭 CLR ;输出低电平,使LED5点亮 ACALL DELAY ;调用延时子程序 SETB
;输出高电平,使LED5熄灭 CLR ;输出低电平,使LED6点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED6熄灭 CLR ;输出低电平,使LED7点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED7熄灭 CLR ;输出低电平,使LED8点亮 ACALL DELAY ;调用延时子程序 SETB ;输出高电平,使LED8熄灭 ACALL DELAY ;调用延时子程序 AJMP START ;8个LED流了一遍后返回到标号START处再循环
;-----延时子程序-----DELAY:
MOV R0,#255 ;延时一段时间D1:
MOV R1,#255 DJNZ R1,$ DJNZ R0,D1 RET ;子程序返回
END ;程序终止
ORG 0000H ;上电复位,程序从0000H开始执行START:
MOV SP,#60H ;堆栈初始化为60H MOV DPTR,#LIU_TAB ;流水花样表首地址送DPTRLOOP:
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:
DB01111111B
;二进制表示的流水花腔数据 DBB DBB DBB DBB DBB DBB DBB DBB DBB DBB DBB DBB DBB DBB DB01111111B DB7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH;十六进制表示 DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH DB7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH DB7FH,3FH,1FH,0FH,07H,03H,01H,00H DB0FFH ;流水花样结束标志0FFH END ;程序结束
延时子程序,12M晶振延时约250毫秒DELAY:
MOVR4,#2L3:
MOVR2,#250L1:
MOVR3,#250L2:
DJNZR3,L2DJNZR2,L1DJNZR4,L3RET
org00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:
mova,#0feh ;给A赋值成loop:
mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcalldelay ;挪用延时子程序 rla ;累加器A循环左移一名 ajmp loop ;从头送P1显示
delay:
movr3,#20 ;最外层循环二十次d1:
movr4,#80 ;次外层循环八十次d2:
movr5,#250 ;最内层循环250次 djnzr5,$ ;总共延时2us*250*80*20= djnzr4,d2 djnzr3,d1 ret end
如何精准计算延时子程序的执行时刻?
汇编语言的一大优势确实是能够精准操纵程序的执行时刻,这在编写一些对时序要求严格的外围器件驱动时由为重要!
;延时子程序,12M晶振延时约253毫秒DELAY:
MOVR4,#2------执行1个机械周期,耗时1微秒L3:
MOVR2,#250---执行1个机械周期,耗时1微秒L1:
MOVR3,#251---执行1个机械周期,耗时1微秒L2:
DJNZR3,L2---执行2个机械周期,反复执行251次(2x251)=502微秒)DJNZR2,L1-----执行2个机械周期,反复执行250次(1+502
+2)*250=126250微秒)DJNZR4,L3-----执行2个机械周期,反复执行2次(1+1+502+126250+2)*2=253512微秒)
RET
delay加上第一条总共延时1+253512=253513微秒