8051霹靂燈

大叔還是小文青的時候,覺得每本課本霹靂燈的程式碼大同小異,一點都不霹靂,突想奇想寫了 地球上最短 的超霹靂的程式碼

融合左右移跟查表,讓代碼變短,這個應該是是地球上最短了.減少約15%

題目: 讓P0,P1的8顆LED達到來回亮的效果.

;============================================
;
; P1 ,P2 2 Port 跑馬燈
;============================================
START:
	ORG 00H		      ;程式從0位址開始
	MOV A,#00000001B  ;讓ACC的內容為00000001
	MOV R0,#7FH  	   ;要把表建在RAM裡
 
ROTATE:
  	MOV @R0,A  	:把跑馬燈建在RAM裡 
	DEC R0     	;讓ACC的值分別放在R0,R1
	RLC A   	;讓ACC左旋
	JNC ROTATE
  
OUT3:  
	MOV R1,#80H                    
	MOV R2,#8	;遞減8次
	MOV R3,#8
OUT1:  
	INC  R0
	DEC  R1

OUT2:

	MOV  P1,@R0	;從Port 1,2輸出 RAM 的內容
	MOV  P2,@R1 
	CALL DELAY  	;延遲副程式  
	DJNZ R2,OUT1	;R0由70H掃描到7FH

	MOV R2,#1
	INC R1
	DEC R0
	DJNZ R3,OUT2

	JMP OUT3     ;R0到7F時,就從頭再一次
  
 ;===================================================   
 DELAY:                     ;延遲副程式
 	MOV  R5, #4 
 DL1:   MOV  R6, #250      ;R6暫存器載入250次數
 DL2:   MOV  R7, #250      ;R7暫存器載入250次數
        DJNZ R7, $         ;本列執行R7次
        DJNZ R6, DL2       ;DL2迴圈執行R6次
        DJNZ R5, DL1       ;DL1迴圈執行R5次
        
	RET                ;返回主程式
         
	END                ;結束程式

大部份教科書的寫如下

 	ORG 0H
 START:
 	MOV R0,#00000001B
 	MOV R1,#10000000B
 IIN:
	MOV A, R0
 	MOV P1,R0
  	RLC A
  	MOV R0,A
 
  	MOV A,R1
  	MOV P2,A
  	RRC A
  	MOV R1,A
   
  	CALL    DELAY
 
  	JNC IIN
	CLR C
  	MOV R0,#10000000B
  	MOV R1,#00000001B
 OUT:
  	MOV A, R0
  	MOV P1,R0
  	RRC A
  	MOV R0,A
 
  	MOV A,R1
  	MOV P2,A
  	RLC A
  	MOV R1,A
   
  	CALL    DELAY
 
 	JNC OUT
 
  	JMP START
 
DELAY:             		;延遲副程式
  	MOV  R5, #4 
 	DL1:    MOV  R6, #250	;R6暫存器載入250次數
 DL2:    
	MOV  R7, #250      	;R7暫存器載入250次數
         	DJNZ R7, $   	;本列執行R7次
         	DJNZ R6, DL2 	;DL2迴圈執行R6次
         	DJNZ R5, DL1	;DL1迴圈執行R5次
        	RET      	;返回主程式

	END

如果你覺得 把程式碼變很短 有意義,有些語言很鼓厲這樣做 ,可以google 一些一行代碼大賽,例如 wolfram One-Liner Competition

參考文章 http://faculty.stust.edu.tw/~wjshieh/


http://faculty.stust.edu.tw/~wjshieh/

發表留言