DMA和LED相结合,点阵屏幕玩“动态”
摘要:LED是一般拿来学习单片机的基础元器件,大家肯定对它都不陌生。利用LED构成的点阵显示器件可以方便的实现大面积的显示功能,想要驱动LED点阵也并不复杂,但是如何把它驱动好,则需要我们动一动脑筋。
LED是一般拿来学习单片机的基础元器件,大家肯定对它都不陌生。利用LED构成的点阵显示器件可以方便的实现大面积的显示功能,想要驱动LED点阵也并不复杂,但是如何把它驱动好,则需要我们动一动脑筋。
如果你想要设计一个具有动态效果的LED,我们第*时间就会想到利用PWM来控制LED的亮度和闪烁状态,但如果想要控制矩阵的话,你可能会遇到非常多的问题,你的控制器是否有足够多的PWM端口?如果用普通IO口来模拟PWM端口的话,能否达到相同的扫描速度?
对于越大的LED显示器件,我们想要实现同等无闪烁的显示效果所需要的扫描时间就更短。8×8的矩阵的话,扫描频率约为100Hz。而16×16矩阵的话其扫描频率则将剧增至1666Hz。这要求控制器要有16个以这个频率输出PWM信号的端口。这并不是一个简单的任务。
如何解决呢?也许DMA能够提供给我们一个方便的途径。DMA(Direct Memory Access直接内存存取)是一种在现代的控制器中非常常见的外部设备。它可以在不占用CPU时间的情况下将数据从内部存储设备中移动到外部设备中,或进行相反的过程。在完成了这样的过程之后,DMA控制器将告知CPU任务已完成。而利用DMA控制器,我们就能够用它来实现高速LED显示。
我们首先要构建一个调色盘。上面的这个表格粗略的表示出了我们想要在LED矩阵上显示出来的内容。而转化成C语言的数组之后,它看起来是这个样子的。
将不同的位叠加,我们就能够得到这样的一个序列。
将数据用DMA送至IO口之后,显示在LED上,我们所看到的就是这样的效果了。
而通过同样的查表法,我们就可以像是显存一样将数据送至LED矩阵,并构建出动态的效果了。如下图所示:
上面,我们对于控制行的管脚送去了数据,如果我们利用两个DMA通道同时对于控制行和控制列的管脚发送数据,我们就能够构建出更加复杂一点的动画效果了。
责编:小瀞
来源:无线电杂志
欢迎投稿
QQ:2548416895
邮箱:yejibang@yejibang.com
或 yejibang@126.com
每天会将您订阅的信息发送到您订阅的邮箱!