万年历程序(不要嫌程序长,功能很齐全,而且对初学者很有帮助)

合集下载

多功能万年历黄历

多功能万年历黄历

多功能万年历黄历多功能万年历黄历是一种常见的日历表,它不仅能够记录日期和节假日,还能提供各种有用的信息和功能。

下面,我将为大家介绍一下多功能万年历黄历的种类、特点以及应用。

多功能万年历黄历通常包含在一本书籍或应用程序中,通过不同的形式向用户展示日期和特定的信息。

它可以提供公历和农历日期,帮助人们方便地查看节日、节气和个人生肖等信息。

此外,多功能万年历黄历还可以提供日出日落时间、月相和星座等天文数据,方便人们了解自然界的变化。

多功能万年历黄历的特点在于其多样化的功能。

首先,它可以提供节假日的信息,让人们了解传统的重要节日以及法定假日。

这在安排休假、旅行或者活动时非常有帮助。

其次,多功能万年历黄历还可以提供阳历和农历的转换和计算,帮助人们了解传统农耕社会的生活方式。

再次,它还可以提供各种神话和传说,让人们了解民俗文化和历史传统。

最后,多功能万年历黄历还可以结合日历和备忘录功能,让人们可以记录和管理日常生活中的重要事件。

多功能万年历黄历的应用非常广泛。

首先,它可以作为一种日常生活辅助工具,帮助人们随时了解日期、时间和天气情况。

其次,它对于学生和教师来说也非常有用,可以帮助他们安排学习和教学计划,并提醒重要的考试日期和作业截止日期。

再次,它对于商家来说也是必备的工具,可以帮助他们安排促销活动、折扣和特殊节日的推广活动。

此外,多功能万年历黄历还可以作为礼品赠送给朋友、家人和客户,因为它既实用又富有纪念价值。

总之,多功能万年历黄历是一种非常实用的工具,能够提供多种信息和功能,帮助人们更好地管理和规划生活。

它不仅可以用于日程安排和日期查询,还能够帮助了解传统文化和天文信息。

无论是个人还是商家,都可以从多功能万年历黄历中获得很多帮助和启发。

希望大家能够善用多功能万年历黄历,使生活更加有序和丰富多彩。

万年历C语言程序

万年历C语言程序
C:\Users\Administrator.QH-20150419NTDZ\Desktop\竞赛温度\竞赛温度\wendu.c
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define h1 0x80
//第一行
#define h2 0x80+0x40 //第二行
ห้องสมุดไป่ตู้
uchar ac=12; sbit led1=P3^6; sbit led2=P3^7;
//喇叭变量 sbit beep=P2^3; uchar alarmflag;
//闹钟 uchar nmiao,nfen,nshi,flag2;
Page: 2
C:\Users\Administrator.QH-20150419NTDZ\Desktop\竞赛温度\竞赛温度\wendu.c
DQ=0;//给脉冲信号 dat>>=1;//右移一位 DQ=1;//给脉冲信号 if(DQ==1) dat|=0x80; delay1(4); } return dat; } void dswr(uchar dat)//写一个字节函数 { uchar i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay1(8); DQ=1; dat>>=1; } } uint ReadTemperature(void)//读取温度 { uchar a,b;//用于合并 uint t=0; float tt=0; dsreset(); dswr(0xcc);//跳过读取序列号的操作 dswr(0x44);//启动温度转换 dsreset();//再次初始化 dswr(0xcc);//跳过读取序列号 dswr(0xbe);//读取温度寄存器 a=dsrd();//先读取低位 b=dsrd();//后读取高位 t=b; t<<=8; t=t|a; if(t<0xfff)//判断温度是否小于0 dsflag=0; else { t=~t+1; dsflag=1; } tt=t*0.0625; t=tt*10+0.5;//放大10倍并四舍五入 return(t); } void writetemp(uchar add)//写入温度值函数指定位置 { uchar gw,sw,xsw,flagdat;//个位,十位,小数位(注意得到为三位有效数)

万年历功能介绍及操作说明

万年历功能介绍及操作说明

万年历是一款常用的日历工具,它可以为用户提供日期信息、节假日信息和天气预报等多种功能。

下面是对万年历的功能介绍和操作说明。

1.日期查询:万年历可以为用户提供历法查询功能,用户可以通过输入日期,查询该日期是星期几、在一年中的第几天、该年的第几周等信息。

例如,用户输入2024年5月10日,万年历会显示这一天是星期三,是当年的第130天,是第19周。

2.节日查询:万年历可以为用户提供各种节日的查询功能,用户可以通过输入节日名称,查询该节日的日期信息。

例如,用户输入“元旦节”,万年历会显示元旦节的日期是1月1日。

3.节假日提示:万年历可以为用户提供节假日的提醒功能,用户可以选择设置节假日提醒,在节假日前一天或当天,万年历会发出提醒通知,提醒用户该节假日的到来。

4.时区转换:万年历可以为用户提供时区转换功能,用户可以通过输入不同时区的时间,将其转换为其他时区的时间。

例如,用户输入北京时间的10点,选择转换为纽约时间,万年历会显示纽约时间的是晚上22点。

5.天气预报:万年历可以为用户提供天气预报功能,用户可以输入地理位置,查询该地区的天气情况。

例如,用户输入“北京”,万年历会显示北京的天气情况,包括温度、天气状况和风力等信息。

6.农历信息:万年历可以为用户提供农历信息查询功能,用户可以通过输入日期,查询该日期对应的农历日期和农历节日信息。

例如,用户输入2024年7月1日,万年历会显示这一天是农历五月初二,是“端午节”。

7.闹钟功能:万年历可以为用户提供闹钟功能,用户可以设置闹钟的时间,并选择重复提醒的周期。

当闹钟时间到达时,万年历会发出提醒通知,提醒用户该事件或任务的到来。

8.备忘录功能:万年历可以为用户提供备忘录功能,用户可以在特定的日期上添加备忘录,并设置提醒时间。

当备忘录的提醒时间到达时,万年历会发出提醒通知,提醒用户该备忘录事项。

操作说明:1.打开万年历应用程序,进入主界面。

界面通常以日历的形式呈现,显示当前日期。

c语言万年历实训报告

c语言万年历实训报告

c语言万年历实训报告万年历是一种历法,用于记录每年的日期和星期。

在日常生活中,我们常常需要使用万年历来查询某一天是星期几,或者某个月有多少天。

因此,开发一个万年历程序可以方便我们的日常使用。

本次实训中,我们使用c语言开发了一个简单的万年历程序。

下面将介绍该程序的实现过程和功能。

一、程序界面该程序的界面非常简洁,只有一个输入框和一个查询按钮。

用户可以在输入框中输入日期,然后点击查询按钮,程序将会返回该日期对应的星期几和当月的日历。

二、程序功能1. 输入检查在程序中,我们使用了正则表达式来检查用户输入的日期是否符合格式要求。

具体而言,日期的格式应该为“YYYY-MM-DD”,其中YYYY表示年份,MM表示月份,DD表示日期。

如果用户输入的日期格式不正确,程序将会提示用户重新输入。

2. 星期查询当用户输入符合格式要求的日期后,程序将会计算该日期对应的星期几。

具体而言,我们使用了蔡勒公式来计算星期几。

该公式的计算过程较为复杂,不在此做详细介绍。

3. 月历输出除了星期几之外,程序还能输出当月的日历。

具体而言,程序将会输出该月份的日历表格,其中包括每天的日期和星期几。

为了使输出的日历表格美观整洁,我们使用了格式化输出的方式,将日期和星期几对齐输出。

三、程序实现在程序实现过程中,我们主要使用了c语言中的日期和时间相关函数。

具体而言,我们使用了time.h头文件中的函数来获取当前日期和时间,然后使用strftime函数将其格式化。

我们还使用了ctype.h头文件中的isxdigit函数来检查用户输入的日期格式是否正确,以及math.h头文件中的floor函数来对日期进行取整操作。

除此之外,我们还使用了c语言中的数组和循环语句来实现日历的输出。

具体而言,我们使用了一个二维数组来存储日历中每天的日期和星期几,然后使用循环语句将其输出到屏幕上。

四、程序测试在程序开发完成后,我们进行了多次测试,确保程序的功能正常。

具体而言,我们测试了以下几个方面:1. 输入检查:测试了输入正确日期和错误日期两种情况,确保程序能够正确检查用户输入的日期格式。

万年历程序

万年历程序

•/*********************************************************************************** *************•C51写的公历转农历,并驱动LCM-12864汉字液晶显示。

•author: cth•本程序参考了网上部分程序,在这里感谢所有无私奉献的朋友!•全程注释,有耐心就慢慢看!•************************************************************************************ ************/••#include <reg52.h>•#include <intrins.h>•#include <stdio.h>•#define uint unsigned int•#define uchar unsigned char•char sec,min,hour,day,month,year,week; //定义全局变量,秒,分,时,日,月,年和星期•bit century; //定义世纪位:0为20世纪,1为19世纪。

•//此时初始日期为2006年8月13日,即此程序完成日期!••/**************************************C51写的公历转农历和星期•**************************************••公历是全世界通用的历法以地球绕太阳的一周为一年一年365 天分为12 个月1 3 5 7 8 10 12 月为•31 天2 月为28 天其余月份为30 天事实上地球绕太阳一周共365 天5 小时48 分46 秒比公历一年多出5 小时48•分46 秒为使年误差不累积公历年用闰年法来消除年误差由于每年多出5 小时48 分46 秒每4 年累计多出23•小时15 分4 秒接近1 天天文学家就规定每4 年有一个闰年把2 月由28 天改为29 天凡是公历年代能被4 整除•的那一年就是闰年但是这样一来每4 年又少了44 分56 秒为了更准确地计时天文学家又规定凡能被100 整除•的年份只有能被400 整除才是闰年即每400 年要减掉3 个闰年经过这样处理后实际上每400 年的误差只有2 小时•53 分20 秒已相当准确了•农历与公历不同农历把月亮绕地球一周作为一月因为月亮绕地球一周不是一整天所以农历把月分为大月和小•月大月30 天小月29 天通过设置大小月使农历日始终与月亮与地球的位置相对应为了使农历的年份与公历年•相对应农历通过设置闰月的办法使它的平均年长度与公历年相等农历是中国传统文化的代表之一并与农业生产联•系密切中国人民特别是广大农民十分熟悉并喜爱农历•公历与农历是我国目前并存的两种历法各有其固有的规律农历与月球的运行相对应其影响因素多它的大小•月和闰月与天体运行有关计算十分复杂且每年都不一致因此要用单片机实现公历与农历的转换用查表法是最方•便实用的办法•51 系列单片机因其在功能上能满足大部份对速度要求不高的应用场合的要求且价格低廉开发工具普及程度高•是目前应用最多的单片机之一本文介绍一种用51 单片机实现从1901 年到2099 年2199 年公历日到农历日及星期•的转换方法并向读者提供完整的51C程序•二基本原理•实现公历与农历的转换一般采用查表法按日查表是速度最快的方法但51 单片机寻址能力有限不可能采用•按日查表的方法除按日查外我们可以通过按月查表和按年查表的方法再通过适当的计算来确定公历日所对应的•农历日期本文采用的是按年查表法最大限度地减少表格所占的程序空间•对于农历月来说大月为30 天小月为29 天这是固定不变的这样我们就可用1 个BIT 位来表示大小月信•息农历一年如有闰月为13 个月否则是12 个月所以一年需要用13 个BIT 闰月在农历年中所在的月份并不固定•大部分闰月分布在农历2 8 月但也有少量年份在9 月以后所以要表示闰月的信息至少要4BIT 在这里我们用4BIT•的值来表示闰月的月份值为0 表示本年没有闰月有了以上信息还不足以判断公历日对应的农历日因为还需要一•个参照日我们选用农历正月初一所对应的公历日期作参照日公历日最大为31 日需要5BIT 来表示而春节所在的•月份不是1 月就是2 月用1BIT 就够了考虑到表达方便我们用2BIT 来表示春节月2BIT 的值直接表示月份这•样一年的农历信息只用3 个字节就全部包括了•计算公历日对应的农历日期的方法先计算出公历日离当年元旦的天数然后查表取得当年的春节日期计算出春•节离元旦的天数二者相减即可算出公历日离春节的天数以后只要根据大小月和闰月信息减一月天数调整一月农•历月份即可推算出公历日所对应的农历日期如公历日不到春节日期农历年要比公历年小一年农历大小月取前一•年的信息农历月从12 月向前推算•公历日是非常有规律的所以公历日所对应的星期天可以通过计算直接得到理论上公元0 年1 月1 日为星期日•只要求得公历日离公元0 年1 月1 日的日子数除7 后的余数就是星期天为了简化计算采用月校正法根据公历的•年月日可直接计算出星期天其算法是日期年份所过闰年数月校正数之和除7 的余数就是星期天但如果是在•闰年又不到3 月份上述之和要减一天再除7 其1 12 月的校正数据为6 2 2 5 0 3 5 1 4 6 2 4 在•本程序中采用1 个字节表示年份闰年数也只计算1900 年以后的闰年数所以实际校正数据也和上述数据不同••••公历年对应的农历数据,每年三字节,•格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小•第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小•月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)•第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期•************************************************************************************ *************/•code uchar year_code[597]={• 0x04,0xAe,0x53, //1901• 0x0A,0x57,0x48, //1902• 0x55,0x26,0xBd, //1903• 0x0d,0x26,0x50, //1904• 0x0d,0x95,0x44, //1905• 0x46,0xAA,0xB9, //1906• 0x05,0x6A,0x4d, //1907• 0x09,0xAd,0x42, //1908• 0x24,0xAe,0xB6, //1909• 0x04,0xAe,0x4A, //1910• 0x6A,0x4d,0xBe, //1911• 0x0A,0x4d,0x52, //1912• 0x0d,0x25,0x46, //1913• 0x5d,0x52,0xBA, //1914• 0x0B,0x54,0x4e, //1915• 0x29,0x6d,0x37, //1917 • 0x09,0x5B,0x4B, //1918 • 0x74,0x9B,0xC1, //1919 • 0x04,0x97,0x54, //1920 • 0x0A,0x4B,0x48, //1921 • 0x5B,0x25,0xBC, //1922 • 0x06,0xA5,0x50, //1923 • 0x06,0xd4,0x45, //1924 • 0x4A,0xdA,0xB8, //1925 • 0x02,0xB6,0x4d, //1926 • 0x09,0x57,0x42, //1927 • 0x24,0x97,0xB7, //1928 • 0x04,0x97,0x4A, //1929 • 0x66,0x4B,0x3e, //1930 • 0x0d,0x4A,0x51, //1931 • 0x0e,0xA5,0x46, //1932 • 0x56,0xd4,0xBA, //1933 • 0x05,0xAd,0x4e, //1934 • 0x02,0xB6,0x44, //1935 • 0x39,0x37,0x38, //1936 • 0x09,0x2e,0x4B, //1937 • 0x7C,0x96,0xBf, //1938 • 0x0C,0x95,0x53, //1939 • 0x0d,0x4A,0x48, //1940 • 0x6d,0xA5,0x3B, //1941 • 0x0B,0x55,0x4f, //1942 • 0x05,0x6A,0x45, //1943 • 0x4A,0xAd,0xB9, //1944 • 0x02,0x5d,0x4d, //1945 • 0x09,0x2d,0x42, //1946 • 0x2C,0x95,0xB6, //1947 • 0x0A,0x95,0x4A, //1948 • 0x7B,0x4A,0xBd, //1949 • 0x06,0xCA,0x51, //1950 • 0x0B,0x55,0x46, //1951 • 0x55,0x5A,0xBB, //1952 • 0x04,0xdA,0x4e, //1953• 0x35,0x2B,0xB8, //1955 • 0x05,0x2B,0x4C, //1956 • 0x8A,0x95,0x3f, //1957 • 0x0e,0x95,0x52, //1958 • 0x06,0xAA,0x48, //1959 • 0x7A,0xd5,0x3C, //1960 • 0x0A,0xB5,0x4f, //1961 • 0x04,0xB6,0x45, //1962 • 0x4A,0x57,0x39, //1963 • 0x0A,0x57,0x4d, //1964 • 0x05,0x26,0x42, //1965 • 0x3e,0x93,0x35, //1966 • 0x0d,0x95,0x49, //1967 • 0x75,0xAA,0xBe, //1968 • 0x05,0x6A,0x51, //1969 • 0x09,0x6d,0x46, //1970 • 0x54,0xAe,0xBB, //1971 • 0x04,0xAd,0x4f, //1972 • 0x0A,0x4d,0x43, //1973 • 0x4d,0x26,0xB7, //1974 • 0x0d,0x25,0x4B, //1975 • 0x8d,0x52,0xBf, //1976 • 0x0B,0x54,0x52, //1977 • 0x0B,0x6A,0x47, //1978 • 0x69,0x6d,0x3C, //1979 • 0x09,0x5B,0x50, //1980 • 0x04,0x9B,0x45, //1981 • 0x4A,0x4B,0xB9, //1982 • 0x0A,0x4B,0x4d, //1983 • 0xAB,0x25,0xC2, //1984 • 0x06,0xA5,0x54, //1985 • 0x06,0xd4,0x49, //1986 • 0x6A,0xdA,0x3d, //1987 • 0x0A,0xB6,0x51, //1988 • 0x09,0x37,0x46, //1989 • 0x54,0x97,0xBB, //1990 • 0x04,0x97,0x4f, //1991• 0x36,0xA5,0x37, //1993 • 0x0e,0xA5,0x4A, //1994 • 0x86,0xB2,0xBf, //1995 • 0x05,0xAC,0x53, //1996 • 0x0A,0xB6,0x47, //1997 • 0x59,0x36,0xBC, //1998 • 0x09,0x2e,0x50, //1999 • 0x0C,0x96,0x45, //2000 • 0x4d,0x4A,0xB8, //2001 • 0x0d,0x4A,0x4C, //2002 • 0x0d,0xA5,0x41, //2003 • 0x25,0xAA,0xB6, //2004 • 0x05,0x6A,0x49, //2005 • 0x7A,0xAd,0xBd, //2006 • 0x02,0x5d,0x52, //2007 • 0x09,0x2d,0x47, //2008 • 0x5C,0x95,0xBA, //2009 • 0x0A,0x95,0x4e, //2010 • 0x0B,0x4A,0x43, //2011 • 0x4B,0x55,0x37, //2012 • 0x0A,0xd5,0x4A, //2013 • 0x95,0x5A,0xBf, //2014 • 0x04,0xBA,0x53, //2015 • 0x0A,0x5B,0x48, //2016 • 0x65,0x2B,0xBC, //2017 • 0x05,0x2B,0x50, //2018 • 0x0A,0x93,0x45, //2019 • 0x47,0x4A,0xB9, //2020 • 0x06,0xAA,0x4C, //2021 • 0x0A,0xd5,0x41, //2022 • 0x24,0xdA,0xB6, //2023 • 0x04,0xB6,0x4A, //2024 • 0x69,0x57,0x3d, //2025 • 0x0A,0x4e,0x51, //2026 • 0x0d,0x26,0x46, //2027 • 0x5e,0x93,0x3A, //2028 • 0x0d,0x53,0x4d, //2029• 0x36,0xB5,0x37, //2031 • 0x09,0x6d,0x4B, //2032 • 0xB4,0xAe,0xBf, //2033 • 0x04,0xAd,0x53, //2034 • 0x0A,0x4d,0x48, //2035 • 0x6d,0x25,0xBC, //2036 • 0x0d,0x25,0x4f, //2037 • 0x0d,0x52,0x44, //2038 • 0x5d,0xAA,0x38, //2039 • 0x0B,0x5A,0x4C, //2040 • 0x05,0x6d,0x41, //2041 • 0x24,0xAd,0xB6, //2042 • 0x04,0x9B,0x4A, //2043 • 0x7A,0x4B,0xBe, //2044 • 0x0A,0x4B,0x51, //2045 • 0x0A,0xA5,0x46, //2046 • 0x5B,0x52,0xBA, //2047 • 0x06,0xd2,0x4e, //2048 • 0x0A,0xdA,0x42, //2049 • 0x35,0x5B,0x37, //2050 • 0x09,0x37,0x4B, //2051 • 0x84,0x97,0xC1, //2052 • 0x04,0x97,0x53, //2053 • 0x06,0x4B,0x48, //2054 • 0x66,0xA5,0x3C, //2055 • 0x0e,0xA5,0x4f, //2056 • 0x06,0xB2,0x44, //2057 • 0x4A,0xB6,0x38, //2058 • 0x0A,0xAe,0x4C, //2059 • 0x09,0x2e,0x42, //2060 • 0x3C,0x97,0x35, //2061 • 0x0C,0x96,0x49, //2062 • 0x7d,0x4A,0xBd, //2063 • 0x0d,0x4A,0x51, //2064 • 0x0d,0xA5,0x45, //2065 • 0x55,0xAA,0xBA, //2066 • 0x05,0x6A,0x4e, //2067• 0x45,0x2e,0xB7, //2069• 0x05,0x2d,0x4B, //2070• 0x8A,0x95,0xBf, //2071• 0x0A,0x95,0x53, //2072• 0x0B,0x4A,0x47, //2073• 0x6B,0x55,0x3B, //2074• 0x0A,0xd5,0x4f, //2075• 0x05,0x5A,0x45, //2076• 0x4A,0x5d,0x38, //2077• 0x0A,0x5B,0x4C, //2078• 0x05,0x2B,0x42, //2079• 0x3A,0x93,0xB6, //2080• 0x06,0x93,0x49, //2081• 0x77,0x29,0xBd, //2082• 0x06,0xAA,0x51, //2083• 0x0A,0xd5,0x46, //2084• 0x54,0xdA,0xBA, //2085• 0x04,0xB6,0x4e, //2086• 0x0A,0x57,0x43, //2087• 0x45,0x27,0x38, //2088• 0x0d,0x26,0x4A, //2089• 0x8e,0x93,0x3e, //2090• 0x0d,0x52,0x52, //2091• 0x0d,0xAA,0x47, //2092• 0x66,0xB5,0x3B, //2093• 0x05,0x6d,0x4f, //2094• 0x04,0xAe,0x45, //2095• 0x4A,0x4e,0xB9, //2096• 0x0A,0x4d,0x4C, //2097• 0x0d,0x15,0x41, //2098• 0x2d,0x92,0xB5, //2099•};•///月份数据表•code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; •code uint day_code2[3]={0x111,0x130,0x14e};••bit c_moon;•data uchar year_moon,month_moon,day_moon;•/*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/•bit get_moon_day(uchar month_p,uint table_addr)•{•uchar temp;• switch (month_p){• case 1:{temp=year_code[table_addr]&0x08;• if (temp==0)return(0);else return(1);}• case 2:{temp=year_code[table_addr]&0x04;• if (temp==0)return(0);else return(1);}• case 3:{temp=year_code[table_addr]&0x02;• if (temp==0)return(0);else return(1);}• case 4:{temp=year_code[table_addr]&0x01;• if (temp==0)return(0);else return(1);}• case 5:{temp=year_code[table_addr+1]&0x80;• if (temp==0) return(0);else return(1);}• case 6:{temp=year_code[table_addr+1]&0x40;• if (temp==0)return(0);else return(1);}• case 7:{temp=year_code[table_addr+1]&0x20;• if (temp==0)return(0);else return(1);}• case 8:{temp=year_code[table_addr+1]&0x10;• if (temp==0)return(0);else return(1);}• case 9:{temp=year_code[table_addr+1]&0x08;• if (temp==0)return(0);else return(1);}• case 10:{temp=year_code[table_addr+1]&0x04;• if (temp==0)return(0);else return(1);}• case 11:{temp=year_code[table_addr+1]&0x02;• if (temp==0)return(0);else return(1);}• case 12:{temp=year_code[table_addr+1]&0x01;• if (temp==0)return(0);else return(1);}• case 13:{temp=year_code[table_addr+2]&0x80;• if (temp==0)return(0);else return(1);}• }•}••/*********************************************************************************** **•函数功能:输入阳历数据,输出阴历数据(只允许1901-2099年)•调用函数示例:Conversion(c,year,month,day)•如:计算2004年10月16日Conversion(0,0x4,0x0A,0x10);•c,year,month,day均为16进制数据,c为世纪标志位,c_sun=0为21世纪,c_sun=1为19世纪•调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历16进制数据。

万年历程序设计说明书

万年历程序设计说明书

万年历程序设计说明书一、引言万年历是一种常见的日历工具,用于显示日期和计算日期间的差异。

本说明书旨在介绍万年历程序的设计原理和功能,帮助用户更好地理解和使用该程序。

二、程序设计原理1. 数据结构万年历程序主要基于日期的计算和显示,因此需要设计合适的数据结构来存储日期信息。

常用的数据结构包括日期对象、月份对象和年份对象。

2. 界面设计万年历程序需要提供用户友好的界面,以便用户能够方便地输入和查看日期信息。

界面设计应简洁明了,同时考虑不同屏幕尺寸和分辨率的适配。

3. 算法设计万年历程序的核心功能是日期的计算和显示。

算法设计应能够准确计算日期间的差异,包括年份、月份和天数的计算。

同时,还需要考虑闰年和月份天数不同的情况。

三、功能介绍1. 日期查询用户可以通过输入日期来查询该日期的详细信息,包括星期几、所在月份和年份等。

程序应能够准确显示查询结果并提供相关操作选项。

2. 日期计算用户可以输入两个日期,程序将计算并显示这两个日期之间的差异,包括相差的年份、月份和天数。

程序应能够处理闰年和月份天数不同的情况。

3. 节假日提醒万年历程序可以提供节假日的提醒功能,用户可以设置节假日的提醒日期和提醒方式。

程序应能够准确提醒用户,并提供相应的操作选项。

4. 日期转换用户可以输入不同的日期格式,程序将自动转换为标准的日期格式进行计算和显示。

程序应支持常见的日期格式,并提供错误处理机制。

四、程序设计实现1. 开发环境万年历程序可以使用各种编程语言和开发工具进行实现。

常见的开发环境包括Java、Python、C++等。

选择合适的开发环境可以提高开发效率和程序性能。

2. 数据库设计万年历程序可以使用数据库存储节假日和相关数据,以便程序查询和显示。

数据库设计应考虑数据的结构和索引,提高数据的查询效率和程序的响应速度。

3. 界面设计万年历程序的界面设计应简洁明了,用户可以方便地输入和查看日期信息。

界面设计可以使用图形界面或命令行界面,根据实际需求选择合适的设计方式。

万年历程序设计说明书

万年历程序设计说明书

万年历程序设计说明书一、引言万年历是一款方便用户查询日期、农历、节假日等信息的应用程序。

本文档将详细介绍万年历程序的设计和功能实现,以帮助开发人员理解和使用该程序。

二、需求分析1. 用户可以通过程序查询指定日期的公历和农历信息。

2. 用户可以查看指定日期是否为节假日,并显示节假日名称。

3. 用户可以选择查询某个年份的所有节假日。

4. 用户可以设置提醒功能,当指定日期到来时,程序会发送通知提醒用户。

5. 界面友好,操作简单,用户体验良好。

三、系统设计1. 技术选型本程序将使用Python语言进行开发,使用以下库和框架:- tkinter:用于创建程序的图形用户界面。

- datetime:用于处理日期和时间相关的操作。

- requests:用于发送HTTP请求,获取节假日数据。

- plyer:用于发送系统通知。

2. 模块划分本程序将分为以下几个模块:- 主界面模块:负责显示程序的主界面,包括日期选择框、查询按钮等。

- 日期查询模块:负责处理用户输入的日期,查询公历和农历信息,并显示在界面上。

- 节假日查询模块:负责查询指定日期是否为节假日,并显示节假日名称。

- 节假日提醒模块:负责设置提醒功能,当指定日期到来时发送系统通知提醒用户。

3. 数据获取与处理- 公历和农历信息:使用datetime库获取指定日期的公历和农历信息。

- 节假日数据:通过发送HTTP请求获取节假日数据,并使用json库进行解析和处理。

四、功能实现1. 主界面设计主界面应包括日期选择框、查询按钮、显示区域等组件,用户可以通过日期选择框选择查询日期,并点击查询按钮进行查询操作。

查询结果将显示在显示区域中。

2. 日期查询功能实现用户选择查询日期后,程序将使用datetime库获取公历和农历信息,并将其显示在界面上。

3. 节假日查询功能实现用户可以选择查询某个年份的所有节假日。

程序将通过发送HTTP请求获取节假日数据,并使用json库进行解析和处理。

万年历c语言代码讲解

万年历c语言代码讲解

万年历c语言代码讲解万年历是一种常见的日历形式,可以显示一年中每一天的日期和星期几。

在计算机编程中,我们可以使用C语言编写一个万年历的程序来实现这个功能。

我们需要了解一个概念:闰年。

闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。

闰年的2月份有29天,而普通年份的2月份只有28天。

接下来,我们可以开始编写程序了。

首先,我们需要定义一个结构体来表示日期,结构体中包含年、月和日三个成员变量。

然后,我们可以编写一个函数来判断某一年份是否是闰年。

根据闰年的定义,我们可以使用取余运算符(%)来判断。

接下来,我们需要编写一个函数来计算某一年月的某一天是星期几。

这个函数的核心思想是根据已知的某一天是星期几,然后通过计算得出某一天之后或之前的日期是星期几。

我们可以使用一个数组来保存每个月份的天数,并根据年份是否是闰年来调整2月份的天数。

在计算星期几的过程中,我们可以使用蔡勒公式。

蔡勒公式是一种计算星期几的方法,根据蔡勒公式,我们可以得出某一天是星期几。

具体的计算公式可以在代码中实现,但是根据要求,我们不能输出公式,所以在这里就不展开讲解了。

接下来,我们可以编写一个主函数来调用上述的函数,并输出结果。

在主函数中,我们可以通过用户输入来获取需要查询的年月信息,然后调用函数来计算星期几,并输出结果。

为了使输出结果更加美观,我们可以使用制表符来对齐输出的结果。

在编写主函数的过程中,我们还可以加入一些错误处理的代码,例如判断用户输入的年月是否合法,以及判断计算结果是否正确。

这样可以增加程序的健壮性和用户体验。

我们还可以考虑加入一些额外的功能,例如输出某个月份的日历表格或者某一天所在的周的日期范围等。

这样可以提升程序的实用性和功能性。

通过以上的步骤,我们就可以完成一个简单的万年历程序的编写。

这个程序可以根据用户的输入来计算某一年月的某一天是星期几,并输出结果。

通过这个程序,我们可以更方便地查询任意日期的星期几,从而更好地了解和利用时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <REG51.H>#include <intrins.h>#define uint unsigned int#define uchar unsigned charvoid Stopwatch(); //声明秒表函数void Clock(); //声明闹钟函数void Output(); //声明输出函数void important(); //声明重要函数(相当于mian()函数)void TLimit(); //声明调节温度上下限函数sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P1^6; //实时时钟数据线引脚sbit DS1302_RST = P1^5; //实时时钟复位线引脚sbit wireless_1 = P3^0; //温度过上限标志sbit wireless_2 = P3^1; //温度适中标志sbit wireless_3 = P3^2; //温度过下限标志sbit fan = P3^4; //开风扇标志sbit clock=P3^5; //开关闹钟sbit setclock = P3^6; //闹钟开启控制sbit stopwatch = P3^7; //秒表开启控制sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P2^0; //模式切换键sbit Up = P2^1; //加法按钮sbit Down = P2^2; //减法按钮sbit out = P2^3; //立刻跳出调整模式按钮sbit DQ = P1^0; //温度传送数据IO口char c3,c2=0;char c=0,LowerBonud=20,UpperLimit=30;char a1=0,a2=0,a3=0,a4=0;char k[8]={'0','0',':','0','0',':','0','0'};void InitTimer0(void)//产生10ms时间间隔{TMOD = (TMOD & 0XF0) | 0X01; //定时器0工作在模式1,16Bit定时器模式TH0 = (65536 - 8000)/256;TL0 = (65536 - 8000)%256;TR0 =1; ET0 =1;//开启定时器和中断EA = 1;}char done,count,temp,flag,up_flag,down_flag; //uchar temp_value; //温度值uchar TempBuffer[5],week_value[2],h[8]; //unsigned char NL[5];void show_time(); //液晶显示程序/***********1602液晶显示部分子程序****************///Port Definitions**********************************************************sbit LcdRs = P2^5;sbit LcdRw = P2^6;sbit LcdEn = P2^7;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数************************************************************************** unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();LcdEn=0;return DBPort;}//向LCD写入命令或数据************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式************************************************************#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}//设置输入模式************************************************************ #define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************ void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0')//while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/***********DS1302时钟部分子程序******************/typedef struct SYSTEMTIME{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char YearH;unsigned char YearL;unsigned char day;unsigned char month;unsigned char year;unsigned char DateString[11];unsigned char NLDateString[12];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime; //#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C#define DS1302_YEARH 0xC0void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) {unsigned char i;ACC = d;for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;}}unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数){unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0;}return(ACC);}void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组{unsigned char ReadV alue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadV alue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);Time->YearH = 20;}void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{Time->DateString[0] = Time->YearH/10 + '0';Time->DateString[1] = Time->YearH%10 + '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{Time->DateString[0] = ' ';Time->DateString[1] = ' ';Time->DateString[2] = ' ';Time->DateString[3] = ' ';}Time->DateString[4] = '/';if(hide_month<2){Time->DateString[5] = Time->Month/10 + '0';Time->DateString[6] = Time->Month%10 + '0';}else{Time->DateString[5] = ' ';Time->DateString[6] = ' ';}Time->DateString[7] = '/';if(hide_day<2){Time->DateString[8] = Time->Day/10 + '0';Time->DateString[9] = Time->Day%10 + '0';}else{Time->DateString[8] = ' ';Time->DateString[9] = ' ';}if(hide_week<2){week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}else{week_value[0] = ' ';}week_value[1] = '\0';Time->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符}void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组TimeString[];{ if(hide_hour<2){Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';h[0]=Time->TimeString[0];h[1]=Time->TimeString[1];}else{Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';h[2]=Time->TimeString[2];if(hide_min<2){Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';h[3]=Time->TimeString[3];h[4]=Time->TimeString[4];}else{Time->TimeString[3] = ' ';Time->TimeString[4] = ' ';}Time->TimeString[5] = ':';h[5]=Time->TimeString[5];if(hide_sec<2){Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';h[6]=Time->TimeString[6];h[7]=Time->TimeString[7];}else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' ';}Time->DateString[8] = '\0';if ((a1==h[4])&&(a2==h[3])&&(a3<=h[7])&&((a4==h[6])||(a4==h[6]-1))) {clock=0;c=10;}}void Initial_DS1302(void) //时钟芯片初始化{unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //判断时钟芯片是否关闭{Write1302(0x8e,0x00); //写入允许Write1302(0xC0,0x20);Write1302(0x8c,0x09); //以下写入初始化时间日期:2007/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x06);Write1302(0x86,0x05);Write1302(0x8a,0x07); //xingqiWrite1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}}/***********ds18b20子程序*************************//***********ds18b20延迟子函数(晶振12MHz )*******/void delay_18B20(unsigned int i){while(i--);}/**********ds18b20初始化函数**********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低delay_18B20(80); //精确延时大于480usDQ = 1; //拉高总线delay_18B20(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);}/***********ds18b20读一个字节**************/unsigned char ReadOneChar(void){uchar i=0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1; //数据右移一位DQ = 1; // 给脉冲信号if(DQ)dat|=0x80; //按位或,取最高位delay_18B20(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(uchar dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01; //取最低位delay_18B20(5);DQ = 1; //上升沿将数据送入dat>>=1;}}/**************读取ds18b20当前温度************/void ReadTemp(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay_18B20(100); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);a=ReadOneChar(); //读取温度值低位b=ReadOneChar(); //读取温度值高位temp_value=b<<4; //左移四位,扩大16倍,变为一个字节的高四位temp_value+=(a&0xf0)>>4;//取温度值的地位的高四位,右移四位后与温度的高四位相加得到温度值if (temp_value>=UpperLimit) {wireless_1 =0;fan=1;}else {wireless_1 =1;fan=0;}if ((temp_value>LowerBonud)&&(temp_value<UpperLimit)) wireless_2 =0;else wireless_2 =1;if (temp_value<=LowerBonud) wireless_3 =0;else wireless_3 =1;}void temp_to_str() //温度数据转换成液晶字符显示{TempBuffer[0]=temp_value/10+'0'; //十位TempBuffer[1]=temp_value%10+'0'; //个位TempBuffer[2]=0xdf; //温度符号TempBuffer[3]='C';TempBuffer[4]='\0';}void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++){if (!stopwatch) {c++;Stopwatch();}if (!setclock) {c2++;Clock();}if ((!out)&&(!Set)) {TLimit();}if (!out) clock=1; //关闭闹钟}}/*延时子程序*/void mdelay(uint delay){ uint i;for(;delay>0;delay--)for(i=0;i<32;i++); //1ms延时.}/*****************************阳历转换阴历***********************************/ code unsigned char year_code[597]={0x04,0xAe,0x53, //1901 00x0A,0x57,0x48, //1902 30x55,0x26,0xBd, //1903 60x0d,0x26,0x50, //1904 90x0d,0x95,0x44, //1905 120x46,0xAA,0xB9, //1906 150x05,0x6A,0x4d, //1907 180x09,0xAd,0x42, //1908 210x24,0xAe,0xB6, //19090x04,0xAe,0x4A, //19100x6A,0x4d,0xBe, //19110x0A,0x4d,0x52, //19120x0d,0x25,0x46, //19130x5d,0x52,0xBA, //19140x0B,0x54,0x4e, //19150x0d,0x6A,0x43, //19160x29,0x6d,0x37, //19170x09,0x5B,0x4B, //19180x74,0x9B,0xC1, //19190x04,0x97,0x54, //19200x0A,0x4B,0x48, //19210x5B,0x25,0xBC, //19220x06,0xA5,0x50, //19230x06,0xd4,0x45, //19240x4A,0xdA,0xB8, //19250x02,0xB6,0x4d, //19260x09,0x57,0x42, //19270x24,0x97,0xB7, //19280x04,0x97,0x4A, //19290x66,0x4B,0x3e, //19300x0d,0x4A,0x51, //19310x0e,0xA5,0x46, //19320x56,0xd4,0xBA, //19330x05,0xAd,0x4e, //19340x02,0xB6,0x44, //19350x39,0x37,0x38, //19360x09,0x2e,0x4B, //19370x0C,0x95,0x53, //1939 0x0d,0x4A,0x48, //1940 0x6d,0xA5,0x3B, //1941 0x0B,0x55,0x4f, //1942 0x05,0x6A,0x45, //1943 0x4A,0xAd,0xB9, //1944 0x02,0x5d,0x4d, //1945 0x09,0x2d,0x42, //1946 0x2C,0x95,0xB6, //1947 0x0A,0x95,0x4A, //1948 0x7B,0x4A,0xBd, //1949 0x06,0xCA,0x51, //1950 0x0B,0x55,0x46, //1951 0x55,0x5A,0xBB, //1952 0x04,0xdA,0x4e, //1953 0x0A,0x5B,0x43, //1954 0x35,0x2B,0xB8, //1955 0x05,0x2B,0x4C, //1956 0x8A,0x95,0x3f, //1957 0x0e,0x95,0x52, //1958 0x06,0xAA,0x48, //1959 0x7A,0xd5,0x3C, //1960 0x0A,0xB5,0x4f, //1961 0x04,0xB6,0x45, //1962 0x4A,0x57,0x39, //1963 0x0A,0x57,0x4d, //1964 0x05,0x26,0x42, //1965 0x3e,0x93,0x35, //1966 0x0d,0x95,0x49, //1967 0x75,0xAA,0xBe, //1968 0x05,0x6A,0x51, //1969 0x09,0x6d,0x46, //1970 0x54,0xAe,0xBB, //1971 0x04,0xAd,0x4f, //1972 0x0A,0x4d,0x43, //1973 0x4d,0x26,0xB7, //1974 0x0d,0x25,0x4B, //1975 0x8d,0x52,0xBf, //1976 0x0B,0x54,0x52, //1977 0x0B,0x6A,0x47, //1978 0x69,0x6d,0x3C, //1979 0x09,0x5B,0x50, //1980 0x04,0x9B,0x45, //19810x0A,0x4B,0x4d, //19830xAB,0x25,0xC2, //19840x06,0xA5,0x54, //19850x06,0xd4,0x49, //19860x6A,0xdA,0x3d, //19870x0A,0xB6,0x51, //19880x09,0x37,0x46, //19890x54,0x97,0xBB, //19900x04,0x97,0x4f, //19910x06,0x4B,0x44, //19920x36,0xA5,0x37, //19930x0e,0xA5,0x4A, //19940x86,0xB2,0xBf, //19950x05,0xAC,0x53, //19960x0A,0xB6,0x47, //19970x59,0x36,0xBC, //19980x09,0x2e,0x50, //1999 294 0x0C,0x96,0x45, //2000 297 0x4d,0x4A,0xB8, //20010x0d,0x4A,0x4C, //20020x0d,0xA5,0x41, //20030x25,0xAA,0xB6, //20040x05,0x6A,0x49, //20050x7A,0xAd,0xBd, //20060x02,0x5d,0x52, //20070x09,0x2d,0x47, //20080x5C,0x95,0xBA, //20090x0A,0x95,0x4e, //20100x0B,0x4A,0x43, //20110x4B,0x55,0x37, //20120x0A,0xd5,0x4A, //20130x95,0x5A,0xBf, //20140x04,0xBA,0x53, //20150x0A,0x5B,0x48, //20160x65,0x2B,0xBC, //20170x05,0x2B,0x50, //20180x0A,0x93,0x45, //20190x47,0x4A,0xB9, //20200x06,0xAA,0x4C, //20210x0A,0xd5,0x41, //20220x24,0xdA,0xB6, //20230x04,0xB6,0x4A, //20240x69,0x57,0x3d, //20250x0d,0x26,0x46, //2027 0x5e,0x93,0x3A, //2028 0x0d,0x53,0x4d, //2029 0x05,0xAA,0x43, //2030 0x36,0xB5,0x37, //2031 0x09,0x6d,0x4B, //2032 0xB4,0xAe,0xBf, //2033 0x04,0xAd,0x53, //2034 0x0A,0x4d,0x48, //2035 0x6d,0x25,0xBC, //2036 0x0d,0x25,0x4f, //2037 0x0d,0x52,0x44, //2038 0x5d,0xAA,0x38, //2039 0x0B,0x5A,0x4C, //2040 0x05,0x6d,0x41, //2041 0x24,0xAd,0xB6, //2042 0x04,0x9B,0x4A, //2043 0x7A,0x4B,0xBe, //2044 0x0A,0x4B,0x51, //2045 0x0A,0xA5,0x46, //2046 0x5B,0x52,0xBA, //2047 0x06,0xd2,0x4e, //2048 0x0A,0xdA,0x42, //2049 0x35,0x5B,0x37, //2050 0x09,0x37,0x4B, //2051 0x84,0x97,0xC1, //2052 0x04,0x97,0x53, //2053 0x06,0x4B,0x48, //2054 0x66,0xA5,0x3C, //2055 0x0e,0xA5,0x4f, //2056 0x06,0xB2,0x44, //2057 0x4A,0xB6,0x38, //2058 0x0A,0xAe,0x4C, //2059 0x09,0x2e,0x42, //2060 0x3C,0x97,0x35, //2061 0x0C,0x96,0x49, //2062 0x7d,0x4A,0xBd, //2063 0x0d,0x4A,0x51, //2064 0x0d,0xA5,0x45, //2065 0x55,0xAA,0xBA, //2066 0x05,0x6A,0x4e, //2067 0x0A,0x6d,0x43, //2068 0x45,0x2e,0xB7, //20690x8A,0x95,0xBf, //20710x0A,0x95,0x53, //20720x0B,0x4A,0x47, //20730x6B,0x55,0x3B, //20740x0A,0xd5,0x4f, //20750x05,0x5A,0x45, //20760x4A,0x5d,0x38, //20770x0A,0x5B,0x4C, //20780x05,0x2B,0x42, //20790x3A,0x93,0xB6, //20800x06,0x93,0x49, //20810x77,0x29,0xBd, //20820x06,0xAA,0x51, //20830x0A,0xd5,0x46, //20840x54,0xdA,0xBA, //20850x04,0xB6,0x4e, //20860x0A,0x57,0x43, //20870x45,0x27,0x38, //20880x0d,0x26,0x4A, //20890x8e,0x93,0x3e, //20900x0d,0x52,0x52, //20910x0d,0xAA,0x47, //20920x66,0xB5,0x3B, //20930x05,0x6d,0x4f, //20940x04,0xAe,0x45, //20950x4A,0x4e,0xB9, //20960x0A,0x4d,0x4C, //20970x0d,0x15,0x41, //20980x2d,0x92,0xB5, //2099};//月份数据表code unsigned char day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};code unsigned int day_code2[3]={0x111,0x130,0x14e};/**************************************************************************** * 子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0****************************************************************************/ bit GetMoonDay(unsigned char month_p,unsigned short table_addr){switch (month_p){case 1:if((year_code[table_addr]&0x08)==0) return(0);else return(1);case 2:if((year_code[table_addr]&0x04)==0) return(0);else return(1);case 3:if((year_code[table_addr]&0x02)==0) return(0);else return(1);case 4:if((year_code[table_addr]&0x01)==0) return(0);else return(1);case 5:if((year_code[table_addr+1]&0x80)==0) return(0);else return(1);case 6:if((year_code[table_addr+1]&0x40)==0) return(0);else return(1);case 7:if((year_code[table_addr+1]&0x20)==0) return(0);else return(1);case 8:if((year_code[table_addr+1]&0x10)==0) return(0);else return(1);case 9:if((year_code[table_addr+1]&0x08)==0) return(0);else return(1);case 10:if((year_code[table_addr+1]&0x04)==0) return(0);else return(1);case 11:if((year_code[table_addr+1]&0x02)==0) return(0);else return(1);case 12:if((year_code[table_addr+1]&0x01)==0) return(0);else return(1);case 13:if((year_code[table_addr+2]&0x80)==0) return(0);else return(1);}return(0);}/****************************************************************************** ***************************** 函数名称:GetChinaCalendar** 功能描述:公农历转换(只允许1901-2099年)** 输入: year 公历年** month 公历月** day 公历日** p 储存农历日期地址** 输出: 1 成功** 0 失败** 作者: Campo** 修改: 赖皮** 日期: 2007年02月06日**-------------------------------------------------------------------------------------------------------** 修改人:** 日期:**------------------------------------------------------------------------------------------------------******************************************************************************* *************************/unsigned char GetChinaCalendar(unsigned int year,unsigned char month,unsigned char day){unsigned char temp1,temp2,temp3,month_p,yearH,yearL;unsigned char flag_y;unsigned short temp4,table_addr;yearH=year/100; yearL=year%100;if((yearH!=19)&&(yearH!=20)) return(0);// 定位数据表地址if(yearH==20) table_addr=(yearL+100-1)*3;else table_addr=(yearL-1)*3;// 取当年春节所在的公历月份temp1=year_code[table_addr+2]&0x60;temp1>>=5;// 取当年春节所在的公历日temp2=year_code[table_addr+2]&31;// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月if(temp1==1) t emp3=temp2-1;else temp3=temp2+31-1;// 计算公历日离当年元旦的天数if (month<10) temp4=day_code1[month-1]+day-1;else temp4=day_code2[month-10]+day-1;// 如果公历月大于2月并且该年的2月为闰月,天数加1if ((month>2)&&(yearL%4==0)) temp4++;// 判断公历日在春节前还是春节后if (temp4>=temp3){temp4-=temp3;month=1;month_p=1;flag_y=0;if(GetMoonDay(month_p,table_addr)==0) temp1=29; //小月29天else temp1=30; //大小30天// 从数据表中取该年的闰月月份,如为0则该年无闰月temp2=year_code[table_addr]/16;while(temp4>=temp1){temp4-=temp1;month_p++;if(month==temp2){NL[4]='R';flag_y=~flag_y;if(flag_y==0) {month++;NL[4]=' ';}}else {month++;NL[4]=' ';}if(GetMoonDay(month_p,table_addr)==0) temp1=29;else temp1=30;}day=temp4+1;}// 公历日在春节前使用下面代码进行运算else{temp3-=temp4;if (yearL==0){yearL=100-1;yearH=19;}else yearL--;table_addr-=3;month=12;temp2=year_code[table_addr]/16;if (temp2==0) {month_p=12;NL[4]=' ';}else {month_p=13;NL[4]='R';}flag_y=0;if(GetMoonDay(month_p,table_addr)==0) temp1=29;else temp1=30;while(temp3>temp1){temp3-=temp1;month_p--;if(flag_y==0) month--;if(month==temp2) flag_y=~flag_y;if(GetMoonDay(month_p,table_addr)==0) temp1=29;else temp1=30;}day=temp1-temp3+1;}/////////////////////////NL[0]=yearH;NL[1]=yearL;NL[2]=month;NL[3]=day;return(1);}void zhuan(SYSTEMTIME *Time){GetChinaCalendar(Time->YearH*100+Time->Year,Time->Month,Time->Day);Time->day = NL[3];Time->month =NL[2];//将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22{Time->NLDateString[0] = NL[0]/10 + '0';Time->NLDateString[1] = NL[0]%10 + '0';Time->NLDateString[2] = NL[1]/10 + '0';Time->NLDateString[3] = NL[1]%10 + '0';}else{Time->NLDateString[0] = ' ';Time->NLDateString[1] = ' ';Time->NLDateString[2] = ' ';Time->NLDateString[3] = ' ';}Time->NLDateString[4] = '/';if(hide_month<2){Time->NLDateString[5] =NL[4] ;Time->NLDateString[6] = Time->month/10 + '0';Time->NLDateString[7] = Time->month%10 + '0';}else{Time->NLDateString[6] = ' ';Time->NLDateString[7] = ' ';}Time->NLDateString[8] = '/';if(hide_day<2){Time->NLDateString[9] = Time->day/10 + '0';Time->NLDateString[10] = Time->day%10 + '0';}else{Time->NLDateString[9] = ' ';Time->NLDateString[10] = ' ';}Time->NLDateString[11] = '\0'; //字符串末尾加'\0' ,判断结束字符//////////////////////}//显示天干生肖void lcd_digan(){temp = NL[1]%12;switch(temp){case 0: GotoXY(3,0); Print("Chen LongYear");//龙break;case 1: GotoXY(3,0); Print("Si She ear");//蛇break;case 2: GotoXY(3,0); Print("Wu Ma Year");//马break;case 3: GotoXY(3,0); Print("Wei YangYear"); //羊break;case 4: GotoXY(3,0); Print("Chen Hou Year"); //猴break;case 5: GotoXY(3,0); Print("You Ji Year"); //鸡break;case 6: GotoXY(3,0); Print("Xu Gou Year"); //狗break;case 7: GotoXY(3,0); Print("Hai Zhu Year"); //猪break;case 8: GotoXY(3,0); Print("Zi Shu Year"); //鼠break;case 9: GotoXY(3,0); Print("Chou Niu Year"); //牛break;case 10:GotoXY(3,0); Print("Yin Hu Year"); //虎break;case 11:GotoXY(3,0); Print("Mao Tu Year"); //兔break;}}//显示天支void lcd_tianzhi(){temp = NL[1]%10;switch(temp){case 0: GotoXY(0,0); Print("Gen");//庚break;case 1: GotoXY(0,0); Print("Xin");//辛break;case 2: GotoXY(0,0); Print("Ren");//壬break;case 3: GotoXY(0,0); Print("Gui"); //癸?break;case 4: GotoXY(0,0); Print("Jia"); //甲break;case 5: GotoXY(0,0); Print("Yi"); //乙break;case 6: GotoXY(0,0); Print("Bin"); //丙break;case 7: GotoXY(0,0); Print("Din"); //丁break;case 8: GotoXY(0,0); Print("Wu"); //戊break;case 9: GotoXY(0,0); Print("Ji");//己break;}}void outkey() //跳出调整模式,返回默认显示{ uchar Second;if(out==0)//if(out==0||wireless_1==1) //{ mdelay(4);count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;while(out==0);//while(wireless_1==1);}}////////////////////////////////////////////////////////////////////////////////////////////////////////////void Upkey()//升序按键{Up=1;if(Up==0)//if(Up==0||wireless_2==1){mdelay(4);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp+1; //秒数加1up_flag=1; //数据调整后更新标志if((temp&0x7f)>0x59) //超过59秒,清零temp=0;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp+1; //分数加1up_flag=1;if(temp>0x59) //超过59分,清零temp=0;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp+1; //小时数加1up_flag=1;if(temp>0x23) //超过23小时,清零temp=0;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp+1; //星期数加1up_flag=1;if(temp>0x7)temp=1;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp+1; //日数加1up_flag=1;if(temp>0x31)temp=1;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp+1; //月数加1up_flag=1;if(temp>0x12)temp=1;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp+1; //年数加1up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0);//while(wireless_2==1);}}////////////////////////////////////////////////////////////////////////////////////////////////////////////void Downkey()//降序按键{Down=1;if(Down==0)//if(Down==0||wireless_3==1){mdelay(4);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp-1; //秒数减1down_flag=1; //数据调整后更新标志if(temp==0x7f) //小于0秒,返回59秒temp=0x59;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp-1; //分数减1down_flag=1;if(temp==-1)temp=0x59; //小于0秒,返回59秒break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp-1; //小时数减1down_flag=1;if(temp==-1)temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp-1; //星期数减1down_flag=1;if(temp==0)temp=0x7;;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp-1; //日数减1down_flag=1;if(temp==0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp-1; //月数减1down_flag=1;if(temp==0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp-1; //年数减1down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0);//while(wireless_3==1);}}void Setkey()//模式选择按键{Set=1;if(Set==0)//if(Set==0||wireless_4==1){mdelay(4);count=count+1; //Setkey按一次,count就加1done=1; //进入调整模式while(Set==0);//while(wireless_4==1);}}void keydone()//按键功能执行{ uchar Second;if(flag==0) //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1;。

相关文档
最新文档