from machine import Pin
import time
print("Hello, ESP32!")
#最左下角是0,最上面和最右边是7
#MR接33,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可
#DS串行数据输入引脚,第一块接P32,第二块接P12
#OE输出使能控制脚,它是低电才使能输出,所以接GND
#STCP接P26,SHCP接P25,两块的STCP和SHCP接的引脚一样
#STCP,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存到存储寄存器
#SHCP,移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入
#MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可,两个都接33
#第一块74HC595(上面的那块)控制行,行接负极,第二块595接列,列接正极。
#第一个从SER送入的bit将会从Q7出去
#参考:1,https://blog.csdn.net/ReCclay/article/details/78245642
#参考:2,https://blog.csdn.net/zhentaiyangquan/article/details/114778310
#引脚准备
pin_MR = Pin(33,Pin.OUT)
pin_MR.value(1)
pin_SHCP = Pin(25, Pin.OUT) #34
pin_SHCP.off() # D2,时钟,上升跳变时数据位移锁存,SHCP
pin_STCP = Pin(26, Pin.OUT) #35
pin_STCP.off() # D3,上升跳变时,数据全部推入锁存,STCP
#先让正对角线的小灯亮起来,也就是两个595的Q0到Q7同时闪起来(单个,不是一次全部闪)。
#输入一个8*8的坐标,然后程序就自动执行刷新小灯
led_mat = [[0,0,0,0,0,0,0,1],
[0,0,0,0,0,0,1,0],
[0,0,0,0,0,1,0,0],
[0,0,0,0,1,0,0,0],
[0,0,0,1,0,0,0,0],
[0,0,1,0,0,0,0,0],
[0,1,0,0,0,0,0,0],
[1,0,0,0,0,0,0,0]]
def list_to_16(in_list):
# 将列表转换为二进制字符串
binary_str = ''.join(map(str, in_list))
# 将二进制字符串转换为整数
decimal_val = int(binary_str, 2)
# 将整数转换为16进制字符串
hex_val = hex(decimal_val)
return int(hex_val)
def jump_up(pin):
pin.on() # 产生跳变
time.sleep(0.1)
pin.off() # 保持一段时间后关闭
pin_DS = Pin(32, Pin.OUT)
pin_DS.off() # D4,待移入的数据
def turn_x(x_list): #输入一个list,然后打开x中位1的地方
hex_val = list_to_16(x_list)
for i in range(8):
pin_DS.value((hex_val >> i) & 0x01) # 从最低位开始送数据
jump_up(pin_SHCP) # 位移到下一个寄存器
print("---------------")
print(i)
jump_up(pin_STCP) # 全部数据推入锁存
while True:
print("=========++++++++")
turn_x(led_mat[-1])
time.sleep(0.5)
'''
def turn_y(num,state): #num表示led阵列中的第几行,state值取0或1,取0则拉低,表示打开led;取1则拉高表示关闭led。
pass
#所有的行(接负极的),初始状态都是拉高
def init_y():
pass
def fresh_all(led_mat): #led_mat是8*8的列表
for i in range(0,8): #行数
#先确保所有的灯都关掉了
#拉高第二个寄存器中,第7-i行对应的数字中,为1的led;第一次从最底下那一行led开始
turn_x(led_mat[7-i]) #这里的7-i,i是列表索引,与实际led位置相反的,因此用7-i
#如果第7-i行全为0,则pass,否则,拉低第一个595的第0位
if all(item == 0 for item in led_mat[7-i]):
pass
else:
turn_y(i,0) #拉低led阵列的第i行的负极,0表示拉低
time.sleep(0.5) #灯闪的慢一点,方便观察
turn_y(i,1) #然后再拉高,1表示拉高;确保它是关上的,不然可能同时点亮两行
#要先打开列,因为列是正的。
for j in range(0,8):
if led_mat(i,j)==1:
#把7-i和j分别写入行595和列595中,表示y=7-i和x=j这个点需要点亮
init_y()
while (1):
fresh_all(led_mat)
# 准备数据引脚
pin_sclk = Pin(25, Pin.OUT) #34
pin_sclk.off() # D2,时钟,上升跳变时数据位移锁存,SHCP
pin_rlck = Pin(26, Pin.OUT) #35
pin_rlck.off() # D3,上升跳变时,数据全部推入锁存,STCP
pin_dio = Pin(32, Pin.OUT)
pin_dio.off() # D4,待移入的数据
MR_pin = Pin(33,Pin.OUT)
MR_pin.value(1)
# 行引脚控制
row = [
0x7F, # 01111111
0xBF, # 10111111
0xDF, # 11011111
0xEF, # 11101111
0xF7, # 11110111
0xFB, # 11111011
0xFD, # 11111101
0xFE, # 11111110
]
col = [
0x00, # 00000000
0x66, # 01100110
0x99, # 10011001
0x81, # 10000001
0x42, # 01000010
0x24, # 00100100
0x18, # 00011000
0x00, # 00000000
]
def jump_up(pin):
pin.on() # 产生跳变
pin.off() # 保持一段时间后关闭
def send_data(position, is_row=True):
'向位移寄存器送数据'
value = row[position] if is_row else col[position] # 取行码或列码对应位置的值
for i in range(8):
pin_dio.value((value >> i) & 0x01) # 从最低位开始送数据
jump_up(pin_sclk) # 位移到下一个寄存器
while True:
for n in range(8):
send_data(n, is_row=False) # 先推列码
send_data(n, is_row=True) # 再推行码
jump_up(pin_rlck) # 全部数据推入锁存
'''