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

📄 clock.c

📁 单片机数字钟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                              }
                              break;
                          default: break;     
                       }
                  } 
             }
         }
 	}
}

/***************************************************
			键盘扫描函数
原型:   void readkey(void);
功能:  当获得有效按键时,令getkey=1,keynum为按键值

****************************************************/
void readkey(void)
{
	uchar M_key = 0;  

 	first_row = 0;
 	second_row = 0;
 	M_key = KEY;
 	if(M_key != 0xff)  //如果有连续两次按键按下,认为有有效按键按下。消除按键抖动
   	{
    		if(first_getkey == 0)
     		{
   			first_getkey = 1;	
   		}
  		else    //当有有效按键按下时,进一步识别是哪一个按键
   		{
   			if(keyon == 0)  //防止按键冲突,当还有未释放的按键时不对其它按键动作响应   
   			{
      				first_row = 0;         //扫描第一行按键
      				second_row = 1;
         			M_key = KEY;
         			if(M_key != 0xff)
           			{
            				switch(M_key) 
            				{	
            	 				case 0xfe:
                   					keynum = 0x00;
               						break;
            					case 0xfd:
                       				keynum = 0x01;
                 					break;
               					case 0xfb:
                 		    		keynum = 0x02;
                 					break;
               					case 0xf7:
                      				keynum = 0x03;
                 					break;
               					case 0xef:
                 					keynum = 0x04;
                 					break;
               					case 0xdf:
                 					keynum = 0x05;
                					break;
               					case 0xbf:
                					keynum = 0x06;
                 					break;
              	 				case 0x7f:
                 					keynum = 0x07;
                 					break;
              				}
           			}
         			else
           			{
            				second_row = 0;     //扫描第二行按键
            				first_row = 1;
            				M_key = KEY;
            				switch(M_key)
              				{
               					case 0xfe:
                					keynum = 0x08;
                					break;
               					case 0xfd:
                 					keynum = 0x09;
                 					break;
               					case 0xfb:
                 					keynum = 0x0a;
                 					break;
               					case 0xf7:
                 					keynum = 0x0b;
                 					break;
               					case 0xef:
                 					keynum = 0x0c;
                 					break;
               					case 0xdf:
                 					keynum = 0x0d;
                 					break;
               					case 0xbf:
                 					keynum = 0x0e;
                 					break;
               					case 0x7f:
                 					keynum = 0x0f;
                 					break;
              				}
           			}
				getkey = 1; //获得有效按键数值
                		keyon = 1;  //防止按键冲突,当获得有效按键时将其置1
        		} 
     		} 
   	}
 	else
   	{
    		first_getkey = 0;
    		keyon = 0;     //防止按键冲突,当所有的按键都释放时将其清0
    	}
}

/***************************************************
			数码管显示函数
原型:   void leddisp(void);
功能:  每次调用轮流显示一位数码管

****************************************************/
void leddisp(void)
{
	switch(lednum)  //选择需要显示的数码位
 	{
  		case 0:
            if (aorc==1)
            {  LED1 = segtab[led[0]]; }
            else 
    		{  LED1 = segtab[led[0]]-0x80; }
     		break;
  		case 1:
     		LED2 = segtab[led[1]];
     		break;
 		case 2:
     		LED3 = segtab[led[2]];
     		break;
 		case 3:
     		LED4 = segtab[led[3]];
     		break;
 		case 4:
     		LED5 = segtab[led[4]];
     		break;
 		case 5:
     		LED6 = segtab[led[5]];
     		break;
 		case 6:
            if (alarm_on==1)
            {    
               aorc=1;
               if (alarm_count2!=0)
               {
                  if (alarm_count1<500)//1秒闪烁一次,一次0.5秒
                  {
			         LED7 = segtab[led[6]]-0x80;          
                  }
                  else if (alarm_count1<1000)
                  {
                     LED7 = segtab[led[6]];//这里的alarm_count1,alarm_count2全部由alarm中的决定,为了闪烁时消去小数点,比较烦琐
                  }
               }    
            }
            else 
            {  LED7 = segtab[led[6]]-0x80; }
     		break;
		case 7:
     		LED8 = segtab[led[7]];
     		break;
  	}

	if(lednum == 0) //更新需要现实的数码位
 	{
		lednum = 7;
 	}
 	else
 	{
		lednum = lednum-1;
	}
}  
/* 闹钟设置闪烁函数*/
void flash2(void)
{
    if (aorc==1)
    {
	   if (mode>=1)
	   {
	        count2++;
            if (count2<250)//0。5秒亮一次,一次0.25秒
            {
		        switch (mode)
				{
				    case 0x00: break;
				    case 0x01:
			            led[4]=0x11;
                        led[5]=0x11;
						break;
                    case 0x02:
                        led[6]=0x11;
                        led[7]=0x11;
						break;
					default: break;
				}
  		    }
            else if (count2<500)
            { 
		        switch (mode)
				{
				    case 0x00: break;
				    case 0x01:
			            led[0]=aaorp;
                        led[4]=aminute%10;
                        led[5]=aminute/10;
                        led[6]=ahour%10;
                        led[7]=ahour/10;
                        break;
                    case 0x02:
			            led[0]=aaorp;
                        led[4]=aminute%10;
                        led[5]=aminute/10;
                        led[6]=ahour%10;
                        led[7]=ahour/10;
						break;
					default: break;
				}     
            }
            else 
            {  count2 = 0;  } 
		       
	    }
    }
}
/*时钟设置闪烁函数*/
void flash1(void)
{
    if (aorc==0)
    {
	   if (mode>=1)
	   {
	        count1++;
            if (count1<250)//0.5秒闪烁一次,一次0.25秒
            {
		        switch (mode)
				{
				    case 0x00: break;
				    case 0x01:
			            led[4]=0x11;
                        led[5]=0x11;
						break;
                    case 0x02:
                        led[6]=0x11;
                        led[7]=0x11;
						break;
                    case 0x03:
                        led[0]=0x11;
                        led[1]=0x11;
						break;
					default: break;
				}
  		    }
            else if (count1<500)
            { 
		        switch (mode)
				{
				    case 0x00: break;
				    case 0x01:
			            led[2]=aorp;
                        led[4]=second%10;
                        led[5]=second/10;
                        led[6]=minute%10;
                        led[7]=minute/10;
                        led[0]=hour%10;
                        led[1]=hour/10;
                        break;
                    case 0x02:
			            led[2]=aorp;
                        led[4]=second%10;
                        led[5]=second/10;
                        led[6]=minute%10;
                        led[7]=minute/10;
                        led[0]=hour%10;
                        led[1]=hour/10;
						break;
                    case 0x03:
			            led[2]=aorp;
                        led[4]=second%10;
                        led[5]=second/10;
                        led[6]=minute%10;
                        led[7]=minute/10;
                        led[0]=hour%10;
                        led[1]=hour/10;
						break;
					default: break;
				}     
            }
            else 
            {  count1 = 0;  } 
		       
	    }
    }
}
/*闹铃函数*/
void alarm(void)
{
    if  (ahour==hour&&aminute==minute&&second==0&&aaorp==aorp)
    { alarm_on=1;}
    if (alarm_on==1)//闹钟是否到时?
    {    
        aorc=1;//显示闹钟
        if (alarm_count2!=0)
        {
            alarm_count1++;
            if (alarm_count1<500)//1秒闪烁一次,一次0.5秒
            {
			    led[0]=aaorp;
                led[4]=aminute%10;
                led[5]=aminute/10;
                led[6]=ahour%10;
                led[7]=ahour/10;
            }
            else if (alarm_count1<1000)
            {
			    led[0]=0x11;
                led[4]=0x11;
                led[5]=0x11;
                led[6]=0x11;
                led[7]=0x11;
            }
            else 
            {
                 alarm_count1 = 0;
                 alarm_count2--;     
            }    
        }
        else 
        {
            alarm_on = 0;
            alarm_count2 = 10;
			aorc=0;//闹铃完成后,显示时钟
        }
       
    }
}

⌨️ 快捷键说明

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