一、流水灯原理
如下图所示,本实例中单片机的P1口分别与8只LED的负极相连(串联电阻防止电流过大损坏单片机),LED灯正极共接,当P1口依次输出低电平,LED灯依次被点亮,达到流水灯的效果。
二、流水灯实现代码
1.原理法
LED1_PIN EQU P1.0
LED2_PIN EQU P1.1
LED3_PIN EQU P1.2
LED4_PIN EQU P1.3
LED5_PIN EQU P1.4
LED6_PIN EQU P1.5
LED7_PIN EQU P1.6
LED8_PIN EQU P1.7
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
SETB LED8_PIN
CLR LED1_PIN
LCALL DELAY
SETB LED1_PIN
CLR LED2_PIN
LCALL DELAY
SETB LED2_PIN
CLR LED3_PIN
LCALL DELAY
SETB LED3_PIN
CLR LED4_PIN
LCALL DELAY
SETB LED4_PIN
CLR LED5_PIN
LCALL DELAY
SETB LED5_PIN
CLR LED6_PIN
LCALL DELAY
SETB LED6_PIN
CLR LED7_PIN
LCALL DELAY
SETB LED7_PIN
CLR LED8_PIN
LCALL DELAY
AJMP MAIN
DELAY:
MOV R7,#10H
DELAY0:
MOV R6,#7FH
DELAY1:
MOV R5,#7FH
DJNZ R5,$
DJNZ R6,DELAY1
DJNZ R7,DELAY0
RET
END
2.移位法
可采用循环左移法或循环右移法来实现流水灯效果,指令如下:
指令名称 | 助记符 | 说明 |
---|---|---|
循环左移 | RL A | A中内容左移一位,位7移入位0 |
带进位循环左移 | RLC A | A中内容和进位标志位Cy一起左移,位7移入Cy,Cy位移入位0 |
循环右移 | RR A | A中内容右移一位,位0移入位7 |
带进位循环右移 | RRC A | A中内容和进位标志位Cy一起右移,位0移入Cy,Cy位移入位7 |
(1)移位法实现代码
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV R0,#08H
MOV A,#0EFH
LOOP:
RL A
MOV P1,A
LCALL DELAY
DJNZ R0,LOOP
SJMP MAIN
DELAY:
MOV R7,#10H
DELAY0:
MOV R6,#7FH
DELAY1:
MOV R5,#7FH
DJNZ R5,$
DJNZ R6,DELAY1
DJNZ R7,DELAY0
RET
END
(2)实用技巧
·同样的运行结果,使用合适的指令可以大大减少代码量,节省程序空间。
·循环移位指令的应用——乘除法运算:左移1次=无符号数乘⒉运算,右移1次=有符号数除2运算。
3.查表法
ORG 0000H
MAIN:
MOV DPTR,#LED_TABLE
MOV R1,#42
LOOP:
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
DJNZ R1,LOOP
SJMP MAIN
DELAY:
MOV R7,#10H
DELAY0:
MOV R6,#7FH
DELAY1:
MOV R5,#7FH
DJNZ R5,$
DJNZ R6,DELAY1
DJNZ R7,DELAY0
RET
LED_TABLE:
DB 0FFH
DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H
DB 080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH
DB 07EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,07EH
DB 07EH,03CH,018H,000H,000H,018H,03CH,07EH
DB 000H
END