微机程序设计2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、分支程序设计
例1:
;****************************************
;* 已知内部RAM 30H和31H单元中各有一个无 *
;* 符号数,比较它们的大小,大数送到MAX *
;* (32H)单元 *
;****************************************
MAX EQU 32H
org 0000H
ljmp start
org 0100H
start: mov a, 30H
cjne a, 31H, big
sjmp store
big: jnc store ;(30H)>(31H)
mov a, 31H ;(30H)<(31H)
store: mov MAX, a
sjmp $
end
例2
;*****************************************
;* 128种分支转移程序 *
;* 功能:根据入口条件转移到128个目的地址 *
;* 入口:(r3)=转移目的地址的序号00H~7FH *
;* 出口:转移到相应子程序入口 *
;*****************************************
JMP_128: mov a, r3
rl a
mov dptr, #JMPTAB
jmp @a+dptr
JMPTAB: ajmp rout00
ajmp rout01
…………
ajmp rout7F
rout00:。。。
rout01:。。。
例3
;*********************************
;* 设变量x存放在VAR单元中,函数 *
;* 值y存放在FUNC中,按下式给y赋 *
;* 值;y=1 x>0; y=0 x=0; y=-1 x<0 *
;*********************************
VAR EQU 30H
FUNC EQU 31H
org 0000H
ljmp START
org 0100H
START: mov a, VAR ;取x
jz comp ;为零转COMP
jnb acc.7, POSI ;x>0转POSI
mov a, #0FFH ;x<0,-1->A
sjmp COMP
POSI: mov a, #01H
COMP: mov FUNC, a
sjmp $
end
二、循环程序设计
例4
;************************************** ;* 将内部RAM 30H~32H单元内容左移一位 * ;************************************** ;不用循环方式
org 0000H
ljmp start
org 0100H
start: clr c
mov a, 32H
rlc a
mov 32H, a
mov a, 31H
rlc a
mov 31H, a
mov a, 30H
rlc a
mov 30H, a
sjmp $
end
;循环方式
。
。
mov r0,#32h
mov r7,#03h ;赋初值
clr c
loop:mov a,@r0 ;
rlc a ;循环工作部分
mov @r0,a ;
dec r0
djnz r7,loop ;循环变量修改,终止判别
sjmp $
end
例5
;*****************************************
;* 找出内部RAM 20H开始连续10个单元中无符 *
;* 号数的最小值存于内部RAM 1FH单元中 *
;*****************************************
org 0000H
ljmp start
org 0100H
start: mov r0, #20H
mov r7, #9
mov 1FH, @r0
inc r0
loop: mov a, @r0
cjne a, 1FH, neq
neq: jnc next ; a >= 1FH 转移比较下一个,否则记录小值 mov 1FH, a
next: inc r0
djnz r7, loop
sjmp $
end
例6
;*************************************
;* 将外部RAM 1000H开始的20个单元中的 *
;* ASCII码0~9十个数据传送到内部RAM *
;* 40H开始的区域中,其它数据不传递, *
;* 0~9的ASCII码为 30H~39H *
;*************************************
org 0000H
ljmp start
org 0100H
start: mov dptr, #1000H
mov r0, #40H
mov r7, #20
loop: movx a, @dptr
cjne a, #3aH, neq ; 不等转移
sjmp next ; 相等比较下一个
neq: jnc next ; 大于比较下一个
cjne a,#30H,neq1
neq1: jc next ;大于等于则保存,否则比较下一个 mov @r0, a
inc r0
next: inc dptr
djnz r7, loop
sjmp $
end
例7
;*****************************
;* 内存从21H开始有一字串, *
;* 该字串以$结束,试统计该字 *
;* 串长度,结果存与NUM单元中 *
;*****************************
NUM EQU 20H
org 0000H
ljmp start
org 0100H
start: clr a ;计数器设初值
mov r0, #21H ;置地址指针
loop: cjne @r0, #24H, next
sjmp comp ;找到转comp
next: inc a ;字符计数器增1
inc r0 ;修改地址指针
sjmp loop