188数码管轮询扫描

news2024/9/24 1:26:22

前言

最近用到了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;  	   	//临时计数1
   	u16 cnt2;  	   	//临时计数2
   	LedSta_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();//拉低Pin1
    if(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;//0
    display_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://www.coloradmin.cn/o/1932307.html

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

相关文章

FPGA FIR fdatool filter designer MATLAB

位数问题 fdatool 先确定输入信号的位宽&#xff0c;比如17位在fdatool中&#xff0c;选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意&#xff1a; 当设置输入位宽为16位时&#xff0c;ip核…

Java 快速入门学习 -- Day 2

Java 快速入门 Ⅱ maven&#xff08;图书管理员&#xff09;IDEA使用 maven框架 maven&#xff08;图书管理员&#xff09; maven 仓库&#xff0c;图书馆。要看书的化先从家里找&#xff08;本地仓库&#xff09;&#xff0c;本地找不到就去中央仓库或者镜像仓库找&#xff0c…

CSA笔记3-文件管理命令(补充)+vim+打包解包压缩解压缩命令

grep(-i -n -v -w) [rootxxx ~]# grep root anaconda-ks.cfg #匹配关键字所在的行 [rootxxx ~]# grep -i root anaconda-ks.cfg #-i 忽略大小写 [rootxxx ~]# grep -n root anaconda-ks.cfg #显示匹配到的行号 [rootxxx ~]# grep -v root anaconda-ks.cfg #-v 不匹配有…

记录些MySQL题集(8)

ACID原则、事务隔离级别及事务机制原理 一、事务的ACID原则 什么是事务呢&#xff1f;事务通常是由一个或一组SQL组成的&#xff0c;组成一个事务的SQL一般都是一个业务操作&#xff0c;例如聊到的下单&#xff1a;「扣库存数量、增加订单详情记录、插入物流信息」&#xff0…

AQS详解

文章目录 AQS 是什么&#xff1f;AQS 的原理是什么&#xff1f;AQS 资源共享方式总结 AQS 是什么&#xff1f; AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 AQS是一个用来构建锁和…

【操作系统】定时器(Timer)的实现

这里写目录标题 定时器一、定时器是什么二、标准库中的定时器三、实现定时器 定时器 一、定时器是什么 定时器也是软件开发中的⼀个重要组件.类似于⼀个"闹钟".达到⼀个设定的时间之后,就执行某个指定 好的代码. 定时器是⼀种实际开发中⾮常常用的组件. ⽐如⽹络通…

base SAS programming学习笔记13(Array)

1.Array array-name{dimension} <elements> array-name&#xff1a;向量名称 dimension&#xff1a;向量长度&#xff0c;默认为1&#xff1b; elements:列出变量名&#xff0c;变量名要么全是数值变量或者全是字符变量 array-name和variable不能相同&#xff1b;也不能和…

【BUG】已解决:java.lang.IllegalStateException: Duplicate key

已解决&#xff1a;java.lang.IllegalStateException: Duplicate key 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…

Java红娘婚恋相亲交友系统小程序源码

红娘婚恋相亲交友小程序&#xff1a;遇见爱情&#xff0c;从指尖开始&#x1f496; &#x1f4f1; 掌中红娘&#xff0c;随时待命 &#x1f48c; 在这个数字化时代&#xff0c;爱情也迎来了它的新舞台——“红娘婚恋相亲交友小程序”。只需轻轻一点&#xff0c;你的专属红娘就…

记录些MySQL题集(6)

MySQL 单表为什么不要超过 2000W 行&#xff1f; 数据持久化在磁盘中&#xff0c;磁盘的最小单元是扇区&#xff0c;一个扇区 0.5 KB&#xff0c;而由 8 个扇区可以构成一个文件系统块&#xff08;4K&#xff09;&#xff0c;以 InnoDB 存储引擎为例&#xff0c;一个数据页的大…

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字&#xff1a;class 语法格式&#xff1a; class 类名 { }&#xff1b;//这里的分号不能少 此外&#xff0c;class有三个属性分别是private、public、protected&#xff0c;这三个属性是干啥的&#xff0c;相…

昇思25天学习打卡营第13天|CycleGAN 图像风格迁移互换全流程解析

目录 数据集下载和加载 可视化 构建生成器 构建判别器 优化器和损失函数 前向计算 计算梯度和反向传播 模型训练 模型推理 数据集下载和加载 使用 download 接口下载数据集&#xff0c;并将下载后的数据集自动解压到当前目录下。数据下载之前需要使用 pip install dow…

如何PR到别人仓库(指定分支,无废话)

如何PR到别人仓库&#xff08;指定分支&#xff09; 记录一下&#xff0c;之前都是直接master分支&#xff0c;现在记录如何pr到别人仓库的其他分支 首先进入别人仓库然后点击fork到自己仓库 步骤&#xff08;以博主自己一个例子为例&#xff09; &#xff08;1&#xff09;…

配置和保护SSH

使用SSH访问远程命令行 描述Secure Shell SSH&#xff08;Secure Shell&#xff09; 是一种网络协议&#xff0c;用于在不安全的网络上安全地进行系统管理和数据传输。它最初由 Tatu Ylnen 于1995年设计&#xff0c;并成为保护网络服务免受攻击的标准。SSH提供了多种功能&…

prometheus+grafana应用监控配置

配置Prometheus 官方地址&#xff1a;Download | Prometheus &#xff08;wegt下载压缩包&#xff0c;解压并重命名prometheus&#xff0c;文件放于/data/prometheus即可&#xff09; 配置 service方法(文件放于 /etc/systemd/system/prometheus.service)&#xff1a; [Unit…

Windows与Ubuntu安装ffmpeg

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

Talk|清华大学袁天远:PreSight - 利用NeRF先验帮助自动驾驶场景在线感知

本期为TechBeat人工智能社区第605期线上Talk。 北京时间7月3日(周三)20:00&#xff0c;清华大学博士生—袁天远的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “PreSight - 利用NeRF先验帮助自动驾驶场景在线感知”&#xff0c;他向大家介绍了新…

OBD诊断(ISO15031) 08服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、请求控制车载设备请求消息&#xff08;读取支持的TID&#xff09;2、请求控制车载设备响应消息&#xff08;报告支持的TID&#xff09;3、请求控制车载设备请求消息&#xff08;读取TID值&#xff09;4、…

QTableView仿Excel表头排序和筛选

一.效果 Excel的排序和筛选弹窗如下所示 功能非常强大。不仅支持内容排序和筛选,还支持颜色的排序和筛选,而且还支持设置多种过滤条件。本文只仿最常用的内容排序和内容单过滤条件的筛选,效果如下所示。 从效果图中可以看出,表头Section中的按钮有下列六种状态 enum Butt…

自制OJ在线判题网站

项目效果啊演示&#xff1a; 项目链接&#xff1a; Gitee:Oj: 自定义实现的OJ在线做题网站&#xff0c;自主实现代码沙箱 (gitee.com) GitHub:GitHub - SakanaYdy/Oj 仓库中含有完整的项目流程PDF文档&#xff0c;可以参考自定义OJ网站。 目前只支持Java语言&#xff0c;可以…