robter 发表于 2018-2-25 11:47:05

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

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

wudianjun2001 发表于 2018-2-25 11:53:14

按道理不会出现这种情况吧,都是标准的C。单步调试下走走看一下吧,看具体是怎么回事

robter 发表于 2018-2-25 12:02:27

不光是单步调试,啥方法都试用了。只有最后的方法才能解决,等于投降了

robter 发表于 2018-2-25 12:22:06

还有一个怪现象,按附图焊接线路,编程、仿真都能正常显示,无意中拔掉74164的电源供电线,结果显示不受影响,奇怪。等于断掉74164的Vcc电源,还有显示,怪,可能是推挽输出的原因

时光虫子 发表于 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;

す疯Ⅱ恒す 发表于 2018-2-25 14:07:54

sdata是什么?

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位)挂不上钩的。



robter 发表于 2018-2-25 21:28:05

す疯Ⅱ恒す 发表于 2018-2-25 14:07
sdata是什么?

位定义:
#define sdataPC_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都能工作了,想不通的问题,曲线救国
页: [1] 2
查看完整版本: 关于STM8S103在IAR环境下取8位数据最高位的问题