蓝桥杯模块学习4——数码管

news2024/12/26 22:34:41

第一章 硬件部分

1.1 电路的组成部分

1.1.1 译码器和锁存器

具体可回顾之前LED灯的文章:
https://blog.csdn.net/weixin_63568691/article/details/130660096

1.1.2 共阳极数码管:

  1. 原理图:
    在这里插入图片描述
  2. 功能:
    (1)可以把数码管可以看作多个LED灯组成的电路,每个数字由8个LED组成
    在这里插入图片描述
    对应情况:
    在这里插入图片描述
    (2)什么叫共阳极?可以理解为LED灯的一端接了VCC,只需要在另一端输入低电平就能将他点亮
    (3)共阳极数码管1-F对应的十六进制数(比赛时数据包会有基本的,但是特殊的字母或符号是没有的)
code unsigned char Seg_Table[] =
{
0xc0,
//0
0xf9,
//1
0xa4,
//2
0xb0,
//3
0x99,
//4
0x92,
//5
0x82,
//6
0xf8,
//7
0x80,
//8
0x90,
//9
0x88,
//A
0x83,
//b
0xc6,
//C
0xa1,
//d
0x86,
//E
0x8e
//F
};

1.2 整体电路

在这里插入图片描述
在这里插入图片描述
(1)由上图可知com口(位选)选择需要亮的数码管,再通过a-g口(段选)确定要选择的数字,dp选择是否显示小数点
(2)其中位选为Y6C,段选为Y7C,即与LED控制类似

第二章 具体实验

2.1 实验内容

  前四位显示年份“2022”,接着两位是分隔符“–”,最后两位是月份从一月份开始增加到十二月份,最后循环往复。

2.2 什么是数码管动态显示?

(1)我们如果曾经用过手机照一些分辨率较低屏幕,应该会见到闪烁的屏幕,也就会理解动态显示思路
(2)为什么我们一定要用动态显示呢?如果用静态显示思路,那么每个显示部分都有独立的段选端口和独立的位选端口,以我们八位数码管为例:每一位都要八位的段选和一位的位选,一共就需要七十二位,这样就太浪费资源了
(3)原理:利用人的视觉残留和数码管的余辉效应(1-2ms),我们可以让每个显示部分公用一个段选端口,只需要在极短时间不断改变位选,在人的眼中就会出现八位同时显示的情况

2.3 无操作系统代码

注:一开始接触可以就写这个代码,过省赛应该是没问题的

2.3.1 代码

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#include "stdio.h"

#define u8 unsigned char
#define u16 unsigned int
// 延时函数(最小约1ms@12MHz)
void Delay_1ms(u16 num)
{
  u16  i;
  while(num--)
    for(i=0; i<628; i++);
}

void Delay_10us(u16 num)
{
  u16 i;
  while(num--)
    for(i=0; i<3; i++);
}
/*
	输入变量:无
	输出变量:无
	功能:关闭所有外设
*/
void Close_All(void)
{	
	//关闭蜂鸣器和继电器
	P0 = 0x00;
	P2 = (P2 & 0x1f) | 0xA0;
	P2 &= 0x1f;
	//关闭LED灯
	P0 = 0xff;
	P2 = (P2 & 0x1F) | 0x80;
	P2 &= 0x1f;	
}
u8 SEG_COT[9];
u8 SEG_Code[8];
u8 SEF_POS = 0;
u16 SEG_delay;
void SEG_TSL(u8 *input,u8 *output);
void SEG_Show(u8 num,u16 PIS);
void Timer_0_Init(u16 time);
void SEG_Proc();
// 主函数
void main(void)
{
	Close_All();
	Timer_0_Init(1000);//1ms
  while(1)
  {
		SEG_Proc();
	}
}

void SEG_Proc()
{
	u16 year = 2023;
  static u8 month=1;
	if(SEG_delay)return;
	SEG_delay = 1;
	
	sprintf(SEG_COT, "%4u--%02u", year,(u16)month);
	SEG_TSL(SEG_COT,SEG_Code);
	if(month == 12)
		month = 0;
	month++; 
}
/***************************数码管*****************************/
/*
  输入变量:input,输入字符数组;output:输出16进制数数组
	输出变量:无
	功能:将字符串转化为对应数码管显示的16进制数
	注意:记得定义数组——u8 SEG_COT[9];u8 SEG_Code[8];
*/
void SEG_TSL(u8 *input,u8 *output)
{
	u8 i=0,temp=0,j=0;
	for(i=0;i<8;i++,j++)
	{
		switch(input[j])
		{
			case '0': temp = 0xc0; break;
      case '1': temp = 0xf9; break;
      case '2': temp = 0xa4; break;
      case '3': temp = 0xb0; break;
      case '4': temp = 0x99; break;
      case '5': temp = 0x92; break;
      case '6': temp = 0x82; break;
      case '7': temp = 0xf8; break;
      case '8': temp = 0x80; break;
      case '9': temp = 0x90; break;
      case 'A': temp = 0x88; break;
      case 'B': temp = 0x83; break;
      case 'C': temp = 0xc6; break;
      case 'D': temp = 0xA1; break;
      case 'E': temp = 0x86; break;
      case 'F': temp = 0x8E; break;
      case 'H': temp = 0x89; break;
      case 'L': temp = 0xC7; break;
      case 'N': temp = 0xC8; break;
      case 'P': temp = 0x8c; break;
      case 'U': temp = 0xC1; break;
      case '-': temp = 0xbf; break;
      case ' ': temp = 0xff; break;
      default: temp = 0xff;
		}
		if(input[j+1] == ".")
		{
			temp &= 0x7f;
			j++;
		}
		output[i] = temp;
	}
}

/*
	输入变量:num,要显示数据;PIS,显示位置,从左到右分别为0-7
	输出变量:无
	功能:操作138译码器,4-7分别对应Y4-Y7,其余都会使译码器不起作用
	注意:需要把存放从1-f对应的16进制数数组也移植
*/
void SEG_Show(u8 num,u16 PIS)
{
		//消影
  	P0 = 0xff;
		P2 = (P2 & 0x1f) | 0xE0;
    P2 &= 0x1f;
		//改变显示位置
  	P0 = 0x01<<PIS;
		P2 = (P2 & 0x1f) | 0xC0;
	  P2 &= 0x1f;
		//改变数据
  	P0 = num;
		P2 = (P2 & 0x1f) | 0xE0;
    P2 &= 0x1f;
}
/***************************定时器*****************************/
/*
	输入变量:定时时长___us
	输出变量:无
	功能:配置并开启定时器0
*/
void Timer_0_Init(u16 time)
{
	//12T模式
	AUXR &= 0x7f;
	//定时器0 模式0
	TMOD &= 0xf0;
	//设置初值
	TH0 = (65536-time)/256;
	TL0 = (65536-time)%256;
	//打开中断
	ET0 = 1;
	EA = 1;
	//开始计数
	TR0 = 1;
}

void Timer_0_IT(void) interrupt 1
{
	if(SEG_delay++ == 1000)SEG_delay = 0;//1s
	
	SEG_Show(SEG_Code[SEF_POS],SEF_POS);
	if(++SEF_POS == 8 )SEF_POS = 0;
}

2.3 RTX51代码

国赛必备,优点是可以在延时的时候畅通无阻的执行其他东西

#include <rtx51tny.h>
#include <STC15F2K60S2.H>
#include <stdio.H>
#define u8 **加粗样式**unsigned char
#define u16 unsigned int	

u8 COD[8],COT[9],PSI;
code unsigned char Seg_Table[] =
{
0xc0,
//0
0xf9,
//1
0xa4,
//2
0xb0,
//3
0x99,
//4
0x92,
//5
0x82,
//6
0xf8,
//7
0x80,
//8
0x90,
//9
0x88,
//A
0x83,
//b
0xc6,
//C
0xa1,
//d
0x86,
//E
0x8e
//F
};

void All_Close();
void SEG_TSL(u8 *input,u8 *output);
void SEG_Show(u8 COD,u8 PSI);
void Startup() _task_ 0
{
	All_Close();
	os_create_task(1);
	os_create_task(2);
	os_delete_task(0);
}

void task1() _task_ 1
{
	u8 mouth;
	while(1)
	{
		if(++mouth == 13)mouth = 1;
		sprintf(COT,"2022--%02u",(u16)mouth);
		SEG_TSL(COT,COD);
		os_wait2(K_IVL,250);
		os_wait2(K_IVL,250);
		os_wait2(K_IVL,250);
		os_wait2(K_IVL,247);
	}
}

void task2() _task_ 2
{
	while(1)
	{
		SEG_Show(COD[PSI],PSI);
		if(++PSI == 8)PSI = 0;
		os_wait2(K_IVL,2);
	}
}
/******************************/

//选择锁存器,输出数据
void Select(u8 cs,u8 s_data)
{
	P0 = s_data;
	P2 = P2 & 0x0f | (cs<<5);
	P2 &= 0x0f;
}

//关闭外设
void All_Close()
{
	//关闭蜂鸣器
	Select(5,0x00);
	//关闭LED
	Select(4,0xff);	
	//关闭数码管
	Select(7,0xff);		
}

//输入字符串,输出数码管段码
void SEG_TSL(u8 *input,u8 *output)
{
	u8 i=0;
	for(i=0;i<8;i++)
	{
		switch(input[i])
		{
			case '0':output[i] = Seg_Table[0];break;
			case '1':output[i] = Seg_Table[1];break;
			case '2':output[i] = Seg_Table[2];break;
			case '3':output[i] = Seg_Table[3];break;
			case '4':output[i] = Seg_Table[4];break;
			case '5':output[i] = Seg_Table[5];break;
			case '6':output[i] = Seg_Table[6];break;
			case '7':output[i] = Seg_Table[7];break;
			case '8':output[i] = Seg_Table[8];break;
			case '9':output[i] = Seg_Table[9];break;
			case '-':output[i] = ~0x40;break;
			default:output[i] = 0xff;
		}
	}
}
void SEG_Show(u8 COD,u8 PSI)
{
	//消隐
	Select(7,0xff);	
	//位选
	Select(6,0x01<<PSI);	
	//段选
	Select(7,COD);		
}

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

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

相关文章

[网鼎杯 2020 青龙组]bang 复现--frida-dexdump安卓脱壳工具的使用

一.前言 在NSSCTF练习安卓逆向,第一次遇到安卓脱壳题 大佬的题解只有一句话"frida-dexdump一把嗦" 听起来容易做起来难,还遇到了安卓虚拟机的玄学bug,折磨了我很久,好在最终使用真机成功dump并得到flag 题目来源:[网鼎杯 2020 青龙组]bang 如果直接用jadx打开会发现…

重大喜讯!国产讯飞星火大模型将超越chatGPT!

引言 近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;自然语言处理成为了研究的热点。而在自然语言处理领域&#xff0c;ChatGPT是一个备受关注的模型&#xff0c;它的出现极大地推动了自然语言处理技术的发展。然而&#xff0c;最近国内一家公司——讯飞&#xff0…

记录--10个超级实用的Set、Map使用技巧

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 Set是一种类似于数组的数据结构&#xff0c;但是它的值是唯一的&#xff0c;即Set中的每个值只会出现一次。Set对象的实例可以用于存储任何类型的唯一值&#xff0c;从而使它们非常适用于去重。 Map是…

如何为研发团队打造专属的效能提升路径|QECon 演讲回顾

近日&#xff0c;ONES 受邀参加 2023 QECon 全球软件质量&效能大会&#xff08;深圳站&#xff09;。在会上&#xff0c;ONES 研发效能改进咨询顾问陈仪&#xff0c;发表了主题为《如何为研发团队打造专属的效能提升路径》的演讲。 陈仪有着丰富的咨询经验&#xff0c;曾带…

C++考试

文章目录 1.程序填空1.1函数调用1.2前置和后置“”、“--”运算符重载1.3异常处理1.4文本文件读取 2.程序阅读2.1C编程基础2.2继承与派生2.3静态成员2.4继承与派生2.5 输入输出2.6 模板 3.程序改错3.1三种访问权限3.2 友元3.3抽象类不能实例化对象3.4常数据成员初始化必须使用构…

面试题总结

1、0513 1.重载和重写的区别? 重载发生在同一类中&#xff0c;同名的方法如果有不同的参数列表&#xff08;类型不同、个数不同、顺序不同&#xff09;则视为重载。 重写发生在父子类中&#xff0c;重写要求子类重写之后的方法与父类被重写方法有相同的返回类型&#xff0c;比…

Linux:在VMware中,如果虚拟机之前可以上网,之后突然不能上网,怎么办?

Linux系统版本&#xff1a;centos 7.5 x64位 VMware版本&#xff1a; VMware Workstation Pro 16 文章目录 前言一、什么原因会导致这种问题并如何解决它&#xff1f;原因①&#xff1a;虚拟机没有启动网络服务原因②&#xff1a;外部主机上VMware的【VMware NAT Service】服务…

Linux常用命令——htpasswd命令

在线Linux命令查询工具 htpasswd apache服务器创建密码认证文件 补充说明 htpasswd命令是Apache的Web服务器内置工具&#xff0c;用于创建和更新储存用户名、域和用户基本认证的密码文件。 语法 htpasswd(选项)(参数) 选项 -c&#xff1a;创建一个加密文件&#xff1b;…

用“平面两点距离”求三角形面积,再用“三角形面积”多边形面积

不小于 3 边的多边形&#xff0c;都可以任一顶点发出的边切分为 n - 2 个三角形。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&am…

跟着我学 AI丨教育 + AI = 一对一教学

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;它已经开始了改变教育的方式。本文将介绍AI在教育行业中的应用场景&#xff0c;当前从事AI 教育的公司有哪些以及这些公司所提供的教育产品的特点&#xff0c;和未来AI 教育的潜在实现方式。 AI在教育行业的…

【C++初阶】C/C++内存管理

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C初阶 ⭐代码仓库&#xff1a;C初阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

【数据结构】一篇带你彻底了解栈

文章目录 栈的概念及结构栈接口的实现栈的初始化入栈出栈获取栈顶元素判断栈是否为空获取栈中有效元素个数栈的销毁 总结 栈的概念及结构 栈&#xff1a;一种线性数据结构&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶 (Top&…

Node.js 学习系列(三) —— REPL

Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境&#xff0c;类似 Windows 系统的终端或 Unix/Linux shell&#xff0c;可以在终端中输入命令&#xff0c;并接收系统的响应。 Node 自带了交互式解释器&#xff0c;可以执行以下任务&#xff1a; 读取 —…

Spring 初始导读

1.Spring初始 1. 为什么要学框架 学习框架相当于从"小作坊"到"工厂"的升级 , 小作坊什么都要做 , 工厂是组件式装配 , 特点就是高效. 2.框架的优点展示(SpringBoot Vs Servlet) 使用SpringBoot 项目演示框架相比 Servlet 所具备的以下优点: 无需配置 …

Three.js 实战【1】—— 3D全景视图开发

Three.js 实战【1】—— 3D全景视图开发 摘要 1、3D视图Demo2、准备工作——搭建好一个开发环境3、RGBELoader——高范围动态图像加载器4、HDR——高动态范围图像5、使用HDR实现3D全景视图6、直接通过图片纹理进行实现 摘要 在现代开发过程当中&#xff0c;3D开发是越来越不可…

find,which,whereis,grep,bc,uname,free,nano,history指令的语法,功能与选项等

Tips x86_64 与 x64 都是指 64位x86 指的是 32位 find指令的语法&#xff0c;功能与选项 语法&#xff1a;find 目录 -name 文件名功能&#xff1a;在指定的目录之下进行文件查找&#xff08;递归式查找&#xff09;选项&#xff1a;它的选项也非常多&#xff0c;讲个 -name…

【Java 基础】File IO流

文章目录 1. File1.1 File类概述和构造方法1.2 绝对路径和相对路径1.3 File 类的常用方法1.4 递归删除文件夹及其下面的文件 2. IO2.1 分类2.2 字节输出流2.3 字节输入流2.4 文件的拷贝2.5 文件拷贝效率优化2.6 释放资源2.7 缓冲流2.8 编码表 3. commons-io 工具包3.1 API 1. F…

VSCode中安装GPT插件详细教程+gpt4改进

目录 安装插件 A.安装CodeGPT B.安装chatgpt 1.VSCode安装插件&#xff0c;使用本地下载vsix文件 2.获取 ChatGPT API 密钥 3.配置settings.json gpt4和3.5对比 GPT-4主要有三大改进点 局限性 安装插件 AB功能一样&#xff0c;A安装的人最多&#xff0c;GPT具体功能可…

K8s之标签、Node选择器与亲和性详解

文章目录 一、标签1、标签是什么&#xff1f;2、给Pod打标签3、给Node节点打标签4、查看标签资源 二、Node选择器1、nodeName(指定Pod调度到指定Node节点)2、nodeSelector(指定Pod调度到具有指定标签的Node节点) 三、亲和性1、Node亲和性-nodeAffinity2、Pod亲和性-podAffinity…

软件测试项目实战经验附视频以及源码【医疗项目,社区管理,前后端分离项目,银行项目,金融项目,车载项目】

前言&#xff1a; ​​大家好&#xff0c;我是测试小马。 很多初学的测试小白都在烦恼找不到合适的项目去练习&#xff0c;这也是难倒大部分测试小白的一个很常见的问题&#xff0c;项目经验确实是每一个测试非常宝贵的经验&#xff01;这里小马哥给大家找了一些常用的项目合…