之後從60H單元開始找最大值的位置,然後從40H開始找到出現次數最多的數據,送到A及P1。
程序已經經過了驗證,符合要求,如下:
ORG 0000H
MOV 20H, #12H ;準備數據.
MOV 21H, #23H
MOV 22H, #32H
MOV 23H, #32H
MOV 24H, #32H
MOV 25H, #43H
MOV 26H, #32H
MOV 27H, #56H
MOV 28H, #56H
MOV 29H, #35H
;-------------------------------------------------
MOV R0, #20H ;未知數據起始地址.
MOV R1, #40H ;篩選後的數據起始地址.
MOV 7FH, #1 ;現篩選出來1個數據: 00H
MOV 7EH, 7FH
INC 7EH
MOV R7, #10 ;***有10個未知數據,(最多可以有32個)
BBB:
MOV A, @R0 ;取出未知數據.
MOV R1, #40H ;從頭和已篩選出的比較.
WWW:
MOV B, @R1
CJNE A, B, CCC ;不同就比較下壹個.
RRR:
MOV A, R1 ;相同則個數加壹.
ADD A, #20H
MOV R1, A
INC @R1
INC R0 ;轉到下壹個未知數據.
MOV 7EH, 7FH
INC 7EH
DJNZ R7, BBB
SJMP EEE ;查找數據結束
;-----------------------------------------------------
CCC:
INC R1
DJNZ 7EH, WWW ;按照已知數據的個數循環.
;-----------------------------------------------------
MOV A, #40H ;沒有找到,那就存入這個數據.
ADD A, 7FH
MOV R1, A ;計算出新數據應該存放的地址.
MOV A, @R0
MOV @R1, A ;存放.
INC 7FH ;已知數據個數加壹.
MOV 7EH, 7FH
INC 7EH
SJMP RRR
;-----------------------------------------------------
EEE: ;從篩選後的個數中找最多數據的地址.
MOV 7EH, #0
MOV R0, #60H
YYY:
MOV A, @R0
CJNE A, 7EH, $+3
JC TTT
MOV 7EH, A
MOV B, R0
TTT:
INC R0
DJNZ 7FH, YYY
;-----------------------------------------------------
MOV A, B ;根據地址,再找到數據.
CLR C
SUBB A, #20H
MOV R0, A
MOV A, @R0
MOV P1, A ;輸出到P1
SJMP $
END
------------------------------------------------------
它們是51單片機片內RAM的最後兩個單元。
對篩選出來的數據,需要統計個數,進行循環處理,還需要控制循環次數,7FH 7EH,就擔任了這個任務。
用Rn也可,但是涉及互相傳送的時候,不方便;7FH 7EH,基本是空閑的,可以利用。