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

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