- 51單片機應用開發(fā)從入門到精通(“十二五”國家重點圖書出版規(guī)劃項目)
- 張華杰編著
- 948字
- 2019-01-02 09:17:13
2.2 跑馬燈實例
在上一節(jié)點亮1只LED的基礎上,讓我們來看看如何控制多只LED實現(xiàn)跑馬燈效果。
2.2.1 硬件電路圖
本實例中,硬件電路和上一節(jié)的硬件電路相似,為了實現(xiàn)跑馬燈,本實例電路連接了8只LED,原理電路圖如圖2-2所示。

圖2-2 跑馬燈原理電路圖
2.2.2 軟件程序設計
控制多只LED實現(xiàn)跑馬燈效果可以有多種實現(xiàn)方式,下面給出其中兩種,請對比這兩種實現(xiàn)方式的優(yōu)劣。
1.程序全貌
首先,使用上節(jié)學習的直接尋址位置1指令SETB bit和直接尋址位清0指令CLR bit控制P1口實現(xiàn)跑馬燈效果,以下為程序實例。
;----------------------------------- ; 跑馬燈實例 ;功能:循環(huán)輪流點亮8只發(fā)光管LED ;----------------------------------- 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 ;偽指令,指定程序從0000H開始存放 LJMP MAIN ;跳轉指令,程序跳轉到MAIN處 ORG 0100H ;偽指令,指定以下程序從0100H開始存放 MAIN: MOV SP,#60H ;給堆棧指針賦初值 MOV P1,#0FFH ;給P1賦初值,LED全滅 (1) LIGHT: CLR LED1_PIN ;清零P1.0,LED1亮 (2) LCALL DELAY ;調延時子程序 (3) SETB LED1_PIN ;置一P1.0,LED1滅 (4) CLR LED2_PIN ;清零P1.1,LED2亮 (5) LCALL DELAY ;調延時子程序 (6) SETB LED2_PIN ;置一P1.1,LED2滅 (7) CLR LED3_PIN ;清零P1.2,LED3亮 (8) LCALL DELAY ;調延時子程序 (9) SETB LED3_PIN ;置一P1.2,LED3滅 (10) CLR LED4_PIN ;清零P1.3,LED4亮 (11) LCALL DELAY ;調延時子程序 (12) SETB LED4_PIN ;置一P1.3,LED4滅 (13) CLR LED5_PIN ;清零P1.4,LED5亮 (14) LCALL DELAY ;調延時子程序 (15) SETB LED5_PIN ;置一P1.4,LED5滅 (16) CLR LED6_PIN ;清零P1.5,LED6亮 (17) LCALL DELAY ;調延時子程序 (18) SETB LED6_PIN ;置一P1.5,LED6滅 (19) CLR LED7_PIN ;清零P1.6,LED7亮 (20) LCALL DELAY ;調延時子程序 (21) SETB LED7_PIN ;置一P1.6,LED7滅 (22) CLR LED8_PIN ;清零P1.7,LED8亮 (23) LCALL DELAY ;調延時子程序 (24) SETB LED8_PIN ;置一P1.7,LED8滅 (25) AJMP LIGHT ;跳轉,程序繼續(xù) (26) ;延時子程序 DELAY: MOV R7,#10H DELAY0: MOV R6,#7FH DELAY1: MOV R5,#7FH DJNZ R5,$ DJNZ R6,DELAY1 DJNZ R7,DELAY0 RET END
本實例也可使用循環(huán)左移指令和循環(huán)右移指令來實現(xiàn)跑馬燈效果,循環(huán)左移指令和循環(huán)右移指令的功能見表2-6。
表2-6 循環(huán)左移指令和循環(huán)右移指令

(1)~(26)程序替換為如下程序,運行結果不變。
LIGHT: MOV R0,#08H ;給R0賦初值08H,循環(huán)右移8次 MOV A,#0FEH ;給A賦初值0FEH,即11111110 LOOP: RR A ;右移1位 MOV P1,A ;輸出顯示 LCALL DELAY ;調延時子程序 DJNZ R0,LOOP ;循環(huán)右移8次 SJMP LIGHT ;跳轉,程序繼續(xù)
2.運行結果
該實例的運行結果為8只LED循環(huán)輪流點亮。
2.2.3 技巧總結
本實例技巧總結如下:
● 同樣的運行結果,使用合適的指令可以大大減少代碼量,節(jié)省程序空間。
● 循環(huán)移位指令的應用——乘除法運算:左移1 次 = 無符號數(shù)乘2 運算,右移1次 = 有符號數(shù)除2運算。