STC89C52单片机 点亮两个数码管,可以显示 00——10 共 11 个数字

手动显示
#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)
{
												
	/*第一位显示*/ 		
	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);
	
}

void main()//main函数自身会循环
{	
	while(1)
	{			
		display(0, 0); //数码管显示函数
	}	
}  

说明:

由于传参的缘故,显示 00——10 共 11 个数字只需要调用
自定义的函数void display(uchar num1, uchar num2)
依次传入:

display(0 ,1);
display(0 ,2);
display(0 ,3);
display(0 ,4);
display(0 ,5);
display(0 ,6);
display(0 ,7);
display(0 ,8);
display(0 ,9);
display(1 ,0);

所以以上其它代码不再复制。

自动显示
#include <reg52.h>//包含51头文件
#include <intrins.h>//包含移位标准库函数头文件

#define uint unsigned int
#define uchar unsigned char

sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
uchar count = 0; // 控制数码管显示的变量
uchar i = 0;  // 控制循环次数的变量

//共阴数码管段选表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)
{
												
	/*第一位显示*/ 		
	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);
	
}


/*====================================
变量 count:负责控制点亮哪2个数码管,例如count 为1 则点亮 01 数码管
描述	:由于同时点亮2个数码管,需要2个数码管不断的循环才能实现2个数码管同时点亮
			所以在这里将数码管显示在单片机的代码封装起来,来让我们调用。
====================================*/
void singlechip_show_num(uchar count){	 
	switch(count){	// 通过	switch case 语句对 数码管的数值进行精准的管理
	    case 0 :
	       display(0 , 0);
	       break; 
	    case 1 :
	       display(0 , 1);
	       break;
		case 2 :
	       display(0 , 2);
	       break;
		case 3 :
	       display(0 , 3);
	       break;
		case 4 :
	       display(0 , 4);
	       break;
		case 5 :
	       display(0 , 5);
	       break;
		case 6 :
	       display(0 , 6);
	       break;   
		case 7 :
	       display(0 , 7);
	       break; 
		case 8 :
	       display(0 , 8);
	       break;
		case 9 :
	       display(0 , 9);
	       break;
		case 10 :
	       display(1 , 0);
	       break;      
	}
	
}

void main()//main函数自身会循环
{	
	while(1)
	{			
		for (i = 0; i < 200; i++){	  // 使点亮的数码管循环 200 次,保证人眼能够看到的数码管是同时显示的。
			singlechip_show_num(count);	  // 调用数码管显示函数
		}

		count++; //每次循环200次结束,	count 变量自身+1,单片机显示+1后的数值

		if(count == 11){	// 当count 变量 等于11时,我们把变量再重新初始化为0,从0重新开始计数循环
			count = 0;
		}
	}	
}  

效果显示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要确定使用的八位数码管的型号和接口,然后根据其接口和控制方式编写相应的控制程序。 以下为一种可能的代码实现: ```c #include <reg51.h> #define DIGIT_PORT P1 // 数码管段选控制端口 #define ADDR_PORT P0 // 数码管位选控制端口 // 数码管显示的数值 unsigned char digits[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++); } } void display_digit(unsigned char d, unsigned char addr) { // 在地址线上输出位选信号 ADDR_PORT |= (1 << addr); // 在数据线上输出段选信号 DIGIT_PORT = digits[d]; // 等待足够的显示时间 delay_ms(1); // 清除段选信号,准备显示下一个数字 DIGIT_PORT = 0; // 清除位选信号,准备显示下一位 ADDR_PORT &= ~(1 << addr); } void display_number(unsigned int num) { unsigned char digit, i; for (i = 0; i < 8; i++) { // 从低位到高位逐个获取数字的每一位,并显示在对应的数码管上 digit = num % 10; display_digit(digit, i); num /= 10; } } void main() { unsigned int num1 = 12345678; unsigned int num2 = 87654321; while (1) { // 循环显示两个数字 display_number(num1); delay_ms(500); display_number(num2); delay_ms(500); } } ``` 该程序逐位显示数字并控制数码管的位选和段选信号,通过循环反复显示两个数字。需要注意不同型号的数码管可能需要不同的控制方式,具体实现需根据所用数码管的型号和数据手册进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值