【玩转单片机系列001】 08接口双色LED显示屏驱动方式探索

news/2024/11/30 15:31:12/

  前些日子,从淘宝上购得一块08接口的双色LED显示屏(打算做个音乐频谱显示器),捣鼓了好几天,终于搞清楚了其控制原理,在这里做个总结,算是备忘吧。

 

1.LED显示屏的扫描方式

  LED显示屏的扫描方式有静态、1/2、1/4、1/8、1/16几种。

这些扫描方式具体是什么意思呢?我们以1/16扫描方式为例来说明。因为LED显示屏是逐行刷新显示的,所以在任意时刻我们只能控制其任意一行的显示,每次刷新显示一行,16行为一个扫描周期,这就是1/16扫描方式。当然了,一个扫描周期的时间必须要小于人眼视觉暂留的时间(约0.05秒到0.2秒),否则,人眼会观察到LED显示屏所呈现的画面出现闪烁。

 

2.LED显示屏的接口形式

  LED显示屏的接口形式有04接口、08接口、12接口几种,这里只介绍08接口。

  08接口的管脚定义如图1所示。

1 08接口管脚定义

  其中,管脚LALBLCLD表示行信号;管脚R1R2G1G2表示列信号;管脚EN表示使能信号;管脚SCK表示时钟信号;管脚STB表示锁存信号;管脚GND表示接地。

  那么,管脚LALBLCLD是如何来控制行信号,从而实现1/16扫描方式的。其实很简单,这是通过两个3-8译码器74HC138芯片来实现,通过这两个芯片可以实现如下的功能:

  当管脚LDLCLBLA的输出分别为0000时,LED显示屏的第一行被选中;

  当管脚LDLCLBLA的输出分别为0001时,LED显示屏的第二行被选中;

  当管脚LDLCLBLA的输出分别为0010时,LED显示屏的第三行被选中;

  ......

  当管脚LDLCLBLA的输出分别为1111时,LED显示屏的第十六行被选中。

  现在,我们已经知道如何通过08接口的四个行信号LALBLCLD来控制LED显示屏的每一行了。将08接口的四个列信号都接地,循环给四个行信号输入00001111,就可以点亮整个LED显示屏了。

  但是要在LED显示屏上显示出汉字或是图形,仅仅对行信号进行控制是远远不够的,我们还需要对列信号进行控制。

 

3.LED显示屏的列驱动

  LED显示屏的列驱动使用了74HC595芯片,该芯片具有8位串行输入、8位串行/并行输出,8位锁存功能。

  对于64*32LED显示屏来说,因为其总共有64列,所以通过对874HC595芯片进行级联,即可将其扩展为64位串行输入,64位并行输出,从而实现对64列信号进行控制。

  08接口中的管脚R1R2G1G2就是用来输入64位串行数据的。其中,R1G1分别用来控制上半屏(16行)的红、绿信号;R2G2分别用来控制下半屏(16行)的红绿信号。因此,对于64*32的双色LED显示屏来说,总共需要使用3274HC595芯片。

  显然,当红绿信号同时使能时(列信号低电平使能),就可以控制LED显示屏显示出黄色来了。

  现在,我们已经知道LED显示屏的列驱动原理,下一步就可以编写程序,让LED显示屏显示出任意我们想要的汉字或图形了。

 

4.示例程序

  了解了LED显示屏的驱动原理之后,编写单片机程序,利用08接口对其进行控制是很容易的。

  程序的大致流程应该是这样的:

  (1)初始化单片机的GPIO引脚。

  (2)设置08接口的使能信号EN

  (3)利用行信号选中第1行,移位串行输入第1行的列信号数据,锁存列信号,并行输出显示。

  (4)利用行信号选中第2行,移位串行输入第2行的列信号数据,锁存列信号,并行输出显示。

  (5)依次遍历,直到第32行,并行输出显示为止。

  (6)循环进行3-5的过程。

  如下的代码示例了整个程序流程。

 1 void main(void)
 2 {
 3     int rowNumber = 0;                   //行序号
 4     int columnNumber = 0;                //列序号
 5 
 6     InitGPIO();                          //初始化单片机的GPIO引脚    
 7     LED_OE = 1;                          //使能信号
 8 
 9     while(1)                             //循环刷新显示
10     {        
11         for(rowNumber=0; rowNumber<16; rowNumber++)                   //写入上半屏的显示内容
12         {
13               SetRowLight(rowNumber);                                 //行信号选择
14 
15             for(columnNumber=0; columnNumber<8; columnNumber++)       //写入列信号数据
16             {
17                 Write1ByteToFirstHalfScreen(FirstHalfScreenArray[rowNumber][columnNumber], 0xFF);
18             }
19 
20             LED_STB = 0;                                              //锁存列信号
21             LED_STB = 1;
22         }
23             
24         for(rowNumber=0; rowNumber<16; rowNumber++)                   //写入下半屏的显示内容
25         {
26               SetRowLight(rowNumber);                                 //行信号选择
27                                                                     
28             for(columnNumber=0; columnNumber<8; columnNumber++)       //写入列信号数据
29             {
30                 Write1ByteToLowerHalfScreen(0xFF, LowerHalfScreenArray[rowNumber][columnNumber]);    
31             }
32                                                                    
33             LED_STB = 0;                                              //锁存列信号
34             LED_STB = 1;
35         }                
36     }
37 }

  其中,函数SetRowLight()用于控制行信号的选择;函数Write1ByteToFirstHalfScreen()用于向上半屏写入列信号数据;函数Write1ByteToLowerHalfScreen()用于向下半屏写入列信号数据,二维数组FirstHalfScreenArray[16][8]LowerHalfScreenArray[16][8]分别用于存储列信号数据,该数据可以通过汉字图形取模软件得到。

  例如,向二维数组FirstHalfScreenArray[16][8]LowerHalfScreenArray[16][8]中分别放入我的邮箱“menlsh@163.com”的ASCII数据码,就可以得到如图2所示的显示效果了。

2 LED显示屏显示效果示例

 


http://www.ppmy.cn/news/535425.html

相关文章

室内全彩LED显示屏选购指南,行业揭秘

室内全彩LED显示屏作为一种引人注目的视觉媒体&#xff0c;广泛应用于商业、文化和娱乐场所。但在众多产品中选择合适的室内全彩LED显示屏可能会令人感到困惑。本文将为您提供一份详尽的选购指南&#xff0c;帮助您挑选到性能卓越、适用的室内全彩LED显示屏。 一、确定需求和用…

0002Java程序设计-SSM协同过滤算法的新闻推荐系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多行业的管理仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;使得对人力物力造成诸多浪费&#xff0c;工作效率不高等情况&am…

框架设计准则

一&#xff1a;命名准则&#xff1a; 类和变量名采用帕斯卡命名法&#xff08;每一个单词的首字母都大写&#xff09;&#xff0c;函数的参数名字&#xff0c;采用第一个单词的首字母小写&#xff0c;剩下单词的首字母大写 二&#xff1a;类型设计准则 在类与结构体之间选择 …

easyX库文字输出相关函数(注释版)

您好这里是limou3434的博文系列&#xff0c;感兴趣的话可以看看我的其他系列。 本次我给您带来的是easyX库的字符输出系列函数&#xff0c;祝您看得开心。 0.文字输出函数概览 函数或数据类型描述LOGFONT文字样式的结构体。settextcolor设置当前文字颜色。settextstyle设置当…

ipad刷机

看到网络上豆瓣中有个“豆瓣笔记”的功能觉得蛮好的&#xff0c;但是呢这个只有iphone版本的安装&#xff0c;没有android的安装&#xff0c;自己想到ipad上面也是可以安装iphone的程序的&#xff0c;就跑去装啦&#xff0c;不过呀&#xff0c;”相机功能不知道怎么在哪儿&…

一分钟 帮你搞懂什么是柔性数组!

文章目录 什么是柔性数组&#xff1f;柔性数组的特点柔性数组的使用模拟实现柔性数组的功能柔性数组的优势 什么是柔性数组&#xff1f; 柔性数组这个概念相信大多数人博友都没有听说过&#xff0c;但是它确实存在。 在C99中&#xff0c;结构&#xff08;结构体&#xff09;的…

基于jsp、servlet的超市购物车商城系统

文章目录 项目介绍主要功能截图:登录注册商品列表加入购物车查看购物车结算生成订单生成订单查看历史账单部分代码展示购物车servlet用户控制层订单设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,…

硬件入门之什么是mos管

硬件入门之什么是mos管 文章目录 硬件入门之什么是mos管一、mos管是什么&#xff1f;MOS管常用于&#xff1a; 驱动大功率电路中。MOS选型参数mos管调参数 二、实际应用场景1.防反接保护电路&#xff09;2.防过压保护电路3.防反接防过压电路一体电路4.驱动电路 总结 一、mos管是…