找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864红外遥控万年历单片机源代码及全套资料(已经制作实物)

  [复制链接]
跳转到指定楼层
楼主
采用芯片:STC89C16RD+(只要大于22K以上的单片机都是可以的),红外接收采用了VS/HX1838,走时正常,改了下控制器的地址。
程序内容很清楚,自己也容易修改我就不多做介绍了。  程序还暂时没有特别研究,现在实物制作成了,就打算研究程序。
在这我分享下制作心得,之前,在网上找了一些库(这库害我挺惨,引脚跟丝印的方向是不对应的),然后也没查看库的引脚是否有问题,就直接画了板子,最后,当板子做出来的时候,看见屏幕还是一片空白,然后我就顿了顿,想了下是哪里出了问题?忽然间,闻到有股味道(不是特别大的味),也没太在意。最后,我又用手碰了碰上面的器件,格外烫手,(幸好没爆炸)。通过检查,才发现是封装出了问题(一般,普通器件发热,都是引脚接错了),然后去下器件换了方向,发现成了。再度检查,发现修改后的程序中,红外没起作用,想了又想,查了一遍又一遍(通过网上找参考手册,查看PCB,原理图),最后发现,原来之前我采用了DS18B20(错误封装),然后也导致红外没法工作。。。。。。。遇到的一系列问题我就不一一详谈了。下边是我的东西,有PCB(可以直接做),有芯片资料,有程序,有报表。自己慢慢看吧

实物图:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  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. …………限于本文篇幅 余下字库代码请从51黑下载附件…………

  44. uchar code  powerOnPhoto1[]={    //此处为小东电子图片代码,可以更改为你喜欢的图片代码

  45. /*--  调入了一幅图像:F:\小东电子.bmp  --*/
  46. /*--  宽度x高度=128x64  --*/


  47. //图片数字圆体

  48. //图片数字方体
  49. /******************************************************************************/

  50.          {// 图片" "
  51.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  53.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  55.                                                 };  
  56. /******************************************************************************/
  57. //农历代码
  58. /*
  59. 公历年对应的农历数据,每年三字节,
  60. 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
  61. 第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
  62. 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)
  63. 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
  64. */
  65. /******************************************************************************/
  66. code uchar year_code[] = {
  67. 0x0C,0x96,0x45, //2000
  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 V7┃");
  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. …………限于本文篇幅 余下代码请从51黑下载附件…………
  1980.         
复制代码

所有资料51hei提供下载:
程序 PCB.rar (12 MB, 下载次数: 290)
取模软件及元件资料.rar (4.68 MB, 下载次数: 209)
相关算法及说明书,报表.rar (29.77 KB, 下载次数: 214)



评分

参与人数 6黑币 +135 收起 理由
mslong + 5 很给力!
stkh + 5 赞一个!
Handsome_Lin + 5 很给力!
GUOXUAN + 15 绝世好帖!
xwnc + 5 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:187478 发表于 2017-10-29 16:03 | 只看该作者
大家按照我画的PCB做,别看我实物图,有点不一样的,PCB图是我完善后放出来的
回复

使用道具 举报

板凳
ID:187478 发表于 2017-10-29 16:08 | 只看该作者
希望大家能给我评下分,以示鼓励
回复

使用道具 举报

地板
ID:64089 发表于 2017-11-2 13:37 | 只看该作者
很不错,万年历一直是单片机DIY的经典,支持
回复

使用道具 举报

5#
ID:243748 发表于 2017-11-4 23:15 来自手机 | 只看该作者
很好,可以学习下
回复

使用道具 举报

6#
ID:243748 发表于 2017-11-6 23:12 来自手机 | 只看该作者
89C52RC搞了一天还是白屏,是什么原因??
回复

使用道具 举报

7#
ID:259274 发表于 2017-12-19 11:55 | 只看该作者
本帖最后由 单片机设计时钟 于 2017-12-19 23:28 编辑

编辑了,对不起了
回复

使用道具 举报

8#
ID:284548 发表于 2018-2-24 23:14 | 只看该作者
真是太崇拜搂住了 。淘宝买的的话 得120,真是无私 好像原作者 已经推出 8.2版本了
回复

使用道具 举报

9#
ID:288930 发表于 2018-3-12 12:19 | 只看该作者
很好,感谢分享!
回复

使用道具 举报

10#
ID:310944 发表于 2018-4-18 17:01 | 只看该作者
很好感谢分享51黑更精彩
回复

使用道具 举报

11#
ID:243394 发表于 2018-8-26 12:23 | 只看该作者
很好,可以学习下
回复

使用道具 举报

12#
ID:409828 发表于 2018-10-17 12:49 | 只看该作者

很好感谢分享51黑更精彩
回复

使用道具 举报

13#
ID:326450 发表于 2018-10-18 23:49 | 只看该作者
好长啊,学习起来感觉会很酸爽
回复

使用道具 举报

14#
ID:413080 发表于 2018-10-21 14:04 | 只看该作者
十分感谢大神
回复

使用道具 举报

15#
ID:138273 发表于 2018-11-5 12:23 | 只看该作者
为什么我的程序怎么停止在第三个图片哪里不东了啊,就亲嘴那地方不往下走了,
回复

使用道具 举报

16#
ID:517951 发表于 2020-11-15 14:06 | 只看该作者
谢谢楼主分享,,51黑有你更精彩!!超强代码,抽空来拜读
回复

使用道具 举报

17#
ID:849376 发表于 2020-12-23 07:41 来自手机 | 只看该作者
大佬太强了,可以学习大佬的东西
回复

使用道具 举报

18#
ID:230742 发表于 2020-12-31 20:57 | 只看该作者
高手就是高手。程序1000多行。太强了。
回复

使用道具 举报

19#
ID:871721 发表于 2021-1-2 16:54 | 只看该作者
把三个压缩包合成一个可以吗?这样还能少花10个黑币
回复

使用道具 举报

20#
ID:872394 发表于 2021-1-2 23:15 | 只看该作者
真是太崇拜楼主了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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