4位数码管,带小数显示方法
说明
4位数码管,带小数点,最大显示整数为9999;最多显示3位小数,例:0.123。
#define HAL_DIGITAL_TUBE_MUTIPLE (1000) //可以改为10的整数倍倍数, 放大倍数, 要显示1.234,请输入1234
#define HAL_DIGITAL_TUBE_DISPLAY_HZ (5) //自动刷新频率,可以关闭
代码
/**************************************************************************/
#ifdef PRINT_HEADER
#undef PRINT_HEADER
#endif
#define PRINT_HEADERx "DT> "#ifdef PRINT_HEADER
#ifndef print
#undef print
#endif
#define print(...) do{Debug(PRINT_HEADER);Debug(__VA_ARGS__);}while(0)#ifndef println
#undef println
#endif
#define println(...) do{Debug(PRINT_HEADER);Debugln(__VA_ARGS__);}while(0)#ifndef print_hex
#undef print_hex
#endif
#define print_hex(_x,_y) do{DebugHex(_x, _y);}while(0)
#else
#ifndef print
#undef print
#endif
#define print(...)#ifndef println
#undef println
#endif
#define println(...)#ifndef print_hex
#undef print_hex
#endif
#define print_hex(_x,_y)
#endif
/**************************************************************************/
#define HAL_DIGITAL_TUBE_MUTIPLE (1000)
#define HAL_DIGITAL_TUBE_DISPLAY_HZ (5)
/**************************************************************************/uint16_t hal_digital_tube_timer = 0;
//uint16_t hal_digital_tube_display_hz = HAL_DIGITAL_TUBE_DISPLAY_HZ;
uint32_t hal_digital_tube_display_new_num = 0;
uint32_t hal_digital_tube_display_last_num = 0;
uint8_t decimal_dispaly_digits = 0;
/**************************************************************************/
void hal_digital_tube_write_num(uint8_t dig, char num, bool dot);
/**************************************************************************/
void hal_digital_tube_init(void)
{aip650_init();aip650_write_cmd(AIP650_ADDR_SETING, AIP650_CMD_SYSON_3_8SEG_ON);decimal_dispaly_digits = math_get_digits(HAL_DIGITAL_TUBE_MUTIPLE - 1) ;//hal_digital_tube_timer = 1000;// HAL_DIGITAL_TUBE_DISPLAY_HZ + 1;hal_digital_tube_decimal(0);
}
/*************************************************************************************************** @fn hal_digital_tube_update** @brief just update, display in poll** @param uint32_t num** @return None**************************************************************************************************/
void hal_digital_tube_update(uint32_t num)
{hal_digital_tube_display_new_num = num;
}
/*************************************************************************************************** @fn hal_digital_tube_integer** @brief display at once** @param uint32_t num** @return None**************************************************************************************************/
void hal_digital_tube_integer(uint32_t num)
{char n = 0;char display_buff[AIP_DIGITAL_TUBE_DIGITS] = {AIP650_NUM_NULL};hal_digital_tube_display_new_num = num;if(hal_digital_tube_display_new_num != hal_digital_tube_display_last_num){hal_digital_tube_display_last_num = hal_digital_tube_display_new_num;uint16_t integer = hal_digital_tube_display_last_num;for(n = 0; n < AIP_DIGITAL_TUBE_DIGITS; n++){display_buff[n] = AIP650_NUM_NULL;}if(num){uint8_t digits = math_get_digits(integer) ;digits = digits > AIP_DIGITAL_TUBE_DIGITS?AIP_DIGITAL_TUBE_DIGITS:digits;println("digits %d", digits);for(n = 0; n < digits; n++){display_buff[AIP_DIGITAL_TUBE_DIGITS - 1 - n] = (integer % 10);integer /= 10;}}else{display_buff[AIP_DIGITAL_TUBE_DIGITS-1] = AIP650_NUM_0;}print_hex(display_buff, AIP_DIGITAL_TUBE_DIGITS);for(n = 0; n < AIP_DIGITAL_TUBE_DIGITS; n++){hal_digital_tube_write_num(n, display_buff[n], false);}}
}
/*************************************************************************************************** @fn hal_digital_tube_decimal** @brief display at once** @param uint32_t dec** @return None**************************************************************************************************/
void hal_digital_tube_decimal(uint32_t dec)
{char n = 0;char display_buff[AIP_DIGITAL_TUBE_DIGITS] = {AIP650_NUM_NULL};hal_digital_tube_display_new_num = dec;if(hal_digital_tube_display_new_num != hal_digital_tube_display_last_num){hal_digital_tube_display_last_num = hal_digital_tube_display_new_num;uint16_t decimal = hal_digital_tube_display_last_num % HAL_DIGITAL_TUBE_MUTIPLE;uint16_t integer = hal_digital_tube_display_last_num / HAL_DIGITAL_TUBE_MUTIPLE;uint8_t digits = math_get_digits(integer) ;uint8_t dec_digits, i = 0, base = 0;println("num %d, digits %d, integer %d", hal_digital_tube_display_last_num, digits, integer);digits = digits > AIP_DIGITAL_TUBE_DIGITS?AIP_DIGITAL_TUBE_DIGITS:digits;//integerif(!digits){display_buff[0] = AIP650_NUM_0 | AIP650_DOT;digits = 1; //at least 1 digitn = 1;println("no integer");} else{for(n = 0; n < digits; n++){base = math_pow(10, digits - 1 - n);if(n == (digits - 1))display_buff[n] = (integer / base) | AIP650_DOT;elsedisplay_buff[n] = integer / base;integer %= base;}}//decimaldec_digits = AIP_DIGITAL_TUBE_DIGITS - digits;println("dec_digits %d, decimal %d", dec_digits, decimal);for(i = 0; i < dec_digits; i++, n++){base = math_pow(10, decimal_dispaly_digits - 1 - i);display_buff[n] = decimal / base;println("i %d, decimal %d, base %d", i, decimal, base);decimal %= base;}print_hex(display_buff, AIP_DIGITAL_TUBE_DIGITS);for(n = 0; n < AIP_DIGITAL_TUBE_DIGITS; n++){hal_digital_tube_write_num(n, display_buff[n] & (~ AIP650_DOT), display_buff[n] & AIP650_DOT? true:false);}}
}
void hal_digital_tube_write_num(uint8_t dig, char num, bool dot)
{switch(dig){case 0:aip650_write_number(AIP650_ADDR_DIG0, (Aip650Num_e)(num), dot);break;case 1:aip650_write_number(AIP650_ADDR_DIG1, (Aip650Num_e)(num), dot);break;case 2:aip650_write_number(AIP650_ADDR_DIG2, (Aip650Num_e)(num), dot);break;case 3:aip650_write_number(AIP650_ADDR_DIG3, (Aip650Num_e)(num), dot);break;default:break;}
}
void hal_digital_tube_loop(void)
{if(hal_digital_tube_timer == 1){hal_digital_tube_timer = 1000 / HAL_DIGITAL_TUBE_DISPLAY_HZ + 1;hal_digital_tube_decimal(hal_digital_tube_display_new_num);}}uint8_t math_get_digits(uint32_t arg)
{uint8_t n = 0;while(arg != 0){arg /= 10;n++;}return n;}uint32_t math_pow(uint8_t base, uint8_t exponent)
{uint32_t value = 1;uint8_t n = 1;if(exponent){while(n++ <= exponent){value *= base;}}return value;}
4位数码管,带小数显示方法相关推荐
- STM32 4位数码管 无需芯片 显示方法
我使用的STM32F103C8T6 4位共阳数码管 数码管的多位显示,一开始认为多位显示必须用芯片才可以,后来发现了一个新的思路,就是扫描的方式,逐字快速显示,肉眼无法察觉的频率,让其看似都在同时显示 ...
- 数字系统实验—第13周任务(3位数码管动态扫描显示实验含工程与优化)
数字系统实验--第13周任务 任务书 0.简介 1. 实验操作:1周 2. 完成并在线提交文档(100%) 日志(系统功能描述) 报告(目的 设计 实现 总结) 3. 三位数码管数据显示实验在线验收 ...
- 【Proteus仿真】8位数码管动态扫描显示变化数据
[Proteus仿真]8位数码管动态扫描显示变化数据 Proteus仿真 示例代码 /*-----------------------------------------------名称:8位数码管动 ...
- 【单片机】用定时器以间隔500ms在8位数码管上依次显示0、1、2、3、...C、D、E、F,重复
代码如下 #include <REGX52.H> #define uchar unsigned char #define uint unsigned int sbit LSA=P2^2; ...
- 4位数码管数字循环显示(201714350314为例)
/************************************************************************************** 动态数码管显示实验 * ...
- ActiveReport的小数显示方法
2019独角兽企业重金招聘Python工程师标准>>> 在ActiveReport中,在Detail中单价会默认地加上 .00, 例如: 2000.00 如果我希望能做到自动省略后面 ...
- 第三篇:动态 8位数码管显示---亚龙236电路
第三篇:动态8位数码管显示 -亚龙236电路 上一篇中已经实现了数码管的静态显示,如果按照上一篇的思路89s52芯片最多可以驱动4位数码管.这一节我们来看看其它显示更多位数的方案. 目前最常用的是 5 ...
- K_A02_003 基于单片机驱动8位数码管模块(MAX7219) 0-7静态显示+滚动显示
目录 一.资源说明 二.基本参数 1.电气参数 2.引脚说明 三.通信协议说明 工作时序 对应程序 四.部分代码说明 1.接线说明 1.1.STC89C52RC+8位数码管模块 1.2.STM32F1 ...
- Xbox Game Bar 实时显示帧数方法| Win10开启自带FPS显示
对于喜欢玩游戏的win10系统用户来说,Xbox Game Bar应该不陌生,同时这个功能里面还有一项实时帧率(FPS)工具.但是有些用户打开的时候,这项功能反而显示不出来.由于权限的缘故,首次使用往 ...
最新文章
- SpringMVC + Hibernate-Validator 参数校验
- 密码学研究-密钥长度限制
- 阿里云高级技术专家张毅萍:我眼中的边缘计算
- JSP 页面 jstl 时间戳 long型转时间
- 网络中的那些事儿(一)之神奇的通讯
- 元素显示模式转换(HTML、CSS)
- android自定义ViewPager之——水平滑动弹性效果
- 工程项目管理问题那么多,什么软件可以实现工程项目管理自动化
- JavaScript获取CSS内联样式和外联样式
- 居家办公提高工作效率的八点建议
- 贾玲,这次你是不是可以真的快乐了?
- 20190729杭电多校第三场
- 密码生成器(C语言实现)
- 传真系统的跨平台兼容和更换升级
- 定制Android模拟器skin
- Xshell7的下载和安装
- 计算机应用基础2004版,计算机应用基础2004年上半年全国试题
- 心理学与计算机交叉学专业,心理学与计算机的交叉学科有哪些?
- CentOS集群上安装Ganglia-3.6.1监控
- Nginx多策略流量分发
热门文章
- 在线会议中人脸面部轮廓图像提取(二)——HOG人脸面部轮廓图像特征提取
- 下列语句中在python中是非法的_下列语句中,()在Python中是非法的
- 幼儿园带括号算式口诀_幼儿园数学作业括号题型
- 河北工业大学计算机类学硕,2021年河北工业大学电子通信与信息系统学硕专业考研必看成功上岸前辈复习经验分享...
- Processing 入门教程(二十四) lerp函数
- 搜索和查询html代码,html查找框功能
- 通过a标签下载文件,不能下载原因
- 项目下没有Web App Libraries
- 四年后看微软第二代超融合系统:Azure Stack HCI
- 3D角色硬表面建模技巧与思路分享【下】