当前位置: 首页 > news >正文

51单片机入门_10_数码管动态显示(数字的使用;简单动态显示;指定值的数码管动态显示)

接上篇的数码管静态显示,以下是接上篇介绍到的动态显示的原理。
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示

文章目录

  • 1. 数码管简单动态显示
  • 2. 数组的定义与引用
  • 3. 实现指定值的数码管动态显示

1. 数码管简单动态显示

按照上面提到的原理,可以设计得到如下代码:

#include <reg52.h>
#include <intrins.h>

#define unit unsigned int
#define uchar unsigned char


sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选

//毫秒级延时函数定义
void delay(uint z)
{
	uint x,y;
	for(x = z; x>0;x--)
		for(y=114;y>0;y--);

}

void main() //main函数自身就会循环
{
	//动态扫描就需要循环显示,因此需要写到循环中
	while(1)
	{
	   //第一位数码管
	   P0 = 0xFF; //清楚断码
	   WE = 1; //打开位选锁存器
	   P0=0xFE;	//1111 1110
	   WE = 0; //锁存位选数据
	   
	   DU = 1;//打开段选锁存器
	   P0=0xFD;//1111 1101
	   DU = 0; //段选锁存,锁存段选数据
	   dely(5);

	   //第二位数码管
	   P0 = 0xFF; //清楚断码	   
	   WE = 1;//打开位选锁存器
	   P0=0xFD;	 //1111 1101
	   WE = 0; //锁存位选数据
  
	   DU = 1;//打开段选锁存器
	   P0=0x5B;	 //0101 1011
	   DU = 0; //段选锁存,锁存段选数据
	   dely(5);
	}

}

在这里插入图片描述
数码管通常用来显示程序运行之后的结果,我们通常是给数码管赋一个值,然后将其进行显示,可以将其写为一个函数,此处需要使用到数组

2. 数组的定义与引用

数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。
数组的一般格式定义如下:
数据类型 数组名[常量表达式]={元素表} ;
例如:

unsigned char tabel[3]={0x3F, 0x06, 0x5B, };
P0= tabel[0];//P0此时的值为0x3F

3. 实现指定值的数码管动态显示

回到前面的目的:给数码管赋一个值,然后将其进行显示

具体代码如下:

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

//共阴数码管段选表0-9
//code关键字存到ROM区;不加的话会存储到data区,也就是RAM区;
//RAM区在执行过程中是可以被修改的,ROM区不可以被修改,此处不希望后期被修改
//code区容量大8K,data区只有512个字节
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x40,0x00};

sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选

//毫秒级延时函数定义
void delay(uint z)
{
	uint x,y;
	for(x = z; x>0;x--)
		for(y=114;y>0;y--);

}

//形参i表示显示的数字
void disoplay(uchar i)
{
	   uchar bai,shi,ge;
	   bai = i / 100;
	   shi = i%100/10;
	   ge = i%10;

	   //第一位数码管
	   P0 = 0xFF; //清楚断码
	   WE = 1; //打开位选锁存器
	   P0=0xFE;	//1111 1110
	   WE = 0; //锁存位选数据
	   
	   DU = 1;//打开段选锁存器
	   P0=table[bai];
	   DU = 0; //段选锁存,锁存段选数据
	   delay(5);

	   //第二位数码管
	   P0 = 0xFF; //清楚断码	   
	   WE = 1;//打开位选锁存器
	   P0=0xFD;	 //1111 1101
	   WE = 0; //锁存位选数据
  
	   DU = 1;//打开段选锁存器
	   P0=table[shi];
	   DU = 0; //段选锁存,锁存段选数据
	   delay(5);

	   //第三位数码管
	   P0 = 0xFF; //清楚断码	   
	   WE = 1;//位选锁存器
	   P0=0xFB;	 //1111 1101
	   WE = 0; //锁存位选数据
  
	   DU = 1;//打开段选锁存器
	   P0=table[ge];
	   DU = 0; //段选锁存,锁存段选数据
	   delay(5);

}

void main() //main函数自身就会循环
{
	//动态扫描就需要循环显示,因此需要写到循环中
	while(1)
	{
	 	display(236);
	}

}

在这里插入图片描述

相关文章:

  • Python - 爬虫利器 - BeautifulSoup4常用 API
  • 【故障处理】- xtts增量恢复报ORA-19611
  • Django REST Framework (DRF) 中用于构建 API 视图类解析
  • vue2-this.$set确保数据响应性的实例方法
  • CCF-CSP第31次认证第二题——坐标变换(其二)【NA!前缀和思想的细节,输出为0的常见原因】
  • 大模型 + cursor应用案例
  • 文件fd
  • 苏剑林“闭门造车”之多模态思路浅谈思考
  • PageHelper分页插件
  • C语言题目:链表数据求和操作
  • 【系列教程】Python第三课:用前两课知识解决实际问题
  • “mysqld --initialize --console ”执行不成功情况总结和解决措施
  • vue3-04vue3中ref函数( 定义一个响应式的数据)
  • 设计模式14:职责链模式
  • 普通报表入门
  • 使用html css js 开发一个 教育机构前端静态网站模板
  • Show 『Picture Add + Crosee Line ROI
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析④】
  • 《StyleID:一种无训练的方法将大规模扩散模型适配于风格迁移》
  • Mistral Saba:为中东和南亚量身打造的AI模型
  • 菲律宾中期选举初步结果出炉,杜特尔特家族多人赢得地方选举
  • 上海能源科技发展有限公司原董事长李海瑜一审获刑13年
  • 【社论】人工智能将为教育带来什么
  • 商务部就开展打击战略矿产走私出口专项行动应询答记者问
  • 中美经贸高层会谈在瑞士日内瓦举行
  • “80后”李灿已任重庆市南川区领导,此前获公示拟提名为副区长人选