- 1、本文档共60页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 3.循环程序 在程序设计中,经常需要连续多次地重复执行某段程序,这时可以设计循环程序,这种结构有助于用简短的程序完成大量的处理任务。我们把这种按某一规律重复执行的程序称为循环程序。 循环程序的设计中一般包含有循环体设计、循环结束条件设置和循环初态设置3个内容。 循环程序的操作流程有先执行后判断和先判断后执2种结构。 例1:长度为10H的字符串存放在首地址为inbuf的内部RAM中,从inbuf地址开始将字符串向片外RAM的outbuf地址开始的存储单元传送,一直进行到遇见回车符(ODH)或整个字符串传送完毕。 * 实现程序如下: MOV R7, #10H ;置转送次数 MOV R0, #inbuf ;送字符串首地址 MOV DPTR, #outbuf ;送传送单元起始地址 LOOP: CJNE @R0, #ODH, NEXT ;不是回车符则转移 SJMP ED NEXT: MOV A, @R0 ;取字符 MOVX @DPTR, A ;送字符 INC R0 ;地址加1 INC DPTR ; DJNZ R7, LOOP ;未送完返回 ED: SJMP ﹩ * 例2:在外部RAM首地址为table的数据表中,有10个字节的数据,编程将每个字节的最高位无条件的置1。 实现程序如下: MOV DPTR,#table ;送数据表首地址 MOV R7,#OAH ;置处理次数 LOOP: MOVX A,@DPTR ;取数据 ORL A, ;最高位置1 MOVX @DPTR,A ;送回 INC DPTR ;地址加1 DJNZ R7,LOOP ;未处理完返回 SJMP ﹩ * 例3:把片内RAM中地址为30H到39H单元中的10个无符号数逐一比较,并按从小到大的顺序依次排列在这片单元中。 数据排序常用冒泡排序法。此题可从30H开始从前向后进行相邻两数的比较,若两数的大小次序与要求的顺序不符,则将两数的顺序互换,并置位标志位,否则就不互换,也不置位标志位。从头到尾进行1次相邻数比较并按要求调整两数的顺序后(进行1次冒泡),就会把最大的数换到最后,再进行1次这样的比较和调整,就会把次大的数排在倒数第2的位置。在多次比较和调整后中,若出现相邻两数从头到尾不再有互换的情况(互换标志始终为0),就说明从30H~29H单元中的数已经从小到大排列完毕。 * 实现程序如下: START:CLR 00H ;互换标志清0 MOV R7,#09H ;置循环控制初值 MOV R0,#30H ;地址指针置数据首地址 MOV A,@R0 ;取前一个数 LOOP: INC R0 ;地址指针加1,指向后一个数的存储单元 MOV R2,A ;暂存前一个数 SUBB A,@R0 ;前数减后数(比较相邻两数) MOV A,R2 ;前数送A JC NEXT ;若前数小于后数,转移 * SETB 00H ;若前数大于后数,互换标志位置1 XCH A,@R0 ;前数(大数)送后数的存储单元 DEC R0 ;地址指针减1,指向前一个数的存储单元 XCH A,@R0 ;后数(小数)送前数的存储单元,完成了相邻两数的互换 INC R0 ;地址指针加1,指回原后数的存储单元 NEXT: MOV A,@R0 ;取出大数 DJNZ R7,LOOP ;循环次数未到转移到LOOP,否则往下执行 JB 00H,START ;若有互换(标志位为1)则转 ; START,否则往下执行 SJMP ﹩ ;结束
文档评论(0)