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

📄 led.c

📁 利用单片机、HD7279、键盘
💻 C
字号:
#include "reg51.h"
#include "define7279.h"
#include "function.h"
unsigned  int i,j,tmr,a=0;
unsigned  int sg,ss,mg,ms,hg,hs;
unsigned  char key_number=0,hour,min,sec,key_value[6];  //时,分,秒初值为23:59:30




//**********************主函数中完成测试基本功能并进入等待键盘状态******************
void main()
{  
   for (tmr=0;tmr<0x2000;tmr++);       //测试
   send_byte(CMD_RESET);
   send_byte(CMD_TEST);
   
   for(i=0;i<3;i++)                    //延时测试时间为3秒
       delay10ms(100);


   send_byte(CMD_RESET);               //复位
   delay10ms(1);


/*   write7279(0x86,0x08);               //最左位显8
   delay10ms(50);
   for(j=0;j<23;j++)                   //右循环3圈
       {
          send_byte(RTR_CYCLE);
          delay10ms(50);
       } 


   send_byte(CMD_RESET);               //复位
   delay10ms(1);


   write7279(0x80,0x07);               //最右位显7
   delay10ms(50);
   for(j=0;j<23;j++)
       {
          send_byte(RTL_CYCLE);        //左循环3圈
          delay10ms(50);
       } 
*/


   keycontrol();                      //进入等待键盘状态

}







//***************************清空key_value中的函数值******************************

void key_valueclean()         
{
   char b;  
   for(b=0;b<6;b++)
      key_value[b]=0;
}





//*************************键盘控制程序*********************************

void keycontrol()               
{

   send_byte(CMD_RESET);               //复位
   delay10ms(1);


   
   key_valueclean();                   //清空key_value中的函数值
 
  
   while(1)                            //键盘控制程序
       { 
              while(a<7)
			  {
		          if(!key)             //是否有键按下
	              {       
			          
                      key_number=read7279(CMD_READ); 
       		          switch(key_number)
				      {
				                case KEY_0:               //0
					                 key_value[a]=0;
                                     out();
									 a++;
                                     break;

                                case KEY_1:               //1
			       		             key_value[a]=1;
									 out();
									 a++;
                                     break;

					            case KEY_2:               //2
					                 key_value[a]=2;
									 out();
									 a++;
                                     break;
						  					      
				                case KEY_3:               //3
					                 key_value[a]=3;
									 out();
									 a++;
                                     break;
						   
					            case KEY_4:               //4
					                 key_value[a]=4;
									 out();
									 a++;
									 break;

					            case KEY_5:               //5
					                 key_value[a]=5;
									 out();
									 a++;
									 break;

				 
				           	    case KEY_6:               //6
					                 key_value[a]=6;
									 out();
									 a++;
									 break;

					            case KEY_7:               //7
					                 key_value[a]=7;
									 out();
									 a++;
									 break;

					            case KEY_8:               //8
					                 key_value[a]=8;
									 out();
									 a++;
									 break;

					            case KEY_9:               //9
					                 key_value[a]=9;
									 out();
									 a++;			
									 break;

   					            case KEY_C:               //开始计时
								     clock();
									 break;

								case KEY_D:               //开始倒计时
						             countdowntime();
									 break;
                                
                                case KEY_F:               //操作错误时,重新操作
                                     a=0;
                                     keycontrol();        
                                     break;

								default: 
								     break;
								     
								     
                                }
			       }
			   }
			   
			   
			   
      }
}
	  
	  


//*****************************在LED上显示数值*************************************	  
//*********************************************************************************
//                  因为要显示六位数,前五位左移,最后一位不移
//*********************************************************************************
					
void out()               
{
    if(a<5)
	{
           write7279(DECODE1,key_value[a]);
           send_byte(RTL_UNCYL);
    }
	else if(a==5)
	{      
	       write7279(DECODE1,key_value[a]);
	}
	while (!key); 				   
}




//*****************************开始计时************************************

void clock()
{

   hour=key_value[0]*10+key_value[1];
   min=key_value[2]*10+key_value[3];
   sec=key_value[4]*10+key_value[5];

   if(hour>23||min>59||sec>59) 
   { 
       key_valueclean(); 
       Error();
     
   }
   else
   {
       while(1)
       {
              if(sec==60)                  //秒为60分进1
              {
                  min++;
                  sec=0;   
                  if(min==60)              //分为60时进1
                     {
                         hour++;
                         min=0;
                         if(hour==24)      //时为24,时为0
                             hour=0;
                    
                     }
              
              }
            
         sg=sec%10;                    //显示秒
         ss=sec/10;
         write7279(0x80,sg);
         write7279(0x81,ss);



         mg=min%10;                    //显示分
         ms=min/10;
         write7279(0x82,mg);
         write7279(0x83,ms);



         hg=hour%10;                   //显示时
         hs=hour/10;          
         write7279(0x84,hg);
         write7279(0x85,hs);

        
         
         
         delay10ms(100);               //延时1秒
         sec++;

         stopkey(); 
              
           
  
      }
    }
}





//*************************倒计时函数***********************************************




void countdowntime()
{

     hour=key_value[0]*10+key_value[1];
     min=key_value[2]*10+key_value[3];
     sec=key_value[4]*10+key_value[5];


    if(hour>23||min>59||sec>59) 
    { 
       key_valueclean(); 
       Error();

    }
    else
    {
       while(1)
       {
              if(sec==-1)              //秒记到0时
              {
                  min--;
                  sec=59;   
                  if(min==-1)          //分记到0时
                     {
                         hour--;
                         min=59;
//                         if(hour==-1)  //时记到0时
//                             hour=23;
                    
                     }
              
              }
            
         sg=sec%10;                    //显示秒
         ss=sec/10;
         write7279(0x80,sg);
         write7279(0x81,ss);



         mg=min%10;                    //显示分
         ms=min/10;
         write7279(0x82,mg);
         write7279(0x83,ms);



         hg=hour%10;                   //显示时
         hs=hour/10;          
         write7279(0x84,hg);
         write7279(0x85,hs);

        
         
         
         delay10ms(100);               //延时1秒
         sec--;



         while(hour==0&min==0&sec==-1) //时间到时,显示要按F键
         {
            write7279(DECODE1,0x0f);
            stopkey();
         } 
              
           
  
      }
   }


     
} 



//****************************显示错误*********************************

void Error()
{
 

            send_byte(CMD_RESET);         //复位
   		  
  			write7279(UNDECODE+4, 0x4F);  //E
   			write7279(UNDECODE+3, 0x05);  //r
   			write7279(UNDECODE+2, 0x05);  //r
   			write7279(UNDECODE+1, 0x1D);  //o
  			write7279(UNDECODE, 0x05);    //r

          while(1)
          {
           stopkey();
          } 


}




//**********************************等待停止键**************************************


void stopkey(void)
{
            if(!key)
            {
               key_number=read7279(CMD_READ); //按下F键后回到键盘等待状态
       		   if(key_number==KEY_F)
               {
                    a=0;
                    keycontrol();
               }
            }
}




  

⌨️ 快捷键说明

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