【蓝桥杯入门记录】动态数码管例程

目录

(1)例程1:两个数码管显示不同内容。本例以第一个数码管显示数字"0",第二个数码管显示数字"1"为例。

(2)例程2:多个数码管显示不同内容(二)。注:创建数码管显示子函数。

(3)例程3:多个数码管显示不同内容(二)。注:创建数码管显示子函数。

①法一:

②法二:

③法三

(4)例程4:多位数码管倒计时。本例以第6、7、8位数码管显示255→0的倒计时为例,其他数码管保持熄灭。

(5)例程5:,多位数码管倒计时+联合LED控制。本例以第6、7、8位数码管显示255→0的倒计时(其他数码管保持熄灭),倒计时至250时L1点亮为例。

(6)例程6:独立按键控制数码管显示。本例以上电之后所有数码管显示字符"-",按下S7按键,第一个数码管显示数字"1",按下S6按键,第二个数码管显示数字"2",按下S5按键,第三个数码管显示数字"3",按下S4按键,第四个数码管显示数字4为例。

(7)例程7:独立按键控制数码管显示+数码管倒计时+LED控制。本例以上电之后所有数码管显示字符"-",按下S7按键,第一个数码管显示数字"1";按下S6按键,第二个数码管显示数字"2",按下S5按键,控制点亮L1灯,且第6、7、8位数码管显示255->0的倒计时(其他所有数码管熄灭),倒计时至250时,L8灯点亮为例。


(1)例程1:两个数码管显示不同内容。本例以第一个数码管显示数字"0",第二个数码管显示数字"1"为例。

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>

//变量声明区域
unsigned int i = 0;

//函数声明区域
void Delay(int ms);

//程序主体
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//初始化程序  

	while(1)
	{
		P2=0XC0;P0=0X01;//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=0XC0;//大家控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay(1);
		
		P2=0XC0;P0=0X02;//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=0XF9;//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay(1);
		
		
	}	
		
}


//函数定义区域
void Delay(int ms)		//@11.0592MHz
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	
}

(2)例程2:多个数码管显示不同内容(二)。注:创建数码管显示子函数。

cs 复制代码
#include <STC15F2K60S2.H>
#include<intrins.h>

void Delay_MS(unsigned int MS);

void main(void)
{
	IO_Init();
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;		//初始化程序,后期详解;
	
	while(1)
	{
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=0XC0;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=0XF9;	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	}
}

void Delay_MS(unsigned int MS)
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	
}

(3)例程3:多个数码管显示不同内容(二)。注:创建数码管显示子函数。

①法一:
cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>

//变量声明区域
unsigned int i = 0;
unsigned char DSEG[]= {0X00,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char code SEG[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};

//函数声明区域
void Delay(int ms);
void DSED_Display(unsigned char dseg,unsigned char seg);



//程序主体
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//初始化程序  
	
	while(1)
	{
	 DSED_Display(1,1);
     DSED_Display(2,2);
	 DSED_Display(3,3);
	 DSED_Display(4,4);
	 DSED_Display(5,5);
     DSED_Display(6,6);
	 DSED_Display(7,7);
	 DSED_Display(8,8);

		
		
	}	
		
}


//函数定义区域
void Delay(int ms)		//@11.0592MHz
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	
}

void DSED_Display(unsigned char dseg,unsigned char seg)
{
	P0 = 0XFF;//消影
	P2=0XC0;P0=DSEG[dseg];//打开控制数码管位选的锁存器,然后选中第一个数码管
	P2=0XFF;P0=SEG[seg];
	Delay(1);
	
	
}
②法二:
cs 复制代码
#include <STC15F2K60S2.H>
#include<intrins.h>

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};

unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;

void Delay(int ms);
void SEG_Display(unsigned char yi,unsigned char er,unsigned char san,unsigned char si,unsigned char wu,unsigned char liu,unsigned char qi,unsigned char ba);

void main(void)
{
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;		//初始化程序,后期详解;

	
	while(1)
	{
		SEG1=1,SEG2=2,SEG3=3,SEG4=4,SEG5=5,SEG6=6,SEG7=7,SEG8=8;
		SEG_Display(SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8);
	}
}

void SEG_Display(unsigned char yi,unsigned char er,unsigned char san,unsigned char si,unsigned char wu,unsigned char liu,unsigned char qi,unsigned char ba)
{
		P0=0XFF;
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

void Delay(int ms)		//@11.0592MHz
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	
}
③法三
cs 复制代码
#include <STC15F2K60S2.H>
#include<intrins.h>

//#define uchar unsigned char
//#define uint unsigned int
	
typedef unsigned char uchar ;
typedef unsigned int uint ;

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};

unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;

void Delay(int ms);
void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);

void main(void)
{

	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;		//初始化程序,后期详解;

	while(1)
	{
		SEG1=1,SEG2=2,SEG3=3,SEG4=4,SEG5=5,SEG6=6,SEG7=7,SEG8=8;
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
	}
}


void SEG_Display12(unsigned char yi,unsigned char er)
{
		P0=0XFF;
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

void SEG_Display34(unsigned char san,unsigned char si)
{
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);		
}


void Delay(int ms)		//@11.0592MHz
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	
}

(4)例程4:多位数码管倒计时。本例以第6、7、8位数码管显示255→0的倒计时为例,其他数码管保持熄灭。

cs 复制代码
#include <STC15F2K60S2.H>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};

unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char Num = 255 ;
unsigned char Num_Refresh = 0 ;

void Delay(uint MS);
void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);

void main(void)
{
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;		//初始化程序,后期详解;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;		//打开第一个数码管,后期详解;
	
	SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11;
	SEG6=2,SEG7=5,SEG8=5;
	while(1)
	{		
		
	  if(++Num_Refresh==125)
		{
			Num_Refresh = 0 ;
			Num = Num -1; //Num--;
			SEG6=Num/100,SEG7=Num%100/10,SEG8=Num%10;
		}
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
	}
}


void SEG_Display12(unsigned char yi,unsigned char er)
{
		P0=0XFF;
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

void SEG_Display34(unsigned char san,unsigned char si)
{
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);		
}


void Delay(uint MS)	//@11.0592MHz
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	

(5)例程5:,多位数码管倒计时+联合LED控制。本例以第6、7、8位数码管显示255→0的倒计时(其他数码管保持熄灭),倒计时至250时L1点亮为例。

cs 复制代码
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>

//变量声明区域
unsigned int i = 0;
unsigned char DSEG[]= {0X00,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char code SEG[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char Num = 255;
unsigned char Num_Refresh = 0;

//函数声明区域
void Delay(int ms);
void DSED_Display(unsigned char dseg,unsigned char seg);



//程序主体
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//初始化程序  
	
	while(1)
	{
	 DSED_Display(1,10);
   DSED_Display(2,10);
	 DSED_Display(3,10);
	 DSED_Display(4,10);
	 DSED_Display(5,10);
	 DSED_Display(6,Num/100);
	 DSED_Display(7,Num%100/10);
	 DSED_Display(8,Num%10);
			

		if(++Num_Refresh == 125)
		{
			Num_Refresh = 0;
			Num--;

					
		}
			if(Num == 250)
			{
				P2 = 0X90;P0 = 0XFE;
			}
		
		
	}	
		
}


//函数定义区域
void Delay(int ms)		//@11.0592MHz
{
	unsigned char i, j;
	for(i = 0;i < ms;i++)
	{
		_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
				
	}
	
}

void DSED_Display(unsigned char dseg,unsigned char seg)
{

	P2=0XC0;P0=DSEG[dseg];
	P2=0XFF;P0=SEG[seg];
	Delay(1);
	P0 = 0XFF;
	
	
}

(6)例程6:独立按键控制数码管显示。本例以上电之后所有数码管显示字符"-",按下S7按键,第一个数码管显示数字"1",按下S6按键,第二个数码管显示数字"2",按下S5按键,第三个数码管显示数字"3",按下S4按键,第四个数码管显示数字4为例。

cs 复制代码
#include <STC15F2K60S2.H>
#include<intrins.h>

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};


unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char Num = 255 ;
unsigned char Num_Refresh = 0 ;
unsigned char S7_Flag = 0, S6_Flag = 0, S5_Flag = 0, S4_Flag = 0 ;
void Delay_MS(unsigned int MS);
void SEG_Display12(unsigned char,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void KeyScan(void);

void main(void)
{
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;		//初始化程序,后期详解;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;		//打开第一个数码管,后期详解;
	
	SEG1=10,SEG2=10,SEG3=10,SEG4=10,SEG5=10;
	SEG6=10,SEG7=10,SEG8=10;
	while(1)
	{		
		KeyScan();
		
		if(S7_Flag == 1){ S7_Flag = 0 ; SEG1 = 1 ; }
		if(S6_Flag == 1){ S6_Flag = 0 ; SEG2 = 2 ; }
		if(S5_Flag == 1){ S5_Flag = 0 ; SEG3 = 3 ; }
		if(S4_Flag == 1){ S4_Flag = 0 ; SEG4 = 4 ; }		
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
	}
}

void KeyScan(void)
{
	if(P30==0)
	{
		Delay_MS(10);
		if(P30==0)S7_Flag = 1 ;		
		while(!P30);
	}
	else if(P31==0)
	{
		Delay_MS(10);
		if(P31==0)S6_Flag = 1 ;		
		while(!P31);
	}	
	else if(P32==0)
	{
		Delay_MS(10);
		if(P32==0)S5_Flag = 1 ;		
		while(!P32);
	}	
	else if(P33==0)
	{
		Delay_MS(10);
		if(P33==0)S4_Flag = 1 ;		
		while(!P33);
	}	
}

void SEG_Display12(unsigned char yi,unsigned char er)
{	
	P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
	P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
	
	P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
	P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);	
	P0=0XFF;
}

void SEG_Display34(unsigned char san,unsigned char si)
{
	P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
	P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
	
	P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
	P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);	
	P0=0XFF;
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
	P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
	P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
	
	P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
	P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{	
	P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
	P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;

	P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
	P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);	
	P0 = 0XFF;	
}

void Delay_MS(unsigned int MS)
{
	unsigned char i, j;

	while(MS--)
	{
	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
}

(7)例程7:独立按键控制数码管显示+数码管倒计时+LED控制。本例以上电之后所有数码管显示字符"-",按下S7按键,第一个数码管显示数字"1";按下S6按键,第二个数码管显示数字"2",按下S5按键,控制点亮L1灯,且第6、7、8位数码管显示255->0的倒计时(其他所有数码管熄灭),倒计时至250时,L8灯点亮为例。

cs 复制代码
#include <STC15F2K60S2.H>
#include<intrins.h>


unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};

unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char Num = 255 ;
unsigned char Num_Refresh = 0 ;
unsigned char S7_Flag = 0, S6_Flag = 0, S5_Flag = 0, S4_Flag = 0 ;
unsigned char SEG_Run = 0 ;


void Delay_MS(unsigned int MS);
void SEG_Display12(unsigned char yi, unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu, unsigned char liu);
void SEG_Display78(unsigned char qi, unsigned char ba);
void KeyScan(void);

void main(void)
{
	
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;		//初始化程序,后期详解;

	
	SEG1=10,SEG2=10,SEG3=10,SEG4=10,SEG5=10;
	SEG6=10,SEG7=10,SEG8=10;
	while(1)
	{		
		KeyScan();
		
		if(S7_Flag == 1){ S7_Flag = 0 ; SEG1 = 1 ; }
		if(S6_Flag == 1){ S6_Flag = 0 ; SEG2 = 2 ; }
		if(S5_Flag == 1)
		{
			S5_Flag = 0 ;
			SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11;
			SEG6=Num/100,SEG7=Num%100/10,SEG8=Num%10;
			P2=0X80;P0=0XFE;
			SEG_Run = 1 ;
		}
		
		if(SEG_Run == 1)
		{
			if(++Num_Refresh==125)
			{
				Num_Refresh = 0 ;
				Num = Num -1; //Num--;
				SEG6=Num/100,SEG7=Num%100/10,SEG8=Num%10;
				if(Num == 250)
				{
					P2=0X80;P0=0X7F;
				}
			}			
		}
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
	}
}

void KeyScan(void)
{
	if(P30==0)
	{
		Delay_MS(10);
		if(P30==0)S7_Flag = 1 ;		
		while(!P30);
	}
	else if(P31==0)
	{
		Delay_MS(10);
		if(P31==0)S6_Flag = 1 ;		
		while(!P31);
	}	
	else if(P32==0)
	{
		Delay_MS(10);
		if(P32==0)S5_Flag = 1 ;		
		while(!P32);
	}	
	else if(P33==0)
	{
		Delay_MS(10);
		if(P33==0)S4_Flag = 1 ;		
		while(!P33);
	}	
}

void SEG_Display12(unsigned char yi,unsigned char er)
{	
	P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
	P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
	
	P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
	P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);	
	P0=0XFF;
}

void SEG_Display34(unsigned char san,unsigned char si)
{
	P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
	P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
	
	P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
	P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);	
	P0=0XFF;
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
	P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
	P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
	
	P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
	P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{	
	P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
	P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);
	P0=0XFF;

	P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
	P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
	Delay_MS(1);	
	P0=0XFF;	
}

void Delay_MS(unsigned int MS)
{
	unsigned char i, j;

	while(MS--)
	{
	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
}
相关推荐
LCG元6 小时前
【面试问题】JIT 是什么?和 JVM 什么关系?
面试·职场和发展
不想当程序猿_8 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
m0_7482455210 小时前
吉利前端、AI面试
前端·面试·职场和发展
kkflash314 小时前
提升专业素养的实用指南
学习·职场和发展
sinat_3070215315 小时前
大数据政策文件——职业道德(山东省大数据职称考试)
大数据·职场和发展
Sudo_Wang17 小时前
力扣150题
算法·leetcode·职场和发展
逝灮19 小时前
【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块
驱动开发·stm32·单片机·嵌入式硬件·物联网·蓝桥杯·温度传感器
清弦墨客19 小时前
【数据结构与算法】深度优先搜索:树与图的路径探寻之道
数据结构·python·算法·蓝桥杯·深度优先
呆呆的猫20 小时前
【LeetCode】9、回文数
算法·leetcode·职场和发展
测试老哥1 天前
Python自动化测试图片比对算法
自动化测试·软件测试·python·测试工具·程序人生·职场和发展·测试用例