这几天在调试串行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串行时钟线拉高,上升沿移位 } } |
STM8S003F3U6 请求各位大佬支援,但是遇到如下问题。。。这样就一定是这颗芯片的问题吗?
STVD如何生成库文件
STM8 flash 库函数 startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_S
stm 8 flash 在RAM运行代码的问题,是不是库函数有问题 Library call (?sll32_l0_l0_a) from within a
STM 有能替代MCHC912B32CFUE8 / NXP的型号吗?
STM8S的CAN总线使用
STM8L151在使用DAC功能后严重发热
STM8 IIC SLAVE 400K
STM8S 定时器1互补输出pwm
STM8S003F3 NRST电压低,无法开机
程序单步跑过吗?
51是速度比较慢,并且是按顺序执行的。
STM32、STM8这种带几级流水的就不一样了,如果不加延时,两个IO一先一后操作,到执行的时候谁先谁后就没个准,因此IO有时序的话,之间加延时是必须的,可以很短,但不能没有。
用下面代码试试看
评分
查看全部评分
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位)挂不上钩的。
评分
查看全部评分
刚刚看到。我在模拟串口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与,左移即可。
评分
查看全部评分
评分
查看全部评分
这种奇怪现象很少遇到
sdata = ( k & 0x80 )?1:0;
评分
查看全部评分
位定义:
#define sdata PC_ODR_ODR3 // 164串行数据输入PC3 13脚,接164的1和2脚
你看的是在移植前的STC12A5的单片机仿真结果,验证74164串行点亮数码管线路的正确性,现在STC、STM8都能工作了,想不通的问题,曲线救国
谢谢回复,你的这段代码早就用过,不行,单步跟过几回才发现的问题,最终的问题就出在取不出高位。实际上已经解决。我怀疑是编译器什么的问题,或者是坑
那你用的是哪个版本的IAR?是原版安装包吗?有没有破解过?
如果原版的,出这样的问题的话,比较不可思议。
一般来说,像这么低级的BUG,IAR编译器应该不会犯,机率不大。
仿真是在STC12C5A单片机下进行的,移植到STM8S103F下出的问题,问题解决以后感觉是个坑才在这里提出来的,如果是初学很难解决这样的问题,
刚刚回复过这个楼层,提示要审核,等到现在没看到,现在再回复一次
买STLINK2商家给的,版本2.20.3,应该够新的,破解了,能用的