大叔還是小文青的時候,覺得每本課本霹靂燈的程式碼大同小異,一點都不霹靂,突想奇想寫了 地球上最短 的超霹靂的程式碼
融合左右移跟查表,讓代碼變短,這個應該是是地球上最短了.減少約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/