4位数码管显示

之前的《Android Things创客DIY第三课-Android Things入门配件包开发案例教程-数码管显示》中,介绍了如何使用Android Things控制1位数码管显示。本文先对之前的1位数码管做一个回顾,再介绍4位数码管显示原理和动手实践过程。

根据之前的介绍,我们知道,1位数码管是通过8个GPIO控制8个显示段的显示,达到显示不同数字的目的的。1位的8段数码管,相当于8个独立的LED发光二极管。每个独立的发光二极管都有正极(阳)和负极(阴)两根引脚。

所谓共阳,就是把这8个发光二极管的正极(阳)连接在一起,接入到电源正极,通过GPIO分别控制每个发光管的负极,达到控制显示的目的。

所谓共阴,就是把这8个发光二极管的负极(阴)连接在一起,接入到GND上,通过GPIO分别控制每个发光管的正极,达到控制现实的目的。

入门配件包中提供的1位数码管是“1位共阴”的数码管,所以在之前的例子中,我们是将共阴脚接在GND上,将8段的脚分别接在8个GPIO上,控制8个段的GPIO为高电平时该段显示,为低电平时该段不显示。

1位数码管显示的例子

4位数码管显示的物料准备

1. 树莓派3B开发板 或 NXP Pico i.MX7D开发板

2. 1KΩ电阻8个(入门配件包中蓝色电阻)

3. 4位数码管

4. 透明热缩管

5. 面包板

6. 杜邦线12根(公-母)

如需购买入门配件包,可访问:淘宝(https://item.taobao.com/item.htm?id=564226570619) 或 微店(https://weidian.com/item.html?itemID=2238998104)

了解4位数码管的显示原理

如前文所述,1位数码管的显示需要8个GPIO,那么控制4位数码管,是不是需要4*8=32个GPIO呢?什么样的开发板会提供那么多GPIO???

答案当然是否定的。我们说过数码管每段有正极(阳)和负极(阴),如前面所述,我们将1位共阴数码管的共阴脚接在GND上,那么如果我们将共阴脚接在另一个GPIO上呢?通过这个GPIO,我们就可以控制这一位数码管是否显示。那么对于4位数码管,我们就可以通过4个GPIO选择我们要显示4位中的哪一位。

显示4位数码管中的某一位

通过这种方式,我们只需要4+8个GPIO,就可以控制4位数码管的每一位依次显示了:

1. 设置第一位数字要显示哪些段
2. 通过GPIO控制第一位数字显示
3. 持续一段时间
4. 关闭第一位数字的显示
5. 设置第二位数字要显示哪些段
6. 通过GPIO控制第二位数字显示
……如此周而复始

那么如何实现4位数字同时显示呢?其实只要上面依次显示的刷新速度足够快,人眼看到的就是同时显示的效果了。

动手实践

入门配件包中提供的4位数码管是”4位共阳“数码管,即控制4位数字某位是否显示的引脚接入正极(阳)——也就是高电平时该位显示;控制数字中某段是否显示的引脚接入负极(阴)——也就是低电平时该段显示。

4位数码管接线图

可以按上图的原理,使用面包板进行接线,先将4位数码管插在面包板上,将数码管的各段对应的引脚,通过电阻引出,再接到开发板上。将每位数字的引脚,通过面包板接到开发板对应的引脚上。连接效果如下图所示:

四位数码管连接图

接下来,我们就可以通过程序控制数码管的显示了。代码同样可以从Github上下载:https://github.com/sysolve/androidthings-digitalDisplay

案例代码已升级到Android Things Developer Preview 7版本,注意开发板系统与代码版本一致。

代码中的FourDigitalActivity.java即为控制4位数码管显示的程序,运行前需要将AndroidManifest.xml中FourDigitalActivity的启动设置注释取消,并将MainActivity的启动设置注销掉。

修改AndroidManifest.xml

程序分析

首先,我们对控制数字的各个段的GPIO进行定义,即digital[0]~digital[7];对控制数码管4位数字是否显示的GPIO进行定义,即showDigital[0]~showDigital[3]。

定义GPIO

初始化时,我们让所有段、所有数字都不现实,因为是4位共阳数码管,我们将所有段对应的GPIO置为高电平,Gpio.DIRECTION_OUT_INITIALLY_HIGH;将各位数字是否显示的GPIO设置低电平,Gpio.DIRECTION_OUT_INITIALLY_LOW。

初始化完成后,我们先依次显示每位数字的每个段进行一下测试,即代码中调用testDigitalSegment()方法。具体代码不再贴出,逻辑摘要如下:

for-each showDigital[d]            //循环每一位数字
      showDigital[d].setValue(true);   //控制这一位数字显示(置高电平)
      for-each digital[i]        //循环数字的每一段
              digital[i].setValue(false);            //控制这一段显示(置低电平)
              Thread.sleep(200);                    //持续200ms
              digital[i].setValue(true);              //关闭这一段显示(置高电平)
      showDigital[d].setValue(false);    //控制这一位数字不显示(置低电平)

这样,我们就能依次看到各位数字的各段依次显示的效果了:https://github.com/sysolve/androidthings-digitalDisplay#testdigitalsegment

每段都显示完成后,接下来依次显示数字。

测试依次显示数字

首先我们要定义0-9这10个数字对应数码管各段显示的真值表,真值表与1位数码管显示的例子相同,即数字8显示的真值表为7段都为true,只有最后个点为false。

因为我们用的4为数码管是共阳的数码管,低电平时对应段才显示,我已在使用真值表中的值时,需要先取反。接下来我们来看testDisplayDigital()方法,逻辑如下:

for i = -1 to 10    //依次显示0-9的数字,为-1时不现实
        for-each showDigital[d]    //遍历每一位数字,即依次在各位数码管上显示数字
                 displayDigital(i);    //调用displayDigital(i)方法,设置显示数字i
                 showDigital[d].setValue(true);    //设置指定位的数码管显示
                 Thread.sleep(500);    //持续500ms
                 showDigital[d].setValue(false);    //设置指定位的数码管不显示

在displayDigital()方法中,我们从真值表中获得指定数字d各段是否显示,并循环设置GPIO,注意,设置GPIO时要先取反。

设置数字对应数码管的GPIO

这样我们就能看到0~9的数字,依次在数码管的各位上显示出来:https://github.com/sysolve/androidthings-digitalDisplay#testdisplaydigital

最后,我们来看看如何通过4位数码管显示4位数字,我们来做个自动累加计数器,并将计数器的数值显示在数码管上。

//自动计数
autoIncNumber();

//将自动计数的数值显示在4位数码管上
display4Digitals();

autoIncNumber()每隔1秒调用一次,即每秒计数+1,并将计数器值转换成4位数字分别存放在digitalForDisplay[]数组中。

display4Digitals()方法是一个持续扫描数码管的各个数位,并将计数器值的对应位显示在对应的数码管对应位上的方法。

while (true)      //持续刷新显示
            for-each showDigital[d]           //依次在每位数码管上显示             
                     //先设置显示的数码管段
                     displayDigital(digitalForDisplay[d]);

//设置对应的数码管位开启显示
                     showDigital[d].setValue(true);

Thread.sleep(2);           //扫描时间越短,数字显示的闪烁感越弱,如将数值改大,则会看到各个数字位依次显示的效果

//设置对应的数码管位关闭显示
                     showDigital[d].setValue(false);

这样,我们就完成了数码管显示4位数字:https://github.com/sysolve/androidthings-digitalDisplay#display4digitals

写在后面

1. 数码管可以显示小数点,感兴趣的朋友,可以尝试一下用4位数码管显示小数。

2. 4位数码管显示时,会发现亮度忽亮忽暗的情况,这是因为Android并非实时系统,显示延时并不精确,而扫描各位数字显示时,时间长短直接影响显示亮度。

3. 占用过多GPIO,树莓派3B一共有13个GPIO,NXP Pico iMX7D只有12个,而这个4位数码管就用掉了12个GPIO!

4. 本案例只是为了讲解4位数码管的原理,通常在实际使用中,我们会使用专门的控制芯片去控制数码管的显示,由专用芯片实现数码管各位的扫描显示。通常只需要2~3个GPIO进行数据通讯,主控板将要显示的内容发送给数码管控制芯片即可,具体的扫描显示过程由专用芯片完成,专用芯片中的实时系统保证显示的效果更稳定。在《Android Things创客DIY第五课-硬件开发案例教程-PWM调色-触摸开关-数码管显示-OLED显示》中介绍的带冒号4位数码管,就是通过专用芯片控制数码管显示的。

Android Things创客DIY第六课-Android Things入门配件包开发案例教程-4位数码管显示相关推荐

  1. 【Android】Android应用开发案例教程

    <Android应用开发案例教程(高等学校计算机科学与技术项目驱动案例实践规划教材)>应用"项目驱动(project-driven) "最新教学模式,通过完整的项目案例 ...

  2. android开发菜单,Android学习指南之十六:Android菜单详解

    Android用户界面的组成除了View外,还包括菜单和对话框,本节我们先来学习一下菜单的使用方法. 菜单Menu是Android用户界面中最常见的元素之一,使用非常频繁.Android菜单主要分为三 ...

  3. Android开发案例教程吴志祥,Android应用开发案例教程(Android Studio版)

    本书内容浅显易懂,可操作性强.全书共分9章,第1-7章详细介绍了Android Studio基础知识,包括Android UI设计.Activity与多个用户界面.多媒体播放与录制.广播与服务.数据存 ...

  4. android数据库开发案例教程,Android Studio项目开发教程 第6章 数据库编程(30页)-原创力文档...

    ;目录;;;;;;6.3 SQLite数据库的操作;;;;表 6.1 Cursor类提供的常用方法;;;;;6.5购物商城的数据库编程;使用Activity类中的 getPreferences方法获取 ...

  5. 第六篇:拦截器( MVC案例教程(基于ASP.NET MVC beta))

    http://ljl-xyf.javaeye.com/blog/725196 摘要       本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论A ...

  6. 【直播回顾】Hello HarmonyOS应用篇第六课——短视频应用开发

    由HDE夏德旺老师主讲的Hello HarmonyOS进阶系列应用篇第六课<短视频应用开发>, 已于6月8日晚上 19 点在HarmonyOS社群内成功举行. 本节课夏德旺老师带领大家了解 ...

  7. Android Studio第六课:模仿QQ登录跳转

    Android Studio第六课:模仿QQ登录跳转 导包,添加依赖 登陆界面 欢迎界面 主界面 导包,添加依赖 找到build.gradle,后缀是自己建的项目名 // 基础依赖包,必须要依赖imp ...

  8. 浅入浅出 Android 安全:第六章 Android 安全的其它话题

    第六章 Android 安全的其它话题 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们会涉及到与 Andro ...

  9. ffmpeg实战教程(六)Android CMake实现解码(MP4转YUV)

    ffmpeg实战教程(六)Android CMake实现解码(MP4转YUV) 我们将使用最新版: 最新版ffmpeg ffmpeg3.3  新版Android studio Android stud ...

最新文章

  1. java 远程调试超时_java 远程调试
  2. 72.数据库中什么叫码?
  3. 教你从0到1搭建秒杀系统-缓存与数据库双写一致
  4. MyBatisPlus中updateById与updateAllColumnById方法区别
  5. Netronome为中国云计算大幅提速升效降成本
  6. 【Python基础】Python数据分析实战之分布分析
  7. IBM TS3200 Drive故障处理方案
  8. Vue CLI 3开发中屏蔽烦人的EsLint错误
  9. php中在网页中显示图片代码,用PHP将网页上的Canvas图像保存到服务器上的方法
  10. python中的LEGB 规则
  11. Linux误删C基本运行库libc.so.6处理方法
  12. 尚硅谷nginx学习笔记
  13. 将RP文件导出为HTML文件
  14. 重要知识结构-持续更新中
  15. python画网络图_python3中NetworkX网络图绘制
  16. 什么是Data Matrix二维码
  17. 通过GPU服务器运行Carla
  18. python 方差齐性检验_已知F和sig值_方差齐性 sig_如何判断方差齐性_怎么判断方差齐不齐...
  19. window系统 node.js安装 (node-v14安装配置、node-v16及其他版本安装配置)
  20. EPICS ‘makeBaseApp’ IOC

热门文章

  1. Yes I can——强兵是怎样炼成的
  2. 小明和小强的故事==很值得我们深思
  3. CF1474A Puzzle From the Future (模拟
  4. 超声波牙刷VS电动牙刷
  5. c#winform程序的改名(修改名称)
  6. 提取式存储才是最佳的记忆方法
  7. c#图像处理(OpenCVSharp)
  8. python中常见的内置函数_python常用内置函数
  9. 「冰果」一曲新时代的招隐之歌
  10. 上古世纪服务器维护真情礼,4月9日例行维护怀旧服合服公告