问答

汇集网友智慧,解决技术难题

21ic问答首页 - 51单片机使用74HC595时编写移位代码遇到的问题

单片机

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

JZ在努力2025-07-28
在编写74HC595相关代码时,关于串行发送,目的是依次点亮LED点阵某一行temp = dat<<i;
SER = temp>>7;

SER  = dat >>7;
dat <<=1;这两种写法是对的,演示结果与预期一致。
但SER  = (dat<<i)>>7;这种写法理应也是对的,但演示结果是先全部点亮然后一次灭一行
请求各位大佬解答
回答 +关注 0
180人浏览 3人回答问题 分享 举报
3 个回答
  • 本帖最后由 dffzh 于 2025-7-28 17:20 编辑

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


  • 本帖最后由 xch 于 2025-7-28 12:00 编辑

    temp, dat, i, SER 是什么数据类型?分开写与合起来写估计数据类型转换不一样影响结果
    JZ在努力 2025-7-28 16:11 回复TA
    temp、dat和i都是无符号char类型的,SER是一位的IO口, 
  • 试一下以下两种写法看有没有能用的
    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
    尝试过了,都没有能用的,分开写就正确 

您需要登录后才可以回复 登录 | 注册