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

目录

(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);
}
}
相关推荐
测试老哥11 小时前
Python+selenium自动化生成测试报告
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
2351613 小时前
【LeetCode】3. 无重复字符的最长子串
java·后端·算法·leetcode·职场和发展
微笑尅乐13 小时前
神奇的位运算——力扣136.只出现一次的数字
java·算法·leetcode·职场和发展
吃着火锅x唱着歌14 小时前
LeetCode 3105.最长的严格递增或递减子数组
算法·leetcode·职场和发展
测试199814 小时前
Web自动化测试之测试用例流程设计
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
吃着火锅x唱着歌14 小时前
LeetCode 2765.最长交替子数组
算法·leetcode·职场和发展
墨染点香15 小时前
LeetCode 刷题【91. 解码方法】
算法·leetcode·职场和发展
hn小菜鸡18 小时前
LeetCode 2460.对数组执行操作
算法·leetcode·职场和发展
hn小菜鸡20 小时前
LeetCode 524.通过删除字母匹配到字典里最长单词
算法·leetcode·职场和发展
小欣加油1 天前
leetcode 98 验证二叉搜索树
c++·算法·leetcode·职场和发展