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

📄 myboard.c

📁 单片机电子音乐程序
💻 C
📖 第 1 页 / 共 4 页
字号:
				   musicKeyFlag=~musicKeyFlag;
			   }
			   s_tableCounter=0x00;
               break;		
    case 0x0e: if(LEDKeyFlag==1)              /*按*键:开始/停止流水灯自动演示*/
			   {
                   AutoShow();
                   LEDKeyFlag=~LEDKeyFlag; 
               }
               else
			   {
                   StopAutoShow();
				   LEDKeyFlag=~LEDKeyFlag;
               }			       
               break;		                   
    case 0x0f: if(++LEDFlag>5)     		      /*按#键:流水灯方案循环切换*/
	           {
			       LEDFlag=1;
			   }
               break;
    default:                           		
               break;
    }   
}
/*************************************************************************/
void LEDHandle(void)                     /*流水灯方案选择*/
{
    switch(LEDFlag)                      /*判断该演示的流水灯方案*/
	{
    case 0x01: DropDown(); break;        /*水滴方案*/
	case 0x02: CircleFlash(); break;     /*环扫方案*/
	case 0x03: GradualFlash(); break;    /*渐明渐暗方案*/
	case 0x04: SlowFlash(); break;       /*慢闪方案*/
	case 0x05: FastFlash(); break;       /*快闪方案*/
    }
}
/*************************************************************************/
void AutoShow(void)                /*开始流水灯自动循环演示*/
{
    LEDFlag=1;
    LEDAutoFlag=1;
}
/*************************************************************************/
void StopAutoShow(void)            /*停止流水灯自动循环演示*/
{
    LEDAutoFlag=0;
}
/*************************************************************************/
void DropDown(void)                                 /*水滴方案*/
{
    static uchar s_dropdownCounter=0,s_dropdown_i=7,s_dropdown_OverCounter;
   	uchar rest;
    if(LEDCycle100msFlag==1)                        /*判断100ms是否到*/
	{
	    LEDCycle100msFlag=0;
        rest=s_dropdownCounter%8;
		P2=~(0x01<<rest) & (0xff>>(7-s_dropdown_i));/*使水滴流到某个灯并且让流到底的灯常亮*/
		if(s_dropdownCounter>=(8-s_dropdown_i)*7)   /*判断一个水滴流程是否完成*/
		{
		    s_dropdownCounter+=8-s_dropdown_i;      /*每流完一个流程下一个水滴的流程就要相应减少一个灯*/
		    s_dropdown_i--;
			if(s_dropdown_i==0)                     /*整个水滴流程完了吗*/
		    {
			    s_dropdown_i=7;
				s_dropdownCounter=0;
				if(++s_dropdown_OverCounter>=1)     /*一个完整水滴流程完了之后如果自动演示功能打开则跳到下一方案*/
				{
				    s_dropdown_OverCounter=0;
					if(LEDAutoFlag==1)
			        {
			            LEDFlag++;
			        }
				}
			}
		}
		else
		{
		    s_dropdownCounter++;
		}
	}
}
/*************************************************************************/
void GradualFlash(void)                     /*渐明渐暗方案*/
{
    static uchar s_gradualFlash_i=10,s_flashCounter,s_gradualFlash_OverCounter;
	static bit s_gradualFlash_i_Flag=0;
    if(LEDCycle500usFlag==1)                /*判断500us是否到*/
	{
	    LEDCycle500usFlag=0;
	    if(((++s_flashCounter)%10)!=0)      /*PWM周期为10*500us=5ms,判断PWM周期到否*/
		{
		    if((s_flashCounter%10)<s_gradualFlash_i)    /*在PWM周期内按设定占空比调节灯的亮灭*/
			{
			    P2=0xff;
			}
			else
			{
			    P2=0x00;
			}		    
		}
		else                                /*PWM周期到了*/
		{
		    P2=0xff;
			if((s_flashCounter/10)>=10)     /*改变PWM占空比前先判断延时10*5ms=50ms到否*/
			{                               /*没到在此周期内占空比保持不变*/
			    s_flashCounter=0;
		        if(s_gradualFlash_i_Flag==0)   /*需要渐明则调高占空比*/
    		    {
		            s_gradualFlash_i--;
			    }
			    else                           /*需要渐暗则调低占空比*/
			    {
			        s_gradualFlash_i++;       
			    }
			    if(s_gradualFlash_i==0 || s_gradualFlash_i>=10) /*如果渐明或渐暗完毕则交换*/
			    {
				    s_gradualFlash_i_Flag=~s_gradualFlash_i_Flag;
					if(++s_gradualFlash_OverCounter>=6) /*渐明渐暗6/2=3个周期后如果自动演示功能打开则跳到下一方案*/
					{
					    s_gradualFlash_OverCounter=0;
						if(LEDAutoFlag==1)
			            {
			                LEDFlag++;
			            }
					}
			    }
			}
		}
	}
}
/*************************************************************************/
void CircleFlash(void)                      /*环扫方案*/
{
    static uchar s_circleFlashCounter,s_circle_OverCounter;
    if(LEDCycle100msFlag==1)                /*判断100ms是否到*/
	{
	    LEDCycle100msFlag=0;
		P2=~(0x01<<s_circleFlashCounter);   /*让某个灯亮应该令相应引脚为低*/
		if(++s_circleFlashCounter>=8)       /*8个灯都亮过以后再重新开始*/
		{
		    s_circleFlashCounter=0;
			if(++s_circle_OverCounter>=5)   /*循环5遍后如果自动演示功能打开则跳到下一方案*/
			{
			    s_circle_OverCounter=0;
			    if(LEDAutoFlag==1)
			    {
			        LEDFlag++;
				}
			}
		}
	}
}

/*************************************************************************/
void SlowFlash(void)                        /*慢闪方案*/
{
    static uchar s_slowFlashCounter;
    if(LEDCycle100msFlag==1)                /*判断100ms是否到*/
	{
	    LEDCycle100msFlag=0;
		if((++s_slowFlashCounter%5)==0)     /*判断5*100ms=500ms是否到*/ 
		{
		    P2=~P2;                         /*每500ms灯亮灭改变一次*/
		}
		if(s_slowFlashCounter/5>=6)         /*慢闪6/2=3个周期以后如果自动演示功能打开则跳到下一方案*/
		{
		    
		    s_slowFlashCounter=0;
			if(LEDAutoFlag==1)
			{
			    LEDFlag++;
			}
		}
	}
}
/*************************************************************************/
void FastFlash(void)                        /*快闪方案*/
{
    static uchar s_fashFlashCounter;
    if(LEDCycle100msFlag==1)                /*判断100ms是否到*/
	{
	    LEDCycle100msFlag=0;
		P2=~P2;                             /*每100ms灯亮灭改变一次*/
		if(++s_fashFlashCounter>=30)        /*快闪30/2=15个周期以后如果自动演示功能打开则跳到下一方案*/
		{
		    s_fashFlashCounter=0;
		    if(LEDAutoFlag==1)
			{
			    LEDFlag=1;
			}
		}
	}
}
/*************************************************************************/
void ScrShift(uchar keyIndex)	    /*六位数码管顺序左移*/
{
    uchar i;			
    for(i=5;i>0;i--)
    {
        DisplayArray[i]=DisplayArray[i-1];	
    }
    DisplayArray[0]=c_keyCode[keyIndex];	
}			
/*************************************************************************/
void ClearScr(void)		            /*清屏*/
{
    uchar i;			
    for(i=0;i<6;i++)		
    {
        DisplayArray[i]=0x00;
    }			
}
/*************************************************************************/
void ReadPassword()		            /*从24C02中读取密码*/
{
    uchar i;
    IICRead(0xa0,0,password,6);     
    for(i=0;i<6;i++)
    {
        DisplayArray[i]=password[i];
    }
}
/*************************************************************************/
void WritePassword()		        /*将屏幕的六位数字作为密码存入24C02中*/
{
   IICWrite(0xa0,0,DisplayArray,6);	
}
/*************************************************************************/
void StatusSend(void)		        /*下位机状态反馈(串口)*/
{
    uchar i;
    IE&=0xef;
    for(i=6;i>0;i--)
	{
	    SBUF=DisplayArray[i-1];	
	    while(TI!=1);		
	    TI=0;	
	}
    SBUF=s_musicCounter;
    while(TI!=1);
    TI=0;
    SBUF=LEDFlag;
    while(TI!=1);
    TI=0;
    IE|=0x10;
}
/*************************************************************************/
void Delay (unsigned int value)     /*10us延时*/
{
    while (value!=0) 
	{
	    value--;	
	}
}
/*************************************************************************/
void ModifyTime(void)		        /*调整时间*/
{
    uchar ucharTemp;
    ucharTemp=sec;			
    sec%=60;				        /*秒除60取余数为sec*/
    min+=ucharTemp/60;		        /*分加上秒的进位先暂存于min*/
	ucharTemp=min;
    min%=60;				        /*分再除60取余数为min*/
    hour=(hour+ucharTemp/60)%24;	/*时加上分的进位除24取余数为hour时*/
    DisplayArray[0]=(sec%10);		/*将时间存入显示缓冲区*/	
    DisplayArray[1]=(sec/10);		
    DisplayArray[2]=(min%10);		
    DisplayArray[3]=(min/10);		
    DisplayArray[4]=(hour%10);	
    DisplayArray[5]=(hour/10); 	
}		
/*************************************************************************/		
void ScanSeg7()                             /*数码管扫描显示*/
{
    static uchar s_scanCounter;
    s_scanCounter++;
    if(s_scanCounter>5) s_scanCounter=0;	            	/*ptr1>5表示6个数码管都已经扫描过*/
    P0=s_scanCounter|(DisplayArray[s_scanCounter]<<4);
}	
/*************************************************************************/
void IICClockDelay()           /*IIC总线时钟电平延时*/
{
    nop;nop;nop;nop;nop;nop;
}
/*************************************************************************/
void IICAck(bit ackValue)      /*MCU对24C02的应答/不应答函数*/
{
  if(ackValue==0)              /*ackValue=0表示不应答*/         
     SDA=0;     	     
  else                         /*ackValue=1表示应答*/
     SDA=1;
  IICClockDelay();
  SCL=1;
  IICClockDelay();

⌨️ 快捷键说明

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