打印

51单片机使用74HC595时编写移位代码遇到的问题

[复制链接]
933|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在编写74HC595相关代码时,关于串行发送,目的是依次点亮LED点阵某一行temp = dat<<i;
SER = temp>>7;

SER  = dat >>7;
dat <<=1;这两种写法是对的,演示结果与预期一致。
但SER  = (dat<<i)>>7;这种写法理应也是对的,但演示结果是先全部点亮然后一次灭一行
请求各位大佬解答

使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2025-7-28 11:31 | 只看该作者
试一下以下两种写法看有没有能用的
SER  = (unsigned int)(dat<<i)>>7
SER  = (unsigned char)(dat<<i)>>7

使用特权

评论回复
评论
LcwSwust 2025-7-28 16:21 回复TA
@JZ在努力 :这样,给dat一个固定的值,用你的两种写法,把SER的值通过串口助手或显示屏或调试看看具体有什么区别. 
JZ在努力 2025-7-28 16:13 回复TA
尝试过了,都没有能用的,分开写就正确 
板凳
xch| | 2025-7-28 11:59 | 只看该作者
本帖最后由 xch 于 2025-7-28 12:00 编辑

temp, dat, i, SER 是什么数据类型?分开写与合起来写估计数据类型转换不一样影响结果

使用特权

评论回复
评论
xch 2025-7-28 19:09 回复TA
@JZ在努力 :temp,dat 类型改成16或者32位无符号的结果可能就一样了 
JZ在努力 2025-7-28 16:11 回复TA
temp、dat和i都是无符号char类型的,SER是一位的IO口, 
地板
dffzh| | 2025-7-28 17:14 | 只看该作者
本帖最后由 dffzh 于 2025-7-28 17:20 编辑

按照你发的三种方式,实测如下:
将SER = (dat<<i)>>7;改成坛友说的 SER = (unsigned char)(dat<<i)>>7;实测如下,貌似可以的呀,你的改了也不行?
另外有个建议,因为C语言在数据类型转换这块,其实是比较复杂的,对于类似这种多个运算符参与的逻辑运算,分开多条语句实现比全部用一条语句实现更好,代码可读性更强,也不容易出错。


使用特权

评论回复
5
567| | 2025-7-28 20:43 | 只看该作者
整形提升

使用特权

评论回复
6
CelestialScribe| | 2025-7-29 08:33 | 只看该作者
居然真的还有人在用51?

使用特权

评论回复
7
zjsx8192| | 2025-7-29 09:06 | 只看该作者
估计sfr转换不过来,要用if来判断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝