STM32
直播中

李燕

7年用户 1529经验值
私信 关注
[问答]

STM8S103在IAR环境下取8位数据最高位遇到的疑问求解

这几天在调试串行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串行时钟线拉高,上升沿移位
        }
}


回帖(2)

李童

2024-4-30 10:50:20
按道理不会出现这种情况吧,都是标准的C。单步调试下走走看一下吧,看具体是怎么回事 
举报

刘悌耀

2024-4-30 16:57:36
在STM8S103的IAR环境下,您遇到的问题可能是由于取8位数据最高位时的位操作方式不正确。在您提供的代码中,您使用了`sdata = (k & 0x80);`来获取k的最高位。然而,这种方法可能在IAR环境下不适用。

为了解决这个问题,您可以尝试以下方法:

1. 使用位运算符`>>`来获取k的最高位。例如:

```c
sdata = (k >> 7) & 0x01;
```

这里,`k >> 7`将k的二进制表示向右移动7位,然后将结果与0x01进行按位与操作,以确保结果为0或1。

2. 如果您仍然遇到问题,可以尝试使用IAR提供的内置函数。例如,您可以使用`_BitSet()`和`_BitClr()`函数来设置或清除特定位。例如:

```c
_BitSet(sdata, 7, (k & 0x80) >> 7);
```

或者

```c
_BitClr(sdata, 7, !((k & 0x80) >> 7));
```

这里,`_BitSet()`函数将sdata的第7位设置为(k & 0x80) >> 7的结果,而`_BitClr()`函数将sdata的第7位清除,如果(k & 0x80) >> 7的结果为0。

3. 确保您的74LS164和STM8S103之间的硬件连接正确。检查数据线、时钟线和控制线是否正确连接,以确保数据能够正确传输。

4. 如果问题仍然存在,请检查您的程序逻辑,确保在向74LS164发送数据之前,您已经正确地设置了控制信号,如锁存和时钟信号。

通过尝试上述方法,您应该能够在IAR环境下解决STM8S103取8位数据最高位的问题。如果问题仍然存在,请仔细检查您的硬件连接和程序逻辑,以确保一切正常。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分