掌上实验室V8系列教程(三)数码管动态显示
目录
1 项目功能
2 电路原理
3 动态显示原理
4 示例代码
6 扩展功能
7 参考资源
1 项目功能
4位数码管动态显示
2 电路原理
3 动态显示原理
一位八段式数码管内部有8个LED,习惯上称为a,b,c,d,e,f,g,dp,排列顺序如上图所示。根据公共端的接法不同,分为共阳极数码管和共阴极数码管两类。如果要显示3,就要点亮对应的a,b,c,d,g等5个LED。
数码管的8个LED刚好对应一个字节。为了编程方便,我们把显示的字形对应的字形码列表如下,表中h对应dp。
如果需要多位数码管,有两种形式,一种是采用4个单独的数码管,每个数码管需要8根IO线来控制,4个数码管共需要32个IO口线。这种方式每个数码管都是独立控制,称为静态显示电路。优点是编程比较方便,但缺点也很明显,需要占用比较多的口线。另外一种方式是把4个数码管的字形控制引脚并联连接,比如掌上实验室V8采用4位共阳数码管的内部电路如下图所示。
这种电路优点是所需IO口线少,4根位控线+8根段控线,总共只需12根IO口线;由于4个数码管共用8根段控线,所以不能同时显示4个不同的内容。这时候需动态扫描显示。
例如我们想显示1234,由于不能同时显示,就采用扫描的办法。先在第1位显示1,然后在第2位上显示2,接着在第3位上显示3,最后在第4位上显示4。然后就动画一样循环显示。
由于人眼视觉暂留效应,当循环速度很快时,实际人眼看到的是如下图所示,亮度变成了平均亮度,会感觉变暗。
这种显示方式需要一直刷新,所以程序设计和静态显示比会稍微复杂一些。
刷新流程如下:
4 示例代码
#include "at32f403a_407_conf.h"//端口初始化
void gpio_pins_init(void)
{//打开GPIO时钟crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);//配置PD2~PD5, PE0~PE7为输出gpio_init_type gpio_init_struct;gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7;gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_pull = GPIO_PULL_NONE;gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init(GPIOE, &gpio_init_struct);gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5;gpio_init(GPIOD, &gpio_init_struct);
}//显示缓冲区定义
uint8_t disp_buf[4];//显示整数
void display_dec_int(int num)
{static uint8_t tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};disp_buf[0] = tab[num/1000%10];disp_buf[1] = tab[num/100%10];disp_buf[2] = tab[num/10%10];disp_buf[3] = tab[num%10];
}//扫描刷新
void display_scan()
{static int cur_digit = 0;//全关gpio_bits_set(GPIOD, GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5); //输出字形码gpio_bits_reset(GPIOE, 0xff); //PE0~PE7 = 0gpio_bits_set(GPIOE, disp_buf[cur_digit]); //打开对应位开关gpio_bits_reset(GPIOD, GPIO_PINS_2 << cur_digit);//更新cur_digit, 准备下一次扫描cur_digit = (cur_digit + 1) % 4;
}int main(void)
{gpio_pins_init();display_dec_int(1234);for(;;){display_scan();}
}
6 扩展功能
我们根据上述原理,增加一个16进制显示的函数和关闭显示的函数
void display_hex_int(int num)
{static uint8_t tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};disp_buf[0] = tab[num/0x1000%16];disp_buf[1] = tab[num/0x100%16];disp_buf[2] = tab[num/0x10%16];disp_buf[3] = tab[num%16];
}void display_off(void)
{disp_buf[0] = 0xff;disp_buf[1] = 0xff;disp_buf[2] = 0xff;disp_buf[3] = 0xff;
}
7 参考资源
《掌上实验室V8》 原理图
AT32F403A AT32F407 固件库2.0.2 应用说明
掌上实验室V8系列教程(三)数码管动态显示相关推荐
- 掌上实验室V8系列教程(四)定时器PWM输出
1 项目功能 三色RGB LED 通过PWM 调色 2 电路原理 我们可以通过3路PWM波分别调整RGB三个二极管的亮度,即调整RGB的比例,合成不同的颜色. PWM,英文名Pulse Width M ...
- 掌上实验室V8系列教程(八)ADC模数转换
目录 1 项目功能 2 ADC工作原理 3 电路原理图 4 AT32 ADC应用 4.1 ADC基础操作流程 4.2 ADC触发 4.3 ADC采样和转换时间 4.4 读取ADC转换结果 5 示例程序 ...
- 掌上实验室V8系列教程(二)跑马灯
目录 1 项目功能 2 电路原理 3 软件流程 4 程序设计 5.参考资源 1 项目功能 循环点亮LED4, LED5, LED6, LED7 2 电路原理 根据硬件电路图,PC0输出"0& ...
- 掌上实验室V8系列教程(七)I2C应用 HP203B
目录 1 项目功能 2 电路原理图 3 传感器HP203B 3.1 HP203B功能 3.2 HP203B技术指标 3.3 HP203B I2C总线接口命令 4 示例代码 1 项目功能 通过HB203 ...
- 掌上实验室V8系列教程(九)光电编码器转速测量
1 项目功能 通过光电编码器进行转速测量 2 光电编码器工作原理 光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器.这是应用最多的传感器,光电编码器是由光源.光码盘和 ...
- 掌上实验室V8系列教程(五)定时器中断及应用
1 项目目标 利用定时器产生周期为1ms的中断,作为系统时基.并在数码管上显示开机时间(分辨率为0.1秒):同时实现LED4.LED5.LED6和LED7分别以300ms.220ms.450ms和70 ...
- 基于雅特力AT32的 《掌上实验室》V8
1 项目介绍 掌上实验室V8是由中国计量大学现代科技学院和雅特力共同研发的一款ARM学习板,内置AT-Link-Ez仿真器. 主MCU采用雅特力AT32F407VGT7. 板上资源: 1.通信接口 1 ...
- Fastify 系列教程三 (验证、序列化和生命周期)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...
- 毕业设计-基于微信小程序的“掌上实验室” 安全教育与管理系统
目录 前言 课题背景与简介 实现设计思路 一."掌上实验室"安全教育与管理 平台功能架构 二."掌上实验室"的功能设计 三."掌上实验室"的 ...
最新文章
- 虚拟网卡技术-VETH、MACVLAN、IPVLAN
- win10无法连接wifi_手机连接WIFI但是无法上网?3个办法帮您解决!
- Qt数据库操作(三) -- 使用SQL模型类
- 钉钉宜搭3.0发布!易连接、酷数据、更安全
- mongodb数据迁移2种方式比较
- 弱水三千 之 统计独立性、统计相关性辨析
- AMD将于年内推出高端Polaris图形处理器
- sql server 内存_SQL Server内存性能指标–第6部分–其他内存指标
- NYOJ463 - 九九乘法表
- java 中的匿名内部类
- 8天入门wpf—— 第四天 模板
- 日常中的迅捷PDF转换器
- 命令行解析工具gflags
- 远程软件TeamViewer如何导出选项注册表文件?
- graphpadY轴设置刻度不均匀_Matlab画图技巧: 不需要敲代码的傻瓜式操作流程
- SDUT 第十届校赛H menhera酱那惨不忍睹的数学 【二分图 || 网络流】
- 用python刷微信投票_微信投票知道 微信刷票能否python抓取微信投票_大师网络投票刷票网...
- python画布删除图形_Matplotlib在savefig之后从画布中清除旧图形
- android 根目录uri,如何在根目录下创建一个文件夹Android
- MFSK调制与相干解调-MATLAB基带仿真
热门文章
- PhotoShop基础使用
- 榕树贷款分布式共识算法分为CFT与BFT(榕树贷款)
- 【监控仪表系统】Grafana 中文入门教程 | 构建你的第一个仪表盘
- 使用tftpd32搭建PXE服务器——从FTP服务器下载内核及INITRD文件
- MySQL语句之show
- Altium Designer,PCB处理最后GND以及铺铜经验
- 【转】使用bt4(Backtrack)破解无线路由(无线网络/无线AP)密码/wep加密/Aircrack-ng
- ButterKnife 牛油刀使用
- 转载:哈佛大学精神病测试题(笑话)
- 爱迪麦斯 无线路由