4267|7

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个PIC单片机的问题, [复制链接]

  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了试过了,没有问题 。谢谢各位了

最新回复

void send(uchar data) { uchar i; for (i = 0; i < 8; i++) { scl = 0; if (data & 0x80) { sda = 1; } else { sda = 0; } scl = 1; data   详情 回复 发表于 2010-3-1 20:15
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
uchar 是下面这个定义
typedef unsigned char uchar;
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
for (ii=7;ii>=0;ii--)
{
//scl=0;
//aa();
jj=(data>>ii);
//sda=(j&0x01);
//aa();
//scl=1;
//aa();
//aa();
}
被编译器优化这个理由是说得过去的,因为JJ的值最将会是最后的值,编译器可能帮你直接算出来了

加volatile声明JJ看看
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
这段程序肯定没有问题,如果出现你说的情况,也肯定不是编译器优化弄的(循环结束jj=data).

可能原因:

1、DEBUG的时候watch显示错误;
2、其他地方程序非法操作内存(越界),改变了变量的值。检查你的aa(),sda()函数,检查你的中断服务函数。肯定有某个地方非法操作内存。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
是不是没有刷新watch,microchip的ide有时就是那样,不显示当前更新的。
你改下这个uchar,改为有符号类型的,有时候编译器处理是相反的。
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

6
 
明显被优化了.
按照下面写吧..
还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();
}
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢楼上几位,我后来实在没找到为啥,不过我感觉跟编译器优化没关系,可能3楼的大哥说的有道理。不过它 左右移一位都是正确的,我把程序改成下面形式,通过了
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 

  1. void send(uchar data)
  2. {
  3. uchar i;
  4. for (i = 0; i < 8; i++)
  5. {
  6. scl = 0;
  7. if (data & 0x80)
  8. {
  9. sda = 1;
  10. }
  11. else
  12. {
  13. sda = 0;
  14. }
  15. scl = 1;
  16. data <<= 1;
  17. }
  18. }

复制代码

PS,5楼,我需要高位到低位传送
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表