8x8共阳LED矩阵中间两行、最左列不亮问题排查(树莓派+74HC595)
问题原因排查与修复
这个故障绝大多数情况不是硬件损坏,优先排查代码逻辑错误,按以下顺序修复即可:
1 修复Python按位取反的符号位问题
你代码中列选通用~x输出低电平选通,但Python的整数是任意长度带符号类型,~x得到的是-x-1的负整数,不是8位单片机场景下的8位无符号取反结果,高位全为1,会导致级联的两片74HC595接收数据错位,固定行列选通异常。
修复方法:所有传给shiftOut的取反值都和0xFF做与运算,截断为8位长度,把两处shiftOut(dataPin,clockPin,MSBFIRST,~x)统一修改为:shiftOut(dataPin,clockPin,MSBFIRST, (~x) & 0xFF)
2 修复shiftOut的MSBFIRST移位逻辑错误
你当前shiftOut函数里MSBFIRST的位判断写反了移位方向:原代码用val<<i左移取位,会导致输出的位顺序错乱,只有你用的笑脸这类完全对称的图案看起来"显示正常",非对称字符、固定行列会出现点亮异常。
直接把shiftOut函数替换为修正后的版本即可,同时统一增加8位截断逻辑,避免长整数、负数导致的输出错误:
def shiftOut(dPin,cPin,order,val): val = val & 0xFF # 强制截断为8位,消除符号位、长整数干扰 for i in range(0,8): GPIO.output(cPin,GPIO.LOW) if(order == LSBFIRST): GPIO.output(dPin, (val >> i) & 0x01) elif(order == MSBFIRST): # 高位先发,依次读取bit7到bit0的电平 GPIO.output(dPin, (val >> (7 - i)) & 0x01) GPIO.output(cPin,GPIO.HIGH)
3 代码修复后仍异常再排查硬件
如果改完代码问题还存在,再按以下顺序检查硬件连接:
- 确认两片74HC595和树莓派共地,74HC595 VCC接稳定5V供电,禁止用树莓派3.3V给595和LED矩阵供电
- 检查74HC595对应不亮行、列的输出引脚,以及和LED矩阵连接的杜邦线有没有虚接、内部断线
- 检查LED矩阵对应不亮位置的行、列引脚有没有脱焊、氧化接触不良
- 确认两片74HC595的级联引脚(第一片9脚Q7S接第二片14脚DS)连接牢固
内容的提问来源于stack exchange,提问作者Kumaran Panchakumar
相关产品推荐
相关产品推荐

