# 實驗四:七段顯示器從 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>