---
# System prepended metadata

title: 七段顯示器從 0 數到 9
tags: ['8051']

---

# 實驗四：七段顯示器從 0 數到 9（循環）  

**其他筆記連結：**
* [單晶片系統實驗器材準備](https://hackmd.io/@zjewp/8051)
* [X8051 組譯器使用說明](https://hackmd.io/@zjewp/x8051_assemble)
* [ALL-100 燒錄器使用教學](https://hackmd.io/@zjewp/all-100)

## Circuit diagram
![7-seg_diagram](https://hackmd.io/_uploads/BJE3pZ0CT.jpg)

## 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>