最低位开始,逐位移入Cy 环
INC R2
;若上句条件不成立,即R3中移出的位=1, 则
JNC NEXT
;Cy=0,则不做任何操作,直接进入下个循
(R2)+1 →R2
NEXT: DJNZ R7, LOOP STOP: SJMP STOP
功能:统计R3中1的个数,并将统计结果送入R2。
START:
MOV 30H, #0
MOV R0, #50H
LOOP: MOV A, @R0
CJNE A, #0FFH, NEXT SJMP STOP
NEXT: INC 30H
INC R0 SJMP LOOP
STOP: SJMP STOP
功能:统计存放在内部数据存储器50H开始的数据块的长度(即数据块占多少个字节),数据块以0FFH为结束标志。
4-12 编一子程序,将一个非压缩8421BCD码(即单字节BCD码)转
29
换成七段显示码。设0~9的BCD码对应的七段显示码分别为3FH、06H、6BH、4FH、66H、6DH、7DH、07H、7FH、6FH。进子程序前,BCD码被放在累加器ACC中;子程序运行后,相应的七段码也放在ACC中。(即入口参数和出口参数均在ACC中)。 ;BCD码转换成显示码
;入口参数:子程序名CHSEG,单字节BCD码放在累加器ACC中 ;出口参数:七段显示码放在ACC中 CHSEG: ADD A, #1
;加上偏移量,偏移量为MOVC A, @A+PC指
令与数据表首间的字节数
MOVC A, @A+PC RET
;单字节指令
DB 3FH, 06H, 6BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;数据表一般紧跟着RET指令
有另一法,不需计算偏移量 CHSEG: ADD A, #SEGTB-SSG 偏移量
MOVC A, @A+PC
;用标号表达式,让编译程序计算
SSG: RET
SEGTB: DB 3FH, 06H, 6BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
4-13 编一子程序,将一个0~9的七段显示码转换成对应的格雷码。
30
0~9的格雷码请参阅本书表1-2。设进子程序前,七段显示码被放在内部数据存储器40H中;子程序运行后,相应的格雷码放在内部数据存储器50H中。(即入口参数为40H,出口参数为50H)。
算法一提示:根据0~9的序号依次查出对应的显示码,然后与40H中的内容比较,如果相等,则根据当前序号查表得到对应的格雷码。 ; 显示码转换成格雷码
;入口参数:子程序名CHGRY,七段显示码被放在内部数据存储器40H中,影响ACC,B,Cy位
;出口参数:格雷码放在内部数据存储器50H中 CHGRY: PUSH ACC
PUSH B PUSH PSW
;用B记录0~9的序号 ;
;保护现场
MOV B, #0
NEXT: MOV A, B
ADD A, #SEGTB-SSG
;用标号表达式,让编译程序计算偏移量 ;根据当前序号,查取对应的显示码 ;比较取得的显示码与源单元中的显
MOVC A, @A+PC
SSG: CJNE A, 40H, NEQ 示码
MOV A, B
;如果相等,则根据当前序号,查取对
应的格雷码
ADD A, #GRYTB-SGR MOVC A, @A+PC
31
SGR: MOV 50H, A POP POP POP
;将查取的格雷码送入目标单元
;恢复现场
PSW B ACC
RET ;返回
;如果不想等,则将序号增1,查取下个显
NEQ: INC 示码作比较
B
SJMP NEXT
SEGTB: DB 3FH, 06H, 6BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;显示码表
GRYTB: DB 00H, 01H, 03H, 02H, 04H, 05H, 07H, 06H, 08H, 09H ;格雷码表
算法二提示:直接将显示码转化成格雷码,程序烦了些,但方法很简单。
; 显示码转换成格雷码
;入口参数:子程序名CHGRY,七段显示码被放在内部数据存储器40H中,影响ACC,Cy位
;出口参数:格雷码放在内部数据存储器50H中 CHGRY: PUSH ACC
;保护现场
PUSH PSW MOV A, 40H
32
相关推荐: