Micropython ESP32驱动CH455控制4位数码管
1、硬件
CH455驱动4位共阴数码管的原理图如下所示。
ESP32-S模块,用GPIO4作为SCL和GPIO16作为SDA。
2、软件
搭载Micropython的ESP32-S模块,驱动代码如下:
from machine import I2C, Pin
i2c = I2C(scl=Pin(4), sda=Pin(16),freq=100000)
i2c.start()
i2c.writeto(36, b'\x01')
i2c.writeto(52, b'\x79')
i2c.writeto(53, b'\x5b')
i2c.writeto(54, b'\x4f')
i2c.writeto(55, b'\x66')
i2c.stop()
3、代码解释:(H代表16进制、D代表10进制)
操作命令分为:设置系统参数命令、加载字数据命令、读取按键代码命令,由于仅仅只是驱动数码管显示,没用到按键,所以只涉及到前两个命令;
用python命令扫描IIC地址,(32、80、105、116是IIC电路挂载的其它芯片地址,剩下的都是CH455扫描的地址)
数据手册说,设置系统参数命令地址为48H 即72D,并没有扫描出来。
后面通过C案例中的操作,可以得到地址是7位。
((((unsigned char)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR)>>1);
即1001000 = 48H = 72D 右移一位 100100 = 24H = 36D,此时可以对比扫描的地址发现地址36是有扫描到的,所以操作命令是7位地址,最后一个是读写位(可能底层自动匹配读写位)。
同理可得到加载字数命令为68H、6aH、6cH右移一位,对应为34H、35H、36H、37H = 52D、53D、54D、55D,对比发现,这四位地址也是有扫描到的。
1、首先设置系统参数,往36地址中写00000001,即数据 00000001B 表示 8 段模式,显示占空比为 8/8,关闭睡眠模式,开启显示和键盘;操作如下:
i2c.writeto(36, b'\x01')
2、设置完系统参数后,就可以显示数据了。52D、53D、54D、55D代表了4个数码管地址,自需要将下面对应8位LED数据写到对应的数码管地址,就可以让对应的数码管,显示对应的数据。
例如,让第一位数码管显示E,只需往52D(68H右移一位34H=52D)中写数据79D = 1111001B
i2c.writeto(52, b'\x79')
同理,让第二个数码管显示2、第三个数码管显示3、第四个数码管显示4:
i2c.writeto(53, b'\x5b')
i2c.writeto(54, b'\x4f')
i2c.writeto(55, b'\x66')
注:数码管的BCD编码如下,代表(0-F)
unsigned char BCD_decode_tab[0x10] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F,0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 };