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

📄 main__.c

📁 使用AVR单片机实现的万年历功能,其中使用了ds1302和1602
💻 C
📖 第 1 页 / 共 5 页
字号:
                                LcdPutOneChar((DS1302Data[key7I] / 10) + 48);
                                LcdPutOneChar((DS1302Data[key7I] % 10) + 48);

                                if (key7I == 6)
                                {
                                        key7I = 0;
                                }
                                else if (key7I == 2)
                                {
                                        key7I = 4;
                                }
                                else
                                {
                                        ++key7I;
                                }

                                break;
                        case key3:		//按键3为加1处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                ++DS1302Data[key7I];
                                break;
                         case key4:		//按键4为减1处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                --DS1302Data[key7I];
                                break;
                         case key5:	//按键5为加10处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0; 			//只要有键按下则清0 20s计数器
                                DS1302Data[key7I] += 10;
                                break;
                         case key8:		//按键8为减10处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                DS1302Data[key7I] -= 10;
                                break;
                         };

                }

                if ((key7KeyValue == key7)||(time20sIsOK ==1))		//如果按下退出键或者20s没有键按下,则进入设置闹钟音乐
                {
                        noiseMusicOrPlayMusic = 1;
                        SetMusicPlay();
                        noiseMusicOrPlayMusic = 0;
           //             DS1302ReadTimeData();
           //             Change();
           //             LcdSetXY(0, 0);
           //             LcdPutFlashString(solarData);
           //             LcdSetXY(1, 0);
           //             LcdPutFlashString(timeData);
           //             DisplayOne();
                        break;
                }
                else
                {
                        if (time500msIsOK)		//500ms到,取反显示标志
                        {
                                time500msIsOK = 0;
                                setOnbit = ~setOnbit;
                        }

                        switch (key7I)//switch语句用于选择显示的位置
                        {
                        case 0:
                                LcdSetXY(1, 14);
                                break;
                        case 1:
                                LcdSetXY(1, 11);
                                break;
                        case 2:
                                LcdSetXY(1, 8);
                                break;
                        case 4:
                                LcdSetXY(0, 14);
                                break;
                        case 5:
                                LcdSetXY(0, 11);
                                break;
                        case 6:
                                LcdSetXY(0, 8);
                                break;
                        };

                        DS1302CheckDataOve();			//判断数据有效性

                        if (setOnbit)					//500ms显示数据,500ms显示空格
                        {
                                LcdPutOneChar(0x20);
                                LcdPutOneChar(0x20);
                        }
                        else
                        {
                                LcdPutOneChar((DS1302Data[key7I] / 10) + 48);
                                LcdPutOneChar((DS1302Data[key7I] % 10) + 48);
                        }

                        switch (key7I)//switch语句用于选择显示的位置
                        {
                        case 0:
                                LcdSetXY(1, 14);
                                break;
                        case 1:
                                LcdSetXY(1, 11);
                                break;
                        case 2:
                                LcdSetXY(1, 8);
                                break;
                        case 4:
                                LcdSetXY(0, 14);
                                break;
                        case 5:
                                LcdSetXY(0, 11);
                                break;
                        case 6:
                                LcdSetXY(0, 8);
                                break;
                        };
                }

        }


}

void SetMusicPlay(void)
{
        unsigned char key8KeyValue;			//用于存储键值
        unsigned char key8MusicPlayChoose;		//选择播放的音乐
        bit setbit;							//有按键按下标志位

        setbit = 0;
        key8KeyValue = 0;							//初始化为0,表示没有按键按下
        key8MusicPlayChoose = 0x01;				//初始化为第一首音乐
        time10msIsOK = 0;						//清0 10ms, 20s标志位以及20s计数器
        time20sIsOK = 0;
        time20sCounter = 0;

        LcdClear();				//清屏
        //音乐选择界面显示初始化
        LcdSetXY(0, 0);
        LcdPutFlashString("CHOOSE MUSIC");
        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 + -