# 實驗四:七段顯示器從 0 數到 9(循環)
**其他筆記連結:**
* [單晶片系統實驗器材準備](https://hackmd.io/@zjewp/8051)
* [X8051 組譯器使用說明](https://hackmd.io/@zjewp/x8051_assemble)
* [ALL-100 燒錄器使用教學](https://hackmd.io/@zjewp/all-100)
## Circuit diagram

## Code
[**按此下載 DOSBox 及 X8051 組譯器**](https://drive.google.com/file/d/1b5MDGoPibUyy07Vs922sZ6UPoWJzFAOj/view?usp=sharing)
**使用方式參閱** [**X8051 組譯器使用說明**](https://hackmd.io/@zjewp/x8051_assemble)
```=
ORG 0
CLEAR: MOV R0, #0 ; 歸零
DIGI0: MOV A, R0
ACALL FONT ; 將 A 的內容轉換為對應數字的七段顯示器編碼
MOV P1, A ; 將該七段顯示器編碼輸出到 Port 1
INC R0
ACALL DELAY ; 延遲一秒鐘
CJNE R0, #10, DIGI0 ; if(R0 != 10) jump to DIGI0
AJMP CLEAR ; R0 == 10 時歸零
DELAY: MOV R5, #50
S1: MOV R6, #50
S2: MOV R7, #200
DJNZ R7, $
DJNZ R6, S2
DJNZ R5, S1
RET
; FONT 這個 routine 會將 A 暫存器內的數字轉換為七段顯示器的格式
; 當 A 為 0 時,A 會被轉換為 0x3F
; 將 0x3F 輸出到 port1 即會在七段顯示器上顯示數字 0
FONT: INC A
MOVC A, @A+PC
RET
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
; 依序分別為 0, 1, 2, 3, 4 ,5 ,6, 7, 8, 9
END
```
## Another version
```=
ORG 0
CLEAR: MOV R0, #0 ; 歸零
DIGI0: ACALL DISPLAY ; "DISPLAY" 會將 R0 的數字輸出到七段顯示器
INC R0
ACALL DELAY ; 延遲一秒鐘
CJNE R0, #10, DIGI0 ; if(R0 != 10) jump to DIGI0
AJMP CLEAR ; R0 == 10 時歸零
DELAY: MOV R5, #50
S1: MOV R6, #50
S2: MOV R7, #200
DJNZ R7, $
DJNZ R6, S2
DJNZ R5, S1
RET
DISPLAY:MOV A, R0
ADD A, #2
MOVC A, @A+PC
MOV P1, A
RET
DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
; 依序分別為 0, 1, 2, 3, 4 ,5 ,6, 7, 8, 9
END
```
---
<div style="position:relative; width:100%; height:0px; padding-bottom:56.250%"><iframe allow="fullscreen" allowfullscreen height="100%" src="https://streamable.com/e/g68t4x?muted=1" width="100%" style="border:none; width:100%; height:100%; position:absolute; left:0px; top:0px; overflow:hidden;"></iframe></div>