原创 数字钟

2008-4-12 23:53 6792 11 11 分类: MCU/ 嵌入式

点击下载//***************************************************//
//***数字钟:四个按键,8个数码显视***
//**************************************************//
#include <reg51.h>
#include <math.h>


#define unchar unsigned char
#define uint   unsigned int


sbit KEY_1 =P3^2;       // 将p3.2定义为KEY_1
sbit KEY_2 =P3^3;    // 将p3.3定义为KEY_2
sbit KEY_3 =P3^6;    // 将p3.6定义为KEY_3
sbit KEY_4 =P3^7;    // 将p3.7定义为KEY_4
//sbit P1_1=P1^1;


//unchar keycnt="0";      //
char hour="0",min=0,sec=0;   //时间清零
char disp[6];    //数码管数据缓冲区
//char ddata[4];              //存放原数据
//char ndata[4];              //存放新数据
unchar Tcnt;
unchar code seg7code[]={0x3F,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //LED段码
  
void Delay(unsigned int tc)     //延时程序
{
 while( tc != 0 )   //如果tc为0则终止延时
 {
  unsigned int i;   //局部正整数变量 i
  for(i=0; i<100; i++); //执行400次将耗时1毫秒
  tc--;     //tc计数减一
 }
}
//******************************************//
//^^^^^^^^^^^^^^^^^键盘扫描^^^^^^^^^^^^^^^^^//
//******************************************//
         //按键扫描程序
//void keyscan();
/*{
   unsigned char i,j;
   while(1)
   {
     if(KEY_1==0)
       {
        for(i=20;i>0;i--)
        for(j=248;j>0;j--);
        if(KEY_1==0)
        {
    TR0=0;
          keycnt++;
          switch(keycnt)  //按下次数判断
             {
               case 1:     //第一次按下
                      ddata[1]=sec;
                      break;
               case 2:     //第二次按下
                      ddata[2]=min;
    
                      break;
               case 3:     //第三次按下
                      ddata[3]=hour;
                      break;
             }
        
         // }
       //}


 if(KEY_2==0)
      {
        for(i=20;i>0;i--)
     for(j=248;j>0;j--);
     if(KEY_2==0)
          {
    switch(keycnt)
             {
               case 1:sec=ddata[1]+1;
                      if(sec==60)
                       sec="0";break;
       case 2:min=ddata[2]+1;
                       if(min==60)
       min=0;
                        break;
                case 3:  hour="ddata"[3]+1;
       if(hour==24)
       hour="0";
       break;
              }
       //}
       //}
    /* if(KEY_3==0)
        {
        for(i=20;i>0;i--)
     for(j=248;j>0;j--);
     if(KEY_2==0)
          {
            switch(m)
             {
               case 1:sec--;
                      if(sec==0)
                       sec="0";break;
       case 2:min--;
                       if(min==0)
       min=0;break;
                case 3:hour--;
      if(hour=0)
       hour=0;break;
              
     }
           }
        }*/
     /* if(KEY_4==0)
           {
              for(i=20;i>0;i--)
           for(j=248;j>0;j--);
           if(KEY_2==0)
              {
                TR0=1;
                return;
              }


           }
         }
        }
       }
     }}*/
conv()
{
  if(sec==60)
   { 
    min++;sec=0;
 if(min==60)
 {
     hour++;min=0;
     if(hour==24)
    {
     hour=0;
    }
  }
 }
  
 disp[0]=seg7code[hour/10];
    disp[1]=seg7code[hour%10];
    disp[2]=seg7code[min/10];
    disp[3]=seg7code[min%10];
    disp[4]=seg7code[sec/10];
    disp[5]=seg7code[sec%10];
}
void main()
{   
    TMOD=0X01;  //TIMER0工作在定时模式,工作方式为1
 TL0=0XA0;  //装入初值
    TH0=0X15;
 Tcnt=20;  //计数初值为20
    TR0=1;   //启动定时器
    ET0=1;   //允许定时器中断
 EA=1;   //开总中断
    //P3=0XFF;
 while(1)
    {
     //keyscan();
  conv();   //位显示子程序
 
 
    P2=0X01;    //显示秒个位
      P0=disp[5];
   Delay(4);
      P2=0X02;     //秒十位
      P0=disp[4];
      Delay(4);


      P2=0X04;
      P0=0X40;   //分隔符
      Delay(4);


      P2=0X08;
      P0=disp[3];
      Delay(4);
      P2=0X10;    //分钟
      P0=disp[2];
      Delay(4);


      P2=0X20;
      P0=0X40;
      Delay(4);


   P2=0X40;
      P0=disp[1];
      Delay(4);
      P2=0X80;
      P0=disp[0];
      Delay(4);  
   }
}


//******************************************//
//^^^^^^^^^^^^^^^^^键盘扫描^^^^^^^^^^^^^^^^^//
//******************************************//
         //按键扫描程序
/*void keyscan()
{
 
   unsigned char i,j;
   P3=0XFF;
   while(1)
   {
     if(KEY_1==0)
       {
        for(i=20;i>0;i--)
        for(j=248;j>0;j--);
        if(KEY_1==0)
        {
    //TR0=0;
          keycnt++;
          switch(keycnt)  //按下次数判断
             {
               case 1:     //第一次按下
                      ddata[1]=sec;
                      break;
               case 2:     //第二次按下
                      ddata[2]=min;
    
                      break;
               case 3:     //第三次按下
                      ddata[3]=hour;
                      break;
               defaut
             }
    if(KEY_2==0)
        {
          for(i=20;i>0;i--)
       for(j=248;j>0;j--);
       if(KEY_2==0)
            {
      switch(keycnt)
               {
                   case 1:sec=ddata[1]+1;
                      if(sec==60)
                       sec="0";break;
         case 2:min=ddata[2]+1;
                       if(min==60)
       min=0;
                        break;
                  case 3:  hour="ddata"[3]+1;
       if(hour==24)
       hour="0";
       break;
                }
         if(KEY_4==0)
              { 
                 for(i=20;i>0;i--)
              for(j=248;j>0;j--);
              if(KEY_2==0)
                 {
                   //TR0=1;
                   return;
                 }


              }
               }
             }
       }
    }
  }
}*/


 

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条