首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MCS-C51定点运算子程序及其使用说明(6)

MCS-C51定点运算子程序及其使用说明(6)

(28) 标号:FDD1 功能:对分查找(ROM)单字节无符号增序数据表格







入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。

出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。

影响资源:PSW、A、B、R2、R3、R4 堆栈需求: 2字节

FDD1: MOV B,A ;保存待查找的内容

MOV R2,#0 ;区间低端指针初始化(指向第一个数据)

MOV A,R7

DEC A

MOV R3,A ;区间高端指针初始化(指向最后一个数据)

FD61: CLR C ;判断区间大小

MOV A,R3

SUBB A,R2

JC FD69 ;区间消失,查找失败

RRC A ;取区间大小的一半

ADD A,R2 ;加上区间的低端

MOV R4,A ;得到区间的中心

MOVC A,@A+DPTR;读取该点的内容

CJNE A,B,FD65;与待查找的内容比较

CLR OV ;相同,查找成功

MOV A,R4 ;取顺序号

RET

FD65: JC FD68 ;该点的内容比待查找的内容大否?

MOV A,R4 ;偏大,取该点位置

DEC A ;减一

MOV R3,A ;作为新的区间高端

SJMP FD61 ;继续查找

FD68: MOV A,R4 ;偏小,取该点位置

INC A ;加一

MOV R2,A ;作为新的区间低端

SJMP FD61 ;继续查找

FD69: SETB OV ;查找失败

RET





(29) 标号:FDD2 功能:对分查找(ROM)双字节无符号增序数据表格




入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据个数在R7中。

出口信息:OV=0 时顺序号在累加器A中,址在DPTR中;OV=1 时未找到。

影响资源:PSW、A、B、R1~R7、DPTR 堆栈需求: 2字节

FDD2: MOV R2,#0 ;区间低端指针初始化(指向第一个数据)

MOV A,R7

DEC A

MOV R3,A ;区间高端指针初始化,指向最后一个数据

MOV R6,DPH ;保存表格首址

MOV R7,DPL

FD81: CLR C ;判断区间大小

MOV A,R3

SUBB A,R2

JC FD89 ;区间消失,查找失败

RRC A ;取区间大小的一半

ADD A,R2 ;加上区间的低端

MOV R1,A ;得到区间的中心

MOV DPH,R6

CLR C ;计算区间中心的地址

RLC A

JNC FD82

INC DPH

FD82: ADD A,R7

MOV DPL,A

JNC FD83

INC DPH

FD83: CLR A ;读取该点的内容的高字节

MOVC A,@A+DPTR

MOV B,R4 ;与待查找内容的高字节比较

CJNE A,B,FD84;不相同

MOV A,#1 ;读取该点的内容的低字节

MOVC A,@A+DPTR

MOV B,R5

CJNE A,B,FD84;与待查找内容的低字节比较

MOV A,R1 ;取顺序号

CLR OV ;查找成功

RET

FD84: JC FD86 ;该点的内容比待查找的内容大否?

MOV A,R1 ;偏大,取该点位置

DEC A ;减一

MOV R3,A ;作为新的区间高端

SJMP FD81 ;继续查找

FD86: MOV A,R1 ;偏小,取该点位置

INC A ;加一

MOV R2,A ;作为新的区间低端

SJMP FD81 ;继续查找

FD89: MOV DPH,R6 ;相同,恢复首址

MOV DPL,R7

SETB OV ;查找失败

RET





(30) 标号: DDM1 功能:求单字节十六进制无符号数据块的平均值







入口条件:数据块的首址在DPTR中,数据个数在R7中。

出口信息:平均值在累加器A中。

影响资源:PSW、A、R2~R6 堆栈需求: 4字节

DDM1: MOV A,R7 ;保存数据个数

MOV R2,A

PUSH DPH

PUSH DPL

CLR A ;初始化累加和

MOV R4,A

MOV R5,A

DM11: MOVX A,@DPTR ;读取一个数据

ADD A,R5 ;累加到累加和中

MOV R5,A

JNC DM12

INC R4

DM12: INC DPTR ;调整指针

DJNZ R2,DM11 ;累加完全部数据

LCALL D457 ;求平均值(R4R5/R7-→R3)

MOV A,R3 ;取平均值

POP DPL

POP DPH

RET





(31) 标号: DDM2 功能:求双字节十六进制无符号数据块的平均值




入口条件:数据块的首址在DPTR中,双字节数据总个数在R7中。

出口信息:平均值在R4、R5中。

影响资源:PSW、A、R2~R6 堆栈需求: 4字节

DDM2: MOV A,R7 ;保存数据个数

MOV R2,A ;初始化数据指针

PUSH DPL ;保持首址

PUSH DPH

CLR A ;初始化累加和

MOV R3,A

MOV R4,A

MOV R5,A

DM20: MOVX A,@DPTR ;读取一个数据的高字节

MOV B,A

INC DPTR

MOVX A,@DPTR ;读取一个数据的低字节

INC DPTR

ADD A,R5 ;累加到累加和中

MOV R5,A

MOV A,B

ADDC A,R4

MOV R4,A

JNC DM21

INC R3

DM21: DJNZ R2,DM20 ;累加完全部数据

POP DPH ;恢复首址

POP DPL

LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值





(32) 标号: XR1 功能:求单字节数据块的(异或)校验和




入口条件:数据块的首址在DPTR中,数据的个数在R6、R7中。

出口信息:校验和在累加器A中。

影响资源:PSW、A、B、R4~R7 堆栈需求: 2字节

XR1: MOV R4,DPH ;保存数据块的首址

MOV R5,DPL

MOV A,R7 ;双字节计数器调整

JZ XR10

INC R6

XR10: MOV B,#0 ;校验和初始化

XR11: MOVX A,@DPTR ;读取一个数据

XRL B,A ;异或运算

INC DPTR ;指向下一个数据

DJNZ R7,XR11 ;双字节计数器减一

DJNZ R6,XR11

MOV DPH,R4 ;恢复数据首址

MOV DPL,R5

MOV A,B ;取校验和

RET





(33) 标号: XR2 功能:求双字节数据块的(异或)校验和




入口条件:数据块的首址在DPTR中,双字节数据总个数在R6、R7中。

出口信息:校验和在R2、R3中。

影响资源:PSW、A、R2~R7 堆栈需求: 2字节

XR2: MOV R4,DPH ;保存数据块的首址

MOV R5,DPL

MOV A,R7 ;双字节计数器调整

JZ XR20

INC R6

XR20: CLR A ;校验和初始化

MOV R2,A

MOV R3,A

XR21: MOVX A,@DPTR ;读取一个数据的高字节

XRL A,R2 ;异或运算

MOV R2,A

INC DPTR

MOVX A,@DPTR ;读取一个数据的低字节

XRL A,R3 ;异或运算

MOV R3,A

INC DPTR ;指向下一个数据

DJNZ R7,XR21 ;双字节计数器减一

DJNZ R6,XR21

MOV DPH,R4 ;恢复数据首址

MOV DPL,R5

RET





(34) 标号: SORT 功能:单字节无符号数据块排序(增序)




入口条件:数据块的首址在R0中,字节数在R7中。

出口信息:完成排序(增序)

影响资源:PSW、A、R2~R6 堆栈需求: 2字节

SORT: MOV A,R7

MOV R5,A ;比较次数初始化

SRT1: CLR F0 ;交换标志初始化

MOV A,R5 ;取上遍比较次数

DEC A ;本遍比上遍减少一次

MOV R5,A ;保存本遍次数

MOV R2,A ;复制到计数器中

JZ SRT5 ;若为零,排序结束

MOV A,R0 ;保存数据指针

MOV R6,A

SRT2: MOV A,@R0 ;读取一个数据

MOV R3,A

INC R0 ;指向下一个数据

MOV A,@R0 ;再读取一个数据

MOV R4,A

CLR C

SUBB A,R3 ;比较两个数据的大小

JNC SRT4 ;顺序正确(增序或相同),不必交换

SETB F0 ;设立交换标志

MOV A,R3 ;将两个数据交换位置

MOV @R0,A

DEC R0

MOV A,R4

MOV @R0,A

INC R0 ;指向下一个数据

SRT4: DJNZ R2,SRT2 ;完成本遍的比较次数

MOV A,R6 ;恢复数据首址

MOV R0,A

JB F0,SRT1 ;本遍若进行过交换,则需继续排序

SRT5: RET ;排序结束

END
返回列表