51单片机时钟

单片机 · 2023-03-09

51单片机实现电子表的功能
废话不多说
代码如下

#include "reg52.h"   //??????

typedef unsigned int u16;    //??????????
typedef unsigned char u8;  //???????????

#define GPIO_KEY P1

#define led P2
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit k1=P3^1;  
sbit k2=P3^0;  
sbit k3=P3^2;
sbit k4=P3^3;

sbit beep=P1^5;

u8 code lzl[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F

u8 wei[8];
u8 weil[8];
u8 ssec,sec,min,hour;
u8 a_ssec,a_sec,a_min,a_hour;
     
u8 model=0;    //????????     
u8 sign=0;    //?????????
     
u8 secl=50;    //??????
u8 minl=12;
u8 hourl=6;    

u8 a_secl=0;    //??????
u8 a_minl=0;
u8 a_hourl=0; 
u8 KeyValue;     
/******************************
*  ????
*******************************/
void delay(u16 i)
{
 while(i--); 
}



/******************************
*  ???0?????
*******************************/
void Time0_Init()
{
 TMOD|=0x01; //???????,????1
 TH0=0xd8; //???????,??10ms
 TL0=0xf0; 
 ET0=1;  //?????0??
 EA=1;  //?????
 TR0=1;  //???????   
}



/******************************
*  ??????
*******************************/
void display()
{
 u8 i;
 for(i=0;i<8;i++)
 {
  switch(i)  //??,????????,
  {
   case(0):
    LSA=1;LSB=1;LSC=1; break;
   case(1):
    LSA=0;LSB=1;LSC=1; break;
   case(2):
    LSA=1;LSB=0;LSC=1; break;
   case(3):
    LSA=0;LSB=0;LSC=1; break;
   case(4):
    LSA=1;LSB=1;LSC=0; break; 
   case(5):
    LSA=0;LSB=1;LSC=0; break;
   case(6):
    LSA=1;LSB=0;LSC=0; break;
   case(7):
    LSA=0;LSB=0;LSC=0; break; 
  }
  P0=wei[i];   //????
  delay(100);   //???????? 
  P0=0x00;
 }
}


void displayl()
{
 u8 i;
 for(i=0;i<8;i++)
 {
  switch(i)  //??,????????,
  {
   case(0):
    LSA=1;LSB=1;LSC=1; break;
   case(1):
    LSA=0;LSB=1;LSC=1; break;
   case(2):
    LSA=1;LSB=0;LSC=1; break;
   case(3):
    LSA=0;LSB=0;LSC=1; break;
   case(4):
    LSA=1;LSB=1;LSC=0; break; 
   case(5):
    LSA=0;LSB=1;LSC=0; break;
   case(6):
    LSA=1;LSB=0;LSC=0; break;
   case(7):
    LSA=0;LSB=0;LSC=0; break; 
  }
  P0=weil[i];   //????
  delay(100);   //???????? 
  P0=0x00;
 }
}

/******************************
*  ???????
*******************************/
void show()  
{
 switch(model)
 {
  case 0:
  {
   wei[2]=lzl[hour/10];  
   if(sign%2==0)
    wei[3]=lzl[hour%10]|0x80;
   else
    wei[3]=lzl[hour%10];
    wei[4]=lzl[min/10];
    wei[5]=lzl[min%10]|0x80;
    wei[6]=lzl[sec/10];
    wei[7]=lzl[sec%10];
   break;
  }
  case 1:
  {
   if(sign%2==0)
   {
    wei[2]=lzl[hour/10];  
    if(sign%2==0)
     wei[3]=lzl[hour%10]|0x80;
    else
     wei[3]=lzl[hour%10];
    wei[4]=lzl[min/10];
    wei[5]=lzl[min%10]|0x80;
    wei[6]=0x00;
    wei[7]=0x00;
   }
   else
   {
    wei[2]=lzl[hour/10];  
    if(sign%2==0)
     wei[3]=lzl[hour%10]|0x80;
    else
     wei[3]=lzl[hour%10];
    wei[4]=lzl[min/10];
    wei[5]=lzl[min%10]|0x80;
    wei[6]=lzl[sec/10];
    wei[7]=lzl[sec%10];
   }
   break;
  }
  case 2:
  {
   if(sign%2==0)
   {
    wei[2]=lzl[hour/10];  
    if(sign%2==0)
     wei[3]=lzl[hour%10]|0x80;
    else
     wei[3]=lzl[hour%10];
    wei[4]=0x00;
    wei[5]=0x00|0x80;
    wei[6]=lzl[sec/10];
    wei[7]=lzl[sec%10];
   }
   else
   {
    wei[2]=lzl[hour/10];  
    if(sign%2==0)
     wei[3]=lzl[hour%10]|0x80;
    else
     wei[3]=lzl[hour%10];
    wei[4]=lzl[min/10];
    wei[5]=lzl[min%10]|0x80;
    wei[6]=lzl[sec/10];
    wei[7]=lzl[sec%10];
   }
  }
   break;
  case 3:
  {
   if(sign%2==0)
   {
    wei[2]=0x00;  
    if(sign%2==0)
     wei[3]=0x00|0x80;
    else
     wei[3]=0x00;
    wei[4]=lzl[min/10];
    wei[5]=lzl[min%10]|0x80;
    wei[6]=lzl[sec/10];
    wei[7]=lzl[sec%10];
   }
   else
   {
    wei[2]=lzl[hour/10];  
    if(sign%2==0)
     wei[3]=lzl[hour%10]|0x80;
    else
     wei[3]=lzl[hour%10];
    wei[4]=lzl[min/10];
    wei[5]=lzl[min%10]|0x80;
    wei[6]=lzl[sec/10];
    wei[7]=lzl[sec%10];
   }
   break;
  }
 }
}
///////////////////////////////////
void showl()  
{
 switch(model)
 {
  case 0:
  {
   weil[2]=lzl[a_hour/10];  
   if(sign%2==0)
    weil[3]=lzl[a_hour%10]|0x80;
   else
    weil[3]=lzl[a_hour%10];
    weil[4]=lzl[a_min/10];
    weil[5]=lzl[a_min%10]|0x80;
    weil[6]=lzl[a_sec/10];
    weil[7]=lzl[a_sec%10];
   break;
  }
  case 1:
  {
   if(sign%2==0)
   {
    weil[2]=lzl[a_hour/10];  
    if(sign%2==0)
     weil[3]=lzl[a_hour%10]|0x80;
    else
     weil[3]=lzl[a_hour%10];
    weil[4]=lzl[a_min/10];
    weil[5]=lzl[a_min%10]|0x80;
    weil[6]=0x00;
    weil[7]=0x00;
   }
   else
   {
    weil[2]=lzl[a_hour/10];  
    if(sign%2==0)
     weil[3]=lzl[a_hour%10]|0x80;
    else
     weil[3]=lzl[a_hour%10];
    weil[4]=lzl[a_min/10];
    weil[5]=lzl[a_min%10]|0x80;
    weil[6]=lzl[a_sec/10];
    weil[7]=lzl[a_sec%10];
   }
   break;
  }
  case 2:
  {
   if(sign%2==0)
   {
    weil[2]=lzl[a_hour/10];  
    if(sign%2==0)
     weil[3]=lzl[a_hour%10]|0x80;
    else
     weil[3]=lzl[a_hour%10];
    weil[4]=0x00;
    weil[5]=0x00|0x80;
    weil[6]=lzl[a_sec/10];
    weil[7]=lzl[a_sec%10];
   }
   else
   {
    weil[2]=lzl[a_hour/10];  
    if(sign%2==0)
     weil[3]=lzl[a_hour%10]|0x80;
    else
     weil[3]=lzl[a_hour%10];
    weil[4]=lzl[a_min/10];
    weil[5]=lzl[a_min%10]|0x80;
    weil[6]=lzl[a_sec/10];
    weil[7]=lzl[a_sec%10];
   }
  }
   break;
  case 3:
  {
   if(sign%2==0)
   {
    weil[2]=0x00;  
    if(sign%2==0)
     weil[3]=0x00|0x80;
    else
     weil[3]=0x00;
    weil[4]=lzl[a_min/10];
    weil[5]=lzl[a_min%10]|0x80;
    weil[6]=lzl[a_sec/10];
    weil[7]=lzl[a_sec%10];
   }
   else
   {
    weil[2]=lzl[a_hour/10];  
    if(sign%2==0)
     weil[3]=lzl[a_hour%10]|0x80;
    else
     weil[3]=lzl[a_hour%10];
    weil[4]=lzl[a_min/10];
    weil[5]=lzl[a_min%10]|0x80;
    weil[6]=lzl[a_sec/10];
    weil[7]=lzl[a_sec%10];
   }
   break;
  }
 }
}

/******************************
*  ???????
*******************************/
unsigned char key_scan()
{
 if(k1==0)
 {
  delay(1000);
  if(k1==0)
  {
  model++;
  while(!k1);
  if(model==4)
   model=0;
  }
 }
 
 if(k2==0)
 {
  delay(1000);
  if(k2==0)
  {
   if(model==1)  //???
   {
    sec++; if(sec>=60)sec=0;
   }
   else if(model==2) //????
   {
    min++; if(min>=60)min=0;
   }
   else if(model==3) //????
   {
    hour++; if(hour>=24)hour=0;
   }
   while(!k2);
  }
 }
 
 if(k3==0)
 {
  delay(1000);
  if(k3==0)
  {
   if(model==1)  //???
   {
    sec--; if(sec==255)sec=59;
   }
   else if(model==2) //????
   {
    min--; if(min==255)min=59;
   }
   else if(model==3) //????
   {
    hour--; if(hour==255)hour=23;
   }
   while(!k3);
  }
 }
 if(k4==0)
 {
  delay(1000);
  if(k4==0)
   model=0;
  while(!k4);
    return 1;
 }
 
 ///////////////////

return 0;
 
}

    /////////////////////////
 
 


/******************************
*  ???????
*******************************/
void alarm()
{



u8 data1;
data1 =0xfe;
 if(hour==a_hour && min==a_min && sec==a_sec)
 {


  while(1)
  {
     
     data1 = data1<<1|0x01;    
    if(data1==0xff)data1=0xfe;
     beep=~beep;
   delay(100);
     led = data1;
     delay(1000);
   if(k4==0)
    break;
        
    
  }
 }
}

///////////////////////////

void KeyDownn(void)
{unsigned char ook;
    char a=0;
    GPIO_KEY=0x0f;
    if(GPIO_KEY!=0x0f)//????????
    {
        delay(1000);//??10ms????
        if(GPIO_KEY!=0x0f)//??????????
        {    
            //???
            GPIO_KEY=0X0F;
            switch(GPIO_KEY)
            {
                case(0X07):    KeyValue=0;break;
                case(0X0b):    KeyValue=1;break;
                case(0X0d): KeyValue=2;break;
                case(0X0e):    KeyValue=3;break;
            }
            //???
            GPIO_KEY=0XF0;
            switch(GPIO_KEY)
            {
                case(0X70):    KeyValue=KeyValue;break;
                case(0Xb0):    KeyValue=KeyValue+4;break;
                case(0Xd0): KeyValue=KeyValue+8;break;
                case(0Xe0):    KeyValue=KeyValue+12;break;
            }
            
            while((a<50)&&(GPIO_KEY!=0xf0))     //????????
            {
                delay(1000);
                a++;
            }
            
            
            
            while(1){
            displayl();
            showl();
            
            ///////////////////
            if(k1==0)
 {
  delay(1000);
  if(k1==0)
  {
  model++;
  while(!k1);
  if(model==4)
   model=0;
  }
 }
 
 if(k2==0)
 {
  delay(1000);
  if(k2==0)
  {
   if(model==1)  //???
   {
    a_sec++; if(a_sec>=60)a_sec=0;
   }
   else if(model==2) //????
   {
    a_min++; if(a_min>=60)a_min=0;
   }
   else if(model==3) //????
   {
    a_hour++; if(a_hour>=24)a_hour=0;
   }
   while(!k2);
  }
 }
 
 if(k3==0)
 {
  delay(1000);
  if(k3==0)
  {
   if(model==1)  //???
   {
    a_sec--; if(a_sec==255)a_sec=59;
   }
   else if(model==2) //????
   {
    a_min--; if(a_min==255)a_min=59;
   }
   else if(model==3) //????
   {
    a_hour--; if(a_hour==255)a_hour=23;
   }
   while(!k3);
  }
 }
 if(k4==0)
 {
  delay(1000);
  if(k4==0)
   model=0;
  while(!k4);
    break;}
            ////////////////////
            
            
            
          }
            }
    }
}

//////////////////////////




/******************************
*   ???
*******************************/
void main()
{ 
P0=0;
 Time0_Init();
// Time1_Init();
// Int0_Init();
 while(1)
 {
  display();
  show();
  key_scan();
    KeyDownn();
  alarm();
 } 
}



/******************************
*  ???0????
*******************************/
void Time0() interrupt 1
{
 TH0=0Xd8; //???,??10ms
 TL0=0Xf0;
 ssec++;
 if(ssec>=100)  //1s
 {
  ssec=0;
  sec++;
  sign++;
  if(sign>=100)
   sign=0;
  if(sec>=60)
  {
   sec=0;
   min++;
   if(min>=60)
   {
    min=0;
    hour++;
    if(hour>=25)
     hour=0;
   }
  } 
 }


}
  1. 是礼物阿 2023-03-10

    学的数电模电都是假的,我压根全部忘记了

    1. admin (作者)  2023-03-10
      @是礼物阿

      我是初学,嘿嘿😁

Theme Jasmine by Kent Liao