一、原理總結 利用兩個寄存器R4和R5來存儲兩個數位管的顯示效果,R4是前一個數位管顯示所需,而R5是後一個數位管顯示所需,利用左移操作RLC來使之每一位被依次輸入到C中,然後將C輸入到LED中(當LED每位都有數據時,數位管才會顯示),利用停頓函數使數位管上數字停留一段時間。 二、程式分析 以下為 ...
一、原理總結
- 利用兩個寄存器R4和R5來存儲兩個數位管的顯示效果,R4是前一個數位管顯示所需,而R5是後一個數位管顯示所需,利用左移操作RLC來使之每一位被依次輸入到C中,然後將C輸入到LED中(當LED每位都有數據時,數位管才會顯示),利用停頓函數使數位管上數字停留一段時間。
二、程式分析
- 以下為全部代碼,之後會進行具體分析
總體代碼
;====================================================================
; Main.asm file generated by New Project wizard
;
; Created: 周一 九月 19 2022
; Processor: AT89C51
; Compiler: ASEM-51 (Proteus)
;====================================================================
$NOMOD51
$INCLUDE (8051.MCU)
;====================================================================
; DEFINITIONS
;====================================================================
;====================================================================
; VARIABLES
;====================================================================
;====================================================================
; RESET and INTERRUPT VECTORS
;====================================================================
; Reset Vector
org 0000h
jmp Start
;====================================================================
; CODE SEGMENT
;====================================================================
org 0100h
TAB : DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
PAUSE: ;停頓函數
MOV R1,#255 ;R1是第一層嵌套迴圈
D1: MOV R2,#255 ;R2是第二層嵌套迴圈
D2: DJNZ R2,D2 ;當R2不為0時跳轉,為0時不跳轉,執行DJNZ R1,D1使得R1- -
DJNZ R1,D1 ;當R1不為0時跳轉,為0時不跳轉
RET
LED:
MOV R0,#8 ;將8賦值給R0,8位左移
MOV A,R5 ;R5代表右邊的LED的數
MOVC A,@A+DPTR ;A是偏移地址,是從DPTR中定址
LOOP1:
RLC A ;A左移
CLR P1.4
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP1
MOV R0,#8
MOV A,R4
MOVC A,@A+DPTR
LOOP2:
RLC A
CLR P1.4
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP2
MOV R6,#0
S1: LCALL PAUSE
INC R6
CJNE R6,#10,S1
RET
START: MOV A,#00H
MOV p0,A
MOV DPTR,#TAB
MOV R4,#0
MOV R5,#0
A1: MOV C,P1.0
JC XUNHUAN
MOV C,9
JC FUWEI
INC R5
CJNE R5,#15,XUNHUAN
MOV R5,#0
INC R4
CJNE R4,#15,XUNHUAN
JMP FUWEI
XUNHUAN:
LCALL LED
JMP A1
FUWEI:
MOV R4,#0
MOV R5,#0
JMP A1
JMP START
;====================================================================
END
數組存值:
- TAB 是用來存儲0-15這16個數據,之後使用A來定址
TAB : DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
停頓函數:
- R1是第一層嵌套迴圈,R2是第二層嵌套迴圈,當R2不為0時跳轉,為0時不跳轉,執行DJNZ R1,D1使得R1- -,當R1不為0時跳轉,為0時不跳轉。
PAUSE: ;停頓函數
MOV R1,#255 ;R1是第一層嵌套迴圈
D1: MOV R2,#255 ;R2是第二層嵌套迴圈
D2: DJNZ R2,D2 ;當R2不為0時跳轉,為0時不跳轉,執行DJNZ R1,D1使得R1- -
DJNZ R1,D1 ;當R1不為0時跳轉,為0時不跳轉
RET
數位管亮燈函數
- LED中的內容:
- 將8賦值給R0,使用R0來實現8位右移
- 將R5賦值給A,而R5代表的是右邊的數位管,R5共八位,使用R0來使之每位被傳輸到數位管中。
- MOVC A,@A+DPTR 是將A在DPTR中定址,之後回賦值給A。
LED:
MOV R0,#8 ;將8賦值給R0,8位右移
MOV A,R5 ;R5代表右邊的LED的數
MOVC A,@A+DPTR ;A是偏移地址,是從DPTR中定址
- LOOP1中的內容:
-
- RLC 是帶進位的迴圈左移,RLC A 即將A的內容左移一位,將進位位C中的值移到累加器A的最低位,A的最高位移到C里。若有A=01000001,C=1,則執行 RLC的話:A=10000011,C=0(A的最高位移到C,C原值移到A最低位)。
- RL 是帶進位的迴圈左移,RL A 即將A的內容左移一位,將進位位C中的值移到累加器A的最低位,A的最高位不移到C里,若有A=01000001,C=1,則執行RL的話:A=10000010,C=1(A所有位左移一位,最低位補零,C不參加移位操作,保持原值不變)
- RLC之後三行是將數據放入數位管中的操作,不過多贅述
- DJNZ R0,LOOP0 是將 R0-- 過後看是否為0,若不為零則跳轉,若為0則執行下麵的操作
-
C=1,A=55H,RLC A後則為:C=0 A=ABH,即:1 01010101變為:0 10101011
LOOP1:
RLC A ;A左移
CLR P1.4 ;下麵三行是對LED進行輸入
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP1
MOV R0,#8
MOV A,R4
MOVC A,@A+DPTR
LED:
MOV R0,#8 ;將8賦值給R0,8位右移
MOV A,R5 ;R5代表右邊的LED的數
MOVC A,@A+DPTR ;A是偏移地址,是從DPTR中定址
LOOP1:
RLC A ;A左移
CLR P1.4 ;下麵三行是對LED進行輸入
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP1
MOV R0,#8
MOV A,R4
MOVC A,@A+DPTR
LOOP2:
RLC A
CLR P1.4
MOV P1.5,C
SETB P1.4
DJNZ R0,LOOP2
MOV R6,#0
S1: LCALL PAUSE
INC R6
CJNE R6,#10,S1
RET
START 部分:
- 首先對圖中上面的數位管進行歸0處理,然後 MOV DPTR,#TAB 將TAB這個數組的首地址給予DPTR,後續定址使用,將R4 與 R5 進行初始化,賦值為0,
- C中一開始存儲的是 p1.0 (其中存儲的是開關數值,為1的話進行累加,為0的話保持不變)如C為1則直接執MOV C,9,若C為0的話跳轉XUNHUAN,保持當前數字
- 之後C中存儲的是9號埠傳入的數據,9號段口控制複位(9號埠為1時執行之後指令,為0時執行FUWEI)
- 之後正式執行,R5從0開始累加,累加夠16使R4加一,當R5小於等於15時執行數位管顯示函數,大於15時執行R4++
START:
MOV A,#00H
MOV p0,A
MOV DPTR,#TAB
MOV R4,#0
MOV R5,#0
A1:
MOV C,P1.0
JC XUNHUAN
MOV C,9
JC FUWEI
INC R5
CJNE R5,#15,XUNHUAN
MOV R5,#0
INC R4
CJNE R4,#15,XUNHUAN
JMP FUWEI
XUNHUAN 和 FUWEI 部分:
- XUNHUAN 使用LED函數,亮數位管,之後跳轉A1中。
- FUWEI 給與R4與R5賦值為0,之後跳轉到A1中
XUNHUAN:
LCALL LED
JMP A1
FUWEI:
MOV R4,#0
MOV R5,#0
JMP A1