请教一个PIC单片机的问题,

2019-03-25 19:47发布

  1. char ii; uchar jj;

  2. void send(uchar data)
  3. {
  4. for (ii=7;ii>=0;ii--)
  5. {
  6. //scl=0;
  7. //aa();
  8. jj=(data>>ii);
  9. //sda=(j&0x01);
  10. //aa();
  11. //scl=1;
  12. //aa();
  13. //aa();
  14. }
复制代码
一个子程序 ,注释掉的内容是为了调试方便画掉的 。
data传来的数据位A0,通过单步运行看到,没有错误,但是在第一次循环时,jj=(data>>ii);后 ,jj成了1A ,后面再循环也是1A。

ii跟jj本来是send内定义了,后来会怕这出问题,换成了全局变量定义,结果也不对 。开始ii jj在 send函数内定义时 ,循环时jj为18,而且每次循环都是这个值。

编译器为MPLAB IDE v8.46和 PICC8.05,仿真器ICD2,单片机为PIC16F877A。
而且上面的程序我在VC了试过了,没有问题 。谢谢各位了

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
zzwy
1楼-- · 2019-03-26 00:37
uchar 是下面这个定义
typedef unsigned char uchar;
gaowei821029
2楼-- · 2019-03-26 04:16
for (ii=7;ii>=0;ii--)
{
//scl=0;
//aa();
jj=(data>>ii);
//sda=(j&0x01);
//aa();
//scl=1;
//aa();
//aa();
}
被编译器优化这个理由是说得过去的,因为JJ的值最将会是最后的值,编译器可能帮你直接算出来了

加volatile声明JJ看看
沙漠绿洲
3楼-- · 2019-03-26 09:07
 精彩回答 2  元偷偷看……
sy_ocean
4楼-- · 2019-03-26 11:33
是不是没有刷新watch,microchip的ide有时就是那样,不显示当前更新的。
你改下这个uchar,改为有符号类型的,有时候编译器处理是相反的。
单片机
5楼-- · 2019-03-26 13:49
明显被优化了.
按照下面写吧..
还jj=(data>>ii); 这么也要考虑下效率 ^_^ ^_^ o(∩_∩)o.

char ii; uchar jj;

void send(uchar data)
{
for (ii=7;ii>=0;ii--)
{
scl=0;
aa();
sda=(data&0x01);
data >>= 1;
aa();
scl=1;
aa();
aa();
}
wangxiaoacc
6楼-- · 2019-03-26 16:32
谢谢楼上几位,我后来实在没找到为啥,不过我感觉跟编译器优化没关系,可能3楼的大哥说的有道理。不过它 左右移一位都是正确的,我把程序改成下面形式,通过了

一周热门 更多>