找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12553|回复: 30
收起左侧

基于51单片机和12864液晶的多功能万年历全套资料

  [复制链接]
ID:194170 发表于 2017-5-15 21:09 | 显示全部楼层 |阅读模式
基于51单片机和12864液晶的多功能万年历全套资料.
万年历实物图:
1.jpg 2.jpg
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件):
3.PNG 0.png 0.png


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /************************12864端口定义*******************************************/
  5. #define dataport P0   //12864数据口
  6. sbit rs=P2^0; //指令/数据端口
  7. sbit rw=P2^1; //读/写端口
  8. sbit en=P2^2; //使能端口
  9. sbit psb=P2^3; //并口/串口端口(本万年历采用并口)
  10. sbit rst=P2^5; //复位端口
  11. /********************************************************************************/
  12. /***********************DS1302端口定义*******************************************/
  13. sbit clock_rst=P3^7;  //1302复位管脚定义
  14. sbit clock_dat=P2^6;  //1302I/O管脚定义
  15. sbit clock_clk=P2^7;  //1302时钟管脚定义  
  16. /***************寄存器定义(用于记录1302IO的输入和输出)*************************/
  17. sbit a0=ACC^0;
  18. sbit a1=ACC^1;
  19. sbit a2=ACC^2;
  20. sbit a3=ACC^3;
  21. sbit a4=ACC^4;
  22. sbit a5=ACC^5;
  23. sbit a6=ACC^6;
  24. sbit a7=ACC^7;
  25. /********************DS18B20端口定义*********************************************/
  26. /********************************************************************************/
  27. sbit DQ=P3^4; //DS18B20数据端口
  28. /********************************************************************************/
  29. /******************18B20全局变量定义*********************************************/
  30. uchar temp;     //温度全局变量(整数部分)
  31. uint xs;     //温度全局变量(小数部分)
  32. /********************************************************************************/

  33. /**********************1302全局变量定义******************************************/
  34. uchar sec,min,hour,day,month,week,year1,year2=20;//秒,分,时,日,月,星期,年
  35. /************************蜂鸣器端口定义******************************************/
  36. sbit beep=P3^5;
  37. uchar num;
  38. /***********************按键定义*************************************************/
  39. sbit key1=P3^0;
  40. sbit key2=P3^1;
  41. sbit key3=P3^2;
  42. sbit key4=P3^3;
  43. uchar set=0; //set=0时显示首页,1时显示次页
  44. uchar status=0;//按键功能选择定义(年0,月1,日2,时3,分4 )
  45. /********************************************************************************/
  46. uchar code month_week[12]={6,2,3,6,1,4,6,2,5,7,3,5}; //2000年各月头天星期表
  47. uchar code year_code[300]={0x0C,0x96,0x45, /*2000*/  0x4d,0x4A,0xB8, /*2001*/   //2002~2099年农历表
  48. 0x0d,0x4A,0x4C, /*2002*/   0x0d,0xA5,0x41, /*2003*/  0x25,0xAA,0xB6, /*2004*/
  49. 0x05,0x6A,0x49, /*2005*/   0x7A,0xAd,0xBd, /*2006*/  0x02,0x5d,0x52, /*2007*/
  50. 0x09,0x2d,0x47, /*2008*/   0x5C,0x95,0xBA, /*2009*/  0x0A,0x95,0x4e, /*2010*/
  51. 0x0B,0x4A,0x43, /*2011*/   0x4B,0x55,0x37, /*2012*/  0x0A,0xd5,0x4A, /*2013*/
  52. 0x95,0x5A,0xBf, /*2014*/   0x04,0xBA,0x53, /*2015*/  0x0A,0x5B,0x48, /*2016*/
  53. 0x65,0x2B,0xBC, /*2017*/   0x05,0x2B,0x50, /*2018*/  0x0A,0x93,0x45, /*2019*/
  54. 0x47,0x4A,0xB9, /*2020*/   0x06,0xAA,0x4C, /*2021*/  0x0A,0xd5,0x41, /*2022*/
  55. 0x24,0xdA,0xB6, /*2023*/   0x04,0xB6,0x4A, /*2024*/  0x69,0x57,0x3d, /*2025*/
  56. 0x0A,0x4e,0x51, /*2026*/   0x0d,0x26,0x46, /*2027*/  0x5e,0x93,0x3A, /*2028*/
  57. 0x0d,0x53,0x4d, /*2029*/   0x05,0xAA,0x43, /*2030*/ 0x36,0xB5,0x37, /*2031*/
  58. 0x09,0x6d,0x4B, /*2032*/   0xB4,0xAe,0xBf, /*2033*/  0x04,0xAd,0x53, /*2034*/
  59. 0x0A,0x4d,0x48, /*2035*/   0x6d,0x25,0xBC, /*2036*/  0x0d,0x25,0x4f, /*2037*/
  60. 0x0d,0x52,0x44, /*2038*/   0x5d,0xAA,0x38, /*2039*/  0x0B,0x5A,0x4C, /*2040*/
  61. 0x05,0x6d,0x41, /*2041*/   0x24,0xAd,0xB6, /*2042*/  0x04,0x9B,0x4A, /*2043*/
  62. 0x7A,0x4B,0xBe, /*2044*/   0x0A,0x4B,0x51, /*2045*/  0x0A,0xA5,0x46, /*2046*/
  63. 0x5B,0x52,0xBA, /*2047*/   0x06,0xd2,0x4e, /*2048*/  0x0A,0xdA,0x42, /*2049*/
  64. 0x35,0x5B,0x37, /*2050*/   0x09,0x37,0x4B, /*2051*/  0x84,0x97,0xC1, /*2052*/
  65. 0x04,0x97,0x53, /*2053*/   0x06,0x4B,0x48, /*2054*/  0x66,0xA5,0x3C, /*2055*/
  66. 0x0e,0xA5,0x4f, /*2056*/   0x06,0xB2,0x44, /*2057*/  0x4A,0xB6,0x38, /*2058*/
  67. 0x0A,0xAe,0x4C, /*2059*/   0x09,0x2e,0x42, /*2060*/  0x3C,0x97,0x35, /*2061*/
  68. 0x0C,0x96,0x49, /*2062*/   0x7d,0x4A,0xBd, /*2063*/  0x0d,0x4A,0x51, /*2064*/
  69. 0x0d,0xA5,0x45, /*2065*/   0x55,0xAA,0xBA, /*2066*/  0x05,0x6A,0x4e, /*2067*/
  70. 0x0A,0x6d,0x43, /*2068*/   0x45,0x2e,0xB7, /*2069*/  0x05,0x2d,0x4B, /*2070*/
  71. 0x8A,0x95,0xBf, /*2071*/   0x0A,0x95,0x53, /*2072*/  0x0B,0x4A,0x47, /*2073*/
  72. 0x6B,0x55,0x3B, /*2074*/   0x0A,0xd5,0x4f, /*2075*/  0x05,0x5A,0x45, /*2076*/
  73. 0x4A,0x5d,0x38, /*2077*/   0x0A,0x5B,0x4C, /*2078*/  0x05,0x2B,0x42, /*2079*/
  74. 0x3A,0x93,0xB6, /*2080*/   0x06,0x93,0x49, /*2081*/  0x77,0x29,0xBd, /*2082*/
  75. 0x06,0xAA,0x51, /*2083*/   0x0A,0xd5,0x46, /*2084*/  0x54,0xdA,0xBA, /*2085*/
  76. 0x04,0xB6,0x4e, /*2086*/   0x0A,0x57,0x43, /*2087*/  0x45,0x27,0x38, /*2088*/
  77. 0x0d,0x26,0x4A, /*2089*/   0x8e,0x93,0x3e, /*2090*/  0x0d,0x52,0x52, /*2091*/
  78. 0x0d,0xAA,0x47, /*2092*/   0x66,0xB5,0x3B, /*2093*/  0x05,0x6d,0x4f, /*2094*/
  79. 0x04,0xAe,0x45, /*2095*/   0x4A,0x4e,0xB9, /*2096*/  0x0A,0x4d,0x4C, /*2097*/
  80. 0x0d,0x15,0x41, /*2098*/   0x2d,0x92,0xB5, /*2099*/
  81. };
  82. uint code month_day1[12]={0,31,59,90,120,151,181,212,243,273,304,334};//平年月份累计天数表
  83. uint code month_day2[12]={0,31,60,91,121,152,182,213,244,274,305,335};//闰年月份累计天数表
  84. uint table_addr; //查农历表的地址全局变量
  85. uchar year1_n,month_n,day_n; //农历年月日全局变量
  86. uchar month_r;  //农历闰月全局变量,无时为0
  87. /**********************延时函数*************************************************/
  88. void delay(uint t)  
  89. {
  90. uint b;
  91. for(;t;t--)
  92.   for(b=0;b<121;b++);
  93. }
  94. /*******************************************************************************/
  95. /**************************12864子函数******************************************/
  96. /**********************检查忙信号子函数*****************************************/
  97. void busy()  
  98. {
  99. rs=0;  //指令操作
  100. rw=1;  //读操作
  101. dataport=0xff; //数据端口置位
  102. en=1;  //使能
  103. while(dataport&0x80); //等待数据端口位7为0
  104. en=0;  //取消使能
  105. }
  106. /************************写指令函数*********************************************/
  107. void write_code(uchar c)   
  108. {
  109. busy();   //检查忙标志
  110. rs=0;   //指令操作
  111. rw=0;   //写操作
  112. dataport=c;  //送指令到端口
  113. en=1;   //使能
  114. delay(1);  //稍微延时
  115. en=0;   //取消使能
  116. }
  117. /************************写数据函数*********************************************/
  118. void write_data(uchar d)   
  119. {
  120. busy();   //检查忙标志
  121. rs=1;   //数据操作
  122. rw=0;   //写操作
  123. dataport=d;  //送数据到端口
  124. en=1;   //使能
  125. delay(1);  //稍微延时
  126. en=0;   //取消延时
  127. }
  128. /***********************写汉字**************************************************/
  129. void write_hz(uchar *hz)
  130. {         
  131. while(*hz>0)
  132. {
  133.   write_data(*hz); //写入汉字
  134.   hz++;
  135. }
  136. }

  137. /***************************初始化12864*****************************************/
  138. void init_12864()  
  139. {
  140. psb=1;        //并口方式
  141. rst=1;        //复位端置高
  142. write_code(0x30); //8位数据传送,基本指令操作
  143. delay(10);
  144. write_code(0x0c); //无光标,不反白
  145. delay(10);   
  146. write_code(0x01); //清除显示
  147. delay(10);
  148. write_code(0x40); //光标左移,字符不动
  149. delay(10);
  150. }                  
  151. /*******************************************************************************/
  152. /*************************DS1302子函数******************************************/
  153. /************************1302写驱动函数*****************************************/
  154. void write_clock(uchar dat)
  155. {
  156. ACC=dat;
  157. clock_dat=a0; clock_clk=1; clock_clk=0; //数据在上升沿变化
  158. clock_dat=a1; clock_clk=1; clock_clk=0; //下降沿写入1302
  159. clock_dat=a2; clock_clk=1; clock_clk=0;
  160. clock_dat=a3; clock_clk=1; clock_clk=0;
  161. clock_dat=a4; clock_clk=1; clock_clk=0;
  162. clock_dat=a5; clock_clk=1; clock_clk=0;
  163. clock_dat=a6; clock_clk=1; clock_clk=0;
  164. clock_dat=a7; clock_clk=1; clock_clk=0;
  165. }
  166. /************************1302读驱动函数*****************************************/
  167. uchar read_clock()
  168. {
  169. clock_dat=1;   //输出赋1
  170. a0=clock_dat;clock_clk=1; clock_clk=0;  //位0为1,读1302
  171. a1=clock_dat;clock_clk=1; clock_clk=0; //下降沿读出有效
  172.     a2=clock_dat;clock_clk=1; clock_clk=0;
  173. a3=clock_dat;clock_clk=1; clock_clk=0;
  174.     a4=clock_dat;clock_clk=1; clock_clk=0;
  175. a5=clock_dat;clock_clk=1; clock_clk=0;
  176. a6=clock_dat;clock_clk=1; clock_clk=0;
  177. a7=clock_dat;clock_clk=1; clock_clk=0;
  178. return(ACC);
  179. }
  180. /***************************写数据入1302****************************************/
  181. void write_dat_clock(uchar add,uchar dat)
  182. {
  183. clock_clk=0;
  184. clock_rst=0; //时钟脉冲为低时
  185. clock_rst=1; //复位端才能置高
  186. write_clock(add); //写入地址(命令字节)
  187. write_clock(dat); //写入数据
  188. clock_rst=0; //终止数据传送
  189. clock_clk=1;
  190. }
  191. /***************************从1302读出数据**************************************/
  192. uchar read_dat_clock(uchar add)
  193. {
  194. uchar dat=0; //定义数据储存变量
  195. clock_clk=0;
  196. clock_rst=0;
  197. clock_rst=1;
  198. write_clock(add); //写入要读数据的地址
  199. dat=read_clock(); //读出数据
  200. clock_rst=0; //终止数据传送
  201. clock_clk=1;
  202. return dat;  //返回数据
  203. }
  204. /**************************设置初始时间函数*************************************/
  205. void set_time()
  206. {
  207. write_dat_clock(0x8e,0x00);  //允许写操作
  208. write_dat_clock(0x8c,0x09);  //年
  209. write_dat_clock(0x8a,0x03);  //星期
  210. write_dat_clock(0x88,0x10);  //月
  211. write_dat_clock(0x86,0x14);  //日
  212. write_dat_clock(0x84,0x21);  //小时
  213. write_dat_clock(0x82,0x56);  //分
  214. write_dat_clock(0x80,0x00);  //秒,且振荡器工作
  215. //write_dat_clock(0x90,0xa5);  //充电
  216. write_dat_clock(0x8e,0x80);  //禁止写操作
  217. }
  218. /*****************************读取时间******************************************/
  219. void get_time()
  220. {
  221. sec=read_dat_clock(0x81);    //读取秒
  222. sec=(sec>>4)*10+(sec&0x0f);  //秒二进制转换
  223. min=read_dat_clock(0x83);    //读取分钟
  224. min=(min>>4)*10+(min&0x0f);  //分二进制转换
  225. hour=read_dat_clock(0x85);   //读取小时
  226. hour=(hour>>4)*10+(hour&0x0f);//小时二进制转换
  227. day=read_dat_clock(0x87);     //读取日期
  228. day=(day>>4)*10+(day&0x0f);   //日期二进制转换
  229. month=read_dat_clock(0x89);   //读取月份
  230. month=(month>>4)*10+(month&0x0f);//月二进制转换
  231. week=read_dat_clock(0x8b);    //读取星期
  232. week=(week>>4)*10+(week&0x0f);//星期二进制转换
  233. year1=read_dat_clock(0x8d);     //读取年份
  234. year1=(year1>>4)*10+(year1&0x0f); //年份二进制转换
  235. }         
  236. /*************************DS18B20各子函数***************************************/  
  237. /*************************DS18B20延时函数***************************************/
  238. void delay_DS18B20(uint i)
  239. {
  240. for(;i;i--);
  241. }
  242. /*************************DS18B20初始化函数*************************************/
  243. void init_DS18B20()  
  244. {  
  245. DQ=1;       //DQ复位
  246. delay_DS18B20(1);   //稍作延时
  247. DQ=0;       //产生复位脉冲
  248. delay_DS18B20(160); //精确延时,大于480us
  249. DQ=1;       //拉高总线
  250. delay_DS18B20(5);   //等待20us左右
  251. while(DQ);      //等待DS18B20发出存在脉冲
  252. delay_DS18B20(30); //脉冲持续100us左右
  253. }
  254. /*****************************写一个字节****************************************/
  255. void write_onechar(uchar dat)
  256. {
  257. uchar i;
  258. for(i=8;i>0;i--)
  259. {
  260.   DQ=0;
  261.   DQ=dat&0x01;
  262.   delay_DS18B20(3);
  263.   DQ=1;
  264.   dat>>=1;
  265. }
  266. }
  267. /*****************************读一个字节****************************************/
  268. uchar read_onechar()
  269. {
  270. uchar i;
  271. uchar dat;
  272. for(i=8;i>0;i--)
  273. {
  274.   DQ=0;    //总线拉低
  275.   dat>>=1; //维持一个指令时间
  276.   DQ=1;    //拉高总线
  277.   if(DQ)  //读数据
  278.    dat|=0x80;
  279.   delay_DS18B20(20); //维持60us
  280. }
  281. return dat;
  282. }
  283. /*************************读取温度数值******************************************/
  284. uchar read_tem()
  285. {
  286. uchar ltemp;          //定义温度低字节
  287. uchar htemp;          //定义温度高字节
  288. uchar t;           //定义温度整数部分返回值
  289. init_DS18B20();
  290. write_onechar(0xcc);  //跳过读序号列号的操作
  291. write_onechar(0x44);  // 启动温度转换
  292. init_DS18B20();
  293. write_onechar(0xcc);  //跳过读序号列号的操作
  294. write_onechar(0xbe);  //读取温度寄存器
  295. ltemp=read_onechar(); //读取温度低字节
  296. htemp=read_onechar(); //读取温度高字节
  297. ltemp=ltemp>>4;       //低字节右移4位,去掉小数位
  298. t=htemp<<4;        //高字节左移4位,去掉符号位
  299. t|=ltemp;        //合并整数部分
  300. xs=ltemp&0x0f;       //小数部分赋予xs
  301. xs*=0.625;        //计算小数部分的数值
  302. return t;        //返回温度整数部分数值
  303. }
  304. /******************************************************************************/
  305. /*****************************按键功能函数*************************************/
  306. void key_1()     //选择变量函数
  307. {
  308. key1=1;
  309. if(key1==0)
  310. {
  311.   delay(10);
  312.   if(key1==0)
  313.   {
  314.    if(++status>5)status=0; //1控制年的变化,2控制月的变化,3控制日的变化
  315.   }       //4控制时的变化,5控制分的变化
  316.   while(key1==0);
  317. }
  318. }
  319. /******************************************************************************/
  320. void key_2()       //加函数
  321. {
  322. key2=1;
  323. if(key2==0)
  324. {
  325.   delay(10);
  326.   if(key2==0)
  327.   {
  328.    switch(status)
  329.    {
  330.     case 1:if(++year1>99)year1=0;break;
  331.     case 2:if(++month>12)month=1;break;
  332.     case 3:if(++day>31)day=1;break;
  333.     case 4:if(++hour>=24)hour=0;break;
  334.     case 5:if(++min>=60)min=0;break;
  335.    }
  336.   }
  337.   while(key2==0);
  338. }
  339. }
  340. /*****************************************************************************/
  341. void key_3()//减函数
  342. {
  343. key3=1;
  344. if(key3==0)
  345. {
  346.   delay(10);
  347.   if(key3==0)
  348.   {
  349.    switch(status)
  350.    {
  351.     case 1:if((year1--)<=0)year1=99;break;
  352.     case 2:if((month--)<=1)month=12;break;
  353.     case 3:if((day--)<=1)day=31;break;
  354.     case 4:if((hour--)<=0)hour=23;break;
  355.     case 5:if((min--)<=0)min=59;break;
  356.    }
  357.   }
  358.   while(key3==0);
  359. }
  360. }
  361. /*****************************************************************************/
  362. void key_4()     //选择变量函数
  363. {
  364. key4=1;
  365. if(key4==0)
  366. {
  367.   delay(10);
  368.   if(key4==0)
  369.   {
  370.    if(++set>1)set=0;//0显示首页,1显示次页
  371.   }
  372.   write_code(0x01); //清除一下显示屏
  373.   while(key4==0);
  374. }
  375. }
  376. /*****************************************************************************/
  377. void key_time()    //按键设置时间的处理
  378. {
  379. write_dat_clock(0x8e,0x00);  //允许写操作
  380. write_dat_clock(0x8c,(year1/10)*16+year1%10);  //年
  381. write_dat_clock(0x8a,(week/10)*16+week%10);  //星期
  382. write_dat_clock(0x88,(month/10)*16+month%10);  //月
  383. write_dat_clock(0x86,(day/10)*16+day%10);  //日
  384. write_dat_clock(0x84,(hour/10)*16+hour%10);  //小时
  385. write_dat_clock(0x82,(min/10)*16+min%10);  //分
  386. write_dat_clock(0x8e,0x80);  //禁止写操作
  387. }
  388. /*****************************************************************************/
  389. /***********************平闰年设定********************************************/
  390. bit prp(uchar y)
  391. {
  392. uint temp;
  393. temp=2000+y;
  394. if(((temp%4)==0)&&((temp%100)!=0)||((temp%400)==0))
  395.   return 1;
  396. else
  397.   return 0;
  398. }
  399. /***********************某年月日星期设定**************************************/
  400. void d_week()
  401. {
  402. uchar x,y;
  403. x=year1/4;
  404. y=year1%4;
  405. if(month<3)
  406.   week=((x*5+2+(y-1)+(day-1))%7+month_week[month-1])%7;
  407. else
  408.   week=((x*5+y+(day-1))%7+month_week[month-1])%7;
  409. }
  410. /***********************某年月日农历设定**************************************/
  411. uchar get_moon_day(uchar m,uint ta)//农历月天数判定函数
  412. {
  413. uchar temp;
  414. switch(m)
  415. {
  416.   case 1:temp=year_code[ta]&0x08;break;
  417.   case 2:temp=year_code[ta]&0x04;break;
  418.   case 3:temp=year_code[ta]&0x02;break;
  419.   case 4:temp=year_code[ta]&0x01;break;
  420.   case 5:temp=year_code[ta+1]&0x80;break;
  421.   case 6:temp=year_code[ta+1]&0x40;break;
  422.   case 7:temp=year_code[ta+1]&0x20;break;
  423.   case 8:temp=year_code[ta+1]&0x10;break;
  424.   case 9:temp=year_code[ta+2]&0x08;break;
  425.   case 10:temp=year_code[ta+2]&0x04;break;
  426.   case 11:temp=year_code[ta+2]&0x02;break;
  427.   case 12:temp=year_code[ta+2]&0x01;break;
  428.   case 13:temp=year_code[ta+2]&0x80;break;
  429. }
  430. if(temp==0)
  431.   return 29;
  432. else
  433.   return 30;
  434. }
  435. /**********************某年农历闰月设定**************************************/
  436. uchar get_month_r(uchar y)
  437. {
  438. uchar temp,ta;
  439. ta=y*3;
  440. temp=(year_code[ta]&0xf0)>>4;
  441. return temp;
  442. }
  443. /*********************阳历转化农历*******************************************/
  444. void convert_yinyan(uchar year1,uchar month,uchar day)
  445. {
  446. uchar month_n1,day_n1;//春节公历月日
  447. uint temp1,temp2;     //值转移变量
  448. table_addr=year1*3;
  449. month_n1=(year_code[table_addr+2]&0x60)>>5;//农历正月所在月数
  450. day_n1=year_code[table_addr+2]&0x1f;    //农历正月所在当月日数
  451. month_r=get_month_r(year1);  //计算当年闰月
  452. if(month_n1==1)   //春节离当年元旦天数
  453.   temp1=day_n1-1;
  454. else
  455.   temp1=30+day_n1-1;
  456. if(prp(year1))//次年是否为闰年
  457.   temp2=month_day2[month-1]+day-1;
  458. else
  459.   temp2=month_day1[month-1]+day-1;
  460. if(temp2>=temp1)//次月日在春节后否
  461. {
  462.   year1_n=year1;
  463.   month_n=1;
  464.   temp2=temp2-temp1;
  465.   temp1=get_moon_day(month_n,table_addr); //当月天数计算
  466.   while(temp2>=temp1)
  467.   {
  468.    month_n++;
  469.    temp2=temp2-temp1;
  470.    temp1=get_moon_day(month_n,table_addr);
  471.   }
  472.   day_n=temp2+1;
  473. }
  474. else
  475. {
  476.   year1_n=year1-1;
  477.   temp1=temp1-temp2;
  478.   table_addr=table_addr-3;
  479.   month_r=get_month_r(year1-1);
  480.   if(month_r==0)   //若当年没有闰月
  481.    month_n=12;
  482.   else
  483.    month_n=13;
  484.   temp2=get_moon_day(month_n,table_addr);
  485.   while(temp1>=temp2)
  486.   {
  487.    month_n--;
  488.    temp1=temp1-temp2;
  489.    temp2=get_moon_day(month_n,table_addr);
  490.   }
  491. }


  492. }

  493. /***********************特殊功能子函数***************************************/
  494. /**************************星期设定******************************************/
  495. void xingqi()
  496. {
  497. d_week();
  498. switch(week)
  499. {
  500.   case 1:write_hz("一");break;
  501.   case 2:write_hz("二");break;
  502.   case 3:write_data(0xc8);write_data(0xfd);break;
  503.   case 4:write_hz("四");break;
  504.   case 5:write_hz("五");break;
  505.   case 6:write_hz("六");break;
  506.   case 0:write_hz("日");break;
  507.   default:break;
  508. }
  509. }
  510. /*************************生肖年设定*****************************************/
  511. void shengxiao()
  512. {
  513. uchar sx=year1%12;
  514. switch(sx)
  515. {
  516.   case 0:write_hz("龙");break;
  517.   case 1:write_hz("蛇");break;
  518.   case 2:write_hz("马");break;
  519.   case 3:write_hz("羊");break;
  520.   case 4:write_hz("猴");break;
  521.   case 5:write_hz("鸡");break;
  522.   case 6:write_hz("狗");break;
  523.   case 7:write_hz("猪");break;
  524.   case 8:write_hz("鼠");break;
  525.   case 9:write_hz("牛");break;
  526.   case 10:write_hz("虎");break;
  527.   case 11:write_hz("兔");break;
  528.   default:break;
  529. }
  530. }
  531. /************************天干地支设定****************************************/
  532. void tgdz()
  533. {
  534. uchar tiangan=year1_n%10;
  535. uchar dizhi=year1_n%12;
  536. switch(tiangan)
  537. {
  538.   case 4:write_hz("甲");break;
  539.   case 5:write_hz("乙");break;
  540.   case 6:write_hz("丙");break;
  541.   case 7:write_hz("丁");break;
  542.   case 8:write_hz("戊");break;
  543.   case 9:write_hz("己");break;
  544.   case 0:write_data(0xb8);write_data(0xfd);break;
  545.   case 1:write_hz("辛");break;
  546.   case 2:write_hz("壬");break;
  547.   case 3:write_hz("葵");break;
  548.   default:break;
  549. }
  550. switch(dizhi)
  551. {
  552.   case 8:write_hz("子");break;
  553.   case 9:write_hz("丑");break;
  554.   case 10:write_hz("寅");break;
  555.   case 11:write_hz("卯");break;
  556.   case 0:write_hz("辰");break;
  557.   case 1:write_hz("巳");break;
  558.   case 2:write_hz("午");break;
  559.   case 3:write_hz("未");break;
  560.   case 4:write_hz("申");break;
  561.   case 5:write_hz("酉");break;
  562.   case 6:write_hz("戌");break;
  563.   case 7:write_hz("亥");break;
  564.   default:break;
  565. }
  566. }
  567. /*******************农历月设定**********************************************/
  568. void nongli_m()
  569. {
  570. if(month_n==0)
  571. {
  572.   switch(month_n)
  573.   {
  574.    case 1: write_hz("    ");write_data(0xd5);write_data(0xfd);break;  //正
  575.    case 2: write_hz("    二");break;
  576.    case 3: write_hz("    ");write_data(0xc8);write_data(0xfd);break;  //三
  577.    case 4: write_hz("    四");break;
  578.    case 5: write_hz("    五");break;
  579.    case 6: write_hz("    六");break;
  580.    case 7: write_hz("    七");break;
  581.    case 8: write_hz("    八");break;
  582.    case 9: write_hz("    九");break;
  583.    case 10:write_hz("    十");break;
  584.    case 11:write_hz("  十一");break;
  585.    case 12:write_hz("  十二");break;
  586.   }
  587. }
  588. else
  589. {
  590.   if((month_n-1)==month_r)
  591.   {
  592.    switch(month_n-1)
  593.    {
  594.     case 1: write_hz("  闰一");break;
  595.     case 2: write_hz("  闰二");break;
  596.     case 3: write_hz("  闰");write_data(0xc8);write_data(0xfd);break;
  597.     case 4: write_hz("  闰四");break;
  598.     case 5: write_hz("  闰五");break;
  599.     case 6: write_hz("  闰六");break;
  600.     case 7: write_hz("  闰七");break;
  601.     case 8: write_hz("  闰八");break;
  602.     case 9: write_hz("  闰九");break;
  603.     case 10:write_hz("  闰十");break;
  604.     case 11:write_hz("闰十一");break;
  605.     case 12:write_hz("闰十二");break;
  606.    }
  607.   }
  608.   else if(month_n<=month_r)
  609.   {
  610.    switch(month_n)
  611.    {
  612.     case 1: write_hz("    ");write_data(0xd5);write_data(0xfd);break;
  613.     case 2: write_hz("    二");break;
  614.     case 3: write_hz("    ");write_data(0xc8);write_data(0xfd);break;
  615.     case 4: write_hz("    四");break;
  616.     case 5: write_hz("    五");break;
  617.     case 6: write_hz("    六");break;
  618.     case 7: write_hz("    七");break;
  619.     case 8: write_hz("    八");break;
  620.     case 9: write_hz("    九");break;
  621.     case 10:write_hz("    十");break;
  622.     case 11:write_hz("  十一");break;
  623.     case 12:write_hz("  十二");break;
  624.    }
  625.   }
  626.   else
  627.   {
  628.    switch(month_n-1)
  629.    {
  630.     case 2: write_hz("    二");break;
  631.     case 3: write_hz("    ");write_data(0xc8);write_data(0xfd);break;
  632.     case 4: write_hz("    四");break;
  633.     case 5: write_hz("    五");break;
  634.     case 6: write_hz("    六");break;
  635.     case 7: write_hz("    七");break;
  636.     case 8: write_hz("    八");break;
  637.     case 9: write_hz("    九");break;
  638.     case 10:write_hz("    十");break;
  639.     case 11:write_hz("  十一");break;
  640.     case 12:write_hz("  十二");break;
  641.    }
  642.   }
  643. }
  644. }
  645. /***********************农历日设定******************************************/
  646. void nongli_d()
  647. {
  648. switch(day_n)
  649. {
  650.   case 1: write_hz("初一  ");break;
  651.   case 2: write_hz("初二  ");break;
  652.   case 3: write_hz("初");write_data(0xc8);write_data(0xfd);write_hz("  ");break;
  653.   case 4: write_hz("初四  ");break;
  654.   case 5: write_hz("初五  ");break;
  655.   case 6: write_hz("初六  ");break;
  656.   case 7: write_hz("初七  ");break;
  657.   case 8: write_hz("初八  ");break;
  658.   case 9: write_hz("初九  ");break;
  659.   case 10:write_hz("初十  ");break;
  660.   case 11:write_hz("十一  ");break;
  661.   case 12:write_hz("十二  ");break;
  662.   case 13:write_hz("十");write_data(0xc8);write_data(0xfd);write_hz("  ");break;
  663.   case 14:write_hz("十四  ");break;
  664.   case 15:write_hz("十五  ");break;
  665.   case 16:write_hz("十六  ");break;
  666.   case 17:write_hz("十七  ");break;
  667.   case 18:write_hz("十八  ");break;
  668.   case 19:write_hz("十九  ");break;
  669.   case 20:write_hz("廿十  ");break;
  670.   case 21:write_hz("廿十一");break;
  671.   case 22:write_hz("廿十二");break;
  672.   case 23:write_hz("廿十");write_data(0xc8);write_data(0xfd);break;
  673.   case 24:write_hz("廿十四");break;
  674.   case 25:write_hz("廿十五");break;
  675.   case 26:write_hz("廿十六");break;
  676.   case 27:write_hz("廿十七");break;
  677.   case 28:write_hz("廿十八");break;
  678.   case 29:write_hz("廿十九");break;
  679.   case 30:write_data(0xc8);write_data(0xfd);write_hz("十");write_hz("  ");break;
  680. }
  681. }

  682. /************************节日函数*******************************************/
  683. void holiday()
  684. {  
  685. while(1){
  686. if(status==1)          {write_hz("    调整年份    ");break;}
  687. if(status==2)          {write_hz("    调整月份    ");break;}
  688. if(status==3)          {write_hz("    调整日期    ");break;}
  689. if(status==4)          {write_hz("    调整小时    ");break;}
  690. if(status==5)          {write_hz("    调整分钟    ");break;}
  691. if(month==1&&day==1)   {write_hz("    新年元旦    ");break;}
  692. if(month==2&&day==14)  {write_hz("  今日情人节    ");break;}
  693. if(month==3&&day==8)   {write_hz("  国际妇女节    ");break;}
  694. if(month==3&&day==12)  {write_hz("  中国植树节    ");break;}
  695. if(month==3&&day==15)  {write_hz("世界消费者权益日");break;}
  696. if(month==4&&day==1)   {write_hz("    愚人节      ");break;}
  697. if(month==5&&day==1)   {write_hz("  国际劳动节    ");break;}
  698. if(month==5&&day==4)   {write_hz("  中国青年节    ");break;}
  699. if(month==5&&day==8)   {write_hz("  世界红十字日  ");break;}
  700. if(month==5&&day==12)  {write_hz("  国际护士节    ");break;}
  701. if(month==6&&day==1)   {write_hz("  国际儿童节    ");break;}
  702. if(month==6&&day==26)  {write_hz("  国际禁毒日    ");break;}
  703. if(month==7&&day==1)   {write_hz("中国共产党诞生日");break;}
  704. if(month==7&&day==7)   {write_hz("抗日战争纪念日  ");break;}
  705. if(month==8&&day==1)   {write_hz("  中国建军节    ");break;}
  706. if(month==8&&day==12)  {write_hz("  国际青年节    ");break;}
  707. if(month==9&&day==10)  {write_hz("  中国教师节    ");break;}
  708. if(month==10&&day==1)  {write_hz("    国庆节      ");break;}
  709. if(month==10&&day==24) {write_hz("    联合国日    ");break;}
  710. if(month==10&&day==31) {write_hz("    万圣节      ");break;}
  711. if(month==12&&day==1)  {write_hz("  世界艾滋病日  ");break;}
  712. if(month==12&&day==25) {write_hz("    圣诞节      ");break;}
  713. if(hour>=4&&hour<6)    {write_hz("凌晨了,ZZZ~~~");break;}
  714. if(hour>=6&&hour<8)    {write_hz("主人,早上好!");break;}
  715. if(hour>=8&&hour<12)   {write_hz("__●__上午▲▲__");break;}
  716. if(hour==12)           {write_hz("午休时间到咯~");break;}
  717. if(hour>=13&&hour<18)  {write_hz("下午茶时间^_^");break;}
  718. if(hour>=18&&hour<22)  {write_hz("  晚上了额  ~");break;}
  719. if(hour>=22&&hour<=23) {write_hz("该准备睡咯~~~");break;}
  720. if(hour>=0&&hour<4)    {write_hz("你,睡了吗?Z~");break;}

  721. ……………………

  722. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
(015)基于51单片机和12864液晶的多功能万年历全套资料.rar (706.53 KB, 下载次数: 264)

评分

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

查看全部评分

回复

使用道具 举报

ID:119290 发表于 2017-12-19 13:33 | 显示全部楼层
这个代码有错误
要稍微改下才能用。
不然闰月处理不准!
回复

使用道具 举报

ID:87193 发表于 2017-12-20 13:54 | 显示全部楼层
感觉资料挺详细的,下载了
回复

使用道具 举报

ID:99056 发表于 2017-12-27 11:09 | 显示全部楼层
学习学习了
回复

使用道具 举报

ID:99056 发表于 2017-12-27 11:09 | 显示全部楼层
可以参考一下
回复

使用道具 举报

ID:73992 发表于 2017-12-27 21:37 | 显示全部楼层
无法生成hex
回复

使用道具 举报

ID:73992 发表于 2017-12-28 18:03 | 显示全部楼层
可以生成hex,是因为我的keil没有注册,不好意思!!
回复

使用道具 举报

ID:208733 发表于 2017-12-28 21:41 | 显示全部楼层
楼主你好,能发个能生成.hex的文件吗
回复

使用道具 举报

ID:270546 发表于 2018-1-3 08:48 | 显示全部楼层
下了学习学习
回复

使用道具 举报

ID:272411 发表于 2018-1-9 16:45 | 显示全部楼层
下载学习了,谢谢分享&#128591;
回复

使用道具 举报

ID:277440 发表于 2018-1-18 16:10 来自手机 | 显示全部楼层
那个,请问一下,程序有一个语法错误,找不到,有知道的么
回复

使用道具 举报

ID:277440 发表于 2018-1-18 16:11 来自手机 | 显示全部楼层
happyner 发表于 2017-12-19 13:33
这个代码有错误
要稍微改下才能用。
不然闰月处理不准!

那个,程序导入进去有一个语法错误,请问你知道怎么改么
回复

使用道具 举报

ID:161715 发表于 2018-1-19 12:20 | 显示全部楼层
我想问下你里面那个农历表是为什么要那样写?有点不懂!
回复

使用道具 举报

ID:255614 发表于 2018-1-19 19:16 | 显示全部楼层
利害了我的哥,好想學下
回复

使用道具 举报

ID:75390 发表于 2018-1-20 09:14 | 显示全部楼层
分数太高下不了啊,哪位兄弟给一份
回复

使用道具 举报

ID:145935 发表于 2018-1-20 14:36 | 显示全部楼层
#在这里快速回复#谢谢分享! 51黑有你更精彩!!!
回复

使用道具 举报

ID:278393 发表于 2018-1-21 19:51 | 显示全部楼层
谢谢分享! 51黑有你更精彩!!!
回复

使用道具 举报

ID:163501 发表于 2018-1-21 23:12 | 显示全部楼层
正在测试,不知能不能用。
回复

使用道具 举报

ID:282869 发表于 2018-6-30 20:06 | 显示全部楼层
感觉资料挺详细的 謝謝分享
回复

使用道具 举报

ID:282869 发表于 2018-6-30 20:06 | 显示全部楼层
謝謝分享..............................
回复

使用道具 举报

ID:282869 发表于 2018-6-30 20:15 | 显示全部楼层
参考一下 謝謝....................
回复

使用道具 举报

ID:282869 发表于 2018-6-30 20:16 | 显示全部楼层
謝謝.........................................................
回复

使用道具 举报

ID:282869 发表于 2018-6-30 20:19 | 显示全部楼层
很好作品希望能下載
回复

使用道具 举报

ID:282869 发表于 2018-7-12 11:34 | 显示全部楼层
已做成成品,但按鍵無作用無法設定更改時間。
回复

使用道具 举报

ID:370096 发表于 2018-7-12 11:57 | 显示全部楼层
学习了!
回复

使用道具 举报

ID:439981 发表于 2018-12-5 13:26 | 显示全部楼层
很棒的东西
回复

使用道具 举报

ID:440451 发表于 2018-12-5 21:44 | 显示全部楼层
非常nice,学习了
回复

使用道具 举报

ID:266007 发表于 2018-12-6 00:57 来自手机 | 显示全部楼层
假如电路图可以发PDF文件就非常感谢了,schdoc文件要重新下载软件好麻烦~可以发电路pdf文件给我吗?非常感谢,邮箱957075280@qq.com
回复

使用道具 举报

ID:434877 发表于 2018-12-6 22:15 | 显示全部楼层
新人来学习一下
回复

使用道具 举报

ID:440451 发表于 2018-12-7 16:54 | 显示全部楼层
这个12864在proteus中找不到这个器件,无法仿真以验证程序的完整性有效性.
回复

使用道具 举报

ID:20345 发表于 2019-2-6 15:58 | 显示全部楼层
程序看不太懂。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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