STC89C52单片机 数码管动态显示

数码管动态显示

静态与动态显示

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

数组的定义与引用

数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。

数组的一般格式定义如下:

数据类型 数组名[常量表达式] = {元素表};

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

数码管动态显示数字 123
#include <reg52.h>
#include <intrins.h>

#define uint 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){
		/*第一位显示 数字 1*/
	   	P0 = 0XFF; // 清除断码	  如果没有为P0 初始化赋值 0XFF,那么 P0的值会是上一个打开段选锁存器过程中赋予的值,执行到这里 会把段选值赋给锁存器中P0,导致数码管显示错误。
		WE = 1; // 打开位选锁存器
		P0 = 0XFE;   // 1111 1110  选通第一位数码管
	//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管
		WE = 0; // 锁存位选数据
		
		DU = 1;  // 打开段选锁存器
		P0 = 0X06;  // 0000 0110  显示“1”
		DU = 0;   // 锁存段选数据
		delay(5);	// 对每次数码管的切换进行 5毫秒延时操作


		/*第二位显示 数字 2*/
 		P0 = 0XFF; // 清除断码
		WE = 1; // 打开位选锁存器
		P0 = 0XFD;   // 1111 1101  选通第二位数码管
	//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管
		WE = 0; // 锁存位选数据
		
		DU = 1;  // 打开段选锁存器
		P0 = 0X5B;  // 0101 1011  显示“2”
		DU = 0;   // 锁存段选数据
		delay(5);


		/*第三位显示 数字 3*/
		P0 = 0XFF; // 清除断码
		WE = 1; // 打开位选锁存器
		P0 = 0XFB;   // 1111 1011  选通第三位数码管
	//	P0 = 0X00;  // 0000 0000  表示选通所有位数码管
		WE = 0; // 锁存位选数据
		
		DU = 1;  // 打开段选锁存器
		P0 = 0X4F;  // 0100 1111  显示“3”
		DU = 0;   // 锁存段选数据
		delay(5);

	}	
}

数码管动态显示数字 123 (代码优化)
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件

#define uint unsigned int
#define uchar unsigned char

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

//共阴数码管段选表0-9
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

/*====================================
函数	:display(uchar i)
参数	:i 显示数值,取值范围0-255
返回值	:无
描述	:三位共阴数码管动态显示
====================================*/
void display(uchar i)
{
	uchar bai, shi, ge;
	bai = i / 100; //236 / 100  = 2
	shi = i % 100 / 10;	//236 % 100 / 10 = 3
	ge  = i % 10;//236 % 10 =6
	
	//第一位数码管  		
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFE; //1111 1110
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[bai];//
	DU = 0;//锁存段选数据
	delay(5);

	//第二位数码管
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFD; //1111 1101
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[shi];//
	DU = 0;//锁存段选数据
	delay(5);

	//第三位数码管
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFB; //1111 1011
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[ge];//
	DU = 0;//锁存段选数据
	delay(5);
}

void main()//main函数自身会循环
{	
	while(1)
	{
		display(123); //数码管显示函数
	}	
}  
数码管动态显示数字 12345678 (代码优化)
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件

#define uint unsigned int
#define uchar unsigned char

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

//共阴数码管段选表0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 

/*====================================
描述	:八位共阴数码管动态显示
====================================*/
void display(uchar num1, uchar num2, uchar num3, uchar num4, uchar num5, uchar num6, uchar num7, uchar num8)
{
												
	/*第一位显示*/ 		
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFE; //1111 1110
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[num1];//
	DU = 0;//锁存段选数据
	delay(1);

	/*第二位显示*/
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFD; //1111 1101
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[num2];//
	DU = 0;//锁存段选数据
	delay(1);

	
	/*第三位显示*/
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = 0XFB; //1111 1011
	WE = 0;//锁存位选数据
	
	DU = 1;//打开段选锁存器
	P0 = tabel[num3];//
	DU = 0;//锁存段选数据
	delay(1);

	/*第四位显示*/
	P0 = 0XFF; // 清除断码
	WE = 1; // 打开位选锁存器
	P0 = 0XF7;   // 1111 0111  选通第四位数码管
	WE = 0; // 锁存位选数据
	
	DU = 1;  // 打开段选锁存器
	P0 = tabel[num4];//
	DU = 0;   // 锁存段选数据
	delay(1);

	/*第五位显示*/
	P0 = 0XFF; // 清除断码
	WE = 1; // 打开位选锁存器
	P0 = 0XEF;   // 1110 1111  选通第五位数码管
	WE = 0; // 锁存位选数据
	
	DU = 1;  // 打开段选锁存器
	P0 = tabel[num5];//
	DU = 0;   // 锁存段选数据
	delay(1);

	/*第六位显示*/
	P0 = 0XFF; // 清除断码
	WE = 1; // 打开位选锁存器
	P0 = 0XDF;   // 1101 1111  选通第六位数码管
	WE = 0; // 锁存位选数据
	
	DU = 1;  // 打开段选锁存器
	P0 = tabel[num6];//
	DU = 0;   // 锁存段选数据
	delay(1);

	/*第七位显示*/
	P0 = 0XFF; // 清除断码
	WE = 1; // 打开位选锁存器
	P0 = 0XBF;   // 1011 1111  选通第七位数码管
	WE = 0; // 锁存位选数据
	
	DU = 1;  // 打开段选锁存器
	P0 = tabel[num7];//
	DU = 0;   // 锁存段选数据
	delay(1);
		
	/*第八位显示*/
	P0 = 0XFF; // 清除断码
	WE = 1; // 打开位选锁存器
	P0 = 0X7F;   // 0111 1111  选通第八位数码管
	WE = 0; // 锁存位选数据
	
	DU = 1;  // 打开段选锁存器
	P0 = tabel[num8];
	DU = 0;   // 锁存段选数据
	delay(1);	
}

void main()//main函数自身会循环
{	
	while(1)
	{			
		display(1, 2, 3, 4, 5, 6, 7, 8); //数码管显示函数
	}	
}  
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值