《实现8个led流水灯汇编语言程》由会员分享,可在线阅读,更多相关《实现8个led流水灯汇编语言程(5页珍藏版)》请在金锄头文库上搜索。
1、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 R0,#255 ;延时一段时间D1: M
2、OV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束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 熄灭CL
3、R P1.3 ;P1.3 输出低电平,使 LED4 点亮ACALL DELAY ;调用延时子程序SETB P1.3 ;P1.3 输出高电平,使 LED4 熄灭CLR P1.4 ;P1.4 输出低电平,使 LED5 点亮ACALL DELAY ;调用延时子程序SETB P1.4 ;P1.4 输出高电平,使 LED5 熄灭CLR P1.5 ;P1.5 输出低电平,使 LED6 点亮ACALL DELAY ;调用延时子程序SETB P1.5 ;P1.5 输出高电平,使 LED6 熄灭CLR P1.6 ;P1.6 输出低电平,使 LED7 点亮ACALL DELAY ;调用延时子程序SETB P1.6
4、 ;P1.6 输出高电平,使 LED7 熄灭CLR P1.7 ;P1.7 输出低电平,使 LED8 点亮ACALL DELAY ;调用延时子程序SETB P1.7 ;P1.7 输出高电平,使 LED8 熄灭ACALL DELAY ;调用延时子程序AJMP START ;8 个 LED 流了一遍后返回到标号 START 处再循环;- 延时子程序 -DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束ORG 0000H ;上电复位,程序从 0000H 开始执行START: MOV SP,#60
5、H ;堆栈初始化为 60HMOV DPTR,#LIU_TAB ;流水花样表首地址送 DPTRLOOP: CLR AMOVC A,A+DPTRCJNE A,#0FFH,SHOW ;检查流水结束标志AJMP START ;所有花样流完,则从头开始重复流SHOW: MOV P1,A ;将数据送到 P1 口ACALL DELAYINC DPTRAJMP LOOP;- 延时子程序 -DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回;- 下面是流水花样数据表 -LIU_TAB: DB 01111111B ;二进制表
6、示的流水花样数据DB 10111111BDB 11011111BDB 11101111BDB 11110111BDB 11111011BDB 11111101BDB 11111110BDB 11111110BDB 11111101BDB 11111011BDB 11110111BDB 11101111BDB 11011111BDB 10111111BDB 01111111BDB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;十六进制表示DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FHDB 7EH,0BDH,0DBH,0E7H,
7、0E7H,0DBH,0BDH,7EHDB 7FH,3FH,1FH,0FH,07H,03H,01H,00HDB 0FFH ;流水花样结束标志 0FFHEND ;程序结束延时子程序,12M 晶振延时约 250 毫秒DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RETorg 00h ;程序上电从 00h 开始ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main:mov a,#0feh ;给 A 赋值成 11111110loop: mov
8、 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.8Sdjnz r4,d2djnz r3,d1retend如何精确计算延时子程序的执行时间?汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要!;延时子程序,1
9、2M 晶振延时约 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 次(15022)*250126250 微秒)DJNZ R4 ,L3执行 2 个机器周期,反复执行 2 次 (1+1+502+126250+2)*2253512 微秒)RETdelay 加上第一条总共延时 1+253512=253513 微秒