其实不用关EA,你把CLR ea也删去就可以运行。只要你的手没有中断服务程序快就会有中断。每次按都有。你试一下在开发板上运行,应该可以的。
原因是当你外中断置低电平时,就会进入中断程序。运行完就会自动返回主程序
而你的主程序是SJMP $死循环,就是用来等待中断的。所以不用重新中断初始化。
程序从20H开始查找数据,把首次出现的数据存放到40H开始的单元,并在60H开始的单元,存放该数据的个数,如果数据是重复出现的,就将其个数加一。之后从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,基本是空闲的,可以利用。
MCS-51汇编语言源程序设计中,下列符号中不能用作标号的有()。
A.LOOP
B.MOV
C.LD1
D.ADD1
正确答案:MOV
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)