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

📄 clock1.c

📁 一个本人编写的时钟程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>		 
sbit  led1=P1^3;  /* 4位数码管选通引脚 */
sbit  led2=P1^4;	  
sbit  led3=P1^6;
sbit  led4=P1^7;
sbit  led2dz=P1^5;  /*小数点 */

sbit  ls164_ab=P3^0; /*74LS164数据线 */
sbit  ls164_clk=P3^1; /*74LS164时钟线 */

sbit  key1=P3^5; /*按键1   */
sbit  key2=P3^7; /*按键2   */

unsigned int DispFlag;  /*显示标识  */

sbit  key1flag=P3^2;/*按键1状态标识*/
sbit  key2flag=P3^3;/*按键2状态标识*/

sbit  beep=P1^0; /*蜂鸣器*/

unsigned int  MSCNT; /*中断次数  */
  
unsigned char SecondBuf=0;/*秒缓冲区*/
unsigned char MinuteBuf=0; /*分钟缓冲区*/
unsigned char HourBuf=0;   /*小时缓冲区*/
unsigned char MonthBuf=0;/*月缓冲区*/
unsigned char DayBuf=0;	/*日缓冲区*/

unsigned char DispBuf[15]; //显示缓冲
/************************************************************/
//DispBuf[1]-DispBuf[2]--DispBuf[3]-DispBuf[4]--DispBuf[5]-DispBuf[6]
//分  钟     -------     小 时     -------     	天
//DispBuf[7]-DispBuf[8]--DispBuf[9]-DispBuf[10]
//月         -------     秒        
/************************************************************/

/* led1查表 */
unsigned char Sag_led1[10]=
{0x50,0xF9,0x34,0xB0,0x99,0x92,0x12,0xF8,0x10,0x90}; 
/* led234查表 */
unsigned char Sag_led234[10]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

/* 延时子程序 */
void Delay(unsigned int val)
{ 
  while (val!=0) val--;  
}	
/*清缓冲区子程序*/
void ClearDispBuf()
{
  char i;
  for(i=0;i<15;i++)
   {
     DispBuf[0]=0;
   }
}

			  
/* 74ls164工作原理子程序 */		
void Send74ls164(unsigned char sag)
{ 
  char i;
  for(i=1;i<9;i++)
  {
   sag=sag<<1 ;
  if(CY==1)
   ls164_ab=1;
  else 
   ls164_ab=0;
  ls164_clk=1;
  ls164_clk=0 ;	
  }
}

//选定led1
void Select_led1()
{ 
   	led1=0;
	led2=1;
	led3=1;
	led4=1;
}
//选定led2
void Select_led2()
{ 
    led2=0;
   	led1=1;
    led3=1;
	led4=1;
}
//选定led3
void Select_led3()
{ 
    led3=0;
   	led1=1;
	led2=1;
	led4=1;
}
//选定led4
void Select_led4()
{ 
    led4=0;
   	led1=1;
	led2=1;
	led3=1;
}

//更新显示缓冲子程序
int UpdateDispBuf()
{ //更新"秒"显示缓冲
	DispBuf[10]=SecondBuf/10;
	DispBuf[9] =SecondBuf%10;
  //更新"分钟"显示缓冲
	DispBuf[2]=MinuteBuf/10;
	DispBuf[1]=MinuteBuf%10;
  //更新"小时"显示缓冲
    DispBuf[4]=HourBuf/10;
	DispBuf[3]=HourBuf%10;
  //更新"月"显示缓冲
    DispBuf[8]=MonthBuf/10;
	DispBuf[7]=MonthBuf%10;
  //更新"日"显示缓冲
    DispBuf[6]=DayBuf/10;
	DispBuf[5]=DayBuf%10;
}

//4位数码管显示子程序
void Disp(void)	//2位 5000,4位 2500
{
     UpdateDispBuf();
   
     switch(DispFlag)
    {
        case 0: //0x0: //显示 时,分							   
         Select_led4();	
         Send74ls164(Sag_led234[DispBuf[1]]);
         Delay(2500);

		 Select_led3();	
         Send74ls164(Sag_led234[DispBuf[2]]);
         Delay(2500);

		 Select_led2();	
         Send74ls164(Sag_led234[DispBuf[3]]);
         Delay(2500);

		 Select_led1();	
         Send74ls164(Sag_led1[DispBuf[4]]);
         Delay(2500);
	    break;

        case 0x1: //显示 月,日
		 Select_led4();	
         Send74ls164(Sag_led234[DispBuf[5]]);
         Delay(2500);

		 Select_led3();	
         Send74ls164(Sag_led234[DispBuf[6]]);
         Delay(2500);

		 Select_led2();	
         Send74ls164(Sag_led234[DispBuf[7]]);
         Delay(2500);

		 Select_led1();	
         Send74ls164(Sag_led1[DispBuf[8]]);
         Delay(2500);
		break;

        case 0x2: //显示 秒
		 Select_led4();	
         Send74ls164(Sag_led234[DispBuf[9]]);
         Delay(2500);

		 Select_led3();	
         Send74ls164(Sag_led234[DispBuf[10]]);
         Delay(2500);
		break;

        case 0x3: //显示 月
		 Select_led2();	
         Send74ls164(Sag_led234[DispBuf[7]]);
         Delay(2500);

		 Select_led1();	
         Send74ls164(Sag_led1[DispBuf[8]]);
         Delay(2500);
	    break;

        case 0x6: //显示 日	  
		 Select_led4();	
         Send74ls164(Sag_led234[DispBuf[5]]);
         Delay(2500);

		 Select_led3();	
         Send74ls164(Sag_led234[DispBuf[6]]);
         Delay(2500);
		break;

        case 0x9: //显示 时
		 Select_led2();	
         Send74ls164(Sag_led234[DispBuf[3]]);
         Delay(2500);

		 Select_led1();	
         Send74ls164(Sag_led1[DispBuf[4]]);
         Delay(2500);
		break;

        case 12: //0x0C: //显示 分
	     Select_led4();	
         Send74ls164(Sag_led234[DispBuf[1]]);
         Delay(2500);

		 Select_led3();	
         Send74ls164(Sag_led234[DispBuf[2]]);
         Delay(2500);
		break;

	    default:
	    break;

     }
}

void KeyScan()
{ 
  if(key1flag==0)
    {
	  if(key2flag==0)
	    {
		  if(key1==0)
		  {	//key1子程序
		     if(DispFlag==1)
		 	  {
		 	   // 无动作 
		 	  }
		     else if(DispFlag==2)
			  {	 
			    SecondBuf=0;//秒缓冲区清0
			  }
			 else
		 	  {	  
			    DispFlag+=3;
			    key1flag=1;
		 	  }
			if(DispFlag>12)//0x0C)
			{
			  DispFlag=0; 
			}
		  }
		  else if(key2==0)
			    {
				//key2子程序
				   switch(DispFlag)
				   {
				      case 0: //显示"月,日"
					    
					    DispFlag+=1;
						key2flag=1;
					 break;

					  case 1: //显示"秒"
					    DispFlag+=1;
						key2flag=1;
					 break;

					  case 2: //返回显示"时,分"
					    DispFlag=0;
						key2flag=1;
					 break;

					  case 3: //"月"+1 
					    MonthBuf+=1;
						if(MonthBuf>59)
						 {
						   MonthBuf=0; 
						 }
					 break;

					  case 6: //"日"+1 
					    DayBuf+=1;
					//	if(MonthBuf%2==0)
						//  {	
						 //  if(DayBuf>30)
						 //    {
						 //  DayBuf=0; 
						 //    }
						//  }
					//	else
						 //{
						  if(DayBuf>31)
						     {
						   DayBuf=0; 
						     }
					//	 }
					 break;

					  case 9: //"时"+1 
					    HourBuf+=1;
					    if(HourBuf>23)
						 {
						   HourBuf=0; 
						 }
					 break;

					  case 12://"分"+1 
					    MinuteBuf+=1;
						if(MinuteBuf>59)
						 {
						   MinuteBuf=0; 
						 }
					 break;

					 default:
					 break;
				   }

				//返回
				}
		} 
	  else if(key2==1)
	       {
	          key2flag=0;
	       }
	}
  else if(key1==1)
	   {
	     key1flag=0;
	   }
}
/************************************************************/
//定时器0中断
/************************************************************/
void timer() interrupt 1 using 2
{ 
  MSCNT++;
  KeyScan();//键扫描
  TH0=0x0;
  TL0=0x0;
  if(MSCNT>7)
  {
  	MSCNT=0;
    SecondBuf+=1;
	if(SecondBuf>59)
	{
	   SecondBuf=0;
	   MinuteBuf+=1;
	   if(MinuteBuf>59)
	   {						
	      MinuteBuf=0;
		  HourBuf+=1;
		  if(HourBuf>23)
		  {
		     HourBuf=0;
		  }
	   }
	}
 	
  }
}
void main(void)															 
{
  ClearDispBuf();//初始时清显示缓冲区	 
  TMOD=0x01;
  TH0=0x0;
  TL0=0x0;
  EA=1;
  ET0=1;
  TR0=1;
  MSCNT=0;

  ls164_ab=0;
  ls164_clk=0;

  DispFlag=0;
  loop: 
      Disp();
 	  goto loop;
 	
}

⌨️ 快捷键说明

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