⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saomiao.c

📁 通过C语言控制数码管动态扫描显示
💻 C
字号:
#include <reg52.h>
//#include <intrins.h>

#define uint  unsigned int
#define uchar unsigned char

uchar code dutable[]={    			//共阴极段选表  数码管段选 0~9
			0xc0,0xf9,0xa4,0xb0,0x99,
			0x92,0x82,0xf8,0x80,0x90
		     };  

uchar code wetable[]={0x08,0x04,0x02,0x01};	//位选表

uint wei_num;		  //四位数码管位选变量

uint 	 Set_key_num;	  //设置按钮的按下次数

uint fen,miao;    //定义时间格式变量   12:34
uint Time_num;

sbit Set_key=P1^5;   //设置按钮
sbit Inc_key=P1^6;   //增1按钮
sbit Dec_key=P1^7;   //减1按钮

////////////////////
//  延时函数
void delay(uint z)	
{
	uint x,y;
	for(x=110;x>0;x++)
		for(y=z;y>0;y--);
}


////////////////////
//  数码管显示函数
void display(uint ifen,uint imiao)
{
	uint shi_fen,ge_fen,shi_miao,ge_miao;

	shi_fen = ifen/10;
	P0 = wetable[wei_num];
	P2 = dutable[shi_fen];
	wei_num++;
	delay(10);
	
	ge_fen = ifen%10;
	P0 = wetable[wei_num];
	P2 = dutable[shi_fen];
	wei_num++;
	delay(10);
		
	shi_miao = imiao/10;
	P0 = wetable[wei_num];
	P2 = dutable[shi_fen];
	wei_num++;
	delay(10);
	
	ge_miao = imiao%10;
	P0 = wetable[wei_num];
	P2 = dutable[shi_fen];
	wei_num++;	
	delay(10);
	
	wei_num = 0;
		
}

////////////////////
//  初始化函数
void init()
{
	Time_num = 0;	//清0倒计时中断次数
	wei_num = 0;	//清0四位数码管位数变量

	P0 = 0xfe;    	//P0口是位选 第一位选通    0 liang
	P2 = 0x11;   	//P1口是段选 初次运行不显示数值    1 liang

	Set_key=1;    	//按键接口设置高电平
	Inc_key=1;   
	Dec_key=1;   

	Set_key_num=0;    //清0  即:按了0次  

	fen=0;	      	  //分、秒清0
	miao=0;


	/////////////////
	//动态扫描定时器初始化
	TMOD=0x01;   
	TH0=(65536-50000)/256;   //50ms	
	TL0=(65535-50000)%256;	
	EA=1;  //开外部中断	
	ET0=1; //开始定时器0中断
	TR0=1; //启动定时器0

	/////////////////
	//时钟定时器初始化
	TMOD=0x01;   
	TH1=(65536-50000)/256;   //50ms	
	TL1=(65535-50000)%256;	
	EA=1; 	

 
}


////////////////////
//  入口函数
void main()
{
	init();
	while(1)
	{
		////////////////////
		//倒计时处理
		if(Time_num == 20)
		{
			Time_num = 0;
			if(fen==0)
			{
				if(miao==0)
					;	/////////////////////////
			}
			if(miao==-1)
			{
				miao=59;
				fen--;
			}
			miao--;		
		}
		////////////////////
		//  "设置"键按下	
		if(Set_key!= 1)             
		{   
			delay(10);        
			if(Set_key!= 1)
			{   
				while(Set_key!= 1); 
				ET1=0;       //Set时  关闭倒计时
				TR1=0; 
				if(Set_key_num>=3)   //按了3次
				{
					Set_key_num = 0;
					ET1=1;       //开始倒计时
					TR1=1;	
				}
				Set_key_num++;       //次数加1
			}
		}   
		////////////////////
		//  "增加"键按下
		if(Inc_key!= 1)              
		{   
			delay(10);       
			if(Inc_key!= 1)            
			{   
				while(Inc_key!= 1); 
				if(Set_key==1)	//按了1次,调分钟
				{
					if(fen==60)
						fen=0;
					else
						fen++;
				}
				if(Set_key==2)
				{
					if(miao==60)
						miao=0;
					else
						miao++;
				}
			}
		}   
		////////////////////
		//  "降低"键按下
		if(Dec_key!= 1)               
		{   
			delay(10);      
			if(Dec_key!= 1)         
			{   
				while(Dec_key!= 1); 
				if(Set_key==1)	//按了1次,调秒钟
				{ 
					if(fen==-1)
						fen=60;
					else
						fen--;								
				}
				if(Set_key==2)
				{
					if(miao==-1)
						miao=0;
					else
						miao--;	
				}
			}
		}  
	}
}


////////////////////
//  动态扫描中断源
void timer0() interrupt 1
{
	TH0=(65536-50000)/256;   //50ms	
	TL0=(65535-50000)%256;	
//	display(fen,miao);
	display(12,34);
}



////////////////////
//  秒数时钟中断源
void timer1() interrupt 3
{
	TH1=(65536-50000)/256;   //50ms	
	TL1=(65535-50000)%256;	

	Time_num++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -