在单片机应用程序的设计中,经常会涉及各种码制的转换问题。在单片机系统内部进行数据计算和存储时,常采用二进制码,二进制码具有运算方便、存储量小的特点。而在输入/输出时,根据人的习惯均采用十进制数的BCD码标识。此外,打印机要打印某个数字字符,也需要将该数字的二进制码转换为该字符的ASCII码。
1.二进制码到BCD码的转换
BCD码有两种形式:一种是1字节存储一位BCD码,适用于显示或输出;另一种是压缩的BCD码,即1字节存储两位BCD码,这样可以节省存储单元。
【例5-16】 单字节二进制码转换为BCD码。
二进制数转换为BCD码的一般方法是把二进制数先除以100,余数再除以10,即可得到BCD码的百、十、个位数。设单字节数在累加器A中,转换结果的百位数放入R3中,十位和个位数放入R4中。本例中用到除法指令,除法指令执行后,商在A中,余数在B中。程序如下:
【例5-17】 双字节二进制码转换为BCD码。
假设一个待转换的16位二进制数存储在R3和R2中,欲将其转换成BCD码,结果存储到片内RAM的30H~32H单元。本例采用迭代乘法原理,16位的二进制数可变成如下展开式:
d15d14d13…d2d1d0=((…(0×2+d15)×2)+d14…)×2+d0
将二进制数从最高位逐次左移入C,并且每次都进行(…)×2+di的运算,共循环16次即可完成16位二进制数转换成BCD数。程序如下:
2.BCD码到二进制数的转换
【例5-18】 4位BCD码转换成二进制数。(www.xing528.com)
假设有一个4位的BCD码d3d2d1d0,要求将这个BCD码转换为二进制数。设4位BCD码分别放在40H~43H单元中,转换完毕的二进制数放在50H、51H单元中。
本例把4位BCD码按照十进制展开得:d3d2d1d0=((d3×10)+d2)×100)+(d1×10+d0),利用乘法和加法运算即可转换得到二进制数。程序如下:
3.二进制数与ASCII码之间的转换
(1)4位二进制数转换成ASCII码
【例5-19】 把存储在R3中的低4位二进制数转换为对应的ASCII码。
采取连续两次加法和DA调整即可实现ASCII转换。程序如下:
(2)ASCII码转换成4位二进制数
【例5-20】 把存储在R3中的ASCII码转换为对应的十六进制数。
实际上在R3中存储的ASCII码,对应的十六进制数为(0~F),转换时,对于小于等于9的ASCII减去30H即可得到4位二进制数;对于大于9的ASCII减去37H即可得到4位二进制数。程序如下:
【例5-21】 将40H单元存储的单字节十六进制数转换为ASCII码,转换结果存储在30H和31H中。程序设计如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。