MCS-51单片机汇编程序,很有挑战性!哪位大侠,能否解释一下,越详尽越好!谢谢。

ORG 0160H
FIND: MOV SP,#60H
MOV R0,#10H
MOV R1,#00H
MOV DPTR,#7000H
FIND1: MOVX A,@DPTR
CJNE A,#00H,FIND2
INC R1
FIND2: INC DPTR
DJNZ R0,FIND1
MOV A,R1
MOV R0,#79H
ANL A,#0FH
MOV @R0,A
INC R0
MOV A,R1
SWAP A
ANL A,#0FH
MOV @R0,A
INC R0
MOV A,#10H
MOV R4,#04H
FIND3: MOV @R0,A
INC R0
DJNZ R4,FIND3
FIND4: LCALL DISP
SJMP FIND4
DISP: SETB 0D4H
MOV R1,#7EH
MOV R2,#20H
MOV R3,#00H
DISP1: MOV DPTR,#0FF21H
MOV A,R2
MOVX @DPTR,A
MOV DPTR,#DATA1
MOV A,@R1
MOVC A,@A+DPTR
MOV DPTR,#0FF22H
MOVX @DPTR,A
DISP2: DJNZ R3,DISP2
DEC R1
CLR C
MOV A,R2
RRC A
MOV R2,A
JNZ DISP1
MOV A,#0FFH
MOV DPTR,#0FF22H
MOVX @DPTR,A
CLR 0D4H
RET
DATA1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
END
这个程序的程序流程图怎么画啊?谢谢

ORG 0160H
FIND: MOV SP,#60H ;保护工作寄存器
MOV R0,#10H
MOV R1,#00H
MOV DPTR,#7000H ;给R0,R1,DPTR赋初值
;初始化
FIND1: MOVX A,@DPTR ;读外部RAM/IO口
CJNE A,#00H,FIND2 ;A与0相等(即A为0),则转移到FIND2
INC R1 ;R1=R1+1
FIND2: INC DPTR ;DPTR=DPTR+1
DJNZ R0,FIND1 ;如果R0-1不为0则转移到FIND1
MOV A,R1 ;(R1)->(A)
MOV R0,#79H ;79H->(R0)
ANL A,#0FH ;A与0FH,将高4位清零,保留低4位
MOV @R0,A ;(A)->((R0))
;上面四行的功能:将r1的第四位取出来存放在79H中
INC R0 ;R0加1
MOV A,R1 ;(R1)->(A)
SWAP A ;A的高低半字节交换
ANL A,#0FH ;A与0FH,清零高4位,保留低4位
MOV @R0,A ;(A)->((R0)
;上面五行的功能:将R1的高四位取出来存放在80H中
INC R0 ;R0加1
MOV A,#10H ;10H->A
MOV R4,#04H ;04H->R4
;为子程序FIND3初始化
FIND3: MOV @R0,A ;(A)->((R0))
INC R0 ;R0加1
DJNZ R4,FIND3 ;如果R4-1不等于0,则转移到FIND3
;子程序FIND3的功能:在从(R0)开始的四个字节中分别存放10H。
FIND4: LCALL DISP ;调用DISP
SJMP FIND4
;子程序FIND4的功能:永无休止的调用DISP
;这个指令好像是错的.SJMP 的语法是
;SJMP rel
;目标地址=PC+2+rel
;rel是相对偏移量
;
;可以改为AJMP FIND4或者LJMP FIND4.
DISP: SETB 0D4H ;置位0D4H
MOV R1,#7EH
MOV R2,#20H
MOV R3,#00H ;给R1,R2,R3赋值
;上面四行的功能:为子程序DISP初始化
DISP1: MOV DPTR,#0FF21H ;给DPTR赋值
MOV A,R2 ;(R2)->A,保护A中的内容
MOVX @DPTR,A ;(A)->((DPTR)),写外部RAM/IO
MOV DPTR,#DATA1 ;#DATA1->DPTR
MOV A,@R1 ;((R0))->A,间接寻址
MOVC A,@A+DPTR ;MOVC是查表指令
;上面这三行的功能是查表
MOV DPTR,#0FF22H ;#0FF22H->DPTR
MOVX @DPTR,A ;(A)->((DPTR)),写外部RAM
DISP2: DJNZ R3,DISP2 ;R3-1不等于0,则转移到DISP2,等待R3-1等于0
DEC R1 ;R1减一
;R1用作循环变量
CLR C ;清零进位标志位C
;借助循环右移清零最高位,与下面的判断语句JNZ一起限制了循环次数最多为7次
MOV A,R2 ;(R2)->A
RRC A ;经过进位位的累加器循环右移一位
MOV R2,A ;(A)->R2
;上面这四行的功能:将R2中的值取出,带进位循环右移,在存进R2
JNZ DISP1 ;累加器A非零则转移到DISP1
MOV A,#0FFH ;0FFH->A
MOV DPTR,#0FF22H ;0FF2H->DPTR
MOVX @DPTR,A ;(A)->((DPTR))
CLR 0D4H ;清零字节地址是0D4H
RET ;子程序返回
DATA1: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
;上面就是表格
END ;伪指令END是汇编语言源程序的结束标志

参考资料:《单片机原理及应用》 张毅刚主编 高等教育出版社

温馨提示:内容为网友见解,仅供参考
第1个回答  2008-11-02
很长时间没用过汇编了,不过还是祝你好运本回答被提问者采纳
第2个回答  2008-11-04
楼下的这位 caogos 能不能解释一下这段程序所实现的功能啊
光对语句解释了还不知道什么意思
第3个回答  2008-11-02
太长了,没有耐心看下去!呵呵!祝你好运!

关于单片机延时子程序流程图的问题
是关于51单片机和AD0809转化器的延时子程序两个子程序是一个程序里面的(高手应给能看出来),请高手们帮个忙,先谢谢了~延时子程序DELAY1: PUSH 05H MOV R5,#10HDELAY2: LCALL DISP1 DJNZ R5,DELAY2 POP 05H延时子程序_2DELAY12: PUSH 06H PUSH 05H MOV R6,#4DELAY21: MOV R5,#225DELAY31: DJNZ R5,...

MCS-51用keil编程时,常出现"...0 error(s),2Warning(s)",但程序能走...
你可以买一本电子工业出版社出的由徐爱均、彭秀华编著的《单片机高级语言C51应用程序设计》,书上对错误、警告都有中文解释。该书也可作为常备手册用,经典。另外,编译能通过,看似程序正常运行,但可能是是假象,尤其是牵涉到指针、数组、结构的警告一定要小心,最好不要忽略,...

学习单片机要有哪些基础知识?
例如,在Intel公司的MCS-51系列单片机中,从存贮器中取出一数到CPU中的累加器(在运算器中,参与运算、存放运算结果的专用寄存器)的指令代码为74H,累加器内容加立即数的代码为24H,再加上立即数代码,累加器送数到内部RAM存贮器的代码为F6H~F7H等。这些指令是用十六进制表示二进制的机器码。 MCS-51单片机的字长为8...

单片机延时子程序
1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度, 51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行 一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。 2 .指令周期是指单片机执行一条...

相似回答