⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i5_5_01_01.htm

📁 用单片机汇编语言写的使用的子程序 包扩浮点书的加减还有 模糊算法
💻 HTM
📖 第 1 页 / 共 5 页
字号:

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">SH2: MOV A,R2</p>

<p ALIGN="JUSTIFY">ORL A,R3</p>

<p ALIGN="JUSTIFY">JNZ SH20</p>

<p ALIGN="JUSTIFY">RET ;被开方数为零,不必运算</p>

<p ALIGN="JUSTIFY">SH20: MOV R7,#0 ;左规次数初始化</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">SH22: ANL A,#0C0H ;被开方数高字节小于40H否?</p>

<p ALIGN="JUSTIFY">JNZ SQRH ;不小于40H,左规格化完成,转开方过程</p>

<p ALIGN="JUSTIFY">CLR C ;每左规一次,被开方数左移两位</p>

<p ALIGN="JUSTIFY">MOV A,R3</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV F0,C</p>

<p ALIGN="JUSTIFY">CLR C</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">MOV ACC.7,C</p>

<p ALIGN="JUSTIFY">MOV C,F0</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R2,A</p>

<p ALIGN="JUSTIFY">INC R7 ;左规次数加一</p>

<p ALIGN="JUSTIFY">SJMP SH22 ;继续左规</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">(13) 标号: SH4 
功能:四字节二进制无符号数开平方(快速)</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">入口条件:被开方数在R2、R3、R4、R5中。</p>

<p ALIGN="JUSTIFY">出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。</p>

<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">SH4: MOV A,R2</p>

<p ALIGN="JUSTIFY">ORL A,R3</p>

<p ALIGN="JUSTIFY">ORL A,R4</p>

<p ALIGN="JUSTIFY">ORL A,R5</p>

<p ALIGN="JUSTIFY">JNZ SH40</p>

<p ALIGN="JUSTIFY">RET ;被开方数为零,不必运算</p>

<p ALIGN="JUSTIFY">SH40: MOV R7,#0 ;左规次数初始化</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">SH41: ANL A,#0C0H ;被开方数高字节小于40H否?</p>

<p ALIGN="JUSTIFY">JNZ SQRH ;不小于40H,左规格化完成</p>

<p ALIGN="JUSTIFY">MOV R6,#2 ;每左规一次,被开方数左移两位</p>

<p ALIGN="JUSTIFY">SH42: CLR C ;被开方数左移一位</p>

<p ALIGN="JUSTIFY">MOV A,R5</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R5,A</p>

<p ALIGN="JUSTIFY">MOV A,R4</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R4,A</p>

<p ALIGN="JUSTIFY">MOV A,R3</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R2,A</p>

<p ALIGN="JUSTIFY">DJNZ R6,SH42 ;被开方数左移完两位</p>

<p ALIGN="JUSTIFY">INC R7 ;左规次数加一</p>

<p ALIGN="JUSTIFY">SJMP SH41 ;继续左规</p>

<p ALIGN="JUSTIFY">SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间</p>

<p ALIGN="JUSTIFY">ADD A,#57H</p>

<p ALIGN="JUSTIFY">JC SQR2</p>

<p ALIGN="JUSTIFY">ADD A,#45H</p>

<p ALIGN="JUSTIFY">JC SQR1</p>

<p ALIGN="JUSTIFY">ADD A,#24H</p>

<p ALIGN="JUSTIFY">MOV B,#0E3H ;第一区间的斜率</p>

<p ALIGN="JUSTIFY">MOV R4,#80H ;第一区间的平方根基数</p>

<p ALIGN="JUSTIFY">SJMP SQR3</p>

<p ALIGN="JUSTIFY">SQR1: MOV B,#0B2H ;第二区间的斜率</p>

<p ALIGN="JUSTIFY">MOV R4,#0A0H;第二区间的平方根基数</p>

<p ALIGN="JUSTIFY">SJMP SQR3</p>

<p ALIGN="JUSTIFY">SQR2: MOV B,#8DH ;第三区间的斜率</p>

<p ALIGN="JUSTIFY">MOV R4,#0D0H;第三区间的平方根基数</p>

<p ALIGN="JUSTIFY">SQR3: MUL AB ;与区间基点的偏移量乘区间斜率</p>

<p ALIGN="JUSTIFY">MOV A,B</p>

<p ALIGN="JUSTIFY">ADD A,R4 ;累加到平方根的基数上</p>

<p ALIGN="JUSTIFY">MOV R4,A</p>

<p ALIGN="JUSTIFY">MOV B,A</p>

<p ALIGN="JUSTIFY">MUL AB ;求当前平方根的幂</p>

<p ALIGN="JUSTIFY">XCH A,R3 ;求偏移量(存放在R2R3中)</p>

<p ALIGN="JUSTIFY">CLR C</p>

<p ALIGN="JUSTIFY">SUBB A,R3</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">SUBB A,B</p>

<p ALIGN="JUSTIFY">MOV R2,A</p>

<p ALIGN="JUSTIFY">SQR4: SETB C ;用减奇数法校正一个字节的平方根</p>

<p ALIGN="JUSTIFY">MOV A,R4 ;当前平方根的两倍加一存入R5R6中</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R6,A</p>

<p ALIGN="JUSTIFY">CLR A</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R5,A</p>

<p ALIGN="JUSTIFY">MOV A,R3 ;偏移量小于该奇数否?</p>

<p ALIGN="JUSTIFY">SUBB A,R6</p>

<p ALIGN="JUSTIFY">MOV B,A</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">SUBB A,R5</p>

<p ALIGN="JUSTIFY">JC SQR5 ;小于,校正结束,已达到一个字节的精度</p>

<p ALIGN="JUSTIFY">INC R4 ;不小于,平方根加一</p>

<p ALIGN="JUSTIFY">MOV R2,A ;保存新的偏移量</p>

<p ALIGN="JUSTIFY">MOV R3,B</p>

<p ALIGN="JUSTIFY">SJMP SQR4 ;继续校正</p>

<p ALIGN="JUSTIFY">SQR5: MOV A,R4 ;将一个字节精度的根存入R2</p>

<p ALIGN="JUSTIFY">XCH A,R2</p>

<p ALIGN="JUSTIFY">RRC A</p>

<p ALIGN="JUSTIFY">MOV F0,C ;保存最终偏移量的最高位</p>

<p ALIGN="JUSTIFY">MOV A,R3</p>

<p ALIGN="JUSTIFY">MOV R5,A ;将最终偏移量的低八位存入R5中</p>

<p ALIGN="JUSTIFY">MOV R4,#8 ;通过(R5R6/R2)求根的低字节</p>

<p ALIGN="JUSTIFY">SQR6: CLR C</p>

<p ALIGN="JUSTIFY">MOV A,R3</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">CLR C</p>

<p ALIGN="JUSTIFY">MOV A,R5</p>

<p ALIGN="JUSTIFY">SUBB A,R2</p>

<p ALIGN="JUSTIFY">JB F0,SQR7</p>

<p ALIGN="JUSTIFY">JC SQR8</p>

<p ALIGN="JUSTIFY">SQR7: MOV R5,A</p>

<p ALIGN="JUSTIFY">INC R3</p>

<p ALIGN="JUSTIFY">SQR8: CLR C</p>

<p ALIGN="JUSTIFY">MOV A,R5</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R5,A</p>

<p ALIGN="JUSTIFY">MOV F0,C</p>

<p ALIGN="JUSTIFY">DJNZ R4,SQR6 ;根的第二字节计算完,在R3中</p>

<p ALIGN="JUSTIFY">MOV A,R7 ;取原被开方数的左规次数</p>

<p ALIGN="JUSTIFY">JZ SQRE ;未左规,开方结束</p>

<p ALIGN="JUSTIFY">SQR9: CLR C ;按左规次数右移平方根,得到实际根</p>

<p ALIGN="JUSTIFY">MOV A,R2</p>

<p ALIGN="JUSTIFY">RRC A</p>

<p ALIGN="JUSTIFY">MOV R2,A</p>

<p ALIGN="JUSTIFY">MOV A,R3</p>

<p ALIGN="JUSTIFY">RRC A</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">DJNZ R7,SQR9</p>

<p ALIGN="JUSTIFY">SQRE: RET</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">(14) 标号: HASC 
功能:单字节十六进制数转换成双字节ASCII码</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">入口条件:待转换的单字节十六进制数在累加器A中。</p>

<p ALIGN="JUSTIFY">出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。</p>

<p ALIGN="JUSTIFY">影响资源:PSW、A、B 堆栈需求: 4字节</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">HASC: MOV B,A ;暂存待转换的单字节十六进制数</p>

<p ALIGN="JUSTIFY">LCALL HAS1 ;转换低四位</p>

<p ALIGN="JUSTIFY">XCH A,B ;存放低四位的ASCII码</p>

<p ALIGN="JUSTIFY">SWAP A ;准备转换高四位</p>

<p ALIGN="JUSTIFY">HAS1: ANL A,#0FH ;将累加器的低四位转换成ASCII码</p>

<p ALIGN="JUSTIFY">ADD A,#90H</p>

<p ALIGN="JUSTIFY">DA A</p>

<p ALIGN="JUSTIFY">ADDC A,#40H</p>

<p ALIGN="JUSTIFY">DA A</p>

<p ALIGN="JUSTIFY">RET</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">(15) 标号: ASCH 功能:ASCII码转换成十六进制数</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">入口条件:待转换的ASCII码(30H~39H或41H~46H)在A中。</p>

<p ALIGN="JUSTIFY">出口信息:转换后的十六进制数(00H~0FH)仍在累加器A中。</p>

<p ALIGN="JUSTIFY">影响资源:PSW、A 堆栈需求: 2字节</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">ASCH: CLR C</p>

<p ALIGN="JUSTIFY">SUBB A,#30H</p>

<p ALIGN="JUSTIFY">JNB ACC.4,ASH1</p>

<p ALIGN="JUSTIFY">SUBB A,#7</p>

<p ALIGN="JUSTIFY">ASH1: RET</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">(16) 标号:HBCD 
功能:单字节十六进制整数转换成单字节BCD码整数</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">入口条件:待转换的单字节十六进制整数在累加器A中。</p>

<p ALIGN="JUSTIFY">出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。</p>

<p ALIGN="JUSTIFY">影响资源:PSW、A、B、R3 堆栈需求: 2字节</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">HBCD: MOV B,#100 ;分离出百位,存放在R3中</p>

<p ALIGN="JUSTIFY">DIV AB</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">MOV A,#10 ;余数继续分离十位和个位</p>

<p ALIGN="JUSTIFY">XCH A,B</p>

<p ALIGN="JUSTIFY">DIV AB</p>

<p ALIGN="JUSTIFY">SWAP A</p>

<p ALIGN="JUSTIFY">ORL A,B ;将十位和个位拼装成BCD码</p>

<p ALIGN="JUSTIFY">RET</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">(17) 标号: HB2 
功能:双字节十六进制整数转换成双字节BCD码整数</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">入口条件:待转换的双字节十六进制整数在R6、R7中。</p>

<p ALIGN="JUSTIFY">出口信息:转换后的三字节BCD码整数在R3、R4、R5中。</p>

<p ALIGN="JUSTIFY">影响资源:PSW、A、R2~R7 堆栈需求: 2字节</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">HB2: CLR A ;BCD码初始化</p>

<p ALIGN="JUSTIFY">MOV R3,A</p>

<p ALIGN="JUSTIFY">MOV R4,A</p>

<p ALIGN="JUSTIFY">MOV R5,A</p>

<p ALIGN="JUSTIFY">MOV R2,#10H ;转换双字节十六进制整数</p>

<p ALIGN="JUSTIFY">HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R7,A</p>

<p ALIGN="JUSTIFY">MOV A,R6</p>

<p ALIGN="JUSTIFY">RLC A</p>

<p ALIGN="JUSTIFY">MOV R6,A</p>

<p ALIGN="JUSTIFY">MOV A,R5 ;BCD码带进位自身相加,相当于乘2</p>

<p ALIGN="JUSTIFY">ADDC A,R5</p>

<p ALIGN="JUSTIFY">DA A ;十进制调整</p>

<p ALIGN="JUSTIFY">MOV R5,A</p>

<p ALIGN="JUSTIFY">MOV A,R4</p>

<p ALIGN="JUSTIFY">ADDC A,R4</p>

<p ALIGN="JUSTIFY">DA A</p>

<p ALIGN="JUSTIFY">MOV R4,A</p>

<p ALIGN="JUSTIFY">MOV A,R3</p>

<p ALIGN="JUSTIFY">ADDC A,R3</p>

<p ALIGN="JUSTIFY">MOV R3,A 
;双字节十六进制数的万位数不超过6,不用调整</p>

<p ALIGN="JUSTIFY">DJNZ R2,HB3 ;处理完16bit</p>

<p ALIGN="JUSTIFY">RET </p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">(18) 标号: HBD 
功能:单字节十六进制小数转换成单字节BCD码小数</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">入口条件:待转换的单字节十六进制小数在累加器A中。</p>

<p ALIGN="JUSTIFY">出口信息:CY=0时转换后的BCD码小数仍在A中。CY=1时原小数接近整数1。</p>

<p ALIGN="JUSTIFY">影响资源:PSW、A、B 堆栈需求: 2字节</p>

<p ALIGN="JUSTIFY"> </p>

<p ALIGN="JUSTIFY">HBD: MOV B,#100 ;原小数扩大一百倍</p>

<p ALIGN="JUSTIFY">MUL AB</p>

<p ALIGN="JUSTIFY">RLC A ;余数部分四舍五入</p>

<p ALIGN="JUSTIFY">CLR A</p>

<p ALIGN="JUSTIFY">ADDC A,B</p>

<p ALIGN="JUSTIFY">MOV B,#10 ;分离出十分位和百分位</p>

<p ALIGN="JUSTIFY">DIV AB</p>

<p ALIGN="JUSTIFY">SWAP A</p>

<p ALIGN="JUSTIFY">ADD A,B ;拼装成单字节BCD码小数</p>

<p ALIGN="JUSTIFY">DA A ;调整后若有进位,原小数接近整数1</p>

<p ALIGN="JUSTIFY">RET</p>

<p ALIGN="JUSTIFY"> </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -