|
这几天在调试串行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串行时钟线拉高,上升沿移位 } } |
STM8S103飞线外接芯片,I2C不能得到slaveAddress应答,通讯失败。
测试标签123
IAR FOR ARM和IAR FOR STM8无法共存,
STM8L052,液晶内部电源怎么用?
STM8S105C6T6 UART2串口,能接收数据,不能发送数据
STM8S105K4 串口2 无奇偶校验,也能接收 偶校验的 数据
在STM8S的IAP使用中断和APP使用中断问题
STM8L151 SMBUS设计
STM8S103F复位异常
STM8L的LCD调试时不亮
微信公众号
手机版
评分
查看全部评分
这种奇怪现象很少遇到
sdata = ( k & 0x80 )?1:0;
评分
查看全部评分
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位)挂不上钩的。
评分
查看全部评分
位定义:
#define sdata PC_ODR_ODR3 // 164串行数据输入PC3 13脚,接164的1和2脚
你看的是在移植前的STC12A5的单片机仿真结果,验证74164串行点亮数码管线路的正确性,现在STC、STM8都能工作了,想不通的问题,曲线救国