以32*64点阵屏为例,详解LED点阵屏驱动全过程

首先要了解LED点阵屏幕的显示原理。

一般LED点阵屏在某一时间段内只能点亮某一行或者某一列,因为人的眼睛只有24帧速度,只要屏幕速度超过这个值,我们看到的是一个连续完整的画面。一般拿手机的高频率拍摄模式照LED点阵屏能很明显的发现屏幕是在一行一行的显示。

我用的这个屏幕32*64的单色点阵屏。

LED点阵屏的行是由行驱动芯片控制,我用的这个屏幕上有两个行驱动芯片,行驱动芯片一般是三八译码器的形式控制。两个行驱动芯片级联,通过HUB75-B接口上A,B,C,D引脚控制,通过这几个引脚的电平高低表示二进制,四个引脚最多能表示16种状态。但是我这个屏幕是32行的,怎么办呢?屏幕的行是两两接在一起的,也就是说当第0行低电平的时候,第16行也是低电平,当第一行接低电平的时候,第17行也是低电平。

LED点阵屏的列是由列驱动芯片控制,也就是真正输出数据的是这些列驱动芯片,我用的屏幕上的列驱动芯片是16输出,单色屏,所以有8个列驱动芯片,4个控制上面16行,剩下四个控制下面16行。如果是双色屏,他的数量会翻倍。

HUB75-B接口

//定义一个数组存放取模后的数据
uint8_t spi_send_buf[32][8]   //屏幕是32*64,一共有32行,每一行64个点,8个字节

程序运行逻辑

将这个函数在循环里或者在任务里面调用就好了

//下面是LED屏幕刷新的大概流程,只要把下面的函数在循环里面调用就好了
//如果用RTOS的话,在任务里面调用就好了,延时500us
uint8_t Line =0; //行变量,遍历32行
void LED_SCAN_Func(void){           SPI_send_line(spi_send_buf[Line][0]);       //往屏幕传数据data_lock_out(Line);                        //数据锁存并输出Line ++;                                 //行自增if(Line==32)Line =0;                        //一共32行,扫描一遍,重新开始 } 
//该函数的作用是数锁存
//具体要看屏幕列驱动芯片的时序
void data_lock_out(uint16_t LINE)
{GPIO_SetBits(GPIOB, LED_LAT);  //HUB75-B 的 LAT拉高 ,数据传入锁存 GPIO_ResetBits(GPIOB, LED_LAT);    //LAT拉低GPIO_SetBits(GPIOB, LED_OE);     //OE拉高 ,不输出if (LINE > 15){LINE -=16;}LED_line_ctrl (LINE);                       //换行GPIO_ResetBits(GPIOB, LED_OE);  //OE拉低  输出
}
//每次发送需要发一整行的内容,每一行8个字节,通过spi发送
void SPI_send_line(uint8_t *data){int i =0;for(i=0;i<8 ; i++)  //循环8次,发送8个字节{SPI_WriteByte(data[i]);  //发送数据}}

下面的函数是控制HUB75-B的A,B,C,D引脚,实现换行

void LED_line_ctrl(uint8_t Num)
{   switch(Num){case 0:  //控制引脚A、B、C、D状态:0000GPIO_ResetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);GPIO_ResetBits(GPIOB, LED_D);break;case 1: //控制引脚A、B、C、D状态:0001GPIO_SetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);GPIO_ResetBits(GPIOB, LED_D);break;case 2: //控制引脚A、B、C、D状态:0010GPIO_ResetBits(GPIOC, LED_A);GPIO_SetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);   GPIO_ResetBits(GPIOB, LED_D);   break;case 3: //控制引脚A、B、C、D状态:0011GPIO_SetBits(GPIOC, LED_A);         GPIO_SetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);GPIO_ResetBits(GPIOB, LED_D);break;case 4: //控制引脚A、B、C、D状态:0100GPIO_ResetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C);GPIO_ResetBits(GPIOB, LED_D);break;case 5: //控制引脚A、B、C、D状态:0101GPIO_SetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C);   GPIO_ResetBits(GPIOB, LED_D);break;case 6: //控制引脚A、B、C、D状态:0110GPIO_ResetBits(GPIOC, LED_A);GPIO_SetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C);GPIO_ResetBits(GPIOB, LED_D);  break;case 7: //控制引脚A、B、C、D状态:0111GPIO_SetBits(GPIOC, LED_A);GPIO_SetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C);  GPIO_ResetBits(GPIOB, LED_D);break;case 8:  //控制引脚A、B、C、D状态:1000GPIO_ResetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);GPIO_SetBits(GPIOB, LED_D);break;case 9: //控制引脚A、B、C、D状态:1001GPIO_SetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);GPIO_SetBits(GPIOB, LED_D);break;case 10: //控制引脚A、B、C、D状态:1010GPIO_ResetBits(GPIOC, LED_A);GPIO_SetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);   GPIO_SetBits(GPIOB, LED_D); break;case 11: //控制引脚A、B、C、D状态:1011GPIO_SetBits(GPIOC, LED_A);        GPIO_SetBits(GPIOC, LED_B);GPIO_ResetBits(GPIOC, LED_C);GPIO_SetBits(GPIOB, LED_D);break;case 12: //控制引脚A、B、C、D状态:1100GPIO_ResetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C);GPIO_SetBits(GPIOB, LED_D);break;case 13: //控制引脚A、B、C、D状态:1101GPIO_SetBits(GPIOC, LED_A);GPIO_ResetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C); GPIO_SetBits(GPIOB, LED_D);break;case 14: //控制引脚A、B、C、D状态:1110GPIO_ResetBits(GPIOC, LED_A);GPIO_SetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C);    GPIO_SetBits(GPIOB, LED_D); break;case 15: //控制引脚A、B、C、D状态:1111GPIO_SetBits(GPIOC, LED_A);GPIO_SetBits(GPIOC, LED_B);GPIO_SetBits(GPIOC, LED_C); GPIO_SetBits(GPIOB, LED_D);break;default:break;}
}

头文件里的一些定义放在下面这一段

/******HUB75-B公头接口引脚定义***********/
//A-->单片机PC13
#define LED_A                          GPIO_Pin_13     //HUB75-B:行电源控制信号A (9号引脚)
//B-->单片机PC14
#define LED_B                          GPIO_Pin_14   //HUB75-B:行电源控制信号B (10号引脚)
//C-->单片机PC15
#define LED_C                          GPIO_Pin_15   //HUB75-B:行电源控制信号C (11号引脚)
//D--》单片机PB9
#define LED_D                          GPIO_Pin_9   //HUB75-B:行电源控制信号D (12号引脚)
//LED_LAT-->单片机PB8
#define LED_LAT                        GPIO_Pin_8   //HUB75-B:数据锁存信号  (14号引脚)
//LED_OE-->单片机PB5
#define LED_OE                         GPIO_Pin_5   //HUB75-B:使能信号   (15号引脚)
//LED_CLEK-->单片机PA5
#define LED_CLK                        GPIO_Pin_5     //HUB75-B:时钟信号   (13号引脚)

我觉得我这个方法是全网最简单,效率最高的

本来写了几千个字的文章忘记保存全没了,第二次就不想写了,后面再补吧,不知道有没有人看这个,如果有人想要的话,私信我把源码发你。内容后期再补

一文教你玩LED点阵屏32*64/64*64----基于STM32相关推荐

  1. 64位计算机不能运行32位游戏,我想玩个游戏,仅支援64位系统,我家电脑win7 32位的,怎么办求解决方法...

    我想玩个游戏,仅支援64位系统,我家电脑win7 32位的,怎么办求解决方法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...

  2. [入门教程]详细讲解STM32控制LED点阵屏(HUB75接口)

    本文适合初级入门的同学,大佬请绕道.讲解怎么用stm32驱动成品LED点阵屏显示一副七色无灰度的图片,有灰度的图片可以入门后继续研究. 使用软硬件: 软件:Keil5,程序在后面会给出 硬件:STM3 ...

  3. 32位和64位操作系统,二者有何区别?是否64位更快?

    电脑操作系统是一台电脑要进行工作必须要安装的软件方面的设备,没有操作系统的电脑,犹如一个没有灵魂的人,所以一个好的操作系统可以充分发挥电脑的硬件性能,更大程度上让你的工作进行得更加顺利,目前来说,in ...

  4. 【装机吧】Win7电脑系统32位和64位区别(详细版)

    第一点  设计初衷不同: [win7系统32位和64位区别] 64位操作系统的设计初衷是:满足机械设计和分析.三维动画.视频编辑和创作,以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的 ...

  5. MCU-51:LED点阵屏

    目录 一.点阵屏介绍 1.1 简介 1.2 分类 二.点阵屏原理 2.1 点阵屏显示原理 2.2 74HC595芯片介绍 三.代码演示 3.1 静态笑脸 3.2 动态Hello! 注意:一定要看 之前 ...

  6. 6. LED 点阵屏

    点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字.图片.视频等.LED点阵屏广泛应用于各种公共场合,如汽车报站器.广告屏以及公告牌等 LED点阵屏分类 按 ...

  7. 51单片机——LED点阵屏(显示滚动画面)

    目录 一.关于数码管.LED点阵屏显示的注意点 二.功能介绍 三.主要模块的介绍 3.1 74HC595模块和点阵屏显示函数 3.1.1 74HC595介绍 3.1.2 点阵屏显示函数MatrixLE ...

  8. 【Arduino实验11 LED点阵屏显示】

    目录 一.实验目的 二.实验设备与环境 三.实验重点 四.实验难点 五.实验内容 5.1实验任务 5.2实验原理 5.3实验内容 5.4实验结果 5.5思考题 一.实验目的 1熟悉8*8点阵屏的原理与 ...

  9. 51单片机学习笔记(串口通信 LED点阵屏 DS1302)

    四.串口通信 1.基本概念 通信中最重要的两个方面: 信息表示和解析方法: 信息的传输方法. 通信双方事先需要约定好信息的表示方法和解析方法,做到一致,否则信息不能有效传递. 信号的传输方法是指经过编 ...

最新文章

  1. Java中使用Jedis连接Redis对String进行操作的常用命令
  2. 嵌入式系统串口解析二进制数_嵌入式系统Bootloader分析及DSP56F800串口加载功能实现...
  3. C++实现由二元组建立图的邻接表
  4. 金三银五,金九银十,找工作的好时间
  5. ffmpeg CLI常用命令
  6. ASP.NET AJAX 1.0 Beta 2 发布
  7. 从mysql全备 导入指定数据库的数据:三种考虑方法
  8. sqlserver入门
  9. 高等数学学习笔记——第十讲——子数列与聚点原理(1. 数列收敛的归并性)
  10. 【cuda】——npp/cuda图像预处理resize+norm对比
  11. 【黑金原创教程】【TimeQuest】【第五章】网表质量与外部模型
  12. nuc7 android tv,7代NUC小白超高清体验NUC7I3BNH
  13. 利用排序规则特点计算汉字笔划和取得拼音首字母
  14. linux无线鼠标右键自动选择,2020年高性价比无线鼠标推荐
  15. 纵断面图标注栏数据复制
  16. 毕业设计-基于深度学习的垃圾邮件过滤系统的设计与实现
  17. 项目进度跟踪的最佳实践:每日站立会议
  18. count的几种写法
  19. Android Studio中配置及使用OpenCV示例(一),android应用案例开发大全第四版源码
  20. CH9121串口转以太网模块STM32驱动

热门文章

  1. Linux内核笔记--软中断
  2. Lattics ——一款简单易用、好看强大的知识管理工具
  3. excel vba 解密
  4. InPaint V7.0
  5. STM32的GPIO输入与输出
  6. Angular的内置指令
  7. PPT结尾页,除了「谢谢」你还能写点啥?
  8. 图片上传与excel的导出
  9. 关于电影制作方和观众之间的思考
  10. 团队交流合作简单解决方案:TeamViewer远程控制amp;会议演示 + HyperCam屏幕录制(免费)