188数码管轮询扫描

前言

最近用到了188数码管,总结一下。

188数码管,用5个IO,在不借助外部驱动芯片的情况下,可以点亮20个灯。188数码管广泛应用于电子烟、充电器、充电宝、DVD、高级音响、工业设备控制面板、医疗器械等多个领域,满足不同设备和场景的需求。

有纰漏请指出,转载请说明。

学习交流请发邮件 1280253714@qq.com。

原理讲解

参考自文章 188数码管驱动程序(简洁)_188数码管电路图-CSDN博客

讲解非常到位,移植也很简单

这里我再给出数码管的顶层应用示例,即开、关、闪烁 

代码

LED.H 

#ifndef LED_H
#define LED_H
#include "SYS.h"void LED_Init(void);
void Display_tube(void);typedef enum {eLedOff = 0,eLedOn,eLedIntermittent,
} LedSta_S;typedef struct {u16 period;    	//闪烁的周期u16 time;  	   	//闪烁的次数u16 cnt1;  	   	//临时计数1u16 cnt2;  	   	//临时计数2LedSta_S sta;
} LED_S;extern LED_S stLed;
void LedSet(LedSta_S sta, u16 period, u16 time);
void LedLoopTask(void);#endif

 

LED.C

#include "led.h"/************************************************************************************/
void LED_Init(void)//初始化IO口
{PIN1_IN();//把单片机IO口配置为输入模式PIN2_IN();PIN3_IN();PIN4_IN();PIN5_IN();
}/********************************熄灭所有数码管***********************************/
void Set_AllPin_INPUT(void)
{PIN1_IN();PIN2_IN();PIN3_IN();PIN4_IN();PIN5_IN();
}u16 display_sram=0;void Display_Scan1(void)
{PIN1_L();//拉低Pin1if(display_sram&0x8000)PIN2_H();if(display_sram&0x4000)PIN3_H();if(display_sram&0x2000)PIN4_H();if(display_sram&0x1000)PIN5_H();
}
void Display_Scan2(void)
{PIN2_L();if(display_sram&0x0800)PIN1_H();if(display_sram&0x0400)PIN3_H();if(display_sram&0x0200)PIN4_H();if(display_sram&0x0100)PIN5_H();
}
void Display_Scan3(void)
{PIN3_L();if(display_sram&0x0080)PIN1_H();if(display_sram&0x0040)PIN2_H();if(display_sram&0x0020)PIN4_H();if(display_sram&0x0010)PIN5_H();
}
void Display_Scan4(void)
{PIN4_L();if(display_sram&0x0008)PIN1_H();if(display_sram&0x0004)PIN2_H();if(display_sram&0x0002)PIN3_H();if(display_sram&0x0001)PIN5_H();
}
void Display_Scan5(void)
{PIN5_L();if(stSys.chargingFlag) {PIN2_H();PIN3_H();} else {PIN2_H();}
}/****************************显示函数***********************************///放在定时器中断函数,5ms运行一次,扫描一轮需要4*5ms=20ms,
//也就是50Hz的刷新频率,如果感觉闪烁,可以4ms运行。
void Display_tube(void)
{u16 Segment[3][11]={{0x0000,0x0006,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},//百位{0x0770,0x0420,0x0741,0x0661,0x0431,0x0271,0x0371,0x0460,0x0771,0x0671,0x0000},//十位{0xE888,0x8080,0xD808,0xD880,0xB080,0x7880,0x7888,0x8880,0xF888,0xF880,0x0000} //个位}; 	static u8 case_cnt = 0;//逐行扫描Set_AllPin_INPUT();//消影作用//display_sram=0x84A6;//111//display_sram=0xDF49;//022//display_sram=0xE888;//0display_sram=Segment[0][stSys.tube_bai] | Segment[1][stSys.tube_shi] | Segment[2][0];//显示百位,十位,个位switch(case_cnt){case 0x00:Display_Scan1();case_cnt++;break;case 0x01:Display_Scan2();case_cnt++;break;case 0x02:Display_Scan3();case_cnt++;break;case 0x03:Display_Scan4();case_cnt++;break;case 0x04:Display_Scan5();case_cnt=0;break;default:case_cnt=0;break;}
}LED_S stLed;void LedSet(LedSta_S sta, u16 period, u16 time)
{stLed.period   	= period;stLed.time 	   	= time;stLed.sta  	   	= sta;stLed.cnt1 	   	= 0;stLed.cnt2 	   	= 0;
}//此函数放在主循环,
void LedLoopTask(void)
{  	  static u8 tubeTaskCnt = 0;tubeTaskCnt++;if (tubeTaskCnt <= 2) {return;}tubeTaskCnt = 0;switch ( stLed.sta ){case eLedOn:Display_tube();break;case eLedOff:Set_AllPin_INPUT();break;case eLedIntermittent:if(stLed.cnt1 < (stLed.period/2)){Set_AllPin_INPUT();stLed.cnt1++;} else if(stLed.cnt1 < stLed.period){Display_tube();stLed.cnt1++;} else {stLed.cnt1 = 0;stLed.cnt2++;if (stLed.cnt2 >= stLed.time) {stLed.cnt2 = 0;	   	stLed.sta = eLedOff;   	} }  	   	   	   	   	   	   	break; 	}
}

函数调用

/********************************************
*  	@函数名   	SetLedSta
*  	@描述	设置Led灯闪状态
*  	@参数	无
*  	@返回值   	无
*  	@注意	无
********************************************/
void SetLedSta(void)
{if (stSys.ledUpdateFlag == 0)return;stSys.ledUpdateFlag = 0;switch (stSys.sta.now){case eStaOverLoad:case eStaLowVolt:LedSet(eLedIntermittent,320,5);break;case eStaRun:case eStaOffChging:LedSet(eLedOn,0,0);break;case eStaCalib:LedSet(eLedIntermittent,320,6);break;default:LedSet(eLedOff,0,0);break;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246693.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS】——TaggedPointer

TaggedPointer介绍 在为了改进从 32位CPU 迁移到 64位CPU 的内存浪费和效率问题&#xff0c;在 64位CPU 环境下&#xff0c;引入了 Tagged Pointer 。旨在提高内存效率和运行性能&#xff0c;尤其针对小的、频繁使用的对象&#xff0c;如NSNumber, NSDate, 和NSString等。在64…

昇思学习打卡-19-生成式/Pix2Pix实现图像转换

文章目录 网络介绍训练推理结果 网络介绍 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线…

mmdetection

首先下载mmdetection 3.2.0版本的 https://github.com/open-mmlab/mmdetection/tree/v3.2.0 第二步&#xff1a;创建虚拟环境 conda create -n mmdetection python3.8 -y conda activate mmdetection第三步&#xff1a;安装包 pip install torch2.0.1cu118 -f https://downl…

【c++】新领域:“智能数组 ” 问世

引入: 大家有没有发现每次创建和使用数组时很麻烦,因为数组长度一般只能用静态常量,太过局限,不满足大部分开发者的需求。而且遍历数组也很麻烦,又要for循环,又要在其他使用数组的地方检查边界。 于是我就构想了一种“智能数组” 就解决了大部分的难题 这样的语言风格是…

分布式IO系统2通道串口通信模块M602x

现场总线耦合器本身包含一个电源模块&#xff0c;它有 2 个串口通道&#xff0c;通过 Modbus RTU&#xff08;Master&#xff09;协议连接外部串行设备&#xff0c;实现耦合器与外部串行设备通信&#xff0c;现以连接设备的示例带大家了解我们钡铼的2 通道串口通信模块 M602x。…

自闭症孩子为什么容易出现饮食问题?

在星启帆自闭症学校&#xff0c;我们深知自闭症孩子在日常生活中常常面临饮食问题的挑战。这些问题不仅影响孩子的营养摄入和健康成长&#xff0c;也给家庭和学校带来了不小的困扰。以下是我对自闭症孩子容易出现饮食问题的几点分析&#xff1a; 一、感官敏感性 自闭症孩子往往…

【NetTopologySuite类库】合并所有几何的包围盒AABB

流程示意图 示例代码 using GeoAPI.Geometries; using Microsoft.VisualStudio.TestTools.UnitTesting; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using System.Collections.Generic; using System.Linq;namespace Test472 {[TestClass]public class T…

vim网络和安全的操作及shell的使用

目录 vim模式 一般模式下的基本操作&#xff1a; 一般模式切换到编辑模式&#xff1a; 一般模式切换到命令模式&#xff1a; Vim多窗口使用技巧 横向切割打开&#xff1a; 纵向切割打开&#xff1a; 关闭多窗口&#xff1a; 窗口的切换&#xff1a; 网络&#xff1a;…

使用 Flask 3 搭建问答平台(二):User 模型搭建

前言 以下所有代码均是在之前的基础上添加&#xff01;&#xff01;&#xff01; 后面的章节均是如此 知识点 1. 使用 pymysql 模块连接数据库 2. 在模型中创建用户数据表 3. 初始化数据库、创建初始迁移脚本、应用初始迁移脚本 一、User 模型搭建 1.1 准备数据库 1.2 …

Python进阶 异常-包-模块案例

import my_utils.str_util from my_utils import file_utilprint(my_utils.str_util.str_reserves("黑马程序员")) print(my_utils.str_util.substr("itheima",0,4))#文件处理 def print_file_info(file_name):"""将给定路径文件的内容输出…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

MongoDB综合实战篇(超容易)

一、题目引入 在MongoDB的gk集合里插入以下数据&#xff1a; 用语句完成如下功能&#xff1a; &#xff08;1&#xff09;查询张三同学的成绩信息 &#xff08;2&#xff09;查询李四同学的语文成绩 &#xff08;3&#xff09;查询没有选化学的同学 &#xff08;4&#xf…

Windows与Ubuntu安装ffmpeg

文章目录 前言ffmpeg的简介安装ffmpegWindows下载设置环境变量 Ubuntu 总结 前言 FFmpeg是一款非常强大的开源音视频处理工具&#xff0c;它包含了众多的音视频编解码库&#xff0c;可以用于音视频的采集、编解码、转码、流化、过滤和播放等复杂的处理。在Windows系统上安装FF…

2024年互联网时代:专业企业IM即时通讯聊天软件的重要性不容忽视!

在这个日新月异的信息时代里&#xff0c;企业IM即时通讯无疑是与我们日常生活联系最紧密的科技工具之一&#xff01;它不仅能让我们轻松实现与亲朋好友间的流畅沟通与联系&#xff0c;更为互联网时代的广大企业员工提供了便捷高效的协同办公平台&#xff0c;助力企业内部信息无…

昂科烧录器支持TI德州仪器的混合信号微控制器MSPM0L1106

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中TI德州仪器的混合信号微控制器MSPM0L1106已经被昂科的通用烧录平台AP8000所支持。 MSPM0L1106微控制器(MCU)属于MSP高度集成的超低功耗32位MSPM0 MCU系列&#xff0c;该系列基…

美式键盘 QWERTY 布局的来历

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

rust + python+ libtorch

1: 环境&#xff0c;ubuntu 1.1 rust : rust-1.79.0 &#xff08;在官方下载linux版本后&#xff0c;解压文件夹&#xff0c;内部有个install的sh文件&#xff0c;可安装&#xff09; 安装成功测试&#xff1a;cargo --version 1.2 python3.10 (直接使用apt install pytho…

快速排序及归并排序的实现与排序的稳定性

目录 快速排序 一. 快速排序递归的实现方法 1. 左右指针法 步骤思路 为什么要让end先走&#xff1f; 2. 挖坑法 步骤思路 3. 前后指针法 步骤思路 二. 快速排序的时间和空间复杂度 1. 时间复杂度 2. 空间复杂度 三. 快速排序的优化方法 1. 三数取中优化 2. 小区…

30秒学会UML-功能类图

目录 1、类图本体 三部分 修饰符 2、类与类直接关系 泛化关系 实现关系 简单关联关系 依赖关系 组合关系 聚合关系 1、类图本体 三部分 第一层&#xff1a;类名第二层&#xff1a;成员变量&#xff08;类的属性&#xff09;第三层&#xff1a;函数方法&#xff08;类…

手机操作系统的沉浮往事

手机操作系统的沉浮往事&#xff08;上&#xff09; 移动终端操作系统&#xff0c;也就是指手机、平板电脑等设备所使用的操作系统。 在移动互联网高度发达的今天&#xff0c;我们使用移动终端操作系统的时长&#xff0c;可能已经远远超过了 Windows 等桌面操作系统。 那么&…