项目二简易电子表 任务2-2数码管动态显示

a8b1631e908f4779940fd684e404ef00.png

注意:P0字型口  P2位选口

首先实现1234轮流隔1s显示 

e81ea19a7cac4d01895de5de77774dfd.png

0a15d251a13646968422a78c81edd00c.png

285838ada9f4414cb1d5c71d0dd4aaf1.png

b627db8003994bb3a6fa5cf823ddedce.png

#include<reg51.h>
//51单片机寄存器定义头文件
//实现1234轮流隔1s显示
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/************************/
void main(){
	int n=1000;
	while(1)
	{
	P2=0x7f;//0111 1111
	P0=seg[1];
	delay(n);
	
	P2=0xbf;//1011 1111
	P0=seg[2];
	delay(n);
	
	P2=0xdf;//1101 1111
	P0=seg[3];
	delay(n);
	
	P2=0xef;//1101 1111
	P0=seg[4];
	delay(n);
	}
}

 由于我们人类的视觉暂留不到百分之1秒,快速循环播放,会利用人眼的暂留实现动态显示,

但同时会占用CPU,程序不能停。

 

动态显示:字段共用的数码管,做不到同时显示不同内容。因此动态显示就是轮流选中每一位数码管,分别显示对应的内容,即为位扫描。然后快速循环,重复以上过程。这样就可以同时显示不同内容,造成视觉假象。其缺点是想要维持显示效果,就必须不断重复位扫描过程。

 

同理我们可以实现单片机连接8位共阳极数码管,编程显示8个不同的数字

如显示日期:

/*************************
项目名称:项目二简易电子表
任务名称:任务2-2数码管动态显示
任务描述:单片机连接8位共阳极数码管,编程显示8个不同的数字
*************************/
#include<reg51.h>
//51单片机寄存器定义头文件
//显示20240322
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
int dis[]={2,0,2,4,0,3,2,2};//定义8位显示内容
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/************************************/
void main()
{
	int n=1;
	while(1)
	{
		P2=0x7f;//0111 1111
		P0=seg[2];
		delay(n);
		
		P2=0xbf;//1011 1111
		P0=seg[0];
		delay(n);
		
		P2=0xdf;//1101 1111
		P0=seg[2];
		delay(n);
		
		P2=0xef;//1110 1111
		P0=seg[4];
		delay(n);
		
		P2=0xf7;//0111 1111
		P0=seg[0];
		delay(n);
		
		P2=0xfb;//1011 1111
		P0=seg[3];
		delay(n);
		
		P2=0xfd;//1101 1111
		P0=seg[2];
		delay(n);
		
		P2=0xfe;//1110 1111
		P0=seg[2];
		delay(n);
	}
}

48c01d6817f744e6b97f075b383529ee.png

 

 

或者使用闭环右移符号实现:

/*************************
项目名称:项目二简易电子表
任务名称:任务2-2数码管动态显示
任务描述:单片机连接8位共阳极数码管,编程显示8个不同的数字
*************************/
#include<reg51.h>
//51单片机寄存器定义头文件
//显示20240322
#include<intrins.h>
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
int dis[]={2,0,2,4,0,3,2,2};//定义8位显示内容 display
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/***************************/
void main()
{
	int i,j;
	while(1)
	{
		for(i=0,j=0x7f;i<8;i++)
		{
			P2=j;//选中某位数码管
			P0=seg[dis[i]];//查表两次,第一次取这一位的显示内容,第二次转换七段码
			delay(1);
			j=_cror_(j,1);//将位选控制字闭环右移1位
		}
		}
}

 

 

方法二:通过调用函数display()实现

/*************************
项目名称:项目二简易电子表

*************************/
#include<reg51.h>
//51单片机寄存器定义头文件
//通过调用函数实现
#include<intrins.h>
int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义0~9共阳极七段码
int dis[]={2,0,2,2,0,2,3,5};//定义8位显示内容 display
void display();//定义显示子函数,完成一次动态扫描
void delay(int i)
{
	int j,k;
	for(k=0;k<i;k++)
		for(j=0;j<100;j++);
}
/***************************/
void main()
{
	
	while(1)//不断重复
	{
		display();
		}
}
/**************************/
void display(){
	int i,j;
	for(i=0,j=0x7f;i<8;i++)
		{
			P2=j;//选中某位数码管
			P0=seg[dis[i]];//查表两次,第一次取这一位的显示内容,第二次转换七段码
			delay(1);
			j=_cror_(j,1);//将位选控制字闭环右移1位
		}
}

 

 

 

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的甲方

你的鼓励是我博文创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值