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

📄 main.c~

📁 使用AVR单片机实现的万年历功能,其中使用了ds1302和1602
💻 C~
📖 第 1 页 / 共 3 页
字号:
        LcdSetXY(1, 0);
        LcdPutFlashString("MUSIC: 1");
        
        while (1)
        {
                FindTime();			//判断各个时间段是否已经到达
                
                if (time10msIsOK)
                {
                        time10msIsOK = 0;
                        key8KeyValue = FindKeyValue();  //读取键值
                        
                        switch (key8KeyValue)
                        {
                        case key8:
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                
                                if (setbit)					//如果有键按下则进行处理
                                {
                                        if(noiseMusicOrPlayMusic)		//判断为播放音乐还是设置闹钟音乐
                                        {
                                                noiseMusicChoose = key8MusicPlayChoose;
                                        }
                                        else
                                        {
                                                PlayMusic(key8MusicPlayChoose, 1);
                                        }
                                }
                                
                                break;
                        case key3:
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                setbit = 1;					//有键按下标志位置1,表示有键按下
                                if (key8MusicPlayChoose < 9)		//加1处理
                                {
                                        key8MusicPlayChoose++;
                                }
                                else
                                {
                                        key8MusicPlayChoose = 0x01;
                                } 
                                
                                break; 
                        case key4: 
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                if (key8MusicPlayChoose > 1)	//减1处理
                                {
                                        key8MusicPlayChoose--;
                                }
                                else
                                {
                                        key8MusicPlayChoose = 0x09;
                                }  
                                break;
                        };
                                
                } 
                
                if ((key8KeyValue == key8)||(time20sIsOK ==1))	//按下退出键或者20s没有键按下则推出设置播放音乐界面,进入显示主程序
                {      
                        DS1302ReadTimeData();
                        FindDataOfWeek();
                        Change();
                        LcdSetXY(0, 0);
                        LcdPutFlashString(solarData);
                        LcdSetXY(1, 0);
                        LcdPutFlashString(timeData);
                        DisplayOne();
                        break;
                }
                else			//否则显示此时选择的音乐
                {
                        LcdSetXY(1, 7);
                        LcdPutOneChar(key8MusicPlayChoose + 48);
                }
                        
                
        }

}

unsigned char NoiseTimeFlag(void)
{
        unsigned char noiseTimeFlag = 0x01;//是否达到闹钟时间的标志,并初始化为到达
        unsigned char i;
        
        for(i = 0; i < 8; i++)
        {
                if (DS1302Data[i] != noiseData[i])
                {
                        noiseTimeFlag = 0x00;		//如果有一个数据不同,表示没有到达闹钟时间,清0闹钟到达标志
                        break;
                }
                
        } 
        
        return noiseTimeFlag;
}

void main(void)
{

        unsigned char mainKeyValue;		//主程序中用于判断键值的变量
        bit mainPlayNoise;
        bit mainPlayHour; 
        mainPlayNoise = 0;
        mainPlayHour = 0;
        
        
        KeyInit();       // 按键处理程序初始化
        LcdInit();       // 液晶显示初始化
        MusicInit();     // 音乐播放初始化
        TimingInit();    // 定时初始化
        UsartInit();     // 串口初始化
//液晶最开始显示阳历和时间格式        
        LcdSetXY(0, 0);
        LcdPutFlashString(solarData);
        LcdSetXY(1, 0);
        LcdPutFlashString(timeData);
        
     //   noiseSetFlag = 0;		//清0闹钟使能标志
        noiseMusicChoose = 0x01;	//闹钟音乐默认为第一首
        mainKeyValue = 0x00;		//清0键值
        noiseMusicOrPlayMusic = 0;		//初始化默认为设置播放音乐
        
 /*       noiseData[0]=00;
        noiseData[1]=00;
        noiseData[2]=12;
        noiseData[3] = 5;
        noiseData[4]=0x01;
        noiseData[5]=0x01;
        noiseData[6]=0x01;
        noiseData[7]=0x14;
        DS1302WriteRamData();
        noiseSetFlag = 1;
   */     
        DS1302ReadRamData(); 		//读取闹钟数据存入noiseData
        #asm("sei")					//开放中断
      //主程序中循环执行以下语句
        
   /*             DS1302Data[0]=56;
        DS1302Data[1]=59;
        DS1302Data[2]=11;
        DS1302Data[3]=5;
        DS1302Data[4]=0x01;
        DS1302Data[5]=0x01;
        DS1302Data[6]=0x01;
        DS1302Data[7]=0x14;
     //   DS1302Data[11]=0x14; 
         DS1302WriteTimeData();  
         */
        while (1)
        {
                FindTime();		//判断各个时间段是否已经到达	
                
                DS1302ReadTimeData();		//读取时钟数据
                FindDataOfWeek();			//计算星期
                Change();					//显示数据送缓冲区
                DisplayOne();				//显示阳历和时间
                
                LcdSetXY(1, 6);				//显示闹钟标志
                
                if (noiseData[8] == 0x01 )
                {
                        LcdPutOneChar(0x2A);
                }
                else
                {
                        LcdPutOneChar(0x20);
                }   
                
                if (TCCR1B == 0x08)
                {
                        mainPlayNoise = 0;
                        mainPlayHour = 0; 
                }
                
                if ((NoiseTimeFlag() == 0x01) && (noiseData[8] == 0x01)) //判断是否闹钟时间到,如果是的话延时1s闹钟起闹
                { 
                        mainPlayNoise = 1;
                 //       mainPlayHour = 0;      
                        DS1302ReadTimeData(); 
                        Change();
                        DisplayOne();
                        delay_ms(300);
                        DS1302ReadTimeData();
                        Change();
                        DisplayOne();
                        delay_ms(300);
                        DS1302ReadTimeData();
                        Change();
                        DisplayOne();
                        delay_ms(400);
                        PlayMusic(noiseMusicChoose, 10);                        
                }                                       
                else if ((DS1302Data[1] == 0) && (DS1302Data[0] == 0) && (mainPlayNoise == 0))	//判断是否为整点,如果是的话延时1s报时
                {
                        mainPlayHour = 1; 
                     //   mainPlayNoise = 0;      
                        DS1302ReadTimeData();
                        Change();
                        DisplayOne();
                        delay_ms(300);
                        DS1302ReadTimeData();
                        Change();
                        DisplayOne();
                        delay_ms(300);
                        DS1302ReadTimeData(); 
                        Change();
                        DisplayOne();
                        delay_ms(400);

                        if (DS1302Data[2] % 12)
                        {
                                PlayMusic(0x0A, (DS1302Data[2] % 12));
                        }
                        else
                        {
                                PlayMusic(0x0A, 12);
                        }
                }
          //      else
           //     {
           //             mainPlayNoise = 0;
           //             mainPlayHour = 0;
            //    } 
                
                if (time10msIsOK)		//判断是否10ms已经到达,如果是,则扫描一次按键
                {
                        time10msIsOK = 0;	
                        mainKeyValue = FindKeyValue();	//读取键值

                        if ((mainKeyValue != 0) && (TCCR1B == 0x0A))	//如果按键按下时有音乐在播放,则关闭定时器1,停止音乐播放
                        {
                       	        TCCR1B = 0x08;
							
                        }
                        else
                        {
                        
                                switch (mainKeyValue)			
                                {
                                case key5 :							//按键5按下则显示农历和星期
                                        SeeLunarAndWeek();
                                        break;
                        
                                case key6:							//按键6按下为设置时间和阳历
                                        SetTimeAndSolar();
                                        break;
                                
                                case key7:							//按键7按下为设置闹钟时间和音乐
                                        SetNoiseData();
                                        break;
                                
                                case key8:							//按键8按下为播放音乐选择
                                        SetMusicPlay();
                                        break;
                                };  
                                
                        }
                       
                }   
                
        }
        
        
        
        
}    

⌨️ 快捷键说明

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