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

关于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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版