发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[技术讨论]

直接以LED组建点阵屏不多见吧?驱动就一种方法?看看在Ar...

[复制链接]
13236|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#
FireBeetle 24×8 LED点阵屏是萤火虫系列的配件产品,与常规点阵屏不同的是它直接用LED发光二极管来构建显示阵列,而非用点阵模块来构建。
为了节省I/O口,该点阵屏是采用高性能的LED驱动芯片HT1632C来进行控制。对每个LED都有独立的寄存器,故可分别驱动每个LED灯。它内置了256KHz的RC时钟,在低功耗模式下,可关闭RC时钟,使功耗仅为5uA。
点阵屏的外观如图1和图2所示,尽管显示屏的引脚较多,但在使用时所涉及的引脚并不很多,见图3所示。
图1 点阵屏正面
图2 点阵屏背面
图3显示所用引脚

点阵屏的性能如下:
·       工作电压:3.3V
·       显示颜色:白色
·       HT1632C驱动芯片
·       内置256KHzRC时钟
·       低功耗:5uA
·       工作电流:6mA~100mA
·       串行数据通信
·       支持Arduino
·       支持滚屏显示
·       接口方式:FireBeetle系列兼容
·       工作温度:-40~+85
·       模块尺寸:24 ×58(mm)/0.94 x 2.28(inches)
·       安装孔尺寸:内径3.1mm/外径6mm
要驱动该点阵屏有2种方式,一种是以常规的Arduino开发板来驱动,另一种则是以ESP32-E Arduino开发板来驱动。
对于常规的Arduino开发板驱动,在使用前安装对应的FireBeetleLEDMatrix-master库,安装后即可见到对应库以供使用。
以Arduino开发板驱动点阵屏的测试连接如图4所示,可实现的显示效果如图5至图7所示。
图4 测试连接
图5数字显示效果
图6  字符显示效果
7  动态滚屏效果
若以ESP32-EArduino开发板来驱动,则无法直接进行编译和上传,为此只好以I/O口驱来编程实现。
按点阵屏的原理图可知,为了便于使用片选信号CS是可供选择的,选择的对象可以是CS1~CS4中的任意一个,选取时只需将S1对应的开关接通即可。而CS1~CS4所对应的引脚则是D2~D5,编程时是以A4来控制串行。
图8 点阵屏片选控制
图9 片选开关
为此,点阵屏与开发板的连接关系定义为:
#define cs1  A4
#define rd   D3
#define wr   D7
#define dat  D2
实现HT1632C初始化的函数为:
void HT1632C_Init(void)
{
   digitalWrite(cs1, HIGH);
   #define SYS_DIS 0x00                //关闭系统震荡
   #define SYS_EN 0x01                //打开系统震荡
   #define LED_OFF 0x02               //关闭LED显示
   #define LED_ON 0x03                //打开LED显示
   #define BLINK_OFF 0x08              //关闭闪烁
   #define BLINK_ON 0x09              //打开闪烁  
   #define SLAVE_MODE 0x10           //从模式  
   #define RC_MASTER_MODE 0x18      //内部RC时钟  
   #define COM_OPTION 0x24           //24:16COMNMOSCCOMPMOS
   #define PWM_DUTY 0xAE            //PWM亮度控制
   digitalWrite(wr, HIGH);
   digitalWrite(dat, HIGH);
   HT1632C_Write_CMD(SYS_DIS);          //关闭HT1632C内部RC时钟
   HT1632C_Write_CMD(COM_OPTION);     //选择HT1632C工作模式,COMNMOS模式
   HT1632C_Write_CMD(RC_MASTER_MODE); //选择内部RC时钟
   HT1632C_Write_CMD(SYS_EN);           //打开HT1632C内部RC时钟
   HT1632C_Write_CMD(PWM_DUTY);       //PWM亮度设置
   HT1632C_Write_CMD(BLINK_OFF);        //关闭闪烁
   HT1632C_Write_CMD(LED_ON);           //打开LED显示
}
实现清屏处理的函数为:
void HT1632C_clr(void)
{
    unsigned char i;
    digitalWrite(cs1, LOW);
    HT1632C_Write(0xa0,3);
    HT1632C_Write(0x00,7);
    for(i=0;i<48;i++)  
       HT1632C_Write(0,8);
    digitalWrite(cs1, HIGH);
}
HT1632C发送数据的函数为:
voidHT1632C_Write(unsigned char Data,unsigned char cnt)
{
   unsigned char i;
   for(i=0;i<cnt;i++)  
   {
      digitalWrite(wr, LOW);
      if(Data & 0x80) digitalWrite(dat, HIGH);
      else
      digitalWrite(dat, LOW);
      Data<<=1;
      digitalWrite(wr, HIGH);
   }
}
HT1632 C写入命令的函数为:
void HT1632C_Write_CMD(unsignedchar cmd)
{
digitalWrite(cs1, LOW);
HT1632C_Write(0x80,3);
HT1632C_Write(cmd,9);
digitalWrite(cs1, HIGH);
}
HT1632 C写入数据的函数为:
void HT1632C_Write_DATA(unsignedchar Addr,unsigned char p,unsigned char cnt)
{
   unsigned char i;
   digitalWrite(cs1, LOW);
   HT1632C_Write(0xa0,3);
   HT1632C_Write(Addr<<1,7);
   for(i=0;i<cnt;i++)  
   {
      HT1632C_Write(p,8);
   }
   digitalWrite(cs1, HIGH);
}
ESP32-E Arduino开发板驱动点阵屏的测试连接如图10所示,可实现的显示效果如图12至图13所示。
图10 测试连接
实现图10显示效果的配置程序为:
void setup() {
      unsigned char temp=0xAA;
      pinMode(LED_BUILTIN, OUTPUT);
      pinMode(cs1, OUTPUT);
      pinMode(rd, OUTPUT);
      pinMode(wr, OUTPUT);
      pinMode(dat,OUTPUT);
      HT1632C_Init();
      HT1632C_clr();
      HT1632C_Write_DATA(0x00,temp,48);
}
经程序的编译与上传,其界面如图11所示。
图11 完成程序上传
实现图12所示三角形绘制的程序如下:
{
    unsigned char i,b;
    digitalWrite(cs1, LOW);
    HT1632C_Write(0xa0,3);
    HT1632C_Write(0x00,7);
    b=1;
    for(i=0;i<24;i++)
    {  
       if(i%8==0) b=1;
       else
       b=(b<<1)+1;
       HT1632C_Write(b,8);
       HT1632C_Write(b,8);
    }   
    digitalWrite(cs1, HIGH);
}
图12绘制三角形
实现图13所示数值显示的程序如下:
voidsetup() {
      unsigned char temp=0xFF;
      pinMode(LED_BUILTIN, OUTPUT);
      pinMode(cs1, OUTPUT);
      pinMode(rd, OUTPUT);
      pinMode(wr, OUTPUT);
      pinMode(dat,OUTPUT);
      HT1632C_Init();
      HT1632C_clr();
      HT1632C_Write_C(58,8);
      HT1632C_Write_C(26,6);
      HT1632C_Write_C(26,4);
}
对于的字符显示函数为:
voidHT1632C_Write_C(unsigned char Addr,unsigned char p)
{
   unsigned char i;
   digitalWrite(cs1, LOW);
   HT1632C_Write(0xa0,3);    //ID:101
   HT1632C_Write(Addr<<1,7);
   for(i=0;i<8;i++)  
   {
      HT1632C_Write(dot[p*8-i],8);
      HT1632C_Write(dot[p*8-i],8);
   }
   digitalWrite(cs1, HIGH);
}
图13 数值显示
所使用的字模由工具软件PCtoLCD2002来提取,其提取的格式定义如图15所示。
图14字模提取
图15字模格式定义
相应的字库格式为:
unsignedchar dot[]= {
0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,/*"0",0*/
0x00,0x48,0x48,0x7C,0x40,0x40,0x00,0x00,/*"1",1*/
0x00,0x48,0x64,0x64,0x64,0x54,0x6C,0x00,/*"2",2*/
0x00,0x28,0x44,0x4C,0x4C,0x54,0x34,0x00,/*"3",3*/
0x00,0x10,0x28,0x24,0x64,0x7E,0x00,0x00,/*"4",4*/
0x00,0x3C,0x54,0x54,0x54,0x54,0x24,0x00,/*"5",5*/
0x00,0x38,0x54,0x54,0x54,0x54,0x20,0x00,/*"6",6*/
0x00,0x0C,0x04,0x74,0x14,0x0C,0x04,0x00,/*"7",7*/
0x00,0x2C,0x54,0x54,0x54,0x54,0x2C,0x00,/*"8",8*/
0x00,0x08,0x54,0x54,0x54,0x74,0x38,0x00,/*"9",9*/
};

这样我们要驱动FireBeetle 24×8 LED点阵屏的显示,就有了2种方法。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2021-07-06
理由:恭喜通过原创文章审核!请多多加油哦!

相关帖子

沙发
lsm12502| | 2021-7-6 14:37 | 只看该作者
看不太懂,没玩过这些。这就跟跑马灯一样?

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2021-7-7 08:16 | 只看该作者
lsm12502 发表于 2021-7-6 14:37
看不太懂,没玩过这些。这就跟跑马灯一样?

的确是用到人较少,希望对用到的人有帮助。

使用特权

评论回复
地板
lsm12502| | 2021-7-8 08:46 | 只看该作者
jinglixixi 发表于 2021-7-7 08:16
的确是用到人较少,希望对用到的人有帮助。

嗯嗯,明白。谢谢!

使用特权

评论回复
5
jinglixixi|  楼主 | 2021-7-8 10:28 | 只看该作者
lsm12502 发表于 2021-7-8 08:46
嗯嗯,明白。谢谢!

使用特权

评论回复
6
moticsoft| | 2021-12-5 11:24 | 只看该作者
学习了

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

455

主题

2756

帖子

38

粉丝