NodeMCU连接74HC595让数码管记秒

这里就不写接线了, 前面文章整理了一些资料, 可以查阅

简单讲一下, 两片595级联, 第二片控制共阴极, 控制位0为有效, 1为关闭, 和第一片的阳极控制相反, 所以0xfe是第一位显示, 0xf7是第四位显示, 数码管是要高频交替刷新, 所以, 这四位不会一同显示

bit.bnot(bit.bit(quence)

再左移8位和第一片单片机控制的阳极合并就得到了最终的传递值

tmr.stop(0)
tmr.stop(1)

--数值
number = 0
--0~9 num[1]=0
num = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
--设置ds位
latch_pin = 2
gpio.mode(latch_pin, gpio.OUTPUT)
gpio.write(latch_pin,gpio.LOW)

--不联网方式开始计时, 从0秒开始
rtctime.set(0,0,0)
 
--初始化spi通信, 默认时钟低电位, 默认高电位写入数据, 传递一次16位, 也就是0xFFFF~0x0000
result = spi.setup(1,spi.MASTER,spi.CPOL_LOW,spi.CPHA_HIGH,16,8)
 
--更新显示
function updateDisplay()
    --将四个数码管循环一遍
    for quence=0,3 do
        index = math.floor(number/10^(3-quence))%10
        finalNum = bit.bor(bit.lshift(bit.bnot(bit.bit(quence)),8),num[index+1])
    --    print(index, string.format("0x%02X", finalNum ))
        --发送数据
        spi.send(1,finalNum)
        --激活显示
        gpio.write(latch_pin,gpio.HIGH)
        gpio.write(latch_pin,gpio.LOW)
        --每个数码管维持时间平分
        tmr.delay(2500)
    end
end    

--更新数值
function updateNum()
    number, usec, rate = rtctime.get()
--    print(number)
end

updateNum()
updateDisplay()    
 
tmr.alarm(0,10,tmr.ALARM_AUTO,updateDisplay)
tmr.alarm(1,1000,tmr.ALARM_AUTO,updateNum)

ps: 把数字高速更新中的计算, 移到刷新数值的updateNum中, 刷新数码管只用作数值传递, 这样高速处理压力大大下降, 避免了重复计算的问题, 大家可以试试看

你可能感兴趣的:(NodeMCU连接74HC595让数码管记秒)