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

📄 main.c~

📁 使用AVR单片机实现的万年历功能,其中使用了ds1302和1602
💻 C~
📖 第 1 页 / 共 3 页
字号:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project : 
Version : 
Date    : 2008-6-28
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega16
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include "ds1302ram.h"
#include "key.h"
#include "lcd.h"
#include "music.h"
#include "time.h"
#include "timing.h"
#include "usart.h"
#include "ds1302ram.c"
#include "key.c"
#include "lcd.c"
#include "music.c"
#include "time.c"
#include "timing.c"
#include "usart.c"

//bit noiseSetFlag;	//用于存放闹钟是否起闹的标志
unsigned char noiseMusicChoose;		//定义闹钟音乐选择的变量
bit noiseMusicOrPlayMusic;			//标识设置播放的音乐还是闹钟音乐

 
void SeeLunarAndWeek(void);
void SetTimeAndSolar(void); 
void SetNoiseData(void);
void SetMusicPlay(void);        
unsigned char NoiseTimeFlag(void);

void SeeLunarAndWeek(void)
{
        LcdClear();		//清屏
        LcdSetXY(0, 0);		//设置显示农历初始化的数据
        LcdPutFlashString(lunarData);
        time2sIsOK = 0;				//清哦2s到达的标志以及计数器
        time2sCounter = 0;
        
        while (1)
        {
                FindTime();				//判断各个时间段是否已经到达
                        
                DS1302ReadTimeData(); //读取时间
				FindDataOfWeek();		//计算星期
                SolarToLunar();			//国历转换为农历
                Change();				//显示数据送缓冲区
                DisplayTwo();			//显示农历和星期
                                
                if (time2sIsOK == 1)		//2s到了则返回显示阳历和时间
                {
                        LcdSetXY(0, 0);
                        LcdPutFlashString(solarData);
                        LcdSetXY(1, 0);
                        LcdPutFlashString(timeData);
                        DisplayOne();
                        break;
                }

                
        }
}

void SetTimeAndSolar(void)
{
        unsigned char key6KeyValue;			//用于存储键值
        bit setbit;							//有键按下的标志
        bit setOnbit;						//显示的标志
        unsigned char key6I;				//循环变量
        
        setbit = 0;							//各个标志位清0
        setOnbit = 0;
        key6KeyValue = 0;
        time10msIsOK = 0;   
        time500msIsOK = 0; 
        time20sIsOK = 0;
        time500msCounter = 0;
        time20sCounter = 0;
		//显示初始化
        LcdSetXY(0, 0);
        LcdPutFlashString(solarData);
        LcdSetXY(1, 0);
        LcdPutFlashString(timeData);
        DS1302ReadTimeData();
        Change();
        DisplayOne(); 
        
        key6I = 0;
        
        while (1)
        {
                FindTime();		//判断各个时间段是否已经到达
                
                if(time10msIsOK)
                {
                        time10msIsOK = 0;
                        key6KeyValue = FindKeyValue();		//读取键值
                        
                        switch (key6KeyValue)
                        {
                        case key6: 
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                
                                if (setbit)					//设置时间
                                {
		                        FindDataOfWeek();	//计算星期
                                        DS1302WriteTimeData();
                                }
                                
                                break;
                        case key1:		//按键1为右移处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                //以下两行显示为了防止刚才恰好没有显示  
                                LcdPutOneChar((DS1302Data[key6I] / 10) + 48);
                                LcdPutOneChar((DS1302Data[key6I] % 10) + 48);  
                                
                                if (key6I == 0)
                                {
                                        key6I = 6;
                                }
                                else if (key6I == 4)
                                {
                                        key6I = 2;
                                }
                                else
                                {
                                        --key6I;
                                }
                                
                                break;
                        case key2:		//按键2为左移处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器  
                                //以下两行显示为了防止刚才恰好没有显示
                                LcdPutOneChar((DS1302Data[key6I] / 10) + 48);
                                LcdPutOneChar((DS1302Data[key6I] % 10) + 48);
                                
                                if (key6I == 6)
                                {
                                        key6I = 0;
                                }
                                else if (key6I == 2)
                                {
                                        key6I = 4;
                                }
                                else
                                {
                                        ++key6I;
                                }
                                
                                break;
                        case key3:		//	按键3为加1处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                ++DS1302Data[key6I];
                                break;
                         case key4:			//按键4为减1处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                --DS1302Data[key6I];
                                break;
                         case key5:			//按键5为加10处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0; 			//只要有键按下则清0 20s计数器
                                DS1302Data[key6I] += 10;
                                break;
                         case key8:				//按键8为减10处理
                                setbit = 1;				//有键按下标志位置1,表示有键按下
                                time20sCounter = 0;			//只要有键按下则清0 20s计数器
                                DS1302Data[key6I] -= 10;
                                break;
                         };
                         
                } 
                
                if ((key6KeyValue == key6)||(time20sIsOK ==1))//按下退出键或者20s没有键按下则推出时间设置
                {       
                        
                        DS1302ReadTimeData();
                        FindDataOfWeek();
                        Change();
                        LcdSetXY(0, 0);
                        LcdPutFlashString(solarData);
                        LcdSetXY(1, 0);
                        LcdPutFlashString(timeData);
                        DisplayOne(); 
                        break;
                }
                else
                {
                        if (time500msIsOK)			//500ms到,取反显示标志
                        {
                                time500msIsOK = 0;
                                setOnbit = ~setOnbit;
                        }
                        
                        switch (key6I)			//选择显示的位置
                        { 
                        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[key6I] / 10) + 48);
                                LcdPutOneChar((DS1302Data[key6I] % 10) + 48);
                        }  
                        
                        switch (key6I)			//选择显示的位置
                        { 
                        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;

⌨️ 快捷键说明

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