您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 实现8个LED流水灯汇编语言程
START:MOVACC,#0FEH;ACC中先装入LED1亮的数据(二进制的11111110)MOVP1,ACC;将ACC的数据送P1口MOVR0,#7;将数据再移动7次就完成一个8位流水过程LOOP:RLA;将ACC中的数据左移一位MOVP1,A;把ACC移动过的数据送p1口显示ACALLDELAY;调用延时子程序DJNZR0,LOOP;没有移动够7次继续移动AJMPSTART;移动完7次后跳到开始重来,以达到循环流动效果;-----延时子程序-----DELAY:MOVR0,#255;延时一段时间D1:MOVR1,#255DJNZR1,$DJNZR0,D1RET;子程序返回END;程序结束START:CLRP1.0;P1.0输出低电平,使LED1点亮ACALLDELAY;调用延时子程序SETBP1.0;P1.0输出高电平,使LED1熄灭CLRP1.1;P1.1输出低电平,使LED2点亮ACALLDELAY;调用延时子程序SETBP1.1;P1.1输出高电平,使LED2熄灭CLRP1.2;P1.2输出低电平,使LED3点亮ACALLDELAY;调用延时子程序SETBP1.2;P1.2输出高电平,使LED3熄灭CLRP1.3;P1.3输出低电平,使LED4点亮ACALLDELAY;调用延时子程序SETBP1.3;P1.3输出高电平,使LED4熄灭CLRP1.4;P1.4输出低电平,使LED5点亮ACALLDELAY;调用延时子程序SETBP1.4;P1.4输出高电平,使LED5熄灭CLRP1.5;P1.5输出低电平,使LED6点亮ACALLDELAY;调用延时子程序SETBP1.5;P1.5输出高电平,使LED6熄灭CLRP1.6;P1.6输出低电平,使LED7点亮ACALLDELAY;调用延时子程序SETBP1.6;P1.6输出高电平,使LED7熄灭CLRP1.7;P1.7输出低电平,使LED8点亮ACALLDELAY;调用延时子程序SETBP1.7;P1.7输出高电平,使LED8熄灭ACALLDELAY;调用延时子程序AJMPSTART;8个LED流了一遍后返回到标号START处再循环;-----延时子程序-----DELAY:MOVR0,#255;延时一段时间D1:MOVR1,#255DJNZR1,$DJNZR0,D1RET;子程序返回END;程序结束ORG0000H;上电复位,程序从0000H开始执行START:MOVSP,#60H;堆栈初始化为60HMOVDPTR,#LIU_TAB;流水花样表首地址送DPTRLOOP:CLRAMOVCA,@A+DPTRCJNEA,#0FFH,SHOW;检查流水结束标志AJMPSTART;所有花样流完,则从头开始重复流SHOW:MOVP1,A;将数据送到P1口ACALLDELAYINCDPTRAJMPLOOP;-----延时子程序-----DELAY:MOVR0,#255;延时一段时间D1:MOVR1,#255DJNZR1,$DJNZR0,D1RET;子程序返回;-----下面是流水花样数据表-----LIU_TAB:DB01111111B;二进制表示的流水花样数据DB10111111BDB11011111BDB11101111BDB11110111BDB11111011BDB11111101BDB11111110BDB11111110BDB11111101BDB11111011BDB11110111BDB11101111BDB11011111BDB10111111BDB01111111BDB7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH;十六进制表示DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FHDB7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EHDB7FH,3FH,1FH,0FH,07H,03H,01H,00HDB0FFH;流水花样结束标志0FFHEND;程序结束延时子程序,12M晶振延时约250毫秒DELAY:MOVR4,#2L3:MOVR2,#250L1:MOVR3,#250L2:DJNZR3,L2DJNZR2,L1DJNZR4,L3RETorg00h;程序上电从00h开始ajmpmain;跳转到主程序org0030h;主程序起始地址main:mova,#0feh;给A赋值成11111110loop:movp1,a;将A送到P1口,发光二极管低电平点亮lcalldelay;调用延时子程序rla;累加器A循环左移一位ajmploop;重新送P1显示delay:movr3,#20;最外层循环二十次d1:movr4,#80;次外层循环八十次d2:movr5,#250;最内层循环250次djnzr5,$;总共延时2us*250*80*20=0.8Sdjnzr4,d2djnzr3,d1retend如何精确计算延时子程序的执行时间?汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要!;延时子程序,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微秒)RETdelay加上第一条总共延时1+253512=253513微秒
本文标题:实现8个LED流水灯汇编语言程
链接地址:https://www.777doc.com/doc-4246395 .html