[时间:2017-05] [状态:Open]

[关键词:sdl2,数字,七段数码管,图形显示,示例代码]

0 引言

本文是针对我的step-into-sdl2/7LedDigit的原理介绍,有兴趣的可以去下载源码。

本文主要目标是使用SDL图形接口实现类似七段数码管的LED显示效果。

1 七段数码管简介

通常LED显示一个10进制数字(0-9)都使用七个LED(点亮或者熄灭),如下图:

  1. + --0-- +
  2. | |
  3. 5 1
  4. | |
  5. + --6-- +
  6. | |
  7. 4 2
  8. | |
  9. + --3-- +

这里按照顺时针的方向将0-6编号的七个数码管组成数字,如果全部点亮就是数字8,如果编号为6的数码管不点亮,就是数字0。如果我们依次把0-6的编号数码管对应到一个字节的低位到高位,因此可以使用二进制分别对0-9进行编码。对应下表:

dec 对应的二进制编码
0 0x3F
1 0x06
2 0x5B
3 0x4F
4 0x66
5 0x6D
6 0x7D
7 0x07
8 0x7F
9 0x6F
E 0x79

注:这里还定义一个错误的字母E,如果遇到无法识别的字符,可以直接显示错误。

至此七段数码管基本原理介绍完毕。我们可以简单的用一个矩形表示一个数码管,显示的话表示点亮1,不显示的话表示不点亮0

2 SDL中矩形的显示

SDL2中提供了SDL_RenderFillRectsSDL_RenderFillRect用于填充矩形,可以用这个实现。

  1. int SDL_RenderFillRects(SDL_Renderer* renderer,
  2. const SDL_Rect* rects,
  3. int count);
  4. int SDL_RenderFillRect(SDL_Renderer* renderer,
  5. const SDL_Rect* rect)

3 代码部分说明

其实绘制部分最主要的关于七个数码管显示位置的计算。这需要一定的区域规划和大小控制。具体代码如下:

  1. void SegmentDigit::calculate_pos(const SDL_Rect & rc)
  2. {
  3. int middle = (rc.y + rc.h/2);
  4. SDL_Rect outer_rc = rc;
  5. inflate_rect(outer_rc, -m_margin, -m_margin); // 缩放一个矩形线条宽度,然后再缩放一下
  6. SDL_Rect inner_rc = outer_rc;
  7. inflate_rect(inner_rc, -m_margin, -m_margin);
  8. // U = 0
  9. m_seg_rect[U].x = inner_rc.x; m_seg_rect[U].y = outer_rc.y;
  10. m_seg_rect[U].w = inner_rc.w; m_seg_rect[U].h = m_margin;
  11. // RU = 5
  12. m_seg_rect[RU].x = inner_rc.x + inner_rc.w;
  13. m_seg_rect[RU].y = inner_rc.y;
  14. m_seg_rect[RU].w = m_margin;
  15. m_seg_rect[RU].h = (inner_rc.h-m_margin)/2;
  16. // RD = 4
  17. m_seg_rect[RD].x = inner_rc.x + inner_rc.w;
  18. m_seg_rect[RD].y = middle + m_margin/2;
  19. m_seg_rect[RD].w = m_margin;
  20. m_seg_rect[RD].h = inner_rc.h/2;
  21. // D = 3
  22. m_seg_rect[D].x = inner_rc.x; m_seg_rect[D].y = inner_rc.y + inner_rc.h;
  23. m_seg_rect[D].w = inner_rc.w; m_seg_rect[D].h = m_margin;
  24. // LD = 2
  25. m_seg_rect[LD].x = outer_rc.x;
  26. m_seg_rect[LD].y = middle + m_margin/2;
  27. m_seg_rect[LD].w = m_margin;
  28. m_seg_rect[LD].h = inner_rc.h/2;
  29. // LU = 1
  30. m_seg_rect[LU].x = outer_rc.x;
  31. m_seg_rect[LU].y = inner_rc.y;
  32. m_seg_rect[LU].w = m_margin;
  33. m_seg_rect[LU].h = (inner_rc.h-m_margin)/2;
  34. // M = 6
  35. m_seg_rect[M].x = inner_rc.x; m_seg_rect[M].y = middle - m_margin/2;
  36. m_seg_rect[M].w = inner_rc.w; m_seg_rect[M].h = m_margin;
  37. }

在调用时建议设置绘制的矩形区域宽高比为0.6。

4 小结

本文仅作为SDL2图形绘制的示例部分,也可作为数字时钟绘制的参考代码。

由于sdl2支持的图形绘制较少,所以LED显示效果略差。

最终绘制效果请参考step-into-sdl2的示例一。

SDL示例一:实现七段数码管的显示的更多相关文章

  1. python 利用turtle库绘制七段数码管的方式,绘制当前事件(时分秒00:00:00)

    # coding:utf-8# 绘制七段数码管,显示当前时间import timeimport turtle as tt # 绘制间隔def drawGap(): tt.penup() tt.fd(3 ...

  2. 使用Python的turtle库实现七段数码管绘制

    七段数码管绘制:七段数码管是由7段数码管拼接而成,每段有亮或不亮两种情况,改进的七段数码管还包括一个小数点位置.七段数码管能形成2=128种状态,其中部分状态能够显示易于人们理解的数字或字母含义.因此 ...

  3. FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码

    这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...

  4. [Python 3.X]python练习笔记[2]-----用python实现七段数码管显示年月日

    #SevenDigitsDrawV2.py import turtle import time def drawGap(i):#绘制数码管间隔 turtle.penup() turtle.fd(i) ...

  5. Python入门基础:七段数码管绘制

    1.在学习Python的过程中,运用所学的一些基础知识,进行一些简单的编程,可以收获很多乐趣.在生活中,LED灯无处不在,荧幕显示的广告词,给我们呈现出动态的视觉效果.下面,则以最简单的显示日期为例, ...

  6. #Python语言程序设计Demo - 七段数码管绘制

    Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...

  7. 基于turtle库的七段数码管绘制

    ·文章结构 >样例及概览 >函数框架分析 >功能发展·样例及概览 七段数码管,是信号灯.电子表等很多设备的显示形式.而利用python的turtle库,我们也可以模拟着写出一个动态生 ...

  8. 【Python】七段数码管绘制问题

    问题分析: 绘制路径: 代码: import turtle #引入绘图库turtle def drawLine(draw): #绘制单段数码管 turtle.pendown() if draw els ...

  9. [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

    关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇 ...

随机推荐

  1. Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)

    Linux学习之文件特殊权限详解(SetUID.SetGID.Sticky BIT) 目录 SetUID SetGID Sticky BIT SetUID SetUID简介 只有可以执行的二进制程序和 ...

  2. Qt学习之信号与槽(一)

    Qt学习之信号与槽(一) 目录 QT的信号与槽机制 在窗口的UI设计中操作添加信号和槽     QT的信号与槽机制   QT的两种机制 在Qt和PyQt中有两种通信机制: 低级事件处理机制(low-l ...

  3. Hash值破解工具Hashcat使用

    Hash值破解工具Hashcat使用 Hashcat介绍 HashCat系列软件拥有十分灵活的破解方式,可以满足绝大多数的破解需求. Hashcat系列软件是比较牛逼的密码破解软件,系列软件包含Has ...

  4. 分布式服务注册中心XXL-REGISTRY

    <分布式服务注册中心XXL-REGISTRY> 一.简介 1.1 概述 XXL-REGISTRY 是一个轻量级分布式服务注册中心,拥有"轻量级.秒级注册上线.多环境.跨语言.跨机 ...

  5. vue-particles粒子动画效果

    1.安装vue-particles依赖包 npm install vue-particles --save-dev 2.在main.js文件中引入并使用 import Vue from 'vue' i ...

  6. JAXB注解 @XmlRootElement 及XML文件解析详解

    @Retention(value=RUNTIME) @Target(value=TYPE) public @interface XmlRootElement @Inherited @Retention ...

  7. MySQL中查询获取每个班级成绩前三名的学生信息

    CREATE TABLE t_testscore( pk_id INT PRIMARY KEY, c_name VARCHAR(50) , c_score INT, c_class INT )DEFA ...

  8. 项目冲刺Fifth

    Fifth Sprint 1.各个成员今日完成的任务 蔡振翼:编写博客,了解php 谢孟轩:无 林凯:优化登录判断逻辑,熟悉相关php及mysql数据库技术的使用 肖志豪:帮助组员 吴文清:实现管理员 ...

  9. Python3练习题系列(07)——列表操作原理

    目标: 理解列表方法的真实含义. 操作: list_1.append(element) ==> append(list_1, element) mystuff.append('hello') 这 ...

  10. Windows 文件名的书写规范

    下面是不能用于文件名的: / \ : * " < > | windows系统下文件名长度为: 255个英文字符(DOS下8.3格式),包括文件名和扩展名在内,或者是255/2=1 ...