SDL示例一:实现七段数码管的显示
[时间:2017-05] [状态:Open]
[关键词:sdl2,数字,七段数码管,图形显示,示例代码]
0 引言
本文是针对我的step-into-sdl2/7LedDigit的原理介绍,有兴趣的可以去下载源码。
本文主要目标是使用SDL图形接口实现类似七段数码管的LED显示效果。
1 七段数码管简介
通常LED显示一个10进制数字(0-9)都使用七个LED(点亮或者熄灭),如下图:
+ --0-- +
| |
5 1
| |
+ --6-- +
| |
4 2
| |
+ --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_RenderFillRects和SDL_RenderFillRect用于填充矩形,可以用这个实现。
int SDL_RenderFillRects(SDL_Renderer* renderer,
const SDL_Rect* rects,
int count);
int SDL_RenderFillRect(SDL_Renderer* renderer,
const SDL_Rect* rect)
3 代码部分说明
其实绘制部分最主要的关于七个数码管显示位置的计算。这需要一定的区域规划和大小控制。具体代码如下:
void SegmentDigit::calculate_pos(const SDL_Rect & rc)
{
int middle = (rc.y + rc.h/2);
SDL_Rect outer_rc = rc;
inflate_rect(outer_rc, -m_margin, -m_margin); // 缩放一个矩形线条宽度,然后再缩放一下
SDL_Rect inner_rc = outer_rc;
inflate_rect(inner_rc, -m_margin, -m_margin);
// U = 0
m_seg_rect[U].x = inner_rc.x; m_seg_rect[U].y = outer_rc.y;
m_seg_rect[U].w = inner_rc.w; m_seg_rect[U].h = m_margin;
// RU = 5
m_seg_rect[RU].x = inner_rc.x + inner_rc.w;
m_seg_rect[RU].y = inner_rc.y;
m_seg_rect[RU].w = m_margin;
m_seg_rect[RU].h = (inner_rc.h-m_margin)/2;
// RD = 4
m_seg_rect[RD].x = inner_rc.x + inner_rc.w;
m_seg_rect[RD].y = middle + m_margin/2;
m_seg_rect[RD].w = m_margin;
m_seg_rect[RD].h = inner_rc.h/2;
// D = 3
m_seg_rect[D].x = inner_rc.x; m_seg_rect[D].y = inner_rc.y + inner_rc.h;
m_seg_rect[D].w = inner_rc.w; m_seg_rect[D].h = m_margin;
// LD = 2
m_seg_rect[LD].x = outer_rc.x;
m_seg_rect[LD].y = middle + m_margin/2;
m_seg_rect[LD].w = m_margin;
m_seg_rect[LD].h = inner_rc.h/2;
// LU = 1
m_seg_rect[LU].x = outer_rc.x;
m_seg_rect[LU].y = inner_rc.y;
m_seg_rect[LU].w = m_margin;
m_seg_rect[LU].h = (inner_rc.h-m_margin)/2;
// M = 6
m_seg_rect[M].x = inner_rc.x; m_seg_rect[M].y = middle - m_margin/2;
m_seg_rect[M].w = inner_rc.w; m_seg_rect[M].h = m_margin;
}
在调用时建议设置绘制的矩形区域宽高比为0.6。
4 小结
本文仅作为SDL2图形绘制的示例部分,也可作为数字时钟绘制的参考代码。
由于sdl2支持的图形绘制较少,所以LED显示效果略差。
最终绘制效果请参考step-into-sdl2的示例一。
SDL示例一:实现七段数码管的显示的更多相关文章
- python 利用turtle库绘制七段数码管的方式,绘制当前事件(时分秒00:00:00)
# coding:utf-8# 绘制七段数码管,显示当前时间import timeimport turtle as tt # 绘制间隔def drawGap(): tt.penup() tt.fd(3 ...
- 使用Python的turtle库实现七段数码管绘制
七段数码管绘制:七段数码管是由7段数码管拼接而成,每段有亮或不亮两种情况,改进的七段数码管还包括一个小数点位置.七段数码管能形成2=128种状态,其中部分状态能够显示易于人们理解的数字或字母含义.因此 ...
- FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码
这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...
- [Python 3.X]python练习笔记[2]-----用python实现七段数码管显示年月日
#SevenDigitsDrawV2.py import turtle import time def drawGap(i):#绘制数码管间隔 turtle.penup() turtle.fd(i) ...
- Python入门基础:七段数码管绘制
1.在学习Python的过程中,运用所学的一些基础知识,进行一些简单的编程,可以收获很多乐趣.在生活中,LED灯无处不在,荧幕显示的广告词,给我们呈现出动态的视觉效果.下面,则以最简单的显示日期为例, ...
- #Python语言程序设计Demo - 七段数码管绘制
Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...
- 基于turtle库的七段数码管绘制
·文章结构 >样例及概览 >函数框架分析 >功能发展·样例及概览 七段数码管,是信号灯.电子表等很多设备的显示形式.而利用python的turtle库,我们也可以模拟着写出一个动态生 ...
- 【Python】七段数码管绘制问题
问题分析: 绘制路径: 代码: import turtle #引入绘图库turtle def drawLine(draw): #绘制单段数码管 turtle.pendown() if draw els ...
- [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图
关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇 ...
随机推荐
- HDU 2612 find a way 【双BFS】
<题目链接> 题目大意:两个人分别从地图中的Y 和 M出发,要共同在 @ 处会面(@不止有一处),问这两个人所走距离和的最小值是多少. 解题分析: 就是对这两个点分别进行一次BFS,求出它 ...
- POJ1125-Stockbroker Grapevine【Floyd】(模板题)
<题目链接> 题目大意: 题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时,输入数据结束),然后接下来N行描述第i(1<=i<=N)个经纪人与其他经纪人的 ...
- Apache目录结构解释
源地址:http://blog.51cto.com/marsman/1913676 本文主要讲述apache主要目录结构及主要配置文件 1.apache目录结构 [root@test apache]# ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
- python——append与extend
编者注:本文主要参考了<Python核心编程(第二版)> 网上有很多对这两个函数的区别讲解,但我觉得都讲的不是很清楚,记忆不深刻.这样解释清楚且容易记住. list.append(obje ...
- 关于Oracle游标out参数多层调用的BUG,ORA-06504
数据库版本 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit 测试代码 declare p_cur sys_refcu ...
- Install LAMP Stack On Ubuntu 16.04
原文:http://www.unixmen.com/how-to-install-lamp-stack-on-ubuntu-16-04/ LAMP is a combination of operat ...
- 偷懒啦!button多了,这样写既简洁又高效
在日常的项目中,我最喜欢用button了,但是button多了,写起来又枯燥又费时,今天学到一方法,绝对简单高效! 看看以前: 看吧,这还只是声明,接下来还有: 等等……,是不是很麻烦?现在找到新方法 ...
- delphi获取文件的创建/修改时间、按时间删除指定文件下的文件
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrl ...
- 动态ip、静态ip、pppoe拨号的区别
pppoe拨号 pppoe拨号上网,又叫做ADSL拨号上网.宽带拨号上网.指现在有很多我的E家用户,送的无线猫,阉割了PPPOE拨号功能,必须要从电脑上拨号才能上网.还有大街上的WIFI热点也很多,如 ...