基于STC15F2K60S2单片机的数码管显示程序。主要功能包括:

  1. 定义了一些宏和全局变量,包括数码管显示需要的码表、数码管的各个位的值、刷新计数器、按键扫描标志等。
  2. 初始化函数All_Init()用来初始化IO口,包括控制蜂鸣器、LED灯、数码管位选和段选的锁存器。
  3. 数码管显示函数分为四个部分,分别用来显示数码管的1-2位、3-4位、5-6位、7-8位。
  4. 按键扫描函数Key_Scan()用来检测外部按键输入,并根据按键情况设置标志位。
  5. 主程序中通过循环不断扫描按键状态,根据按键状态改变显示值或控制特定功能,比如按下按键S7会显示从1到8,按下按键S6会显示从9到2,按下按键S5会控制数码管显示器输出高电平,按下按键S4会控制数码管显示器的运行。
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>

//变量定义区域
#define uchar unsigned char
#define uint  unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
uchar Num=255;
uchar Num_Refresh=0;
uchar S7_Flag=0,S6_Flag=0,S5_Flag=0,S4_Flag=0;
uchar SEG_Run=0;
//函数定义区域
//毫秒级延迟函数
void Delay(unsigned int ms);
//初始化程序
void All_Init(void);
//数码管显示函数
void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(uchar wu,uchar liu);
void SEG_Display78(uchar qi,uchar ba);
//按键扫描函数
void Key_Scan(void);




//主程序
void main()
{

	All_Init();
	SEG1=10;SEG2=10;SEG3=10;SEG4=10;
	SEG5=10;SEG6=10;SEG7=10;SEG8=10;
	while(1)
	{
		Key_Scan();
		if(S7_Flag==1){S7_Flag=0;SEG1=1;SEG2=2;SEG3=3;SEG4=4;SEG5=5;SEG6=6;SEG7=7;SEG8=8;}
		if(S6_Flag==1){S6_Flag=0;SEG1=9;SEG2=8;SEG3=7;SEG4=6;SEG5=5;SEG6=4;SEG7=3;SEG8=2;}
		if(S5_Flag==1)
		{
			S5_Flag=0;
			P2=0X80;
			P0=0X00;
			
		}
		
		if(S4_Flag==1)
		{
			S4_Flag=0;
			if(SEG_Run==0)SEG_Run=1;
			else if(SEG_Run==1)SEG_Run=0;
			
		}
		
		if(SEG_Run == 1)
		{
			if(++Num_Refresh==125)
			{
				Num_Refresh = 1;
				Num=Num-1;
				SEG1=11;SEG2=11;SEG3=11;SEG4=11;SEG5=11;
				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 Delay(unsigned int ms)		//@11.0592MHz
{
	unsigned char i, j;

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

}
//初始化
void All_Init(void)
{
	P2=0XA0;//1010 00000 打开控制蜂鸣器继电器的74HC573锁存器
	P0=0X00;//0000 0000 关闭蜂鸣器继电器
	
	P2=0X80;//1000 0000 打开控制LED灯的74HC573的锁存器
	P0=0XFF;//1111 1111 关闭所有LED
	
	P2=0XC0;//1100 0000 打开控制数码管位选的锁存器
	P0=0XFF;//1111 1111 选中所有数码管
	P2=0XE0;//1110 0000 打开控制数码管段选的锁存器
	P0=0XFF;//1111 1111关闭所有数码管
	
	
}
//数码管显示函数
void SEG_Display12(uchar yi,uchar er)
{
		P0=0XFF;
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay(1);
		P0=0XFF;
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay(1);
	P0=0XFF;
	
	
}
void SEG_Display34(unsigned char san,unsigned char si)
{
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay(1);
	P0=0XFF;
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay(1);	
	P0=0XFF;
}

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

//按键扫描函数
void Key_Scan(void)
{
	if(P30 == 0)
	{
		Delay(30);
		if(P30 == 0) S7_Flag=1;
		while(!30);
		
	}
	
	else if(P31==0)
	{
		Delay(30);
		if(P31 == 0) S6_Flag=1;
		while(!30);		
	}
	else if(P32==0)
	{
		Delay(30);
		if(P32 == 0) S5_Flag=1;
		while(!30);		
	}

	else if(P33==0)
	{
		Delay(30);
		if(P33 == 0) S4_Flag=1;
		while(!30);		
	}
		
		
}
03-23 02:31