找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5622|回复: 19
打印 上一主题 下一主题
收起左侧

LCD12864红外遥控万年历V8单片机源代码(带详细注释)电路资料分享

  [复制链接]
跳转到指定楼层
楼主


万年历使用说明

V6.1以上版本LCD12864万年历PCB增加了24CXX接口和TL1838红外接口,其他接口电路跟老版本一样,程序可以通用,这样此万年历便成了一个简单实用的单片机开发实验板。

一、电源电压4.8V—12V,可以直接用电脑USB供电。(如高于5V供电,请将 J3 短路帽拔掉)
二、程序修改说明
1、如果你编译通不过,就是你用的KEIL库文件不全,请换个完整版本的KEIL,或到我店铺购买,本程序是完全编译通过,且没有1个警告;
2、本程序由于农历,节气等数据很占空间,编译后有22K,请使用程序存储器25K以上的51单片机,比如STC89C58,STC89C516等;
3、如果你的汉字显示不全或乱码,比如“三“显示不了,那是你的KEIL没有打补丁,并不是程序问题,至于什么补丁你可以网上搜或向我索要;
4、在修改位定义的时候需要将Soundplay.h文件下的sbit    BeepIO  = P3^7;  sbit KEY_1 = P2^7;一起修改;
5、蜂鸣器请最好使用无源蜂鸣器或小喇叭,这样音质会很好。

电路原理图如下:


元件清单:
名称    数量    说明
STC89C516单片机    1    内存20K以上的51单片机都可以
DS1302    1   
DS18B20    1   
AT24C02    1    V6.0以下版本不用安装
TL1838红外接收头    1    V6.1以下版本不用安装
微型遥控器    1    V6.1以下版不配备
40DIP座    1   
8DIP座    1   
3DIP座    1   
4DIP弯针    1   
20芯座    1   
20芯插针    1   
无源蜂鸣器    1   
CR2032电池    1   
电池座    1   
电源座    1   
按键    4   
开关    1   
32768HZ晶振    1   
11.0592MHZ晶振    1   
S8050三极管    1   
30P电容    2   
104电容    0    STC89C58/516单片机不用安装
10uF电解    0   
4.7K电阻    1    STC89C58/516  用1K,其他用10K
1K电阻    2    可以不安装
100uF电解    0   
双面绿色环氧PCB    1    ST7920驱动字库液晶
12864液晶    1   
柱子    4   
螺帽    4    使用自带对比度调节液晶不用安装


公历转换农历
公历与农历是我国目前并存的两种历法,各有其固有的规律,农历与月球的运行相对应,其影响因素多,它的大小月和闰月与天体运行有关,计算十分复杂,且每年都不一致,因此要用单片机实现公历与农历的转换用查表法是最方便实用的办法。
计算公历日对应的农历日期的方法是先计算出公历日离当年元旦的天数,然后查表取得当年的春节日期,计算出春节离元旦的天数,二者相减即可算出公历日离春节的天数,以后只要根据大小月和闰月信息减一月天数,调整一月农历月份,即可推算出公历日所对应的农历日期,如公历日不到春节日期,农历年要比公历年小一年,农历大小月取前一年的信息,农历月从12 月向前推算。
本文介绍的公历转换农历C语言程序实现从1901 年到2099 年199 年的公历日到农历转换,如果到2099年后则要添加农历表,但我相信199年对我们现代人已经足够了。在功能函数入口输入BCD公历数据函数出口直接输出BCD农历数据。农历显示按照人为习惯都是用大写显示,比如:“1号”应该显示为’初一“;“21”应该显示为“廿一”;“12月”应该显示为“腊月”等。
二十四节气和生肖
二十四节气是我国劳动人民创造的辉煌文化,它能反映季节的变化,指导农事活动,影响着千家万户的衣食住行。有人认为二十四节气从属农历,其实,它是根据阳历划定的。即根据太阳在黄道上的位置,把一年划分为24个彼此相等的段落。也就是把黄道分成24个等份,每等份各占黄经15°。由于太阳通过每等份所需的时间几乎相等,二十四节气的公历日期每年大致相同:上半年在6日、21日前后,下半年在8日、23日前后。
二十四节气没有固定规律,也需要存表。如1901年的节气为 :  
  1月    2月     3月     4月       5月      6月    7月     8月      9月    10月   11月    12月   
[ 6,21][ 4,19][ 6,21][ 5,21][ 6,22][ 6,22][ 8,23][ 8,24][ 8,24][ 8,24][ 8,23][ 8,22]   
[ 9, 6][11, 4][ 9, 6][10, 6][ 9, 7][ 9, 7][ 7, 8][ 7, 9][ 7, 9][ 7, 9][ 7, 8][ 7,15]   
上面第一行数据为每月节气对应公历日期,15减去每月第一个节气,每月第二个节气减去15得第二行,这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放第二个节气的数据,根据以上规律便可编写出节气表,最后通过表计算出每月节气。
   生肖计算相对就简单多了。12生肖按以下排列:
0鼠    1牛  2虎 3兔  4龙  5蛇  6马  7羊 8猴  9鸡   10狗  11猪
    用当前年数减去1900,然后除以12取余,余数就代表属相数。
  1. 例如:1951年
        (1982-1900)/12=余10
          即1982年生的人的属相为狗年
  2.2009年
         (2009-1900/12=余7
         即2009年生的人属相为牛年

单片机源程序如下:
  1. /*****************************************************************************************************************/
  2. //12864液晶万年历 时钟2010年最新 V8版本

  3. //增加了24C02接口,具有开机界面记忆功能、闹钟时间可以掉电保存功能
  4. //V8.0版本主要特点为三种风格界面显示,功能更强大
  5. /****************************************************************************************************************/
  6. //头文件
  7. #include <AT89X52.h>
  8. #include <string.h>
  9. #include <intrins.h> //包含_nop_()延时函数
  10. #ifndef uchar
  11. #define uchar unsigned char
  12. #endif

  13. #ifndef uint
  14. #define uint  unsigned int
  15. #endif

  16. #include "SoundPlay.h"
  17. #include "ds1302.h"
  18. #include "ds18b20.h"
  19. #include "24c02.h"
  20. #include "lcd12864.h"
  21. #include "tl1838.h"

  22. /*****************************************************************************/
  23. //键盘引脚定义
  24. //sbit KEY_1 = P2^7;  //左上,在音乐文件SoundPlay.h中已定义
  25. sbit KEY_2 = P2^6;         //左下
  26. sbit KEY_3 = P2^5;         //右上
  27. sbit KEY_4 = P2^4;         //右下
  28. /****************************************************************************/
  29. //定义全局变量
  30. unsigned char yy,mo,dd,xq,hh,year,year1;//定义时间映射全局变量(专用寄存器)
  31. unsigned char shi,ge,sec_temp,min_temp,hour_temp,secl,selx,e=0,hh1,mm1,mm,ss,n,t;
  32. char xdata n1,n2;
  33. bit w = 0; //调时标志位
  34. uchar c_sun,year_sun,month_sun,day_sun; //农历
  35. /******************************************************************************/
  36. /*--  一幅图像 KISS- 正向取模,字节正序*/     
  37. /*--  宽度x高度=128x64  --*/
  38. /******************************************************************************/
  39. uchar code powerOnPhoto []={
  40.   
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  42. 0xFF,0xFF,0xFF,0x9F,0x00,0x00,0x0F,0x0E,0x00,0x00,0x00,0x00,0x19,0xFF,0xFF,0xFF,

  43. …………
  44. …………
  45. …………限于本文篇幅 余下代码请从51黑下载附件…………
  46.          {// 图片" "
  47.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  48.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  49.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  50.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  51.                                                 };  
  52. /******************************************************************************/
  53. //农历代码
  54. /*
  55. 公历年对应的农历数据,每年三字节,
  56. 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
  57. 第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
  58. 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)
  59. 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
  60. */
  61. /******************************************************************************/
  62. code uchar year_code[] = {
  63. 0x0C,0x96,0x45, //2000
  64. 0x4d,0x4A,0xB8, //2001
  65. 0x0d,0x4A,0x4C, //2002
  66. …………
  67. …………
  68. …………限于本文篇幅 余下代码请从51黑下载附件…………
  69. 0x2d,0x92,0xB5, //2099
  70. };
  71. ///月份数据表
  72. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  73. code uint day_code2[3]={0x111,0x130,0x14e};
  74. /*
  75. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  76. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  77. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  78. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  79. 纪,c_sun=1为19世纪
  80. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  81. */
  82. bit c_moon;
  83. data uchar year_moon,month_moon,day_moon,week;
  84. /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/
  85. bit get_moon_day(uchar month_p,uint table_addr)
  86. {
  87. uchar temp;
  88. switch (month_p)
  89. {
  90. case 1:{temp=year_code[table_addr]&0x08;
  91. if (temp==0)return(0);else return(1);}
  92. case 2:{temp=year_code[table_addr]&0x04;
  93. if (temp==0)return(0);else return(1);}
  94. case 3:{temp=year_code[table_addr]&0x02;
  95. if (temp==0)return(0);else return(1);}
  96. case 4:{temp=year_code[table_addr]&0x01;
  97. if (temp==0)return(0);else return(1);}
  98. case 5:{temp=year_code[table_addr+1]&0x80;
  99. if (temp==0) return(0);else return(1);}
  100. case 6:{temp=year_code[table_addr+1]&0x40;
  101. if (temp==0)return(0);else return(1);}
  102. case 7:{temp=year_code[table_addr+1]&0x20;
  103. if (temp==0)return(0);else return(1);}
  104. case 8:{temp=year_code[table_addr+1]&0x10;
  105. if (temp==0)return(0);else return(1);}
  106. case 9:{temp=year_code[table_addr+1]&0x08;
  107. if (temp==0)return(0);else return(1);}
  108. case 10:{temp=year_code[table_addr+1]&0x04;
  109. if (temp==0)return(0);else return(1);}
  110. case 11:{temp=year_code[table_addr+1]&0x02;
  111. if (temp==0)return(0);else return(1);}
  112. case 12:{temp=year_code[table_addr+1]&0x01;
  113. if (temp==0)return(0);else return(1);}
  114. case 13:{temp=year_code[table_addr+2]&0x80;
  115. if (temp==0)return(0);else return(1);}
  116. }
  117. }
  118. /*
  119. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  120. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  121. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  122. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  123. 纪,c_sun=1为19世纪
  124. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  125. */
  126. void Conversion(bit c,uchar year,uchar month,uchar day)
  127. { //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  128. uchar temp1,temp2,temp3,month_p;
  129. uint temp4,table_addr;
  130. bit flag2,flag_y;
  131. temp1=year/16; //BCD->hex 先把数据转换为十六进制
  132. temp2=year%16;
  133. year=temp1*10+temp2;
  134. temp1=month/16;
  135. temp2=month%16;
  136. month=temp1*10+temp2;
  137. temp1=day/16;
  138. temp2=day%16;
  139. day=temp1*10+temp2;
  140. //定位数据表地址
  141. if(c==0)
  142. {
  143. table_addr=(year)*0x3;
  144. }
  145. //else
  146. //{
  147. //table_addr=(year-1)*0x3;
  148. //}
  149. //定位数据表地址完成
  150. //取当年春节所在的公历月份
  151. temp1=year_code[table_addr+2]&0x60;
  152. temp1=_cror_(temp1,5);
  153. //取当年春节所在的公历月份完成
  154. //取当年春节所在的公历日
  155. temp2=year_code[table_addr+2]&0x1f;
  156. //取当年春节所在的公历日完成
  157. // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
  158. if(temp1==0x1)
  159. {
  160. temp3=temp2-1;
  161. }
  162. else
  163. {
  164. temp3=temp2+0x1f-1;
  165. }
  166. // 计算当年春年离当年元旦的天数完成
  167. //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  168. //day_code1[9],day_code2[3]
  169. //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  170. //在九月后,天数大于0xff,用表day_code2[3]
  171. //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  172. //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
  173. if (month<10)
  174. {
  175. temp4=day_code1[month-1]+day-1;
  176. }
  177. else
  178. {
  179. temp4=day_code2[month-10]+day-1;
  180. }
  181. if ((month>0x2)&&(year%0x4==0))
  182. { //如果公历月大于2月并且该年的2月为闰月,天数加1
  183. temp4+=1;
  184. }
  185. //计算公历日离当年元旦的天数完成
  186. //判断公历日在春节前还是春节后
  187. if (temp4>=temp3)
  188. { //公历日在春节后或就是春节当日使用下面代码进行运算
  189. temp4-=temp3;
  190. month=0x1;
  191. month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
  192. flag2=get_moon_day(month_p,table_addr);
  193. //检查该农历月为大小还是小月,大月返回1,小月返回0
  194. flag_y=0;
  195. if(flag2==0)temp1=0x1d; //小月29天
  196. else temp1=0x1e; //大小30天
  197. temp2=year_code[table_addr]&0xf0;
  198. temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月
  199. while(temp4>=temp1)
  200. {
  201. temp4-=temp1;
  202. month_p+=1;
  203. if(month==temp2)
  204. {
  205. flag_y=~flag_y;
  206. if(flag_y==0)
  207. month+=1;
  208. }
  209. else month+=1;
  210. flag2=get_moon_day(month_p,table_addr);
  211. if(flag2==0)temp1=0x1d;
  212. else temp1=0x1e;
  213. }
  214. day=temp4+1;
  215. }
  216. else
  217. { //公历日在春节前使用下面代码进行运算
  218. temp3-=temp4;
  219. if (year==0x0)
  220. {
  221. year=0x63;c=1;
  222. }
  223. else year-=1;
  224. table_addr-=0x3;
  225. month=0xc;
  226. temp2=year_code[table_addr]&0xf0;
  227. temp2=_cror_(temp2,4);
  228. if (temp2==0)
  229. month_p=0xc;
  230. else
  231. month_p=0xd; //
  232. /*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/
  233. flag_y=0;
  234. flag2=get_moon_day(month_p,table_addr);
  235. if(flag2==0)temp1=0x1d;
  236. else temp1=0x1e;
  237. while(temp3>temp1)
  238. {
  239. temp3-=temp1;
  240. month_p-=1;
  241. if(flag_y==0)month-=1;
  242. if(month==temp2)flag_y=~flag_y;
  243. flag2=get_moon_day(month_p,table_addr);
  244. if(flag2==0)temp1=0x1d;
  245. else temp1=0x1e;
  246. }
  247. day=temp1-temp3+1;
  248. }
  249. c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据
  250. temp1=year/10;
  251. temp1=_crol_(temp1,4);
  252. temp2=year%10;
  253. year_moon=temp1|temp2;
  254. temp1=month/10;
  255. temp1=_crol_(temp1,4);
  256. temp2=month%10;
  257. month_moon=temp1|temp2;
  258. temp1=day/10;
  259. temp1=_crol_(temp1,4);
  260. temp2=day%10;
  261. day_moon=temp1|temp2;
  262. }
  263. /*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
  264. 调用函数示例:Conver_week(c_sun,year_sun,month_sun,day_sun)
  265. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  266. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  267. 纪,c_sun=1为19世纪
  268. 调用函数后,原有数据不变,读week得出阴历BCD数据
  269. */
  270. code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
  271. /*
  272. 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在
  273. 闰年又不到3 月份上述之和要减一天再除7
  274. 星期数为0
  275. */
  276. /*void Conver_week(bit c,uchar year,uchar month,uchar day)
  277. {//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  278. uchar temp1,temp2;
  279. temp1=year/16; //BCD->hex 先把数据转换为十六进制
  280. temp2=year%16;
  281. year=temp1*10+temp2;
  282. temp1=month/16;
  283. temp2=month%16;
  284. month=temp1*10+temp2;
  285. temp1=day/16;
  286. temp2=day%16;
  287. day=temp1*10+temp2;
  288. if (c==0){year+=0x64;} //如果为21世纪,年份数加100
  289. temp1=year/0x4; //所过闰年数只算1900年之后的
  290. temp2=year+temp1;
  291. temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
  292. temp2=temp2+day+table_week[month-1];
  293. if (year%0x4==0&&month<3)temp2-=1;
  294. week=temp2%0x7;
  295. }*/
  296. //test
  297. /****************************************************************************************************************************
  298. 函数功能: 二十四节气数据库
  299. 入口参数: unsigned char(yy,mo,dd) 对应 年月日
  300. 出口参数: unsigned char(0-24) 1-24对应二十四节气
  301. 作者    : TOTOP
  302. 二十四节气数据库(1901--2050)
  303. 数据格式说明:   
  304. 如1901年的节气为   
  305.      1月    2月     3月     4月       5月      6月    7月     8月      9月    10月   11月    12月   
  306. [ 6,21][ 4,19][ 6,21][ 5,21][ 6,22][ 6,22][ 8,23][ 8,24][ 8,24][ 8,24][ 8,23][ 8,22]   
  307. [ 9, 6][11, 4][ 9, 6][10, 6][ 9, 7][ 9, 7][ 7, 8][ 7, 9][ 7, 9][ 7, 9][ 7, 8][ 7,15]   
  308. 上面第一行数据为每月节气对应公历日期,15减去每月第一个节气,每月第二个节气减去15得第二
  309. 行,这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存
  310. 放第二个节气的数据,可得下表   
  311. ****************************************************************************************************************************/
  312. uchar code jieqi_code[]=
  313. {
  314.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2000   
  315.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2001   
  316.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,     //2002   
  317.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x69,0x78,0x87,     //2003   
  318.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2004   
  319.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2005   
  320.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2006   
  321.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x69,0x78,0x87,     //2007   
  322.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2008   
  323.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2009   
  324.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2010   
  325.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x79,0x78,0x87,     //2011   
  326.        0x96,0xB4,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2012   
  327.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,     //2013   
  328.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2014   
  329.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x79,0x77,0x87,     //2015   
  330.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2016   
  331.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,     //2017   
  332.        0xA5,0xB4,0xA6,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2018   
  333.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x79,0x77,0x87,     //2019   
  334.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,     //2020   
  335.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2021   
  336.        0xA5,0xB4,0xA5,0xA5,0xA6,0x96,0x88,0x88,0x88,0x78,0x87,0x87,     //2022   
  337.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x79,0x77,0x87,     //2023   
  338.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2024   
  339.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2025   
  340.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2026   
  341.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,     //2027   
  342.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2028   
  343.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2029   
  344.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2030   
  345.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,     //2031   
  346.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2032   
  347.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x86,     //2033   
  348.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x78,0x88,0x78,0x87,0x87,     //2034   
  349.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2035   
  350.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2036   
  351.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2037   
  352.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2038   
  353.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2039   
  354.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2040   
  355.        0xA5,0xC3,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2041   
  356.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2042   
  357.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2043   
  358.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x88,0x87,0x96,     //2044   
  359.        0xA5,0xC3,0xA5,0xB4,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2045   
  360.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,     //2046   
  361.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2047   
  362.        0x95,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,     //2048   
  363.        0xA4,0xC3,0xA5,0xA5,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,     //2049   
  364.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x78,0x78,0x87,0x87,     //2050
  365.     };
  366. uchar jieqi (uchar y2,m2,d2)
  367. {
  368. uchar temp,d,y,y1,m;
  369. uint addr;
  370. d=d2/16*10+d2%16;
  371. m=m2/16*10+m2%16;
  372. y1=y2/16*10+y2%16+2000;
  373. y=y1-2000;
  374. addr=y*12+m-1;
  375. if(d<15)
  376. {
  377. temp=15-d;
  378. if((jieqi_code[addr]>>4)==temp) return (m*2-1);
  379. else return (0);
  380. }
  381. if(d==15) return (0);
  382. if(d>15)
  383. {
  384. temp=d-15;
  385. if((jieqi_code[addr]&0x0f)==temp) return (m*2);
  386. else return (0);
  387. }
  388. }

  389. /******************************************************************************/
  390. //公历节日数据库表
  391. /******************************************************************************/
  392. void days ()  //公历节日数据库
  393.        {         
  394.         uchar j;
  395.         j=jieqi(yy,mo,dd);
  396.                 if(t/2%2==0)//设置变化的时间,默认是2秒
  397.                 {           //以下自己添加生日、节日信息
  398.                 if ( month_moon== 0x06 && day_moon== 0x02 ){dispString(3, 0, 1, "后天是    的生日");}
  399.    else if ( month_moon== 0x06 && day_moon== 0x03 ){dispString(3, 0, 1, "明天是    的生日");}


  400.                 //农历节日
  401.    else     if ( month_moon== 0x12 && day_moon== 0x29 ){dispString(3, 0, 1, "    明天大年    ");}
  402.    else            if ( month_moon== 0x12 && day_moon== 0x30 ){dispString(3, 0, 1, "    大年三十    ");}
  403.    else            if ( month_moon== 0x05 && day_moon== 0x05 ){dispString(3, 0, 1, "  今天是端午节  ");}
  404.    else                if ( month_moon== 0x08 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是中秋节  ");}
  405.    else                if ( month_moon== 0x01 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是元宵节  ");}
  406.    else                if ( month_moon== 0x02 && day_moon== 0x02 ){dispString(3, 0, 1, "  今天是龙抬头  ");}
  407.    else                if ( month_moon== 0x07 && day_moon== 0x07 ){dispString(3, 0, 1, "  今天是七夕!   ");}
  408.    else                if ( month_moon== 0x07 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是鬼节!   ");}
  409.    else                if ( month_moon== 0x09 && day_moon== 0x09 ){dispString(3, 0, 1, "  今天是重阳节  ");}
  410.    else                if ( month_moon== 0x12 && day_moon== 0x08 ){dispString(3, 0, 1, "  今天是腊八节  ");}
  411.                 //国立节日                                                               
  412.    else     if ( mo == 0x01 && dd == 0x01 ){dispString(3, 0, 1, "    元旦快乐!   ");}//1月
  413.    else                if ( mo == 0x01 && dd == 0x28 ){dispString(3, 0, 1, "今天是世界麻风日");}
  414.                
  415.    else                if ( mo == 0x02 && dd == 0x02 ){dispString(3, 0, 1, "今天是世界湿地日");}//2月
  416.    else                if ( mo == 0x02 && dd == 0x13 ){dispString(3, 0, 1, "  明天情人节了  ");}               
  417.    else                if ( mo == 0x02 && dd == 0x14 ){dispString(3, 0, 1, "  今天是情人节  ");}
  418.                                 
  419.    else                if ( mo == 0x03 && dd == 0x01 ){dispString(3, 0, 1, "今天是国际海豹日");}//3月               
  420.    else                if ( mo == 0x03 && dd == 0x03 ){dispString(3, 0, 1, "今天是全国爱耳日");}               
  421.    else                if ( mo == 0x03 && dd == 0x08 ){dispString(3, 0, 1, "今天是3.8 妇女节");}               
  422.    else                if ( mo == 0x03 && dd == 0x12 ){dispString(3, 0, 1, "  今天是植树节  ");}               
  423.    else                if ( mo == 0x03 && dd == 0x14 ){dispString(3, 0, 1, "今天是国际警察日");}               
  424.    else                if ( mo == 0x03 && dd == 0x15 ){dispString(3, 0, 1, "今天消费者权益日");}               
  425.    else                if ( mo == 0x03 && dd == 0x17 ){dispString(3, 0, 1, "今天是国际航海日");}               
  426.    else                if ( mo == 0x03 && dd == 0x21 ){dispString(3, 0, 1, "今天是世界森林日");}               
  427.    else                if ( mo == 0x03 && dd == 0x22 ){dispString(3, 0, 1, "今天是世界水日!");}               
  428.    else                if ( mo == 0x03 && dd == 0x23 ){dispString(3, 0, 1, "今天是世界气象日");}               
  429.    else                if ( mo == 0x03 && dd == 0x24 ){dispString(3, 0, 1, "世界防治结核病日");}
  430.                                 
  431.    else                if ( mo == 0x04 && dd == 0x01 ){dispString(3, 0, 1, "愚人节,小心上当");}//4               
  432.    else                if ( mo == 0x04 && dd == 0x07 ){dispString(3, 0, 1, "今天是世界卫生日");}               
  433.    else                if ( mo == 0x04 && dd == 0x08 ){dispString(3, 0, 1, "  今天复活节!   ");}               
  434.    else                if ( mo == 0x04 && dd == 0x13 ){dispString(3, 0, 1, "  黑色星期五!   ");}
  435.                                 
  436.    else                if ( mo == 0x05 && dd == 0x01 ){dispString(3, 0, 1, "  今天是劳动节  ");}//5               
  437.    else                if ( mo == 0x05 && dd == 0x04 ){dispString(3, 0, 1, "今天是五四青年节");}               
  438.    else                if ( mo == 0x05 && dd == 0x08 ){dispString(3, 0, 1, "今天世界红十字日");}               
  439.    else                if ( mo == 0x05 && dd == 0x12 ){dispString(3, 0, 1, "今天是国际护士节");}               
  440.    else                if ( mo == 0x05 && dd == 0x05 ){dispString(3, 0, 1, "近日注意母亲节! ");}               
  441.    else                if ( mo == 0x05 && dd == 0x15 ){dispString(3, 0, 1, "今天是国际家庭日");}
  442.    else                if ( mo == 0x05 && dd == 0x31 ){dispString(3, 0, 1, "今天是世界无烟日");}               
  443.                                 
  444.    else                if ( mo == 0x06 && dd == 0x01 ){dispString(3, 0, 1, "今天是国际儿童节");}//6
  445.    else                if ( mo == 0x06 && dd == 0x05 ){dispString(3, 0, 1, "今天是世界环境日");}               
  446.    else                if ( mo == 0x06 && dd == 0x26 ){dispString(3, 0, 1, "今天是国际禁毒日");}               
  447.    else                if ( mo == 0x06 && dd == 0x06 ){dispString(3, 0, 1, "今天是全国爱眼日");}               
  448.    else                if ( mo == 0x06 && dd == 0x13 ){dispString(3, 0, 1, "近日注意父亲节! ");}
  449.    else                if ( mo == 0x06 && dd == 0x15 ){dispString(3, 0, 1, "近日注意父亲节! ");}
  450.                                 
  451.    else                if ( mo == 0x07 && dd == 0x01 ){dispString(3, 0, 1, "香港回归记念日! ");}//7
  452.    else                if ( mo == 0x07 && dd == 0x07 ){dispString(3, 0, 1, "抗日战争记念日! ");}
  453.    else                if ( mo == 0x07 && dd == 0x11 ){dispString(3, 0, 1, "今天是世界人口日");}

  454.    else                if ( mo == 0x08 && dd == 0x01 ){dispString(3, 0, 1, "今天是八一建军节");}//8
  455.    else                if ( mo == 0x08 && dd == 0x08 ){dispString(3, 0, 1, "今天是中国男子节");}
  456.    else                if ( mo == 0x08 && dd == 0x15 ){dispString(3, 0, 1, "抗战胜利记念日!");}

  457.    else                if ( mo == 0x09 && dd == 0x10 ){dispString(3, 0, 1, "  今天是教师节  ");}//9
  458.    else                if ( mo == 0x09 && dd == 0x18 ){dispString(3, 0, 1, "九·一八事变记念");}
  459.    else                if ( mo == 0x09 && dd == 0x20 ){dispString(3, 0, 1, "今天是国际爱牙日");}
  460.    else                if ( mo == 0x09 && dd == 0x27 ){dispString(3, 0, 1, "今天是世界旅游日");}

  461.    else                if ( mo == 0x10 && dd == 0x01 ){dispString(3, 0, 1, "  今天是国庆节  ");}//10
  462.    else                if ( mo == 0x10 && dd == 0x04 ){dispString(3, 0, 1, "今天是世界动物日");}
  463.    else                if ( mo == 0x10 && dd == 0x24 ){dispString(3, 0, 1, "今天是联合国日! ");}
  464.    else                if ( mo == 0x10 && dd == 0x12 ){dispString(3, 0, 1, "明天国际教师节! ");}
  465.    else                if ( mo == 0x10 && dd == 0x13 ){dispString(3, 0, 1, "今天是国际教师节");}

  466.    else                if ( mo == 0x11 && dd == 0x10 ){dispString(3, 0, 1, "今天是世界青年节");}//11
  467.    else                if ( mo == 0x11 && dd == 0x17 ){dispString(3, 0, 1, "今天是世界学生节");}

  468.    else                if ( mo == 0x12 && dd == 0x01 ){dispString(3, 0, 1, "今天世界艾滋病日");}//12
  469.    else                if ( mo == 0x12 && dd == 0x23 ){dispString(3, 0, 1, "  明晚平安夜!   ");}
  470.    else                if ( mo == 0x12 && dd == 0x24 ){dispString(3, 0, 1, "  今晚平安夜!   ");}
  471.    else                if ( mo == 0x12 && dd == 0x25 ){dispString(3, 0, 1, "    圣诞快乐    ");}
  472.    else                if ( mo == 0x12 && dd == 0x31 ){dispString(3, 0, 1, "    明日元旦    ");}
  473.                   }
  474.                 else{
  475.                         //二十四节气
  476.                if (j==1){dispString(3, 0, 1, "    今天小寒    ");}
  477.    else        if (j==2){dispString(3, 0, 1, "    今天大寒    ");}
  478.    else        if (j==3){dispString(3, 0, 1, "    今天立春    ");}
  479.    else        if (j==4){dispString(3, 0, 1, "    今天雨水    ");}
  480.    else        if (j==5){dispString(3, 0, 1, "    今天惊蛰    ");}
  481.    else        if (j==6){dispString(3, 0, 1, "    今天春分    ");}
  482.    else        if (j==7){dispString(3, 0, 1, "    今天清明    ");}
  483.    else        if (j==8){dispString(3, 0, 1, "    今天谷雨    ");}
  484.    else        if (j==9){dispString(3, 0, 1, "    今天立夏    ");}
  485.    else        if (j==10){dispString(3, 0, 1, "    今天小满    ");}
  486.    else        if (j==11){dispString(3, 0, 1, "    今天芒种    ");}
  487.    else        if (j==12){dispString(3, 0, 1, "    今天夏至    ");}
  488.    else        if (j==13){dispString(3, 0, 1, "    今天小暑    ");}
  489.    else        if (j==14){dispString(3, 0, 1, "    今天大暑    ");}
  490.    else        if (j==15){dispString(3, 0, 1, "    今天立秋    ");}
  491.    else        if (j==16){dispString(3, 0, 1, "    今天处暑    ");}
  492.    else        if (j==17){dispString(3, 0, 1, "    今天白露    ");}
  493.    else        if (j==18){dispString(3, 0, 1, "    今天秋分    ");}
  494.    else        if (j==19){dispString(3, 0, 1, "    今天寒露    ");}
  495.    else        if (j==20){dispString(3, 0, 1, "    今天霜降    ");}
  496.    else        if (j==21){dispString(3, 0, 1, "    今天立冬    ");}
  497.    else        if (j==22){dispString(3, 0, 1, "    今天小雪    ");}
  498.    else        if (j==23){dispString(3, 0, 1, "    今天大雪    ");}
  499.    else        if (j==24){dispString(3, 0, 1, "    今天冬至    ");}

  500.    //非节日时显示时晨信息
  501.    else {   if ( hh >= 0x04 && hh <  0x06 ){dispString(3, 0, 1, "  凌晨  点  分  ");
  502.                         lcdWriteCommand(0x9b);
  503.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  504.                         else{lcdWriteData(0x20);}//同上        
  505.                     lcdWriteData(hh1%10+0x30);
  506.                     lcdWriteCommand(0x9d);          //":"
  507.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  508.                         else{lcdWriteData(0x20);}//同上        
  509.                 lcdWriteData(mm%16+0x30); }
  510.                         if ( hh >= 0x06 && hh <  0x08 ){dispString(3, 0, 1, "  早晨  点  分  ");
  511.                         lcdWriteCommand(0x9b);
  512.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  513.                         else{lcdWriteData(0x20);}//同上        
  514.                     lcdWriteData(hh1%10+0x30);
  515.                     lcdWriteCommand(0x9d);          //":"
  516.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  517.                         else{lcdWriteData(0x20);}//同上        
  518.                 lcdWriteData(mm%16+0x30); }
  519.                         if ( hh >= 0x08 && hh <  0x12 ){dispString(3, 0, 1, "  上午  点  分  ");
  520.                         lcdWriteCommand(0x9b);
  521.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  522.                         else{lcdWriteData(0x20);}//同上        
  523.                     lcdWriteData(hh1%10+0x30);
  524.                     lcdWriteCommand(0x9d);          //":"
  525.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  526.                         else{lcdWriteData(0x20);}//同上        
  527.                 lcdWriteData(mm%16+0x30); }
  528.                         if ( hh == 0x12)               {dispString(3, 0, 1, "  中午  点  分  ");
  529.                         lcdWriteCommand(0x9b);
  530.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  531.                         else{lcdWriteData(0x20);}//同上        
  532.                     lcdWriteData(hh1%10+0x30);
  533.                     lcdWriteCommand(0x9d);          //":"
  534.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  535.                         else{lcdWriteData(0x20);}//同上        
  536.                 lcdWriteData(mm%16+0x30); }
  537.                         if ( hh >= 0x13 && hh <  0x18 ){dispString(3, 0, 1, "  下午  点  分  ");
  538.                         lcdWriteCommand(0x9b);
  539.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  540.                         else{lcdWriteData(0x20);}//同上        
  541.                     lcdWriteData(hh1%10+0x30);
  542.                     lcdWriteCommand(0x9d);          //":"
  543.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  544.                         else{lcdWriteData(0x20);}//同上        
  545.                 lcdWriteData(mm%16+0x30); }
  546.                         if ( hh >= 0x18 && hh <  0x22 ){dispString(3, 0, 1, "  晚上  点  分  ");
  547.                         lcdWriteCommand(0x9b);
  548.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  549.                         else{lcdWriteData(0x20);}//同上        
  550.                     lcdWriteData(hh1%10+0x30);
  551.                     lcdWriteCommand(0x9d);          //":"
  552.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  553.                         else{lcdWriteData(0x20);}//同上        
  554.                 lcdWriteData(mm%16+0x30); }
  555.                         if ( hh >= 0x22 && hh <= 0x23 ){dispString(3, 0, 1, "  夜里  点  分  ");
  556.                         lcdWriteCommand(0x9b);
  557.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  558.                         else{lcdWriteData(0x20);}//同上        
  559.                     lcdWriteData(hh1%10+0x30);
  560.                     lcdWriteCommand(0x9d);          //":"
  561.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  562.                         else{lcdWriteData(0x20);}//同上        
  563.                 lcdWriteData(mm%16+0x30); }
  564.                         if ( hh >= 0x00 && hh <  0x04 ){dispString(3, 0, 1, "  深夜  点  分  ");
  565.                         lcdWriteCommand(0x9b);
  566.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  567.                         else{lcdWriteData(0x20);}//同上        
  568.                     lcdWriteData(hh1%10+0x30);
  569.                     lcdWriteCommand(0x9d);          //":"
  570.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  571.                         else{lcdWriteData(0x20);}//同上        
  572.                 lcdWriteData(mm%16+0x30); }
  573.                         }

  574.                 }
  575. }
  576. /*****************************************************************************/        
  577. //农历显示
  578. /******************************************************************************/
  579. void lcmnongli()
  580. {
  581. uchar yue,ri;
  582. year_sun=yy;
  583. month_sun=mo;
  584. day_sun=dd;
  585. Conversion(c_sun,year_sun,month_sun,day_sun);
  586. yue=(month_moon/16)*10+month_moon%16;
  587. year1=yue;

  588. if(k==2)
  589. {
  590. ri=(day_moon/16)*10+day_moon%16;  //显示农历月
  591.   if(yue==1){dispString(1, 0, 1, "正"); }
  592.   if(yue==2){dispString(1, 0, 1, "二"); }
  593.   if(yue==3){dispString(1, 0, 1, "三"); }
  594.   if(yue==4){dispString(1, 0, 1, "四"); }
  595.   if(yue==5){dispString(1, 0, 1, "五"); }
  596.   if(yue==6){dispString(1, 0, 1, "六"); }
  597.   if(yue==7){dispString(1, 0, 1, "七"); }
  598.   if(yue==8){dispString(1, 0, 1, "八"); }
  599.   if(yue==9){dispString(1, 0, 1, "九"); }
  600.   if(yue==10){dispString(1, 0, 1, "十"); }
  601.   if(yue==11){dispString(1, 0, 1, "冬"); }
  602.   if(yue==12){dispString(1, 0, 1, "腊"); }
  603.   dispString(1, 1, 1, "月");
  604.   if(ri<=10)
  605.    {
  606.     if(ri==1){  dispString(1, 2, 1, "初一"); }
  607.     if(ri==2){  dispString(1, 2, 1, "初二"); }
  608.     if(ri==3){  dispString(1, 2, 1, "初三"); }
  609.     if(ri==4){  dispString(1, 2, 1, "初四");}
  610.     if(ri==5){  dispString(1, 2, 1, "初五"); }
  611.     if(ri==6){  dispString(1, 2, 1, "初六"); }
  612.     if(ri==7){  dispString(1, 2, 1, "初七"); }
  613.     if(ri==8){  dispString(1, 2, 1, "初八"); }
  614.     if(ri==9){  dispString(1, 2, 1, "初九");  }
  615.     if(ri==10){  dispString(1, 2, 1, "初十"); }
  616.    }
  617.   else
  618.    {
  619.     if(ri==11){  dispString(1, 2, 1, "十一");}
  620.     if(ri==12){  dispString(1, 2, 1, "十二");}
  621.     if(ri==13){  dispString(1, 2, 1, "十三"); }
  622.     if(ri==14){  dispString(1, 2, 1, "十四"); }
  623.     if(ri==15){  dispString(1, 2, 1, "十五"); }
  624.     if(ri==16){  dispString(1, 2, 1, "十六"); }
  625.     if(ri==17){  dispString(1, 2, 1, "十七"); }
  626.     if(ri==18){  dispString(1, 2, 1, "十八"); }
  627.     if(ri==19){  dispString(1, 2, 1, "十九"); }
  628.     if(ri==20){  dispString(1, 2, 1, "二十");}
  629.     if(ri==21){  dispString(1, 2, 1, "廿一");  }
  630.     if(ri==22){  dispString(1, 2, 1, "廿二");}
  631.     if(ri==23){  dispString(1, 2, 1, "廿三"); }
  632.     if(ri==24){  dispString(1, 2, 1, "廿四"); }
  633.     if(ri==25){  dispString(1, 2, 1, "廿五"); }
  634.     if(ri==26){  dispString(1, 2, 1, "廿六");}
  635.     if(ri==27){  dispString(1, 2, 1, "廿七"); }
  636.     if(ri==28){  dispString(1, 2, 1, "廿八"); }
  637.     if(ri==29){  dispString(1, 2, 1, "廿九");}
  638.     if(ri==30){  dispString(1, 2, 1, "三十"); }
  639.    }

  640.    }
  641.    else
  642.    {
  643.         ri=(day_moon/16)*10+day_moon%16;  //显示农历月
  644.   if(yue==1){dispString(2, 1, 1, "正"); }
  645.   if(yue==2){dispString(2, 1, 1, "二"); }
  646.   if(yue==3){dispString(2, 1, 1, "三"); }
  647.   if(yue==4){dispString(2, 1, 1, "四"); }
  648.   if(yue==5){dispString(2, 1, 1, "五"); }
  649.   if(yue==6){dispString(2, 1, 1, "六"); }
  650.   if(yue==7){dispString(2, 1, 1, "七"); }
  651.   if(yue==8){dispString(2, 1, 1, "八"); }
  652.   if(yue==9){dispString(2, 1, 1, "九"); }
  653.   if(yue==10){dispString(2, 1, 1, "十"); }
  654.   if(yue==11){dispString(2, 1, 1, "冬"); }
  655.   if(yue==12){dispString(2, 1, 1, "腊"); }
  656.   dispString(2, 2, 1, "月");
  657.   if(ri<=10)
  658.    {
  659.     if(ri==1){  dispString(2, 3, 1, "初一"); }
  660.     if(ri==2){  dispString(2, 3, 1, "初二"); }
  661.     if(ri==3){  dispString(2, 3, 1, "初三"); }
  662.     if(ri==4){  dispString(2, 3, 1, "初四");}
  663.     if(ri==5){  dispString(2, 3, 1, "初五"); }
  664.     if(ri==6){  dispString(2, 3, 1, "初六"); }
  665.     if(ri==7){  dispString(2, 3, 1, "初七"); }
  666.     if(ri==8){  dispString(2, 3, 1, "初八"); }
  667.     if(ri==9){  dispString(2, 3, 1, "初九");  }
  668.     if(ri==10){  dispString(2, 3, 1, "初十"); }
  669.    }
  670.   else
  671.    {
  672.     if(ri==11){  dispString(2, 3, 1, "十一");}
  673.     if(ri==12){  dispString(2, 3, 1, "十二");}
  674.     if(ri==13){  dispString(2, 3, 1, "十三"); }
  675.     if(ri==14){  dispString(2, 3, 1, "十四"); }
  676.     if(ri==15){  dispString(2, 3, 1, "十五"); }
  677.     if(ri==16){  dispString(2, 3, 1, "十六"); }
  678.     if(ri==17){  dispString(2, 3, 1, "十七"); }
  679.     if(ri==18){  dispString(2, 3, 1, "十八"); }
  680.     if(ri==19){  dispString(2, 3, 1, "十九"); }
  681.     if(ri==20){  dispString(2, 3, 1, "二十");}
  682.     if(ri==21){  dispString(2, 3, 1, "廿一");  }
  683.     if(ri==22){  dispString(2, 3, 1, "廿二");}
  684.     if(ri==23){  dispString(2, 3, 1, "廿三"); }
  685.     if(ri==24){  dispString(2, 3, 1, "廿四"); }
  686.     if(ri==25){  dispString(2, 3, 1, "廿五"); }
  687.     if(ri==26){  dispString(2, 3, 1, "廿六");}
  688.     if(ri==27){  dispString(2, 3, 1, "廿七"); }
  689.     if(ri==28){  dispString(2, 3, 1, "廿八"); }
  690.     if(ri==29){  dispString(2, 3, 1, "廿九");}
  691.     if(ri==30){  dispString(2, 3, 1, "三十"); }
  692.    }
  693.    }
  694. }
  695. /******************************************************************************/
  696. //十二生肖显示
  697. /******************************************************************************/
  698. void lcmshengxiao()
  699. {
  700. uint y3;
  701. y3=(yy/16*10+yy%16+2000-1900)%12;
  702. if(year<6 & year1>6) y3--;
  703. switch(y3)
  704. {
  705.   case 0: dispString(0, 6, 1, "子鼠");
  706.           break;
  707.   case 1:  dispString(0, 6, 1, "丑牛");
  708.           break;
  709.   case 2:  dispString(0, 6, 1, "寅虎");
  710.           break;
  711.   case 3:  dispString(0, 6, 1, "卯兔");
  712.           break;
  713.   case 4:  dispString(0, 6, 1, "辰龙");
  714.           break;
  715.   case 5: dispString(0, 6, 1, "巳蛇");
  716.           break;
  717.   case 6: dispString(0, 6, 1, "午马");
  718.           break;
  719.   case 7: dispString(0, 6, 1, "未羊");
  720.           break;
  721.   case 8:  dispString(0, 6, 1, "申猴");
  722.           break;
  723.   case 9:  dispString(0, 6, 1, "酉鸡");
  724.           break;
  725.   case 10:  dispString(0, 6, 1, "戌狗");
  726.           break;
  727.   case 11: dispString(0, 6, 1, "亥猪");
  728.           break;
  729. }
  730. }
  731. /*****************************************************************************/
  732. //调时用加1程序
  733. void Set_time(unsigned char sel)//根据选择调整的相应项目加1并写入DS1302
  734. {
  735.   signed char address,item;
  736.   signed char max,mini;
  737.   dispString(3, 2, 1, "设置");
  738.   if(sel==6)  {dispString(3, 4, 1, "秒钟");address=0x80; max=59;mini=0;}     //秒7
  739.   if(sel==5)  {dispString(3, 4, 1, "分钟");address=0x82; max=59;mini=0;}    //分钟6
  740.   if(sel==4)  {dispString(3, 4, 1, "小时");address=0x84; max=23;mini=0;}    //小时5
  741.   if(sel==3)  {dispString(3, 4, 1, "星期");address=0x8a; max=7;mini=1;}    //星期4  
  742.   if(sel==2)  {dispString(3, 4, 1, "日期");address=0x86; max=31;mini=1;}    //日3
  743.   if(sel==1)  {dispString(3, 4, 1, "月份");address=0x88; max=12;mini=1;}    //月2
  744.   if(sel==0)  {dispString(3, 4, 1, "年份");address=0x8c; max=99; mini=0;}    //年1
  745.   switch(sel)
  746.         {
  747.             case 0: convertChar(0, 1, 2);
  748.                                 break;
  749.                 case 1: convertChar(0, 2, 3);
  750.                                 break;
  751.                 case 2:        convertChar(0, 4, 2);
  752.                                 break;
  753.                 case 3: convertChar(1, 7, 2);
  754.                                 break;
  755.                 case 4: convertChar(2, 0, 2);
  756.                                 break;
  757.                 case 5: convertChar(2, 1, 3);
  758.                                 break;
  759.                 case 6: convertChar(2, 3, 2);
  760.                                 break;
  761.         }
  762.   //读取1302某地址上的数值转换成10进制赋给item
  763.   item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  764.   if(KEY_2 == 0||workcode==3)
  765.   {
  766.           item++;//数加 1
  767.         workcode=0;  
  768.   }
  769.   if(KEY_4 == 0||workcode==7)
  770.   {
  771.           item--;//数减 1
  772.         workcode=0;
  773.   }
  774.   if(item>max) item=mini;//查看数值有效范围   
  775.   if(item<mini) item=max;           
  776.   write_clock(0x8e,0x00);//允许写操作
  777.   write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  778.   write_clock(0x8e,0x80);//写保护,禁止写操作
  779.   
  780. }

  781. /*****************************************************************************/

  782. /*****************************************************************************/
  783. //扬声器驱动程序(闹钟音乐)
  784. /*****************************************************************************/        
  785. void Beep(void)
  786. {//BELL-扬声器--整点报时
  787.         unsigned char a;//定义变量用于发声的长度设置
  788.         for(a=60;a>0;a--){//第一个声音的长度
  789.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  790.                 Delay(100);//音调设置延时
  791.         }
  792.         for(a=100;a>0;a--){//同上
  793.                 beep = ~beep;
  794.                 Delay(80);//
  795.         }
  796.         for(a=100;a>0;a--){//同上
  797.                 beep = ~beep;
  798.                 Delay(30);//
  799.         }
  800.         beep = 1;//音乐结束后扬声器拉高关闭
  801. }
  802. /*****************************************************************************/
  803. void Beep_set(void){//BELL -扬声器--确定设置
  804.         unsigned char a;//定义变量用于发声的长度设置
  805.         for(a=50;a>0;a--){//第一个声音的长度
  806.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  807.                 Delay(100);//音调设置延时
  808.         }
  809.         for(a=100;a>0;a--){//同上
  810.                 beep = ~beep;
  811.                 Delay(50);//
  812.         }
  813.         for(a=50;a>0;a--){//同上
  814.                 beep = ~beep;
  815.                 Delay(100);//
  816.         }
  817.         beep = 1;//音乐结束后扬声器拉高关闭
  818. }
  819. /*****************************************************************************/
  820. void Beep_key(void){//-扬声器--按键音
  821.         unsigned char a;//定义变量用于发声的长度设置
  822.         for(a=100;a>0;a--){//声音的长度
  823.                 beep = ~beep;
  824.                 Delay(50);//音调设置延时
  825.         }
  826.         beep = 1;//音乐结束后扬声器拉高关闭
  827. }               
  828. /*****************************************************************************/

  829. /*****************************************************************************/
  830. //电子钟应用层程序设计
  831. /*****************************************************************************/
  832. //向LCM中填写 年 数据
  833. void lcm_w_yy(void){
  834.         //if(read_clock(0x8d) != yy){
  835.                 yy = read_clock(0x8d);
  836.                 dispString(0, 0, 1, "20");
  837.                 lcdWriteCommand(0x81);
  838.                 lcdWriteData((yy/16)+0x30);        
  839.                 lcdWriteData(yy%16+0x30);
  840. }        //}
  841. /*****************************************************************************/
  842. //向LCM中填写 月 数据
  843. void lcm_w_mo(void){
  844.         //if(read_clock(0x89) != mo){
  845.                 mo = read_clock(0x89);
  846.                     lcdWriteCommand(0x82);
  847.                         lcdWriteData(0x2d);
  848.                         lcdWriteData((mo/16)+0x30);        //十位消隐               
  849.                     lcdWriteData(mo%16+0x30);
  850.                         lcdWriteData(0x2d);
  851.                         year=(mo/16*10)+mo%16;
  852. }        //}
  853. /*****************************************************************************/
  854. //星期处理并送入LCM的指定区域
  855. void lcm_w_xq(void){
  856.         //if(read_clock(0x8b) != xq){
  857.         xq = read_clock(0x8b);
  858.         selx = (read_clock(0x8b))%16; //字节低4位的BCD码放入selx
  859.                 if(selx==7)  {dispString(1, 7, 1, "日");}    //
  860.                   if(selx==6)  {dispString(1, 7, 1, "六");}    //
  861.                   if(selx==5)  {dispString(1, 7, 1, "五");}    //
  862.                   if(selx==4)  {dispString(1, 7, 1, "四");}    //
  863.                   if(selx==3)  {dispString(1, 7, 1, "三");}    //
  864.                   if(selx==2)  {dispString(1, 7, 1, "二");}    //
  865.                   if(selx==1)  {dispString(1, 7, 1, "一");}    //星期一
  866.         dispString(1, 5, 1, "星期");
  867. }        //}
  868. /*****************************************************************************/
  869. //向LCM中填写 日 数据
  870. void lcm_w_dd(void){
  871. //        if(read_clock(0x87) != dd){
  872.                 dd = read_clock(0x87);
  873.                 lcdWriteCommand(0x84);
  874.                 lcdWriteData((dd/16)+0x30);        //十位消隐        
  875.                 lcdWriteData(dd%16+0x30);
  876. }        //}
  877. /*****************************************************************************/
  878. //向LCM中填写 小时 数据
  879. void lcm_w_hh(void){
  880.         if(read_clock(0x85) != hh){
  881.                 hh = read_clock(0x85);
  882.                         if (hh > 0x07 && hh < 0x22 && w == 0){
  883.                                 Beep();//整点报时音
  884.                         }
  885.                 }
  886.                 lcdWriteCommand(0x88);
  887.                 lcdWriteData((hh/16)+0x30);
  888.                 lcdWriteData(hh%16+0x30);
  889.                 hh1=hh/16*10+hh%16;
  890.                 if(hh1>12) hh1=(hh1-12);
  891.                                 
  892. }
  893. /*****************************************************************************/
  894. //向LCM中填写 分钟 数据
  895. void lcm_w_mm(void){
  896.         if(read_clock(0x83) != mm)
  897.             {               
  898.                 mm = read_clock(0x83);
  899.             }
  900.                 lcdWriteCommand(0x89);
  901.                 if(t/1%2==0)lcdWriteData(0x3a);          //":"
  902.                 else{lcdWriteData(0x20);}
  903.                 lcdWriteData((mm/16)+0x30);
  904.                 lcdWriteData(mm%16+0x30);
  905.                 if(t/1%2==0) lcdWriteData(0x3a);          //":"
  906.                 else{lcdWriteData(0x20);}        
  907. }
  908. /*****************************************************************************/
  909. //向LCM中填写 秒 数据
  910. void lcm_w_ss(void)
  911. {
  912.         unsigned int i=0;
  913.         unsigned char a=0,b=0,c=0;
  914.         if(read_clock(0x81) != ss){        //判断是否需要更新
  915.                 ss = read_clock(0x81);        //更新数据
  916.                 if(w==1&&e==6)
  917.                 {
  918.                  if(t/1%2==0)
  919.                  {
  920.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  921.                 lcdWriteData((ss/16)+0x30);        //写十位               
  922.                 lcdWriteData(ss%16+0x30);        //写个位
  923.                  }
  924.                  else
  925.                  {
  926.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  927.                 lcdWriteData(0x20);        //写十位               
  928.                 lcdWriteData(0x20);        //写个位
  929.                  }
  930.                 }
  931.                 else
  932.                 {
  933.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  934.                 lcdWriteData((ss/16)+0x30);        //写十位               
  935.                 lcdWriteData(ss%16+0x30);        //写个
  936.                 }
  937.     }
  938. }
  939. /*****************************************************************************/
  940. void disp_temper()//温度值显示
  941. {
  942.     uint temper;
  943.         uchar temper_ge,temper_shi,temper_bai;
  944.         temper=read_temp();//读取温度
  945.         temper_ge=temper%10+0x30;
  946.         temper_shi=temper%100/10+0x30;
  947.         temper_bai=temper/100+0x30;
  948.         if(tflag==1)
  949.         {
  950.                 dispString(2, 4, 1, " -");
  951.         }
  952.         else
  953.         {
  954.          dispString(2, 4, 1, "  ");
  955.         }
  956.         if(temper_bai==0x30) temper_bai=0x20;
  957.         lcdWriteCommand(0x8d);
  958. lcdWriteData(temper_bai);
  959.         lcdWriteData(temper_shi);
  960. lcdWriteData('.');
  961. lcdWriteData(temper_ge);

  962.         dispString(2, 7, 1, "℃");        
  963.    }
  964.    /*****************************************************************************/
  965. //刷新数据
  966. void updata (void){
  967.         lcm_w_ss();//刷新 秒
  968.                 lcm_w_mm();//刷新 分
  969.                 lcm_w_hh();//刷新 小时
  970.                 lcm_w_dd();//刷新 日
  971.                 lcm_w_xq();//更新星期值        
  972.                 lcm_w_mo();//刷新 月
  973.                 lcm_w_yy();//刷新 年
  974.                 ss = read_clock(0x81);        //更新数据
  975.                 t=ss/16*10+ss%16;
  976.                 lcmnongli();
  977.             lcmshengxiao();
  978.             disp_temper();
  979.                 if(w == 0)
  980.                 {                                
  981.                         days ();//节日显示
  982.                 }
  983.                 if (n==1||n==2||n==3)
  984.                     {
  985.                         lcdWriteCommand(0x85);                //秒值在LCM上的写入位置
  986.                         lcdWriteData(0x20);
  987.                     lcdWriteData(0x0e);        
  988.                         }
  989.                 else{
  990.                      lcdWriteCommand(0x85);                //秒值在LCM上的写入位置
  991.                          lcdWriteData(0x20);
  992.                      lcdWriteData(0x20);        
  993.                      }                                
  994. }
  995. /*********************************************************************************************************
  996. 处理显示函数(被调用层)                                       
  997. *********************************************************************************************************/
  998. void deal(uchar sfm)
  999. {
  1000.         shi=sfm/16;
  1001.         ge=sfm%16;
  1002. }
  1003. /********************************************************************************************************
  1004. 12864显示时分秒函数(被调用层)
  1005. ********************************************************************************************************/
  1006. void display(uchar add,uchar dat)
  1007. {
  1008.         uchar i,j=0;
  1009.         if(k==0)
  1010.         {
  1011.         for(i=16;i<32;i++)
  1012.         {                        
  1013.                 lcdWriteCommand(0x80+i);                                                        
  1014.                 lcdWriteCommand(0x90+add);                                                
  1015.                 lcdWriteData(tab[dat][j++]);
  1016.                 lcdWriteData(tab[dat][j++]);
  1017.         }
  1018.         for(i=0;i<16;i++)
  1019.         {
  1020.                 lcdWriteCommand(0x80+i);
  1021.                 lcdWriteCommand(0x88+add);
  1022.                 lcdWriteData(tab[dat][j++]);
  1023.                 lcdWriteData(tab[dat][j++]);
  1024.         }
  1025.         }
  1026.         else
  1027.         {
  1028.         for(i=0;i<16;i++)
  1029.         {
  1030.                 lcdWriteCommand(0x80+i);
  1031.                 lcdWriteCommand(0x80+add);
  1032.                 lcdWriteData(tab1[dat][j++]);
  1033.                 lcdWriteData(tab1[dat][j++]);
  1034.         }
  1035.         for(i=16;i<32;i++)
  1036.         {                        
  1037.                 lcdWriteCommand(0x80+i);                                                        
  1038.                 lcdWriteCommand(0x90+add);                                                
  1039.                 lcdWriteData(tab1[dat][j++]);
  1040.                 lcdWriteData(tab1[dat][j++]);
  1041.         }
  1042.         }
  1043. }
  1044. /********************************************************************************************************
  1045. 12864显示时分秒函数(被调用层)2
  1046. ********************************************************************************************************/
  1047. void display1(uchar add,uchar dat)
  1048. {
  1049.         uchar i,j=0;
  1050.         for(i=0;i<16;i++)
  1051.         {
  1052.                 lcdWriteCommand(0x80+i);
  1053.                 lcdWriteCommand(0x88+add);
  1054.                 lcdWriteData(tab1[dat][j++]);
  1055.                 lcdWriteData(tab1[dat][j++]);
  1056.         }
  1057.         for(i=16;i<32;i++)
  1058.         {                        
  1059.                 lcdWriteCommand(0x80+i);                                                        
  1060.                 lcdWriteCommand(0x98+add);                                                
  1061.                 lcdWriteData(tab1[dat][j++]);
  1062.                 lcdWriteData(tab1[dat][j++]);
  1063.         }
  1064. }
  1065. /*********************************************************************************************************
  1066. 初始化函数(被调用层)                                       
  1067. *********************************************************************************************************/
  1068. void init_dz()
  1069. {
  1070.         lcdWriteCommand(0x30);                                                        //选择8bit数据流,基本指令集
  1071.         lcdWriteCommand(0x0c);                                                      //开显示(无游标、不反白)
  1072.         lcdWriteCommand(0x01);                                                       //清除显示,并且设定地址指针为00H
  1073.         if(k==0)
  1074.         {
  1075.         dispString(0, 2, 1, "年  月  日");        
  1076.         dispString(3, 0, 1, "星期");        
  1077.         lcdWriteCommand(0x81);                                                         //处理年,并显示
  1078.         yy = read_clock(0x8d);                                
  1079.         deal(yy);
  1080.         lcdWriteData(shi+0x30);
  1081.         lcdWriteData(ge+0x30);
  1082.                                                                                                  //处理月,并显示
  1083.         lcdWriteCommand(0x83);
  1084.         mo = read_clock(0x89);
  1085.         deal(mo);
  1086.         lcdWriteData(shi+0x30);
  1087.         lcdWriteData(ge+0x30);

  1088.         lcdWriteCommand(0x85);                                                         //处理日,并显示
  1089.         dd = read_clock(0x87);
  1090.         deal(dd);
  1091.         lcdWriteData(shi+0x30);
  1092.         lcdWriteData(ge+0x30);
  1093.                                                                                                                                   //处理星期,并显示
  1094.         xq = read_clock(0x8b);
  1095.         switch(xq)
  1096.         {
  1097.                 case 1:        dispString(3, 2, 1, "一");break;
  1098.                 case 2:        dispString(3, 2, 1, "二");break;
  1099.                 case 3:        dispString(3, 2, 1, "三");break;
  1100.                 case 4:        dispString(3, 2, 1, "四");break;
  1101.                 case 5:        dispString(3, 2, 1, "五");break;
  1102.                 case 6:        dispString(3, 2, 1, "六");break;
  1103.                 case 7:        dispString(3, 2, 1, "日");break;
  1104.                 default:break;
  1105.         }
  1106.         dispString(3, 7, 1, "℃");
  1107.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1108.     clear_img();                                                                //清理图片缓冲区
  1109.         lcmnongli();
  1110.         hh = read_clock(0x85);                                                         //处理小时,并显示
  1111.         deal(hh);
  1112.         display(0,shi);
  1113.         display(1,ge);
  1114.         display(2,10);
  1115.         mm = read_clock(0x83);                                                         //处理分钟,并显示
  1116.         deal(mm);
  1117.         display(3,shi);
  1118.         display(4,ge);
  1119.         display(5,10);
  1120.         ss = read_clock(0x81);                                                         //处理秒,并显示
  1121.         deal(ss);
  1122.         display(6,shi);
  1123.         display(7,ge);
  1124.         }
  1125.         else
  1126.         {

  1127.         dispString(0, 5, 1, "星期");
  1128.         dispString(3, 0, 1, " 20");        
  1129.         lcdWriteCommand(0x99);                                                         //处理年,并显示
  1130.         yy = read_clock(0x8d);                                
  1131.         deal(yy);
  1132.         lcdWriteData(0x20);
  1133.         lcdWriteData(shi+0x30);
  1134.         lcdWriteData(ge+0x30);
  1135.         lcdWriteData(0x2d);
  1136.                                                                                                  //处理月,并显示
  1137.         //lcdWriteCommand(0x9a);
  1138.         mo = read_clock(0x89);
  1139.         deal(mo);
  1140.         lcdWriteData(shi+0x30);
  1141.         lcdWriteData(ge+0x30);

  1142.         //lcdWriteCommand(0x9c);                                                         //处理日,并显示
  1143.         dd = read_clock(0x87);
  1144.         deal(dd);
  1145.         lcdWriteData(0x2d);
  1146.         lcdWriteData(shi+0x30);
  1147.         lcdWriteData(ge+0x30);
  1148.                                                                                                                                   //处理星期,并显示
  1149.         xq = read_clock(0x8b);
  1150.         switch(xq)
  1151.         {
  1152.                 case 1:        dispString(0, 7, 1, "一");break;
  1153.                 case 2:        dispString(0, 7, 1, "二");break;
  1154.                 case 3:        dispString(0, 7, 1, "三");break;
  1155.                 case 4:        dispString(0, 7, 1, "四");break;
  1156.                 case 5:        dispString(0, 7, 1, "五");break;
  1157.                 case 6:        dispString(0, 7, 1, "六");break;
  1158.                 case 7:        dispString(0, 7, 1, "日");break;
  1159.                 default:break;
  1160.         }
  1161.         dispString(1, 7, 1, "℃");



  1162.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1163.         clear_img();                                                                //清理图片缓冲区
  1164.         hh = read_clock(0x85);                                                         //处理小时,并显示
  1165.         deal(hh);
  1166.         display(0,shi);
  1167.         display(1,ge);
  1168.         display(2,10);
  1169.         mm = read_clock(0x83);                                                         //处理分钟,并显示
  1170.         deal(mm);
  1171.         display(3,shi);
  1172.         display(4,ge);
  1173.         ss = read_clock(0x81);                                                         //处理秒,并显示
  1174.         deal(ss);
  1175.         display1(6,shi);
  1176.         display1(7,ge);
  1177.         }
  1178. }
  1179. /********************************************************************************************************
  1180. 在12864上显示时间,大数字显示主界面1
  1181. ********************************************************************************************************/
  1182. void disp_sfm()
  1183. {
  1184.         uint temper;
  1185.         uchar temper_ge,temper_shi,temper_bai,day_temp,date_temp,month_temp,year_temp;
  1186.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1187.     ss = read_clock(0x81);        //更新数据                                                
  1188.         if(sec_temp!=ss)//读取秒,只要有改变液晶显示也改变
  1189.         {
  1190.                 sec_temp=ss;
  1191.                 deal(sec_temp);
  1192.                 if(secl!=shi)
  1193.                 {
  1194.                         secl=shi;
  1195.                         display(6,secl);
  1196.                 }
  1197.                 display(7,ge);        
  1198.         }
  1199.         mm = read_clock(0x83);                                                         //读取分,只要有改变液晶显示也改变
  1200.         if(min_temp!=mm)
  1201.         {
  1202.                 min_temp=mm;
  1203.                 deal(mm);
  1204.                 display(3,shi);
  1205.                 display(4,ge);
  1206.         }
  1207.         hh = read_clock(0x85);                                                        //读取小时,只要有改变液晶显示也改变
  1208.         if(hour_temp!=hh)
  1209.         {
  1210.                 hour_temp=hh;
  1211.                 deal(hh);
  1212.                 display(0,shi);
  1213.                 display(1,ge);
  1214.         }

  1215.         if(ge/1%2==0)
  1216.         {
  1217.         display(2,10);
  1218.         display(5,10);
  1219.         }
  1220.         else
  1221.         {
  1222.         display(2,11);
  1223.         display(5,11);
  1224.         }
  1225.          
  1226.         lcdWriteCommand(0x30);
  1227.         dd = read_clock(0x87);                                                //读取日,只要有改变液晶显示也改变
  1228.         if(date_temp!=dd)
  1229.         {        
  1230.                 date_temp=dd;
  1231.                 deal(dd);
  1232.                 lcdWriteCommand(0x85);
  1233.                 lcdWriteData(shi+0x30);
  1234.                 lcdWriteData(ge+0x30);
  1235.         }
  1236.         mo = read_clock(0x89);                                                //读取月,只要有改变液晶显示也改变
  1237.         if(month_temp!=mo)
  1238.         {
  1239.                 month_temp=mo;
  1240.                 lcdWriteCommand(0x83);
  1241.                 deal(mo);
  1242.                 lcdWriteData(shi+0x30);
  1243.                 lcdWriteData(ge+0x30);
  1244.         }
  1245.         yy = read_clock(0x8d);                                                        //读取年,只要有改变液晶显示也改变
  1246.         if(year_temp!=yy)
  1247.         {
  1248.                 year_temp=yy;
  1249.                 lcdWriteCommand(0x81);
  1250.                 deal(yy);
  1251.                 lcdWriteData(shi+0x30);
  1252.                 lcdWriteData(ge+0x30);
  1253.         }
  1254.                 xq = read_clock(0x8b);                                                         //读取星期,只要有改变液晶显示也改变
  1255.         if(day_temp!=xq)
  1256.         {        
  1257.                 day_temp=xq;
  1258.                 switch(xq)
  1259.         {
  1260.                 case 1:        dispString(3, 2, 1, "一");break;
  1261.                 case 2:        dispString(3, 2, 1, "二");break;
  1262.                 case 3:        dispString(3, 2, 1, "三");break;
  1263.                 case 4:        dispString(3, 2, 1, "四");break;
  1264.                 case 5:        dispString(3, 2, 1, "五");break;
  1265.                 case 6:        dispString(3, 2, 1, "六");break;
  1266.                 case 7:        dispString(3, 2, 1, "日");break;
  1267.                 default:break;
  1268.                 }
  1269.         }
  1270.         temper=read_temp();//读取温度
  1271.         temper_ge=temper%10+0x30;
  1272.         temper_shi=temper%100/10+0x30;
  1273.         temper_bai=temper/100+0x30;

  1274.         //lcdWriteCommand(0x9b); //此处可以用来测试各种红外遥控的键值
  1275.         //lcdWriteData(workcode/10+0x30);
  1276.         //lcdWriteData(workcode%10+0x30);

  1277.         if(tflag==1)
  1278.         {

  1279.                         dispString(3, 4, 1, " -");
  1280.         }
  1281.         else
  1282.         {
  1283.          dispString(3, 4, 1, "  ");
  1284.         }
  1285.         if(temper_bai==0x30) temper_bai=0x20;
  1286.         lcdWriteCommand(0x9d);
  1287.         lcdWriteData(temper_bai);
  1288.         lcdWriteData(temper_shi);
  1289.         lcdWriteData('.');
  1290.         lcdWriteData(temper_ge);

  1291.         lcdWriteCommand(0x36);        

  1292. }
  1293. /********************************************************************************************************
  1294. 在12864上显示时间,大数字显示主界面2
  1295. ********************************************************************************************************/
  1296. void disp_sfm1()
  1297. {
  1298.         uint temper;
  1299.         uchar temper_ge,temper_shi,temper_bai,day_temp,date_temp,month_temp,year_temp;
  1300.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1301.     ss = read_clock(0x81);        //更新数据                                                
  1302.         if(sec_temp!=ss)//读取秒,只要有改变液晶显示也改变
  1303.         {
  1304.                 sec_temp=ss;
  1305.                 deal(sec_temp);
  1306.                 if(secl!=shi)
  1307.                 {
  1308.                         secl=shi;
  1309.                         display1(6,secl);
  1310.                 }
  1311.                 display1(7,ge);        
  1312.         }
  1313.         mm = read_clock(0x83);                                                         //读取分,只要有改变液晶显示也改变
  1314.         if(min_temp!=mm)
  1315.         {
  1316.                 min_temp=mm;
  1317.                 deal(mm);
  1318.                 display(3,shi);
  1319.                 display(4,ge);
  1320.         }
  1321.         hh = read_clock(0x85);                                                        //读取小时,只要有改变液晶显示也改变
  1322.         if(hour_temp!=hh)
  1323.         {
  1324.                 hour_temp=hh;
  1325.                 deal(hh);
  1326.                 display(0,shi);
  1327.                 display(1,ge);
  1328.         }

  1329.         if(ge/1%2==0)
  1330.         {
  1331.         display(2,10);
  1332.         }
  1333.         else
  1334.         {
  1335.         display(2,11);
  1336.         }
  1337.                 lcdWriteCommand(0x30);
  1338.         lcmnongli();
  1339.         yy = read_clock(0x8d);                                                        //读取年,只要有改变液晶显示也改变
  1340.         if(year_temp!=yy)
  1341.         {
  1342.                 year_temp=yy;
  1343.                 lcdWriteCommand(0x99);
  1344.                 deal(yy);
  1345.                 lcdWriteData(0x30);
  1346.                 lcdWriteData(shi+0x30);
  1347.                 lcdWriteData(ge+0x30);
  1348.                 lcdWriteData(0x2d);
  1349.         }
  1350.         mo = read_clock(0x89);                                                //读取月,只要有改变液晶显示也改变
  1351.         if(month_temp!=mo)
  1352.         {
  1353.                 month_temp=mo;
  1354.                 lcdWriteCommand(0x9b);
  1355.                 deal(mo);
  1356.                 lcdWriteData(shi+0x30);
  1357.                 lcdWriteData(ge+0x30);
  1358.         }
  1359.         dd = read_clock(0x87);                                                //读取日,只要有改变液晶显示也改变
  1360.         if(date_temp!=dd)
  1361.         {        
  1362.                 date_temp=dd;
  1363.                 deal(dd);
  1364.                 lcdWriteCommand(0x9c);
  1365.                 lcdWriteData(0x2d);
  1366.                 lcdWriteData(shi+0x30);
  1367.                 lcdWriteData(ge+0x30);
  1368.         }
  1369.                 xq = read_clock(0x8b);                                                         //读取星期,只要有改变液晶显示也改变
  1370.         if(day_temp!=xq)
  1371.         {        
  1372.                 day_temp=xq;
  1373.                 switch(xq)
  1374.         {
  1375.                 case 1:        dispString(0, 7, 1, "一");break;
  1376.                 case 2:        dispString(0, 7, 1, "二");break;
  1377.                 case 3:        dispString(0, 7, 1, "三");break;
  1378.                 case 4:        dispString(0, 7, 1, "四");break;
  1379.                 case 5:        dispString(0, 7, 1, "五");break;
  1380.                 case 6:        dispString(0, 7, 1, "六");break;
  1381.                 case 7:        dispString(0, 7, 1, "日");break;
  1382.                 default:break;
  1383.                 }
  1384.         }
  1385.         temper=read_temp();//读取温度
  1386.         temper_ge=temper%10+0x30;
  1387.         temper_shi=temper%100/10+0x30;
  1388.         temper_bai=temper/100+0x30;

  1389.         //lcdWriteCommand(0x9b); //此处可以用来测试各种红外遥控的键值
  1390.         //lcdWriteData(workcode/10+0x30);
  1391.         //lcdWriteData(workcode%10+0x30);

  1392.         /*if(tflag==1)
  1393.         {

  1394.                         dispString(1, 5, 1, " -");
  1395.         }
  1396.         else
  1397.         {
  1398.          dispString(1, 5, 1, "  ");
  1399.         }*/
  1400.         if(temper_bai==0x30) temper_bai=0x20;
  1401.         lcdWriteCommand(0x95);
  1402.         lcdWriteData(temper_bai);
  1403.         lcdWriteData(temper_shi);
  1404.         lcdWriteData('.');
  1405.         lcdWriteData(temper_ge);

  1406.         lcdWriteCommand(0x36);        

  1407. }
  1408. //*****************************Music******************************************************/
  1409. //天空之城
  1410. unsigned char code Music_wo[]={  0x10,0x03, 0x11,0x03, 0x15,0x66, 0x11,0x03, 0x15,0x02,
  1411.                                   0x17,0x02, 0x11,0x01, 0x0D,0x02, 0x0D,0x02, 0x10,0x66,
  1412.                                   0x0F,0x03, 0x10,0x02, 0x15,0x02, 0x0F,0x15, 0x0D,0x03,
  1413.                                   0x0D,0x03, 0x0E,0x66, 0x0D,0x03, 0x0E,0x03, 0x15,0x66,
  1414.                                   0x0D,0x01, 0x15,0x02, 0x15,0x02, 0x15,0x02, 0x11,0x66,
  1415.                                   0x0E,0x03, 0x0E,0x02, 0x11,0x02, 0x11,0x15, 0x10,0x03,
  1416.                                   0x11,0x03, 0x15,0x66, 0x11,0x03, 0x15,0x02, 0x17,0x02,
  1417.                                   0x11,0x15, 0x0D,0x03, 0x0D,0x03, 0x10,0x66, 0x0F,0x03,
  1418.                                   0x10,0x02, 0x15,0x02, 0x0F,0x01, 0x0D,0x03, 0x0E,0x02,
  1419.                                   0x15,0x03, 0x11,0x03, 0x11,0x02, 0x15,0x02, 0x16,0x03,
  1420.                                   0x16,0x03, 0x17,0x03, 0x15,0x16, 0x15,0x02, 0x11,0x03,
  1421.                                   0x10,0x03, 0x10,0x03, 0x11,0x02, 0x0F,0x02, 0x10,0x15,
  1422.                                   0x15,0x03, 0x16,0x03, 0x17,0x66, 0x16,0x03, 0x17,0x02,
  1423.                                   0x19,0x02, 0x16,0x15, 0x0F,0x03, 0x0F,0x03, 0x15,0x03,
  1424.                                   0x11,0x03, 0x15,0x02, 0x17,0x02, 0x17,0x15, 0x10,0x03,
  1425.                                   0x11,0x03, 0x15,0x02, 0x11,0x02, 0x16,0x03, 0x16,0x03,
  1426.                                   0x15,0x66, 0x0F,0x03, 0x0F,0x16, 0x18,0x02, 0x17,0x02,
  1427.                                   0x16,0x02, 0x15,0x02, 0x17,0x00, 0x17,0x02, 0x1A,0x01,
  1428.                                   0x19,0x02, 0x19,0x02, 0x17,0x03, 0x16,0x03, 0x15,0x02,
  1429.                                   0x15,0x02, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x16,0x03,
  1430.                                   0x19,0x02, 0x17,0x15, 0x17,0x02, 0x1A,0x01, 0x19,0x01,
  1431.                                   0x17,0x03, 0x16,0x03, 0x15,0x01, 0x15,0x03, 0x16,0x02,
  1432.                                   0x15,0x03, 0x16,0x03, 0x16,0x03, 0x11,0x02, 0x10,0x01,
  1433.                                   0x00,0x00 };
  1434. /***********************************************************************************/
  1435. /*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
  1436. void lcdfill(unsigned char disdata)
  1437. { unsigned char x,y;
  1438.         for(y=0;y<32;y++)
  1439.          for(x=0;x<16;x++)
  1440.          { lcdWriteCommand(0x36);
  1441.             lcdWriteCommand(y+0x80);        //行地址
  1442.             lcdWriteCommand(x+0x80);     //列地址
  1443.             lcdWriteCommand(0x30);
  1444.             lcdWriteData(disdata);
  1445.             lcdWriteData(disdata);
  1446.                         DelayM(2);
  1447.             }
  1448.    lcdWriteCommand(0x34);                           
  1449.    lcdWriteCommand(0x36);
  1450.    }
  1451. /*------------------显示横-----------------------------*/
  1452. void Disp_H_Line()
  1453. { unsigned char x,y;
  1454.    unsigned char k=0x00;
  1455.        for(y=0;y<32;y++)
  1456.          { k=~k;
  1457.            for(x=0;x<16;x++)
  1458.          { lcdWriteCommand(0x36);
  1459.             lcdWriteCommand(y+0x80);      //行地址
  1460.             lcdWriteCommand(x+0x80);     //列地址
  1461.             lcdWriteCommand(0x30);
  1462.             lcdWriteData(k);
  1463.             lcdWriteData(k);
  1464.                         DelayM(5);
  1465.            };
  1466.          }
  1467.      lcdWriteCommand(0x34);                          
  1468.    lcdWriteCommand(0x36);
  1469. }
  1470. /*------------------显示边框-------------------------------*/
  1471. void Frame()
  1472. {unsigned char x,y;
  1473.           lcdfill(0x00);
  1474.         for(x=0;x<9;x+=8)
  1475.           for(y=0;y<32;y++)
  1476.            { lcdWriteCommand(0x36);
  1477.             lcdWriteCommand(y+0x80);      //行地址
  1478.             lcdWriteCommand(x+0x80);        //列地址
  1479.             lcdWriteCommand(0x30);
  1480.             lcdWriteData(0x80);
  1481.             lcdWriteData(0x00);
  1482.            
  1483.             lcdWriteCommand(0x36);
  1484.             lcdWriteCommand(y+0x80);      //行地址
  1485.             lcdWriteCommand(x+0x87);        //列地址
  1486.             lcdWriteCommand(0x30);
  1487.             lcdWriteData(0x00);
  1488.             lcdWriteData(0x01);
  1489.             DelayM(5);
  1490.             }
  1491.       for(y=0;y<2;y++)
  1492.          for(x=0;x<8;x++)
  1493.            {lcdWriteCommand(0x36);
  1494.             lcdWriteCommand(y*31+0x80);      //行地址
  1495.             lcdWriteCommand(x+0x80+8*y);        //列地址
  1496.             lcdWriteCommand(0x30);
  1497.             lcdWriteData(0xff);
  1498.             lcdWriteData(0xff);
  1499.                         DelayM(5);
  1500.            }
  1501.          lcdWriteCommand(0x34);
  1502.          lcdWriteCommand(0x36);
  1503.                     }
  1504. /*****************************************************************************/
  1505. void zijian(void)
  1506. {
  1507. lcdClear();
  1508. dispString(1, 0, 1, "    V8.0版本    ");
  1509. dispString(2, 0, 1, "  自检程序开始! ");
  1510. DelayM(2000);
  1511. lcdClear();
  1512. displayPhoto(powerOnPhoto1, OFF);
  1513.                                                    DelayM(2000);
  1514. lcdfill(0xff);               //显示全开
  1515.       DelayM(2000);            
  1516.    
  1517.      Disp_H_Line();                //显示横条
  1518.        DelayM(2000);
  1519.       
  1520.       
  1521.        lcdfill(0xaa);               //显示竖条
  1522.       DelayM(2000);
  1523.      
  1524.       Frame();                     //显示边框
  1525.       DelayM(2000);
  1526.           clear_img();
  1527.           lcdClear();
  1528.           lcdWriteCommand(0x30);       //选择8bit数据流
  1529.       lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1530.       lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1531.           Beep_set();//确定按键音
  1532.           dispString(0, 0, 1, "    自检完成!  ");
  1533.           dispString(2, 0, 1, "  ==小东电子==  ");
  1534.           dispString(3, 0, 1, "  QQ:120985850  ");
  1535.           DelayM(2000);
  1536.           lcdInit ();
  1537. }
  1538. /*****************************************************************************/
  1539. void naozhong()
  1540. {
  1541.                 lcdClear();
  1542.                   dispString(0, 2, 1, "闹钟设置");
  1543.                   dispString(2, 0, 1, "闹钟");
  1544.                 n=Read24c02(0);
  1545.                   if(n==0)  {dispString(2, 7, 1, "关");}    //
  1546.                   if(n==1)  {dispString(2, 7, 1, "开");}    //
  1547.                 if(n==2)  {dispString(2, 7, 1, "开");}    //
  1548.                 if(n==3)  {dispString(2, 7, 1, "开");}    //
  1549.                 n1=Read24c02(1);
  1550.             n2=Read24c02(2);
  1551.                 lcdWriteCommand(0x8b);
  1552.         lcdWriteData((n1/10)+0x30);
  1553.             lcdWriteData(n1%10+0x30);
  1554.             dispString(2, 4, 1, "点");
  1555.             lcdWriteData((n2/10)+0x30);
  1556.         lcdWriteData(n2%10+0x30);
  1557.                    while(1)
  1558.                    {
  1559.                    if (KEY_3 == 0||workcode==5) // 设置时间
  1560.               {
  1561.                 DelayM(20);           //去抖
  1562.                 if(KEY_3 == 0 ||workcode==5)
  1563.                   {
  1564.                    Beep_key();//按键音
  1565.                    workcode=0;
  1566.                    n++;
  1567.                    if (n >= 4 ){n = 0;}
  1568.                    Write24c02(n,0);
  1569.                if(n==0)  {dispString(2, 7, 1, "关");}    //
  1570.                  if(n==1)  {dispString(2, 7, 1, "开");}    //
  1571.                    if(n==2)  {dispString(2, 7, 1, "开");}    //
  1572.                    if(n==3)  {dispString(2, 7, 1, "开");}    //
  1573.                    switch(n)
  1574.         {
  1575.               case 0:        convertChar(1, 0, 0);
  1576.                                 break;
  1577.                 case 1: convertChar(1, 0, 0);
  1578.                                 break;
  1579.                 case 2:        convertChar(2, 3, 2);
  1580.                                 break;
  1581.                 case 3: convertChar(2, 5, 2);
  1582.                                 break;
  1583.         }
  1584.                   while(KEY_3 == 0);//等待键松开
  1585.                   }
  1586.                 }
  1587.         if(KEY_4 == 0||KEY_2 == 0||workcode==3||workcode==7)
  1588.         {
  1589.         if ((KEY_2 == 0&&n==2)||(workcode==3&&n==2)) //
  1590.               {
  1591.                  DelayM(20);           //去抖
  1592.                  if((KEY_2 == 0&&n==2)||(workcode==3&&n==2))
  1593.                         {
  1594.                         Beep_key();//按键音
  1595.                         workcode=0;
  1596.                         n1++;
  1597.                         if (n1 >= 24 ){n1 = 0;}
  1598.                         Write24c02(n1,1);
  1599.                         while(KEY_2 == 0);//等待键松开
  1600.                         }
  1601.                 }
  1602.         if ((KEY_2 == 0&&n==3)||(workcode==3&&n==3)) //
  1603.               {
  1604.                  DelayM(20);           //去抖
  1605.                  if((KEY_2 == 0&&n==3)||(workcode==3&&n==3))
  1606.                         {
  1607.                         Beep_key();//按键音
  1608.                         workcode=0;
  1609.                         n2++;
  1610.                         if (n2>= 60 ){n2 = 0;}
  1611.                         Write24c02(n2,2);
  1612.                         while(KEY_2 == 0);//等待键松开
  1613.                         }
  1614.                 }
  1615.                 if ((KEY_4 == 0&&n==2)||(workcode==7&&n==2)) //
  1616.               {
  1617.                  DelayM(20);           //去抖
  1618.                  if((KEY_4 == 0&&n==2)||(workcode==7&&n==2))
  1619.                         {
  1620.                         Beep_key();//按键音
  1621.                         workcode=0;
  1622.                         n1--;
  1623.                         if (n1<0 ){n1 = 23;}
  1624.                         Write24c02(n1,1);
  1625.                         while(KEY_4 == 0);//等待键松开
  1626.                         }
  1627.                 }
  1628.         if ((KEY_4 == 0&&n==3)||(workcode==7&&n==3)) //
  1629.               {
  1630.                  DelayM(20);           //去抖
  1631.                  if((KEY_4 == 0&&n==3)||(workcode==7&&n==3))
  1632.                         {
  1633.                         Beep_key();//按键音
  1634.                         workcode=0;
  1635.                         n2--;
  1636.                         if (n2<0 ){n2 = 59;}
  1637.                         Write24c02(n2,2);
  1638.                         while(KEY_4 == 0);//等待键松开
  1639.                         }
  1640.                 }
  1641.                 n1=Read24c02(1);
  1642.             n2=Read24c02(2);
  1643.                 lcdWriteCommand(0x8b);
  1644.         lcdWriteData((n1/10)+0x30);
  1645.             lcdWriteData(n1%10+0x30);
  1646.             dispString(2, 4, 1, "点");
  1647.             lcdWriteData((n2/10)+0x30);
  1648.         lcdWriteData(n2%10+0x30);
  1649.         }
  1650.            if(KEY_1 == 0 ||workcode==9)
  1651.                                             {
  1652.                                                   Beep_key();//按键音
  1653.                                                   workcode=0;
  1654.                                                   k=0;
  1655.                                                   while(KEY_1 == 0);//等待键松开
  1656.                                           lcdInit ();
  1657.                               break;
  1658.                                     }
  1659.    }

  1660. }
  1661. /*****************************************************************************/
  1662. void naozhongdao()
  1663. {
  1664.         hh1=hh/16*10+hh%16;
  1665.         mm1=mm/16*10+mm%16;
  1666.         n1=Read24c02(1);
  1667.     n2=Read24c02(2);
  1668.         if(n1==hh1 && n2==mm1 && ss==0)
  1669.                    {
  1670.                     lcdWriteCommand(0x30);       //选择8bit数据流
  1671.             lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1672.             lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1673.                    dispString(0, 1, 1, "闹钟时间到了! ");
  1674.                    lcdWriteCommand(0x89);
  1675.            lcdWriteData((n1/10)+0x30);
  1676.                lcdWriteData(n1%10+0x30);
  1677.                    dispString(2, 2, 1, "点");
  1678.                lcdWriteData((n2/10)+0x30);
  1679.            lcdWriteData(n2%10+0x30);
  1680.                    dispString(2, 4, 1, "分");
  1681.                    lcdWriteData(0x0e);
  1682.                    Play(Music_wo,0,3,360);
  1683.                    lcdInit ();
  1684.                  }
  1685. }
  1686. /*****************************************************************************/
  1687. void procKey (void)
  1688. {
  1689. uchar key1Times=1 ;
  1690. lcdClear();
  1691. dispString(0, 0, 1, "    功能菜单    ");
  1692. dispString(1, 0, 1, "1:界面    2:设置");
  1693. dispString(2, 0, 1, "3:闹钟    4:音乐");
  1694. dispString(3, 0, 1, "5:自检    6:退出");
  1695. convertChar(1, 0, 6);
  1696. while(KEY_3 == 0);//等待键松开
  1697. while(1)
  1698. {
  1699. if(KEY_4 == 0||KEY_2 == 0||workcode==4||workcode==6)
  1700.                         {
  1701. if (KEY_4 == 0||workcode==4) //
  1702.               {
  1703.                  DelayM(20);           //去抖
  1704.                  if(KEY_4 == 0 ||workcode==4&& w == 0)
  1705.                         {
  1706.                         Beep_key();//按键音
  1707.                         workcode=0;
  1708.                         while(KEY_4 == 0);//等待键松开
  1709.                         key1Times--;
  1710.                         if (key1Times==0 ){key1Times = 6;}
  1711.                         }
  1712.                 }
  1713.                 if (KEY_2 == 0||workcode==6) //
  1714.               {
  1715.                  DelayM(20);           //去抖
  1716.                  if(KEY_2 == 0 ||workcode==6&& w == 0)
  1717.                         {
  1718.                         Beep_key();//按键音
  1719.                         workcode=0;
  1720.                         while(KEY_2 == 0);//等待键松开
  1721.                         key1Times++;
  1722.                         if (key1Times==7 ){key1Times = 1;}
  1723.                         }
  1724.                 }
  1725.         lcdClear();
  1726.         dispString(0, 0, 1, "    功能菜单    ");
  1727.         dispString(1, 0, 1, "1:界面    2:设置");
  1728.         dispString(2, 0, 1, "3:闹钟    4:音乐");
  1729.         dispString(3, 0, 1, "5:自检    6:退出");
  1730.         if (key1Times == 7)
  1731.         {
  1732.                 key1Times = 1;
  1733.         }

  1734.         switch(key1Times)
  1735.         {
  1736.                 case 1: convertChar(1, 0, 6);
  1737.                                 break;
  1738.                 case 2:        convertChar(1, 5, 6);
  1739.                                 break;
  1740.                 case 3: convertChar(2, 0, 6);
  1741.                                 break;
  1742.                 case 4: convertChar(2, 5, 6);
  1743.                                 break;
  1744.                 case 5: convertChar(3, 0, 6);
  1745.                                 break;
  1746.                 case 6: convertChar(3, 5, 6);
  1747.                                 break;
  1748.         }
  1749. }
  1750. if (KEY_3== 0||workcode==8||workcode==5) //
  1751.                          {
  1752.                                DelayM(20);
  1753.                                if(KEY_3 == 0 ||workcode==8||workcode==5)
  1754.                                              {                                
  1755.                                           Beep_set();//确定按键音
  1756.                                                   workcode=0;
  1757.                                                   if (key1Times==1 )
  1758.                                                   {if(k==0)
  1759.                                                   {k=1;
  1760.                                                   Write24c02(k,3);
  1761.                                                   }
  1762.                                                   else if(k==1)
  1763.                                                   {
  1764.                                                   k=2;
  1765.                                                   Write24c02(k,3);
  1766.                                                   }
  1767.                                                   else if(k==2)
  1768.                                                   {
  1769.                                                   k=0;
  1770.                                                   Write24c02(k,3);
  1771.                                                   }
  1772.                                                   lcdInit ();break;}
  1773.                                                   if (key1Times==2 ){clear_img();lcdClear();w=1;k=2;Set_time(e);break;}
  1774.                                                   if (key1Times==3 ){lcdClear();clear_img();k=3;break;}
  1775.                                                   if (key1Times==4 ){clear_img();lcdClear();displayPhoto(powerOnPhoto, OFF);Play(Music_wo,0,3,360);lcdInit ();break;}
  1776.                                                   if (key1Times==5 ){zijian(); break;}
  1777.                                                   if (key1Times==6 ){lcdInit (); break;}
  1778.                                                   
  1779.                                                   }
  1780.                                         }
  1781.   }
  1782. }
  1783. /*****************************************************************************/
  1784. //---主程序---//
  1785. /*****************************************************************************/
  1786. main()
  1787. {
  1788.     KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始键盘
  1789.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
  1790.         Beep_set();//确定按键音        
  1791.     InitialSound();
  1792.         beep=1;
  1793.         Init_1302();
  1794.         lcdWriteCommand(0x30);       //选择8bit数据流
  1795.     lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1796.     lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1797.         lcdClear();
  1798.     displayPhoto(powerOnPhoto1, OFF); //此处为《小东电子》图片代码,可以更改为你喜欢的图片代码
  1799.         DelayM(2000); //显示等留4秒
  1800.         lcdClear();
  1801.         dispString(0, 0, 1, "┏━红外遥控━┓");
  1802.         dispString(1, 0, 1, "┃12864 LCD V8┃");
  1803.         dispString(2, 0, 1, "┃多功能万年历┃");
  1804.         dispString(3, 0, 1, "┗━━━━━━┛");
  1805.         DelayM(2000); //显示等留2秒
  1806.         lcdInit ();
  1807.         c_sun=0;
  1808.         n=Read24c02(0);
  1809.         k=Read24c02(3);
  1810.         if(k>2||k<0) k=0;
  1811.         EX0= 1;                //使能 INT0 外部中断
  1812.         IT0 =1;      //外中断0下降沿触发
  1813.         IR_GET=1;         //I/O口初始化
  1814.         EA=1;                //开总中断
  1815.          
  1816. /*****************************************************************************/
  1817.         while(1)
  1818.                 {//主循环
  1819.         if(k==2){updata ();}
  1820.                 if(k==0){disp_sfm();}
  1821.                 if(k==1){disp_sfm1();}
  1822.                 if(k==3){naozhong();}
  1823.                 if(n==1||n==2||n==3){naozhongdao();}                                
  1824.                 //------------------------------------------------------------------

  1825.                 if (KEY_3 == 0||workcode==5) // 设置时间
  1826.                                       {
  1827.                                     DelayM(10);           //去抖
  1828.                                         if((KEY_3 == 0&& w == 1)||(workcode==5&& w == 1)) //当是调时状态 本键用于调整下一项
  1829.                                                 {
  1830.                                                 Beep_key();//按键音
  1831.                                                 workcode=0;
  1832.                                                 e++;
  1833.                                                 if (e >= 7 ){e = 0;}
  1834.                                                 Set_time(e);//调整                                
  1835.                                     }
  1836.                                         if((KEY_3 == 0&& w == 0)||(workcode==5&& w == 0))  //当是调时状态 本键用于调整下一项
  1837.                                                 {
  1838.                                                 workcode=0;
  1839.                                                 lcdWriteCommand(0x30);       //选择8bit数据流
  1840.                         lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1841.                         lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1842.                                                 Beep_key();//按键音
  1843.                                                 procKey ();                                
  1844.                                     }
  1845.                                                 while(KEY_3 == 0);//等待键松开
  1846.                          }
  1847.                 //------------------------------------------------------------------
  1848.                 if ((KEY_1 == 0&& w == 1) ||(workcode==9&& w == 1))// 当在调时状态时就退出调时
  1849.                          {
  1850.                                DelayM(20);
  1851.                                if((KEY_1 == 0&& w == 1) ||(workcode==9&& w == 1))
  1852.                                              {                                
  1853.                                           Beep_set();//确定按键音
  1854.                                                   workcode=0;
  1855.                                           w = 0;          //退出调时
  1856.                                           e = 0;                //“下一项”计数器清0
  1857.                                                   convertChar(0, 0, 0);
  1858.                                                   lcdInit ();                                                               
  1859.                                      }
  1860.                                         }
  1861.                 if ((KEY_1 == 0&& w == 0) ||(workcode==2&& w == 0))// 当在调时状态时就退出调时
  1862.                          {
  1863.                                DelayM(20);
  1864.                                if((KEY_1 == 0&& w == 0) ||(workcode==2&& w == 0))
  1865.                                              {
  1866.                                                  workcode=0;                                
  1867.                                                  lcdWriteCommand(0x30);       //选择8bit数据流
  1868.                          lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1869.                          lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1870.                                                  displayPhoto(powerOnPhoto, OFF);
  1871.                                                  Play(Music_wo,0,3,360);
  1872.                                                  lcdInit ();
  1873.                                                  }
  1874.                                  while(KEY_1 == 0);//等待键松开
  1875.                         }
  1876.                 //------------------------------------------------------------------
  1877.                 if ((KEY_2 == 0&& w == 1)||(workcode==3 && w == 1)) // 加减调整
  1878.                          {
  1879.                              DelayM(5);
  1880.                              if((KEY_2 == 0&& w == 1)||(workcode==3 && w == 1))
  1881.                                   {                                
  1882.                                        Set_time(e);//调整
  1883.                                            workcode=0;
  1884.                                            Beep_key();//按键音
  1885.                                   }
  1886.                             while(KEY_2 == 0);//等待键松开
  1887.                        }
  1888.                 //------------------------------------------------------------------
  1889.                 if ((KEY_4 == 0&& w == 1)||(workcode==7&& w == 1))// 加减调整
  1890.                         {               
  1891.                                 DelayM(5);
  1892.                              if((KEY_4 == 0&& w == 1)||(workcode==7&& w == 1))
  1893.                                      {                                
  1894.                                        Set_time(e);//调整
  1895.                                            workcode=0;
  1896.                                            Beep_key();//按键音
  1897.                                  }
  1898.                              while(KEY_4 == 0);//等待键松开
  1899.                       }
  1900.                         //------------------------------------------------------------------
  1901.                 if (workcode==1)// 加减调整
  1902.                         {               
  1903.                                 DelayM(5);
  1904.                              if(workcode==1)
  1905.                                      {                                
  1906.                                            Beep_key();//按键音
  1907.                                             lcdWriteCommand(0x30);       //选择8bit数据流
  1908.                         lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1909.                         lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1910.                                                 dispString(0, 0, 1, "┏━红外遥控━┓");
  1911.                             dispString(1, 0, 1, "┃12864 LCD V8┃");
  1912.                             dispString(2, 0, 1, "┃多功能万年历┃");
  1913.                             dispString(3, 0, 1, "┗  待机界面  ┛");
  1914.                                                 workcode=10;
  1915.                                  }
  1916.                              while(workcode==10);//等待键松开
  1917.                                   workcode=10;
  1918.                                   Beep_set();
  1919.                                   lcdInit ();
  1920.                       }
  1921.   }
  1922. }

  1923. /*****************************************************************************/
  1924.                                   //外部中断0服务函数
  1925. /*****************************************************************************/


  1926. void intt_0() interrupt 0 //下降沿触发:接收不到红外时OUT高电平,接收到红外时OUT低电平。
  1927. {
  1928.         uchar four,one,num=0;
  1929.         EX0 = 0;   //关中断0使能,防止处理过程中再接收红外信号
  1930.         DelayM(2);          //稍延时2ms,防干扰
  1931.         if (IR_GET) //再检测红外接收脚(9ms的前导低电平),为高电平说明是干扰
  1932.         {
  1933.                 EX0 =1;         //使能中断0
  1934.                 return;         //退出中断程序
  1935.         }
  1936.         while(!IR_GET);     //等IR变为高电平,跳过9ms的前导低电平信号。
  1937.         while (IR_GET);    //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  1938.         for (four=0;four<4;four++)  //四组数据
  1939.         {
  1940.                 for (one=0;one<8;one++)   //每组数据8位
  1941.                 {
  1942.                         while (!IR_GET);  //等 IR 变为高电平
  1943.                         while (IR_GET)    //计算IR高电平时长(低电平时长是一样的,不用计)
  1944.                         {
  1945.                                 delay100us(1);  //计时
  1946.                                 num++;      //计时N次     
  1947.                                 if (num>=20)        //17*0.1ms=1.7ms
  1948.                                 {                 //数据“1”的时长最长也就1.685ms,计数超过则数据错误,退出中断
  1949.                                         EX0=1;        //使能中断0
  1950.                                         return;        //退出中断
  1951.                                 }                  
  1952.                         }    //高电平计数完毕     
  1953.                         RXDDATA[four]>>=1;          //从低位读出,随着one的循环8次刚好读出一字节
  1954. //                        if(num<6)  //6*0.1ms=0.6ms, 0.565ms<0.6ms<1.685ms
  1955. //                                RXDDATA[j]|=0x00;   //数据“0”
  1956.                         if(num>6&&num<20)         // 17*0.1ms=1.7ms>1.685ms
  1957.                                 RXDDATA[four]|=0x80;  //数据“1”
  1958.                         num=0; //计时值清0,为下一位数据的计时做准备
  1959.                 }//一组数据接收结束
  1960.         }//全部四组数据接收结束
  1961.         if(RXDDATA[0]!=0x00)  //比较用户码(请根据自己的遥控板修改)
  1962.         {
  1963.                 EX0=1;         //使能中断0
  1964.                 return;   //退出中断
  1965.         }
  1966.         if(RXDDATA[1]!=0xff)  //比较用户码(请根据自己的遥控板修改)
  1967.         {
  1968.                 EX0=1;         //使能中断0
  1969.                 return;   //退出中断
  1970.         }
  1971.         if (RXDDATA[2]!=~RXDDATA[3])  //检测接收到的数据是否正确
  1972.         {                           //不正确则
  1973.                 EX0=1;           //使能中断0
  1974.                 return;   //退出中断
  1975.         }

  1976.         workcode=workIRcode(RXDDATA);        //处理红外编码,返回键值

  1977.         EX0 = 1;         //处理完红外接收,使能中断0,退出中断0
  1978. }
  1979.         
复制代码

所有资料51hei提供下载:
12864红外遥控万年历V8源代码.rar (229.61 KB, 下载次数: 120)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:421208 发表于 2018-11-5 17:40 | 只看该作者
先下来看看,好东西!
回复

使用道具 举报

板凳
ID:421410 发表于 2018-11-5 22:30 | 只看该作者
先下来看看,好东西!
回复

使用道具 举报

地板
ID:100198 发表于 2018-11-6 10:18 | 只看该作者
生肖算法不够严谨,生肖的切换点不是公历的元旦,而是农历的大年初一或者每年的立春,现在通用的分割点是大年初一,用你的例子1982年出生的不一定全部都是属狗的,1982年1月25日0点之前的其实还是属鸡的,之后才是属狗的。
回复

使用道具 举报

5#
ID:326450 发表于 2018-11-8 16:41 | 只看该作者
恩,好东西,值得下载来玩玩
回复

使用道具 举报

6#
ID:423207 发表于 2018-11-8 19:53 | 只看该作者
好东西
回复

使用道具 举报

7#
ID:426296 发表于 2018-11-18 15:36 | 只看该作者
谢谢分享,好东西。
回复

使用道具 举报

8#
ID:412186 发表于 2018-11-19 19:07 | 只看该作者
好东西,下载学习
回复

使用道具 举报

9#
ID:225105 发表于 2018-11-22 00:23 | 只看该作者
好东西,值得下载来玩玩
回复

使用道具 举报

10#
ID:364389 发表于 2018-11-29 19:51 | 只看该作者
下载的里面有原理图不
回复

使用道具 举报

11#
ID:440971 发表于 2018-12-7 17:24 | 只看该作者
请问楼主你在最后一次“04/15/2018
”编译时出现的警告怎么回事?
回复

使用道具 举报

12#
ID:26748 发表于 2018-12-11 11:33 | 只看该作者
本来都想下载来玩玩,结果币不够,
回复

使用道具 举报

13#
ID:426296 发表于 2018-12-12 19:03 | 只看该作者
感谢楼主分享
回复

使用道具 举报

14#
ID:43186 发表于 2019-1-1 17:10 | 只看该作者
请大师帮忙12864-8.0红外遥控万年历仿制一个下载进去怎么就滴一声,什么都不显示了?
回复

使用道具 举报

15#
ID:594143 发表于 2019-8-13 22:31 | 只看该作者
不知什么原因,遥控不起作用!!
回复

使用道具 举报

16#
ID:600240 发表于 2019-8-14 22:58 | 只看该作者
向大佬学习
回复

使用道具 举报

17#
ID:600572 发表于 2019-8-15 20:58 | 只看该作者
向前辈学习学习
回复

使用道具 举报

18#
ID:598951 发表于 2019-8-20 21:36 | 只看该作者
多谢分享,有机会做一个
回复

使用道具 举报

19#
ID:598951 发表于 2019-8-20 21:53 | 只看该作者
解压不了呀
回复

使用道具 举报

20#
ID:207802 发表于 2019-9-7 23:23 | 只看该作者
不错不错,向你学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表