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

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

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

查看全部评分

疯de_恒 回答时间: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 手机版