博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDL示例一:实现七段数码管的显示
阅读量:6762 次
发布时间:2019-06-26

本文共 2399 字,大约阅读时间需要 7 分钟。

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

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

0 引言

本文是针对我的的原理介绍,有兴趣的可以去下载源码。

本文主要目标是使用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_RenderFillRectsSDL_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显示效果略差。

最终绘制效果请参考的示例一。

转载地址:http://cgfeo.baihongyu.com/

你可能感兴趣的文章
安装部署elasticsearch
查看>>
Bluefish
查看>>
centos 安装cmake 3.3.2
查看>>
ubuntu gitlab服务器搭建
查看>>
文本文件里如何快速在每行头尾都加上指定的内容
查看>>
WebGL绘制有端头的线
查看>>
仿照 ButterKnife 的 Android 注解实例
查看>>
为少欠技术债,开发经理应该做的事
查看>>
C#中获得汉字的首拼音(加强版)
查看>>
structure needs cleaning
查看>>
CentOS 7安装WordPress
查看>>
mybatis的jdbcType和javaType、oracle,MySQL的对应类型
查看>>
openxml in sql server
查看>>
Relational Algebra 关系代数
查看>>
node的http请求
查看>>
蓝牙Profile的概念和常见种类(转)
查看>>
Kafka 配置
查看>>
Ddr2,ddr3,ddr4内存条的读写速率
查看>>
MySQL 索引与查询优化
查看>>
static final常量变量的正确书写规范
查看>>