51单片机STC89C52RC——3.1 数码管静态展示

目的

让数码管在指定位置显示指定数字

一,STC单片机模块

二,数码管 

2.1 数码管位置

2.2 生活中用到的数目管

红绿灯

LED数码管在生活中随处可见,洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数码管(为LED灯的个数)。

2.3 数码管的分类


按显示段数分:分为七段、八段、九段、十四段和十六段


七段:七段数码管由7个LED构成

八段:八段数码管比七段多了一个小数点

九段:九段数码管由9个LED构成

十四段:十四段数码管由14个LED构成
十六段:十六段数码管由16个LED构成

按显示位数分:分为1位、2位、3位及多位数码管(大于1位),

我们的板子上是8段4位。

 2.4 数码管电路图

单个数码管的电路图设计如下


内部接线图如下两种

第一种:共阴极(8个LED的负极接一起)

第二种:共阳极(8个LED的正极接一起)

可以看到,这个‘8’有A、B、C、D、E、F、G和DP8个LED构成。我们在程序上只需要将对应位置的LED点亮就可以了。ABCDEFG‘DP’8个位置刚好对应上一个byte的8个Bit位。要注意这里是与byte的低位对齐。

比如:

数字‘0’就是A、B、C、D、E、F位置的LED亮起。0011 1111 ,十六进制0x3F;

数字‘1’就是B、C 两个位置LED亮起。二进制0000 0110 ,十六进制0x06;

数字‘2’就是A、B、G、E、D位置的LED亮起、

……

以此类推,我们可以用HEX罗列出数码管能展示的所有可供我们认识的字符,要显示对应的字符,则P0值如下表

数码管显示点亮位置的LED十六进制
(P0值)
二进制
DPGFEDCBA
0ABCDEF0x3F00111111
1BC0x0600000110
2ABGED0x5B01011011
3ABCDG0x4F01001111
4FGBC0x6601100110
5AFGCD0x6D01101101
6AFEDCG0x7D01111101
7ABC0x0700000111
8ABCDEFG0x7F01111111
9GFABCD0x6F01101111
AABCEFG0x7701110111
CAFED0x3900111001
EAFEDG0x7901111001
FAFEG0x7101110001
HBCEFG0x7601110110
JBCDE0x1E00011110
LFED0x3800111000
pABGFE0x7301110011
qABGFC0x6701100111
UBCDEF0x3E00111110
.'DP'0x8010000000
bFEGDC0x7C01111100
dBCDEG0x5E01011110
uCDE0x1C00011100

这里我们在程序中用两个数组表示;

/*数码管可显示值*/
unsigned int ShuMaGuan_EnableDisplayValue[]={0,1,2,3,4,5,6,7,8,9,
	'A','C','E','F','H','J','L','P','q','U','.','b','d','u'};
/*数码管显示值对应的HEX*/
unsigned int ShuMaGuan_EnableDisplayHEX[]={
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x39,0x79,0x71,0x76,0x1E,0x38,0x73,0x67,0x3E,0x80,0x7C,0x5E,0x1C};
/**
 * 函    数:获取可显值对应的HEX
 * 参    数:数码管显示的值
 * 返 回 值:数码管显示时对应的HEX
 */
unsigned int ShuMaGuan_GetEnableDisplayValueOfHEX(unsigned int Value)
{
	unsigned int index=0;
	for(index=0;index<24;index++)//遍历显示值的数组
	{
		if(ShuMaGuan_EnableDisplayValue[index]==Value)//找到对应值的索引
		{
			break;
		}
	}
	return ShuMaGuan_EnableDisplayHEX[index];
}
/**
 * 函    数:设置数码管要显示的值
 * 参    数:显示值
 * 返 回 值:无
 */
void ShuMaGuan_SetDisplayValue(unsigned int Value)
{
	/*将要显示的值 复制给P0*/
	P0=ShuMaGuan_GetEnableDisplayValueOfHEX(Value);
}


数码管中的8个LED的一端已经通过上面P0设置成功,另一端我们也要设置接通LED才会连接到电路中导通。所以我们还需要了解74HC138译码器。

2.5 74HC138 译码器        

译码器的作用:简单理解就是尽量让程序设置少的针脚通断去控制逻辑电路通断和数据传输

假如在这里不用译码器,我们全部用单一导线和开关将LED的两端与电源正负极接通。那么线路就比较多,引脚也较多,我们程序中要控制的就增加。

在74HC138译码器上,有三个引脚P22、P23、P24,每个引脚都可以有通断(0、1)那么我们用三位的二进制就可以满足8个位置上通断。

CBA
P24P23P22
LED1111
LED2110
LED3101
LED4100
LED5011
LED6010
LED7001
LED8000

我们程序想让那个位置上的LED亮起,就设置对应值就导通了!


/**
 * 函    数:设置要显示的数码管 位置
 * 参    数:位置(左起1-8)
 * 返 回 值:无
 */
void ShuMaGuan_SetDisplayLocation(unsigned int Location)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
}

有了上面两步,我们在主函数就只需要设置在数码管的哪个位置显示什么值就好。


/**
 * 函    数:数码管展示
 * 参    数:Location 显示的位置,Value 显示的值
 * 返 回 值:无
 */
void ShuMaGuan_Display(unsigned int Location,unsigned int Value)
{
	/*显示位置*/
	ShuMaGuan_SetDisplayLocation(Location);
	/*显示值*/
	ShuMaGuan_SetDisplayValue(Value);
}

三,创建Keil项目

详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客

四,代码 

main.c 如下 

#include <REGX52.H>
#include "ShuMaGuan.h"
/**
 * 函    数:主函数
 * 参    数:无
 * 返 回 值:无
 */
void main()
{
	/*在数码管的第一个位置显示2*/
	ShuMaGuan_Display(1,2);
	while(1)
	{
	
	}
}

ShuMaGuan.h如下

#ifndef __SHUMAGUAN_H_
#defind __SHUMAGUAN_H_
void ShuMaGuan_Display(unsigned int Location,unsigned int Value);
#endif

ShuMaGuan.c如下

#include <REGX52.H>
/*数码管可显示值*/
unsigned int ShuMaGuan_EnableDisplayValue[]={0,1,2,3,4,5,6,7,8,9,
	'A','C','E','F','H','J','L','P','q','U','.','b','d','u'};
/*数码管显示值对应的HEX*/
unsigned int ShuMaGuan_EnableDisplayHEX[]={
	0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x39,0x79,0x71,0x76,0x1E,0x38,0x73,0x67,0x3E,0x80,0x7C,0x5E,0x1C};
/**
 * 函    数:获取可显值对应的HEX
 * 参    数:数码管显示的值
 * 返 回 值:数码管显示时对应的HEX
 */
unsigned int ShuMaGuan_GetEnableDisplayValueOfHEX(unsigned int Value)
{
	unsigned int index=0;
	for(index=0;index<24;index++)//遍历显示值的数组
	{
		if(ShuMaGuan_EnableDisplayValue[index]==Value)//找到对应值的索引
		{
			break;
		}
	}
	return ShuMaGuan_EnableDisplayHEX[index];
}
/**
 * 函    数:设置数码管要显示的值
 * 参    数:显示值
 * 返 回 值:无
 */
void ShuMaGuan_SetDisplayValue(unsigned int Value)
{
	/*将要显示的值 复制给P0*/
	P0=ShuMaGuan_GetEnableDisplayValueOfHEX(Value);
}
/**
 * 函    数:设置要显示的数码管 位置
 * 参    数:位置(左起1-8)
 * 返 回 值:无
 */
void ShuMaGuan_SetDisplayLocation(unsigned int Location)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
}
/**
 * 函    数:数码管展示
 * 参    数:Location 显示的位置,Value 显示的值
 * 返 回 值:无
 */
void ShuMaGuan_Display(unsigned int Location,unsigned int Value)
{
	/*显示位置*/
	ShuMaGuan_SetDisplayLocation(Location);
	/*显示值*/
	ShuMaGuan_SetDisplayValue(Value);
}

五,代码编译、下载到51单片机

代码编译请参考

《51单片机STC89C52RC——代码编译-CSDN博客》

代码下载请参考

《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》

六,效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js语法---理解反射Reflect对象和代理Proxy对象

Reflect 基本要点 反射&#xff1a;reflect是一个内置的全局对象&#xff0c;它的作用就是提供了一些对象实例的拦截方法&#xff0c;它的用法和Math对象相似&#xff0c;都只有静态方法和属性&#xff0c;同时reflect也没有构造器&#xff0c;无法通过new运算符构建实例对象&…

WiFi/BLE芯片(1):英飞凌

英飞凌AIROC蓝牙芯片的应用场景:

error: ‘LocalParameterization’ is not a member of ‘ceres

一、错误提示&#xff1a; 对于以下报错&#xff1a; error: ‘LocalParameterization’ is not a member of ‘ceres’ error: ‘quatParam’ was not declared in this scope error: expected type-specifier 二、背景&#xff1a; 我是在Ubuntu20.04下&#xff0c;运行…

数据库 | 试卷五试卷六试卷七

1. 主码不相同&#xff01;相同的话就不能唯一标识非主属性了 2.从关系规范化理论的角度讲&#xff0c;一个只满足 1NF 的关系可能存在的四方面问题 是&#xff1a; 数据冗余度大&#xff0c;插入异常&#xff0c;修改异常&#xff0c;删除异常 3.数据模型的三大要素是什么&…

DDMA信号处理以及数据处理的流程---距离速度测量

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…

华为---OSPF单区域配置(一)

09、OSPF 9.1 OSPF单区域配置 9.1.1 原理概述 为了弥补距离矢量路由协议的不足&#xff0c;IETF组织开发了一种基于链路状态的内部网关协议——OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;。 OSPF作为基于链路状态的协议&#xf…

多态性(Java)

本篇学习面向对象语言的第三个特性——多态。 目录 1、多态的概念 2、继承多态实现条件 3、重写 4、重新与重载的区别&#xff1a; 5、向上转移和向下转型 5、1向上转型&#xff1a; 5、2 向下转型 1、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA 的幸运游戏(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…

textarea标签改写为富文本框编辑器KindEditor

下载 - KindEditor - 在线HTML编辑器 KindEditor的简单使用-CSDN博客 一、 Maven需要的依赖&#xff1a; 如果依赖无法下载&#xff0c;可以多添加几个私服地址&#xff1a; 在Maven框架中加入镜像私服 <mirrors><!-- mirror| Specifies a repository mirror site to…

Spring源码-xxxAware实现类和BeanPostProcessor接口调用过程

xxxAware实现类作用 以ApplicationContextAware接口为例 ApplicationContextAware的作用是可以方便获取Spring容器ApplicationContext&#xff0c;从而可以获取容器内的Bean package org.springframework.context;import org.springframework.beans.BeansException; import or…

gtk+2.0使用绝对布局实现窗体背景图片的办法

有一个简单的办法实现窗体背景图片,就是使用绝对布局,在窗体中放一个图片控件作为背景,之后所有的控件使用绝对布局在窗体的位置。需要注意之后的控件需要在图片控件之后添加到窗体容器。否则就会被图片覆盖而不能显示。 效果: 代码示例 #include <gtk/gtk.h>int …

云商崆峒乐购618活动2024:企业联动创辉煌

2024年6月18日&#xff0c;云商崆峒乐购618活动在平凉盛大开幕。本次活动由崆峒区商务局、崆峒区电子商务协会与平凉新世纪柳湖春酒业公司联合举办&#xff0c;旨在借助“618”全民线上欢购的热潮&#xff0c;整合平凉本地名优特产&#xff0c;推动崆峒区电商产业及特色网货的发…

进阶篇06——锁

概述 全局锁 表级锁 表锁 元数据锁 元数据锁是系统自动加的&#xff0c;不需要我们手动执行命令添加。 意向锁 意向锁和元数据锁一样&#xff0c;也是在加行锁的时候自动给表加上相应的意向锁&#xff0c;不需要我们手动添加。 行级锁 行锁 读锁和读锁兼容&#xff0c;写锁…

【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持

目录 缘起 波澜 凌云 缘起 曾​​​​​​佳伟是《植物大战僵尸》的忠实粉丝&#xff0c;这款游戏给了他很多乐趣&#xff0c;也成为了他度过困难时期的精神支柱。他决定制作杂交版&#xff0c;部分原因是出于对原版游戏的热爱和致敬。 六年前&#xff0c;出于对一些pvz续作…

Java特性之设计模式【访问者模式】

一、访问者模式 概述 在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&…

4月份最新出品:上海交大动手学大模型教程,快速入门LLM大模型(附课件)

前有 李沐 大神的动手学深度学习 现有 上海交大 的动手学大模型教程&#xff0c;对大模型感兴趣的直接冲&#xff01; 就在4月份上交大发布了动手学大模型教程&#xff0c;这份教程来自上海交大 《人工智能安全技术》 课程讲义拓展&#xff0c;教师是是张倬胜教授。 朋友们…

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…

STM32多功能交通灯系统:从原理到实现

一、功能说明 本交通灯系统采用先进的stm32f103c8t6微处理器为核心控制单元。系统设置东南西北四个方向各配置两位数码管&#xff0c;用以精准展示5至99秒的时间范围&#xff0c;并且允许用户根据实际需求进行灵活调整。 在信号灯配置方面&#xff0c;每个方向均配备左转、直…