完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
你好,我现在正在尝试编写一个函数,它根据字节切换端口引脚。我的第一个问题是,命令RRF不会产生一个零标志(我不知道为什么会这样)。我使用掩码来掩码一个接一个的位:另一个问题是,掩码位不是放在最开始的位置(例如,2^0位置),而是放在掩码位所在的位置,这使处理非常复杂。你有什么想法,我怎么能用最简单易懂的方式写出这样的功能?最好的问候
|
|
相关推荐
13个回答
|
|
|
谢谢你的回复,你知道我如何检查我的掩码寄存器(TMP2)是否为零?
|
|
|
|
|
|
从tmp2到某个适当位置(例如W,假设例程已经使用W)的MOVF将根据tmp2内容设置Z。对于tmp2,还有一个简单的测试,它之前包含一个被RRF清空的单个设置位,这也是值得尝试的。第二个问题是让例程更容易理解,这取决于它应该做什么。除了掩码中的位已经旋转到位0中的“正确”位置之外,还有“关闭”。如果(看起来)您试图根据移动掩码位是否与数据字节中设置的位重合来设置端口引脚,则需要进行区分租用测试,而不是检查是否设置了tmp3,0。如果您不确定该测试应该是什么,我建议选择一个合适的数据字节(交替使用0和1,并在纸上(或在模拟中)计算出您的AND的结果应该在连续的周期中是什么,然后看看这些结果如何匹配用你想要的输出状态。在您得到这个想法之前,您可能不需要做很多工作。作为提示,至少有两个合适的测试,这取决于您对“.”这个词的理解有多广泛,以及您对数据表中的相关说明有多了解,尽管其中一个测试可能需要重新排列“SetPin”来成为我们。进行纸质检查的一种方法是,为变化的变量(tmp2,tmp3)分别设置一列,并且可能为相关标志设置一列,并在例程中每当指令发生变化时,编写一行仅包含已更改值的新行,并绘制一行在您要检查如何设置输出的地方交叉这些列。您可以通过预先确定小组指令做什么来简化操作。例如,一旦删除了不必要的BCF STATUS,Z,剩下的BCF STATUS,C;RRF tmp2,f实际上是lo。类似地,使用不影响您正在考虑的寄存器和标志但仅控制流的指令,如果您确信他们正在正确地控制流(或者至少,一旦您已经解决了其他问题,它们将正确地控制流),那么您可以忽略它们。找出变量和标志是如何被改变的。还有其他方法做你似乎想做的事情,包括不使用掩码,但是最好等到你目前的(完全可以的)工作方式完成之后,通过整理你需要为te做的相关测试。端口和端口设置。
|
|
|
|
|
|
|
|
|
|
|
|
您可以尝试以下方法:一些有用的提示:http://pic..org.uk/./pictips.htm您还可以使用ADDLW 0,这会影响Z、C和DC标志。
|
|
|
|
|
|
MOVF本身相应地直接设置Z。因为在这种情况下,W不保存所需的数据,所以没有跟随IORLW的单个MOVF tmp2,W就可以了,并且OP当然值得知道MOVF影响Z(反之,MOVWF不影响Z)。然而,MOVF,tmp2,f是Z标志。设置从tmp2移动到tmp2,这不影响W或任何其他寄存器,所以作为一般测试是优选的。至少在一些PIC汇编器中,有一个“TSTF reg”宏,它解析为“MOVF reg,f”。
|
|
|
|
|
|
丢掉掩码位(tmp2)旋转每个循环中剩下的tmp1。测试进位标志。完成。如果需要返回原始字符,将tmp1复制到tmp2,然后移位。
|
|
|
|
|
|
对!我以为只有一个指令来测试零。我没想到这是一个MOV指令。在Z80代码中,“或A”用于测试累加器的零值。和“XOR A”是一种方便的方法,将其重置为零,为文字节省了一个字节的代码空间。
|
|
|
|
|
|
作为关于选择调用的一个更一般的观点,冒着可能使OP的事情复杂化的风险,我猜值得指出的是,代码:{用于设置状态位N}BTFSC状态的一些代码,Ncall routinetocall_if_flag_N_setBTFSS状态,Ncall routinetocall_if_flag_N_clearis并不总是(de)挂起调用的代码)基于标志“N”的完美if....,因为它确实依赖于第一个例程保存(或不更改)相关状态标志,要么将其保存在某个地方并在返回之前恢复(需要本地存储),要么不更改它,并继续不更改它。更安全的替代方法是一个指令和几个更长的周期,如:{一些设置状态位N}BTFSS状态的代码,N;注意,将先前示例中的初始测试反转为flag_N_clear call routinetocall_if_flag_N_setgoto doneblockflag_N_.:call routinetocall_if_flag_N_cleardoneblock:后一种方式也使用于测试的“then”和“.”块能够容纳多条指令,因为当不需要时,它们不会被跳过指令所绕过,从而允许用多个内联代码指令来替换调用,其中stack空间是有限的,如果可能的话,调用嵌套是可以避免的(在PIC10中经常会出现这种情况)。非常接近,并且不依赖于它们的值在可以调用其他代码的代码段上持久存在。只有在完全独立的代码中,我不太可能稍后进行添加,我才希望标记值在甚至中等距离内持久。至少,当我记得时不会要记住要小心。
|
|
|
|
|
|
丢掉掩码位(tmp2)旋转每个循环中剩下的tmp1。测试进位标志。完成。如果需要返回原始字符,请将tmp1复制到tmp2并移位。哇?老兄,你把我气疯了。我很惊讶,现在尝试,它正在工作。非常感谢你!咧嘴笑:
|
|
|
|
|
|
你使用循环计数器来获得8位输出,还是使用不同的方法?
|
|
|
|
|
|
我用了一个循环计数器。
|
|
|
|
|
|
基于计数器(在伪代码中)的替代方案:使用8loop的数据负载计数器加载temp:clrcrlf临时表与进位相关的stuffdecfsz计数器循环将使用datasetcloop:rlf临时表临时表,fskpnzgoto例程以及依赖于进位的stuffclrcgoto looproutineend:通过预加载ca在循环之前用1进行rry位,因此在第一个RLF之前,所有后续的旋转都在前一个循环末尾被清除的进位中旋转,这确保了无论temp的初始内容如何,temp在RLF之后都将是非零的,直到最初的预加载的1位最终从TEMP的顶端旋转出来。
|
|
|
|
|
|
这是为PIC10F200实现串行比特流输出的通用方法。几乎任何其他特定于应用程序的方法都会更小更快。这只是一个示例!不适用于实际应用程序。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
454 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3529 浏览 3 评论
1121浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1094浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
457浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 15:52 , Processed in 1.077825 second(s), Total 98, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1612