【单片机笔记】数码管的前后今生,分享效率驱动代码
H文件#ifndef __FY_HC595_H #define __FY_HC595_H #include fy_includes.h #define HC595B_H (u16)(10) #define HC595B_G (u16)(11) #define HC595B_F (u16)(12) #define HC595B_E (u16)(13) #define HC595B_D (u16)(14) #define HC595B_C (u16)(15) #define HC595B_B (u16)(16) #define HC595B_A (u16)(17) #define HC595A_H (u16)(18) #define HC595A_G (u16)(19) #define HC595A_F (u16)(110) #define HC595A_E (u16)(111) #define HC595A_D (u16)(112) #define HC595A_C (u16)(113) #define HC595A_B (u16)(114) #define HC595A_A (u16)(115) #define SEG_DATA_BACK_OFF 16 //空 #define SEG_DATA_BACK_0 0 //补0 typedef struct { u16 value_595; u8 seg_data[4]; u8 seg_index; u8 seg_dp; u8 flashCnt; u8 flash; u8 times; u8 flashTimes; u8 leds; }_typdef_hc595; void HC595_Configuration(void); void HC595_ShowValue(u16 value); void HC595_SegData(s16 value,u8 index,u8 mode); void HC595_Diplay(void); void Set_SegFlash(u8 flash_cnt); void Seg_FlashTick(void); void Seg_SetDp(u8 dp,u8 cmd); void HC595_SetLed(u8 led,u8 cmd); u8 HC595_GetLedState(u8 led); #endifC文件#include fy_hc595.h #define SEG_A (u8)(17) #define SEG_B (u8)(16) #define SEG_C (u8)(15) #define SEG_D (u8)(14) #define SEG_E (u8)(13) #define SEG_F (u8)(12) #define SEG_G (u8)(11) #define SEG_H (u8)(10) #define LED0 (10) #define LED1 (11) #define LED2 (12) #define LED3 (13) #define SEG_COM_0 (14) #define SEG_COM_1 (15) #define SEG_COM_2 (16) #define SEG_COM_3 (17) #define HC595_RCK_RCC RCC_AHBPeriph_GPIOA #define HC595_RCK_PORT GPIOA #define HC595_RCK_PIN GPIO_Pin_0 #define HC595_RCK_H() GPIO_SetBits(HC595_RCK_PORT,HC595_RCK_PIN) #define HC595_RCK_L() GPIO_ResetBits(HC595_RCK_PORT,HC595_RCK_PIN) #define HC595_DAT_RCC RCC_AHBPeriph_GPIOB #define HC595_DAT_PORT GPIOB #define HC595_DAT_PIN GPIO_Pin_1 #define HC595_DAT_H() GPIO_SetBits(HC595_DAT_PORT,HC595_DAT_PIN) #define HC595_DAT_L() GPIO_ResetBits(HC595_DAT_PORT,HC595_DAT_PIN) #define HC595_CLK_RCC RCC_AHBPeriph_GPIOA #define HC595_CLK_PORT GPIOA #define HC595_CLK_PIN GPIO_Pin_1 #define HC595_CLK_H() GPIO_SetBits(HC595_CLK_PORT,HC595_CLK_PIN) #define HC595_CLK_L() GPIO_ResetBits(HC595_CLK_PORT,HC595_CLK_PIN) const unsigned char numtab[] { /*00*/ (unsigned char)(~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)), /*11*/ (unsigned char)(~(SEG_B | SEG_C)), /*22*/ (unsigned char)(~(SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)), /*33*/ (unsigned char)(~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)), /*44*/ (unsigned char)(~(SEG_B | SEG_C | SEG_F | SEG_G)), /*55*/ (unsigned char)(~(SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)), /*66*/ (unsigned char)(~(SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)), /*77*/ (unsigned char)(~(SEG_A | SEG_B | SEG_C)), /*88*/ (unsigned char)(~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)), /*99*/ (unsigned char)(~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)), /*10A */ (unsigned char)(~(SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)), /*11b */ (unsigned char)(~(SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)), /*12C*/ (unsigned char)(~(SEG_A | SEG_D | SEG_E | SEG_F)), /*13d*/ (unsigned char)(~(SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)), /*14E*/ (unsigned char)(~(SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)), /*15F*/ (unsigned char)(~(SEG_A | SEG_E | SEG_F | SEG_G)), /*16全灭*/ (unsigned char)((SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) | SEG_H), /*17全亮*/ (unsigned char)(~(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)), /*18-*/ (unsigned char)(~(SEG_G)), /*19c*/ (unsigned char)(~(SEG_D | SEG_E | SEG_G)), /*20o*/ (unsigned char)(~(SEG_C | SEG_D | SEG_E | SEG_G)), /*21H*/ (unsigned char)(~(SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)), /*22r*/ (unsigned char)(~(SEG_E | SEG_G)), /*23U*/ (unsigned char)(~(SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)), /*24u*/ (unsigned char)(~(SEG_C | SEG_D | SEG_E)), /*25L*/ (unsigned char)(~(SEG_D | SEG_E | SEG_F)), /*26T*/ (unsigned char)(~(SEG_A | SEG_E | SEG_F)), /*27P*/ (unsigned char)(~(SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)), /*28i*/ (unsigned char)(~(SEG_E | SEG_F)), /*29k*/ (unsigned char)(~(SEG_B | SEG_D | SEG_E | SEG_F | SEG_G)), /*30n*/ (unsigned char)(~(SEG_C | SEG_E | SEG_G)), /*31*/ (unsigned char)(~(SEG_A | SEG_B | SEG_F | SEG_G)), /*32上u*/ (unsigned char)(~(SEG_B | SEG_F | SEG_G)) }; const u8 numToBit[8] {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; _typdef_hc595 _hc595; //初始化74HC595对应IO void HC595_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //*********************HC595_RCK*********************// //1、时钟配置 RCC_AHBPeriphClockCmd(HC595_RCK_RCC, ENABLE); //2、GPIO配置 GPIO_InitStructure.GPIO_Pin HC595_RCK_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(HC595_RCK_PORT, GPIO_InitStructure);/* 配置引脚*/ //*********************HC595_DAT*********************// //1、时钟配置 RCC_AHBPeriphClockCmd(HC595_DAT_RCC, ENABLE); //2、GPIO配置 GPIO_InitStructure.GPIO_Pin HC595_DAT_PIN; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT; GPIO_Init(HC595_DAT_PORT, GPIO_InitStructure); //*********************HC595_CLK*********************// //1、时钟配置 RCC_AHBPeriphClockCmd(HC595_CLK_RCC, ENABLE); //2、GPIO配置 GPIO_InitStructure.GPIO_Pin HC595_CLK_PIN; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT; GPIO_Init(HC595_CLK_PORT, GPIO_InitStructure); } //74HC595发送一个字节 static void HC595_SendByte(u8 dat) { u8 i; for(i0; i8; i) { HC595_CLK_L(); // __NOP(); if(dat 0x01) HC595_DAT_H(); else HC595_DAT_L(); // __NOP(); HC595_CLK_H(); // __NOP(); dat 1; } } void HC595_ShowValue(u16 value) { HC595_RCK_L(); HC595_CLK_L(); HC595_SendByte(value0xFF); HC595_SendByte(value8); HC595_RCK_H(); HC595_CLK_L(); // __NOP(); HC595_RCK_L(); } /* 数码管输入要显示的数据地址从最低位开始 value 数据 index 地址 mode SEG_DATA_BACK_OFF 高位为0时不显示 SEG_DATA_BACK_0 高位为0时显示0 */ void HC595_SegData(s16 value,u8 index,u8 mode) { u8 s; u8 a; u8 i; if (value 0) { s 1; value -value; } else { s 0; } i 0; do { _hc595.seg_data[index--] numtab[value % 10]; value / 10; if (i 4) { break; } } while (value ! 0); a numtab[mode]; while (i 4) { _hc595.seg_data[index--] a; } if(s) { index; _hc595.seg_data[index] numtab[18]; } } //一次显示一个数字 //00000000 0000 0000 //数码管段选 数码管位选 LED void HC595_Diplay(void) { u8 seg_value; if(_hc595.seg_index4) //这里的4指的是数码管的4位 { _hc595.seg_index0; } seg_value _hc595.seg_data[_hc595.seg_index]; if (_hc595.seg_index 4 )//_hc595.seg_index !3_hc595.seg_index !7 { if (numToBit[_hc595.seg_index] _hc595.seg_dp)//显示小数点 { seg_value ~SEG_H; } else //不显示小数点 { seg_value | SEG_H; } if (_hc595.flash) { if (_hc595.flashCnt 25) { if (_hc595.seg_index 4) { seg_value 0xff; } } if (_hc595.flashCnt 50) { _hc595.flashCnt 0; if (_hc595.flashTimes) { _hc595.flashTimes--; if(_hc595.flashTimes0) _hc595.flash0; } } } } _hc595.value_595 numToBit[3-_hc595.seg_index]4; //位选 _hc595.value_595 | (_hc595.leds0x0f); //LED if (_hc595.seg_index 4) { _hc595.value_595 | seg_value8;//段选 } HC595_ShowValue(_hc595.value_595); _hc595.seg_index; } void Set_SegFlash(u8 flash_cnt) { _hc595.flashCnt0; _hc595.flash 1; _hc595.flashTimesflash_cnt; } void Seg_FlashTick(void) { _hc595.flashCnt; } void Seg_SetDp(u8 dp,u8 cmd) { if (cmd) { _hc595.seg_dp | dp; } else { _hc595.seg_dp ~dp; } } void HC595_SetLed(u8 led,u8 cmd) { if (cmd 1) { _hc595.leds | led; } else if (cmd 0) { _hc595.leds ~led; } else { if(_hc595.leds led) _hc595.leds ~led; else _hc595.leds | led; } } u8 HC595_GetLedState(u8 led) { return _hc595.leds (1led) ? 1:0; } /*********************************************END OF FILE********************************************/这个底层我使用了很长时间了今天记录并分享出来把关键的地方提一下剩下的需要自己啃一下。驱动部分一般都用串行转并行的逻辑芯片这样io就能省下来不少。1、数码管的位数这个在结构体里面的数组里面定义2、整体思路是给数码管开辟一个缓存最终显示调用方式为HC595_Diplay这个调用比较耗处理器一般我是2ms或者1ms调用一次来解决频闪问题。3、更改、送数为HC595_SegData、Seg_SetDp当然因为缓存也可以查询。4、整体闪烁函数调用为Set_SegFlash5、上述针对4位一体数码管如果位不一致的话需要更改。By Urien 2019年9月1日 15:51:39

相关新闻

深度解析FanControl风扇控制软件:从原理到实践的高级散热管理方案

深度解析FanControl风扇控制软件:从原理到实践的高级散热管理方案

深度解析FanControl风扇控制软件:从原理到实践的高级散热管理方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…

2026/7/28 19:58:34阅读更多 →
p093基于大数据的房价数据分析-django+spark+spider21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

p093基于大数据的房价数据分析-django+spark+spider21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

p093基于大数据的房价数据分析-djangosparkspider21(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ python3.7djangosparkspidermysql5.7vue 系统采用python为主体开发语言,爬取了大量的房价数据进行数据清洗、通过pandas清洗后入库…

2026/7/28 19:58:34阅读更多 →
p087基于Hadoop的电影数据分析及可视化系统_flask+spider21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

p087基于Hadoop的电影数据分析及可视化系统_flask+spider21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

p087基于Hadoop的电影数据分析及可视化系统_flaskspider21(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ python3.7hadoopflaskspidermysql5.7vue

2026/7/28 19:58:34阅读更多 →
阿里开源Page Agent:一行JS让AI理解并操作网页,颠覆传统自动化

阿里开源Page Agent:一行JS让AI理解并操作网页,颠覆传统自动化

如果你正在开发一个需要用户频繁操作表单、点击按钮、填写信息的 Web 应用,或者你正在为内部系统构建一个智能助手,那么你很可能面临一个经典难题:如何让 AI 理解并操作你的网页界面?传统的解决方案,无论是基于 Python…

2026/7/28 21:20:56阅读更多 →
小团队如何在大模型浪潮中不踩坑?一个实战项目的“去过度设计”经验

小团队如何在大模型浪潮中不踩坑?一个实战项目的“去过度设计”经验

聊《一份看似完整的程序员就业方案,为什么投递时没效果?》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要2026年,大模型应用从Demo走向权限、日志和可观测性成为趋势。但小团…

2026/7/28 21:20:56阅读更多 →
机械设计图纸的工程实践:从公差标注到系统思维的五大关键细节

机械设计图纸的工程实践:从公差标注到系统思维的五大关键细节

1. 为什么说设计图纸是机械工程师的“经验名片” 一张设计图纸,或者一个三维模型,最直观反映的不是你的软件操作有多熟练,而是你脑子里有没有“工程感”。很多刚入行的朋友,甚至一些工作了几年的工程师,容易把“会用软件”等同于“会设计”。这中间差了一大截。 我见过太…

2026/7/28 21:20:56阅读更多 →
多场景适配研发管理系统哪个更高效?2026主流工具测评与选型建议

多场景适配研发管理系统哪个更高效?2026主流工具测评与选型建议

2026年研发管理工具选型不能只看功能清单,更要看工具对团队实际业务场景的覆盖程度。本文围绕场景覆盖度、配置灵活度、协作效率和上手成本四个维度,对ONES、Tower、Jira、Asana、飞书项目、Azure DevOps和Linear七款主流工具展开测评,帮助不…

2026/7/28 21:20:56阅读更多 →
打破Mac与Android的隔阂:HoRNDIS让你的手机网络随时待命

打破Mac与Android的隔阂:HoRNDIS让你的手机网络随时待命

打破Mac与Android的隔阂:HoRNDIS让你的手机网络随时待命 【免费下载链接】HoRNDIS Android USB tethering driver for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/ho/HoRNDIS 你是否曾经在咖啡馆、机场或客户现场,急需网络连接却发现Wi-…

2026/7/28 21:20:56阅读更多 →
Token压缩技术:提升Transformer长序列处理效率的关键

Token压缩技术:提升Transformer长序列处理效率的关键

1. Token压缩技术为何成为深度学习新焦点2025年开年以来,各大顶会论文中频繁出现Token压缩技术的身影。作为Transformer架构优化的关键路径,这项技术正在彻底改变大模型处理长序列数据的效率瓶颈。我在部署百亿参数模型时深有体会:当输入序列…

2026/7/28 21:18:56阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →