|
2#
楼主 |
发表于 2012-6-25 14:10:47
|
只看该作者
本帖最后由 joyrus 于 2012-6-25 14:11 编辑
再说说指令容易忽视的问题。
我在我的第二个单片机开源项目——全比例模型遥控器摇杆位置采样程序
中使用了求16位数据补码的过程,问题就来了。
这是一个标准的求8位补码的指令,很简单
comf number,f ;求反
incf number,f ;加1
那么16位数据就要分别对高低两次求反并低位加1
comf number,f ;低位求反
comf number+1,f ;高位求反
incf number,f ;低位加1
这样就有问题了,低位加1后可能会出现低8位向高8位进位,修改如下:
comf number,f ;低位求反
comf number+1,f ;高位求反
incf number,f ;低位加1
skpnc ;是否有进位
incf number+1,f ;有进位高8位加1
问题解决了?实际执行后我发现了问题!问题很简单,incf虽然也是加法指令但是他实际上是不改变STATUS中进位标志C的!
这样16位数据求补码我就用addf来实现了。
comf number,f ;低位求反
comf number+1,f ;高位求反
movlw 0x01 ;w送1
addf number,f ;低位加W
skpnc ;是否有进位C=0无进位跳过下条指令
incf number+1,f ;有进位高8位加1
这样问题就解决了! |
|