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

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

[复制链接]
robter 提问时间:2018-2-25 11:47 /
阅读主题, 点击返回1楼
收藏 评论18 发布时间:2018-2-25 11:47
18个回答
toofree 回答时间: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

查看全部评分

robter 回答时间:2018-2-25 23:20:52
toofree 发表于 2018-2-25 23:13
程序单步跑过吗?
51是速度比较慢,并且是按顺序执行的。
STM32、STM8这种带几级流水的就不一样了,如果不 ...

谢谢回复,你的这段代码早就用过,不行,单步跟过几回才发现的问题,最终的问题就出在取不出高位。实际上已经解决。我怀疑是编译器什么的问题,或者是坑
toofree 回答时间: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,应该够新的,破解了,能用的
toofree 回答时间:2018-2-26 01:31:49
本帖最后由 toofree 于 2018-2-26 01:39 编辑
robter 发表于 2018-2-25 23:49
买STLINK2商家给的,版本2.20.3,应该够新的,破解了,能用的

你的sdata是什么类型的?
如果是unsigned char类型的,那么结果是0x80或0x00;肯定不会出现1
你要想出现1,则必须写成:
sdata = ( k & 0x80 ) && 0x80;
或者写成:
sdata = ( k & 0x80 )>>7;
或者写成:
sdata = ( k & 0x80 )?1:0;

说到底,这个是C语言功底的问题。



robter 回答时间:2018-2-26 07:53:11
toofree 发表于 2018-2-26 01:31
你的sdata是什么类型的?
如果是unsigned char类型的,那么结果是0x80或0x00;肯定不会出现1
你要想出现1 ...

这个思路考虑过得,sdats是STM8的PC3位定义,问题已经解决,本帖的关键是同一个取最高位的语句在两个开发环境下的不同结果:
sdata = ( k & 0x80 );   //串行数据位取显示段码数据位的最高位
谢谢关注
这个问题解决方法很多,心里老是感觉别扭
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

查看全部评分

す疯Ⅱ恒す 回答时间:2018-2-26 09:52:11
robter 发表于 2018-2-25 21:28
位定义:
#define sdata  PC_ODR_ODR3  // 164串行数据输入PC3 13脚,接164的1和2脚

这个PC_ODR_ODR3是什么东东?是操作寄存器的?还是直接操作寄存器的一bit的?如果是操作寄存器的,字节处理,那肯定就不对了,是一个字节赋值,永远是高位。

评分

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

查看全部评分

12
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版