你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM8S103在IAR环境下取8位数据最高位的问题

[复制链接]
robter 提问时间:2018-2-25 11:47 /
这几天在调试串行74LS164点亮三位共阳数码管的过程中发现STM8S103在IAR环境下取8位数据最高位有问题。程序是从STC12C5A  Keil uVision4 移植过来的,源程序显示很正常,移植到STM8S103在IAR环境下数码管所有笔画一直都点亮,也就是说164一直接收到低电平,没有收到高电平,哟问题的语句是 sdata = ( k & 0x80); 不管k的值是多少得到的全是0,应该有1,但是没有;只要将语句改为 sdata = ( k & 0x01 ); 得到的各个位有0有1就正常。
我的164点亮三位数码管各段的数据要求先传最高位后传最低位,现在语句改为 sdata = ( k & 0x01 ); 这样是先传输最低位,后传最高位,得到的数据位顺序颠倒了,显示乱码。最后只有重新修改显示数据的段码表才能正常显示。
到现在想不通为何 ( k & 0x80 )得不到 k 数据位当中的最高位,k=0xff都不行,这在STC12C5A  Keil uVision4环境下很正常。不知各位是否遇到?这个小问题害人,也可能是我学艺不精。。。。。。
附上有问题代码:
void send164(unsigned char seg)//送数据位去164显示,共阳数码管,低电平点亮
{
        unsigned char k,m;
        k=tab[seg];//得到显示字符的段码
        for(m=0;m<8;m++)
        {
                sclok=0; //164串行时钟线拉低
                sdata = ( k & 0x80 );   //串行数据位取显示段码数据位的最高位
                k= k<<1;  //所有数据位左移一位
                sclok=1;  //164串行时钟线拉高,上升沿移位
        }
}
调试正常的代码:
void send164(unsigned char seg)//送数据位去164显示,共阳数码管,低电平点亮
{
        unsigned char k,m;
        k=tab[seg];//得到显示字符的段码
        for(m=0;m<8;m++)
        {
                sclok=0; //164串行时钟线拉低
                sdata = ( k & 0x01 );   //串行数据位取显示段码数据位的最低位
                k= k>>1;  //所有数据位右移一位
                sclok=1;  //164串行时钟线拉高,上升沿移位
        }
}

评分

参与人数 1 ST金币 -1 收起 理由
zero99 -1 帖子分类错误

查看全部评分

收藏 评论18 发布时间:2018-2-25 11:47

举报

18个回答
七哥 回答时间:2018-2-25 23:13:35
本帖最后由 toofree 于 2018-2-25 23:14 编辑

程序单步跑过吗?
51是速度比较慢,并且是按顺序执行的。
STM32、STM8这种带几级流水的就不一样了,如果不加延时,两个IO一先一后操作,到执行的时候谁先谁后就没个准,因此IO有时序的话,之间加延时是必须的,可以很短,但不能没有。
用下面代码试试看

  1. void send164(unsigned char seg)//送数据位去164显示,共阳数码管,低电平点亮
  2. {
  3.         unsigned char k,m;
  4.         k=tab[seg];//得到显示字符的段码
  5.         for(m=0;m<8;m++)
  6.         {
  7.                 sclok=0; //164串行时钟线拉低
  8.                 delay_us(1);
  9.                 sdata = ( k & 0x80 );   //串行数据位取显示段码数据位的最高位
  10.                 delay_us(1);
  11.                 k= k<<1;  //所有数据位左移一位
  12.                 sclok=1;  //164串行时钟线拉高,上升沿移位
  13.                 delay_us(2);
  14.         }
  15. }
复制代码





评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-2-25 14:51:40
本帖最后由 wenyangzeng 于 2018-2-25 15:25 编辑

stm8s103没有P2口,21脚是pc4,楼主的图哪里来的?

假设是PC4,改成这样:
for(m=0;m<8;m++)
        {
                sclok=0; //164串行时钟线拉低

                 if(k &0x80)
             PC_ODR |=0x10;
                  else
             PC_ODR &=~0x10;
                k= k<<1;
                sclok=1;  
        }

   楼主原来代码中,如果sdata是一个byte的变量,同时如果原理图中的21脚(P2.0这个不是STM8的属性)刚好也是最低位,那么(k&0x01)就刚好也凑巧将变量k的D0位传输出去了。而(k&0x80)传输最高位的操作当然无反应了。
    而:如果sdata是bit变量,则STM8S103D 21脚(PC4)无论如何与sdata(D0位)挂不上钩的。



评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

zhjb1 回答时间:2018-2-26 08:40:47
robter 发表于 2018-2-26 07:53
这个思路考虑过得,sdats是STM8的PC3位定义,问题已经解决,本帖的关键是同一个取最高位的语句在两个开发 ...

刚刚看到。我在模拟串口LCD是初中常用取位函数,高低都可从来不出问题。我的做法通常不是将取位bit直接输出,而是有个中间变量获得后输出。例如:
//Write 1 byte to LCD,dtata,Command:1/0-Data
void b2l(unsigned char dt,unsigned char com){
unsigned char i;
reg=com;//数据或命令寄存器
for(i=0;i<8;i++){
  if(dt&0x80){dat=1;}else{dat=0;};//判断高位
  dt=dt<<1;
  wri();//调用写脉冲
}
}
如果是取低位,则与0x01与,左移即可。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wudianjun2001 回答时间:2018-2-25 11:53:14
按道理不会出现这种情况吧,都是标准的C。单步调试下走走看一下吧,看具体是怎么回事

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

robter 回答时间:2018-2-25 12:02:27
不光是单步调试,啥方法都试用了。只有最后的方法才能解决,等于投降了
robter 回答时间:2018-2-25 12:22:06
还有一个怪现象,按附图焊接线路,编程、仿真都能正常显示,无意中拔掉74164的电源供电线,结果显示不受影响,奇怪。等于断掉74164的Vcc电源,还有显示,怪,  可能是推挽输出的原因
164led.jpg
时光虫子 回答时间:2018-2-25 12:38:18
本帖最后由 时光虫子 于 2018-2-25 12:39 编辑

这种奇怪现象很少遇到
Mandelbrot_Set 回答时间:2018-2-25 13:28:32
you can try:
sdata = ( k & 0x80 )?1:0;

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

疯de_恒 回答时间:2018-2-25 14:07:54
sdata是什么?
robter 回答时间:2018-2-25 21:28:05

位定义:
#define sdata  PC_ODR_ODR3  // 164串行数据输入PC3 13脚,接164的1和2脚

robter 回答时间:2018-2-25 21:32:49
wenyangzeng 发表于 2018-2-25 14:51
stm8s103没有P2口,21脚是pc4,楼主的图哪里来的?

假设是PC4,改成这样:

你看的是在移植前的STC12A5的单片机仿真结果,验证74164串行点亮数码管线路的正确性,现在STC、STM8都能工作了,想不通的问题,曲线救国
robter 回答时间:2018-2-25 23:20:52
toofree 发表于 2018-2-25 23:13
程序单步跑过吗?
51是速度比较慢,并且是按顺序执行的。
STM32、STM8这种带几级流水的就不一样了,如果不 ...

谢谢回复,你的这段代码早就用过,不行,单步跟过几回才发现的问题,最终的问题就出在取不出高位。实际上已经解决。我怀疑是编译器什么的问题,或者是坑
七哥 回答时间:2018-2-25 23:27:40
robter 发表于 2018-2-25 23:20
谢谢回复,你的这段代码早就用过,不行,单步跟过几回才发现的问题,最终的问题就出在取不出高位。实际上 ...

那你用的是哪个版本的IAR?是原版安装包吗?有没有破解过?
如果原版的,出这样的问题的话,比较不可思议。
一般来说,像这么低级的BUG,IAR编译器应该不会犯,机率不大。
robter 回答时间:2018-2-25 23:33:22
wenyangzeng 发表于 2018-2-25 14:51
stm8s103没有P2口,21脚是pc4,楼主的图哪里来的?

假设是PC4,改成这样:

仿真是在STC12C5A单片机下进行的,移植到STM8S103F下出的问题,问题解决以后感觉是个坑才在这里提出来的,如果是初学很难解决这样的问题,
刚刚回复过这个楼层,提示要审核,等到现在没看到,现在再回复一次
robter 回答时间:2018-2-25 23:49:04
toofree 发表于 2018-2-25 23:27
那你用的是哪个版本的IAR?是原版安装包吗?有没有破解过?
如果原版的,出这样的问题的话,比较不可思议 ...

买STLINK2商家给的,版本2.20.3,应该够新的,破解了,能用的
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版