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

📄 main.c

📁 单片机C语言程序设计实训100例--基于AVR+PROTEUS仿真
💻 C
字号:
//-----------------------------------------------------------------
//  名称: 用DS1302与12864LCD设计的可调式电子日历与时钟
//-----------------------------------------------------------------
//  说明: 本例运行时会以PC时间为默认时间开始显示,运行过程中可以通过
//        K1选择调节对象,所选中的调节对象反相显示,K2,K3进行加减,
//        K4保存,K5则用于取消保存.
//        本例自动将日期时间调节控制在合法范围内,星期调节会在调整
//        年月日时自动完成,闰年问题也能自动处理. 
//                          
//-----------------------------------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#define INT8U   unsigned char
#define INT16U  unsigned int

//按键定义




//当前调节的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)
//5对应星期,星期调节由年月日调节自动完成
char Adjust_Index = -1;

//一年中每个月的天数,2月的天数由年份决定
INT8U MonthsDays[] = {0,31,0,31,30,31,30,31,31,30,31,30,31};

//所读取的日期时间(分别是秒,分,时,日,月,周,年)
extern INT8U DateTime[7];
//在调节日期时间时,用该位决定是否反相显示
extern INT8U Reverse_Display ;

//12864LCD及DS1302相关函数










//以下点阵均用Zimo软件提取
//年月日,星期,时分秒汉字点阵(16X16)--------------------------------------------
prog_uchar DATE_TIME_WORDS[] = 
{
/*---------------年----------------*/
0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
/*---------------月----------------*/
0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
/*---------------日----------------*/
0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
/*---------------星----------------*/
0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,
0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,
/*---------------期----------------*/
0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
/*---------------时----------------*/
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
/*---------------分----------------*/
0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
/*---------------秒----------------*/
0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00
};

//星期几的汉字点阵(16X16)-------------------------------------------------------
prog_uchar WEEKDAY_WORDS[] = 
{










};

//半角数字点阵(8X16)------------------------------------------------------------
prog_uchar DIGITS[] = 
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00 //9
};

INT8U H_Offset = 10, V_Page_Offset = 0; //水平与垂直偏移
//-----------------------------------------------------------------
// 判断是否为闰年
//-----------------------------------------------------------------
INT8U isLeapYear(INT16U y)
{ 


}

//-----------------------------------------------------------------
// 求自2000.1.1开始的任何一天是星期几
// 函数没有通过求出总天数后再求星期几,
// 因为求总天数可能会越出INT16U的范围
//-----------------------------------------------------------------
void RefreshWeekDay()
{ 


}

//-----------------------------------------------------------------
// 年月日时分++/--
//-----------------------------------------------------------------
void DateTime_Adjust(char x)
{ 




}

//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
    DDRA = 0xFF; PORTA = 0xFF;              //配置端口
    DDRB = 0xFF; PORTB = 0xFF;
    DDRC = 0xFF; PORTC = 0xFF;
    DDRD = 0x00; PORTD = 0xFF; 
    LCD_Initialize();                       //初始化LCD
    //显示年的固定前两位(20XX)
    //------------------------------------------------------------
    Display_A_Char_8X16(V_Page_Offset,0  + H_Offset,
	                              (prog_uchar*)(DIGITS + 2 * 16));
    Display_A_Char_8X16(V_Page_Offset,8  + H_Offset,
	                              (prog_uchar*)(DIGITS));
    //显示固定汉字:年月日
    //------------------------------------------------------------
    Display_A_WORD(V_Page_Offset,   32 + H_Offset,
	                              (prog_uchar*)(DATE_TIME_WORDS + 0*32));
    Display_A_WORD(V_Page_Offset,   64 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 1*32));
    Display_A_WORD(V_Page_Offset,   96 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 2*32));
    //显示固定汉字:星期
    //------------------------------------------------------------
    Display_A_WORD(V_Page_Offset+2, 64 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 3*32));
    Display_A_WORD(V_Page_Offset+2, 80 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 4*32));
    //显示固定汉字:时分秒
    //------------------------------------------------------------
    Display_A_WORD(V_Page_Offset+5, 32 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 5*32));
    Display_A_WORD(V_Page_Offset+5, 64 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 6*32));
    Display_A_WORD(V_Page_Offset+5, 96 + H_Offset, 
	                              (prog_uchar*)(DATE_TIME_WORDS + 7*32));












}

//-----------------------------------------------------------------
// 定时器0中断刷新LCD显示,Reverse_Display决定当前显示的内容是否反相
//-----------------------------------------------------------------
ISR (TIMER0_OVF_vect)
{



}

//-----------------------------------------------------------------
// 键盘中断(INT0)
//-----------------------------------------------------------------
ISR (INT0_vect)
{




}

⌨️ 快捷键说明

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