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

关于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个回答
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

查看全部评分

す疯Ⅱ恒す 回答时间: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位)挂不上钩的。



评分

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

查看全部评分

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都能工作了,想不通的问题,曲线救国
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版