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

📄 clock624.c

📁 一个本人编写的时钟程序
💻 C
字号:
#include<reg51.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;
sbit  key2flag=P3^3;

sbit  beep=P1^0;

unsigned int  MSCNT; /*中断次数  */
  
unsigned char SecondBuf=25;
unsigned char MinuteBuf=34;
unsigned char HourBuf=16;
unsigned char MonthBuf=10;
unsigned char DayBuf=15;

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}; 
/* led2查表 */
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_led2();	
         Send74ls164(Sag_led234[DispBuf[9]]);
         Delay(2500);

		 Select_led1();	
         Send74ls164(Sag_led1[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子程序
		    DispFlag+=3;
			key1flag=1;
			if(DispFlag>12)//0x0C)
			{
			  DispFlag=0; 
			}
			else
		    {
			 //******
	     	}
		   //返回
		  }
		  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;
					 break;

					  case 3:    

					 break;
					  case 6:
					 break;
					  case 9:
					 break;
					  case 12:
					 break;
				   }

				//返回
				}
			  else
			    {
				//返回
				}
		    }
		} 
	  else 
	    {
		  if(key2==1)
	       {
	          key2flag=0;
	       }
	      else
	       {
	       //返回		   }
	    }
	}
  else
    {
	 if(key1==1)
	   {
	     key1flag=0;
	   }
	 else
	   {
	   //返回
	   }   
    }
  
}
void main(void)															 
{
  ClearDispBuf();	 
  TMOD=0x01;
  TH0=0x0;
  TL0=0x0;
  MSCNT=15;

  ls164_ab=0;
  ls164_clk=0;

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

⌨️ 快捷键说明

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