zoukankan      html  css  js  c++  java
  • 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_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显示效果略差。

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

  • 相关阅读:
    vue全局启用 emulateJSON 选项
    vue全局配置数据接口的根域名
    CSS实现按钮YES-NO按钮+Jquery获取按钮状态。
    Redis命令
    在js中获取 input checkbox里选中的多个值
    Python中常见字符串去除空格的方法总结
    e.target.value和this的区别
    用脚本来运行scrapy crawl ...
    生成器的两种方式
    python中ord()函数,chr()函数,unichr()函数
  • 原文地址:https://www.cnblogs.com/tocy/p/sdl-sample-7-segment-digit.html
Copyright © 2011-2022 走看看