单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15975|回复: 71
收起左侧

LCD12864大数字显示万年历制作,有单片机代码有图有真相

  [复制链接]
lids 发表于 2017-5-23 12:07 | 显示全部楼层 |阅读模式
51单片机主控的的12864万年历,有图有真相附件里面有原理图,完整源代码,实物测试通过;时分秒大数字显示
单片机型号:STC90C516RD+,用STC89C516RD+也可以.
实物图.jpg
DS1302用现成模块,可以自己网上找电路图焊
DS18B20引脚看清楚不要搞错
12864为并行方式,PSB跟RST接高电平就行,对比度通过103电位器调背光,可用单片机控制或
用热释电模块控制。
闹钟数据掉电会丢失,可以自己改改程序,用24C02或其它芯片

电路图简单,接线时看程序接或自己接好后改程序的定义
原理图.jpg

所需元器件:
1.单片机最小系统,包括上电复位电路跟时钟电路
2.12864液晶屏1个
3.DS18B20数字温度芯片(三脚)
4.DS1302模块
5.蜂鸣器(有源跟无源各一),三极管8050(3个),103电位器用在12864调对比度
6.按键5个,开关一个,导线若干,烙铁,焊锡,
7.其他自己发挥扩展

0.png

部分单片机代码预览:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"lcd12864.h"
  4. sbit DSPORT=P2^2;         //ds18b20接口
  5. sbit DSIO=P1^1;                 //ds1302接口
  6. sbit RST=P1^2;
  7. sbit SCLK=P1^0;
  8. sbit zz=P1^4;                           //有源蜂鸣器        用三极管8050驱动

  9. sbit wei = P2^6;
  10. sbit duan= P2^7;
  11. sbit s1=P3^0;                          //调节时间
  12. sbit s2=P3^1;                           //加
  13. sbit s3=P3^2;                                 //减
  14. sbit s4=P3^3;                                  //调节闹钟
  15. sbit Beep=P1^7;                        //扬声器   用三极管8050驱动
  16. //---定义全局函数---//
  17. void Ds1302Write(uchar addr, uchar dat);
  18. uchar Ds1302Read(uchar addr);
  19. void Ds1302Init();
  20. void Ds1302ReadTime();

  21. //---加入全局变量--//
  22. uchar timeji=0,n=0,keysun=2;
  23. char SetPlace=-1,naoshi=0x08,naofen=0x00,linsheng=1;                          //参数定义
  24. bit biaozhi=1;
  25. bit biaozhi1=1;
  26. bit naobiao=0;
  27. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  28. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  29. //---DS1302时钟初始化2017年5月23日星期二10点57分00秒。---//
  30. //---存储顺序是秒分时日月周年,存储格式---//
  31. char TIME[7] = {0x00, 0x57, 0x10, 0x23, 0x05, 0x02, 0x17};

  32. void Delay1ms(unsigned int );
  33. unsigned char Ds18b20Init();
  34. void Ds18b20WriteByte(unsigned char com);
  35. unsigned char Ds18b20ReadByte();
  36. void  Ds18b20ChangTemp();
  37. void  Ds18b20ReadTempCom();
  38. int Ds18b20ReadTemp();

  39. uchar code CharCode[]="    调整时间      年  月  日周  时间  点  分  秒   ";
  40. uchar code CharCode1[]="20  -  -    周                                              . ℃";
  41. uchar code xiqi[]="  一二三四五六日开关";
  42. uchar code naozhong[]="  设置闹钟            点  分        铃声选择      ";
  43. uchar code naozhonglinshen[]="1.天空之城      2.月亮代表我的心3.你是风儿我是沙4.莫斯科郊外的晚5.经典铃声  嘀嘀";

  44. //uchar code tab[11][64]={
  45. //{/*--  调入了一幅图像:D:\设计\打印\数字取模图片\0.bmp  --*/
  46. ///*--  宽度x高度=16x32  --*/
  47. //0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,
  48. …………限于本文篇幅 字模请从51黑下载附件…………
  49. //0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}
  50. //};



  51. /******************************************************************************/
  52. //图片数字圆体
  53. /******************************************************************************/
  54. //uchar code tab[12][64]={
  55. //        {// 图片数字0
  56. //         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0E,0x70,
  57. …………限于本文篇幅 字模请从51黑下载附件…………
  58. //     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  59. //};
  60. /******************************************************************************/
  61. //图片数字方体
  62. /******************************************************************************/
  63. uchar code tab[12][64]={
  64.         {// 图片数字0
  65.          0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
  66.         …………限于本文篇幅 字模请下载附件…………
  67.          {// 图片" "
  68.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  69.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  70.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  71.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  72.                                                 };  
  73.          
  74. unsigned int code music_tab[4][201] ={{                                                 //天空之城
  75. 0x39,0x20,0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,
  76. 0x4c,0x40,0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x4c,0x20,
  77. 0x4c,0x20,0x48,0x30,0x4c,0x10,0x48,0x40,0x30,0x40,0x4c,0x80,0x30,0x20,
  78. 0x30,0x20,0x33,0x30,0x48,0x10,0x48,0x40,0x33,0x40,0x33,0x80,0x39,0x20,
  79. 0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,0x4c,0x40,
  80. 0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x55,0x20,0x4c,0x20,
  81. 0x48,0x40,0x30,0x20,0x33,0x30,0x30,0x20,0x2b,0x10,0x2b,0x30,0x26,0x10,
  82. 0x30,0x80,0x30,0x20,0x33,0x20,0x39,0x20,0x39,0x20,0x33,0x20,0x40,0x20,
  83. 0x39,0x80,0x30,0x20,0x2b,0x20,0x26,0x30,0x2b,0x10,0x26,0x40,0x20,0x40,
  84. 0x2b,0xc0,0x30,0x40,0x30,0x20,0x33,0x20,0x30,0x40,0x26,0x40,0x26,0xc0,
  85. 0x33,0x20,0x30,0x40,0x33,0x20,0x30,0x20,0x2b,0x40,0x30,0x60,0x00,0x00,
  86. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  89. 0x00,0x00,0x00,0x00,0x00},
  90. {                                                           //月亮代表我的心
  91. 0x40,0x20,0x30,0x60,0x26,0x20,0x20,0x60,0x30,0x20,0x33,0x60,0x26,0x20,
  92. 0x20,0x60,0x20,0x20,0x1c,0x60,0x19,0x20,0x20,0xc0,0x26,0x20,0x2b,0x20,
  93. 0x30,0x60,0x30,0x10,0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
  94. 0x30,0x40,0x2b,0x20,0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x30,0xc0,
  95. 0x26,0x40,0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,
  96. 0x33,0x20,0x39,0x60,0x33,0x10,0x39,0x60,0x40,0x10,0x26,0xc0,0x20,0x40,
  97. 0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,0x33,0x20,
  98. 0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x40,0x2b,0xc0,0x40,0x20,0x30,0x60,
  99. 0x26,0x10,0x20,0x60,0x30,0x10,0x33,0x60,0x26,0x10,0x20,0x60,0x20,0x10,
  100. 0x1c,0x60,0x19,0x10,0x20,0x80,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
  101. 0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x20,
  102. 0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x2b,0x40,0x30,0xc0,0x00,0x00,
  103. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  104. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  105. 0x00,0x00,0x00,0x00,0x00},
  106. {                                                                //你是风儿我是沙
  107. 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
  108. 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x26,0x20,0x26,0xc0,
  109. 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
  110. 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x30,0x20,0x30,0xc0,
  111. 0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x26,0x10,0x2b,0x10,0x30,0x20,
  112. 0x39,0x20,0x30,0x60,0x2b,0x10,0x26,0x80,0x2b,0x10,0x26,0x10,0x39,0x60,
  113. 0x2b,0x10,0x24,0x60,0x2b,0x10,0x26,0x20,0x26,0x60,0x30,0x60,0x39,0x10,
  114. 0x40,0x80,0x30,0x20,0x39,0x20,0x39,0x20,0x30,0x20,0x26,0x20,0x26,0x20,
  115. 0x26,0x20,0x26,0x20,0x2b,0x40,0x39,0x20,0x2b,0x60,0x30,0x20,0x39,0x20,
  116. 0x39,0x20,0x39,0x20,0x30,0x20,0x2b,0x20,0x2b,0x20,0x2b,0x20,0x26,0x40,
  117. 0x2b,0x20,0x30,0x80,0x26,0x20,0x20,0x20,0x18,0x20,0x1c,0x80,0x1c,0x30,
  118. 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
  119. 0x26,0x20,0x26,0x80,0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,
  120. 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
  121. 0x26,0x20,0x26,0xc0,0x00,},
  122. {                                                                        //                        莫斯科郊外的晚上
  123. };
  124. void jiemian();
  125. void LcdDisplay(int temp);
  126. void display();
  127. void zhudisplay();
  128. void TimerConfiguration();
  129. void key();
  130. void naoxian();
  131. void didi();
  132. void naoxianguangbiao();
  133. void linshengbofang();
  134. void sfmxiangao(uchar add,uchar bata);
  135. void sfmxiandi(uchar acc,uchar datb);
  136. void zhujiemian();
  137. void shua_display();
  138. void nyrdisplay();
  139. void delay (unsigned char m);   //控制频率延时   
  140. void delayms(unsigned char a);  //豪秒延时子程序   
  141. void main()
  142. {        


  143.         wei = 0;
  144.         duan = 0;
  145.         zz=0;
  146.         Beep=0;
  147.         LCD12864_ClearScreen();          //清CGrom
  148.         LCD12864_WriteCmd(0x01);  //清屏
  149.         LCD12864_Init();
  150.         Ds1302Init();                        //原来的程序,没有调用1302初始化,上电不走时
  151.         zhujiemian();
  152.         TimerConfiguration();
  153.         while(1)
  154.         {
  155.                  key();
  156.                 if(biaozhi1==1)
  157.                 {
  158.                     LcdDisplay(Ds18b20ReadTemp());          //温度显示放在这里,刷新显示就正常了
  159.                         shua_display();
  160.                         if(biaozhi==0)
  161.                         {
  162.                                 biaozhi=1;
  163. //                                LcdDisplay(Ds18b20ReadTemp());        //温度显示放在这里,刷新很慢
  164.                         }
  165.                         if((naoshi==TIME[2])&&(naofen==TIME[1])&&(naobiao==1))//闹钟
  166.                         {
  167.                                 if(linsheng<5)
  168.                                 {
  169.                                         linshengbofang();
  170.                                 }
  171.                                 if(linsheng==5)
  172.                                 {
  173.                                          didi();
  174.                                 }
  175.                         }               
  176.                 }               
  177.         }        
  178. }
  179. void nyrdisplay()                  //年月日显示函数
  180. {
  181.         LCD12864_SetWindow(0, 1);                                                //第1行,第2列
  182.         LCD12864_WriteData(0x30+TIME[6]/16);                        //        年
  183.         LCD12864_WriteData(0x30+(TIME[6]&0x0f));
  184.         LCD12864_WriteData(0x2d);                                                //显示‘-’
  185.         LCD12864_WriteData(0x30+TIME[4]/16);                        //月
  186.         LCD12864_WriteData(0x30+(TIME[4]&0x0f));
  187.         LCD12864_WriteData(0x2d);                                                //显示‘-’
  188.         LCD12864_WriteData(0x30+TIME[3]/16);                        //日
  189.         LCD12864_WriteData(0x30+(TIME[3]&0x0f));
  190.         LCD12864_SetWindow(0, 7);                                                //第1行,第8列
  191.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]);                //星期
  192.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
  193. }
  194. void zhujiemian()                                //主界面
  195. {
  196.         unsigned char i=0,j=0,k=0;
  197.         LCD12864_SetWindow(0, 0);
  198.         while(CharCode1[i]!='\0')
  199.         {                        
  200.                 LCD12864_WriteData(CharCode1[i]);
  201.                 i++;
  202.                 if(i==16)  //第一行满写第三行
  203.                 {
  204.                         LCD12864_SetWindow(1,0);
  205.                 }
  206.                 if(i==32)  //第三行满写第四行
  207.                 {
  208.                         LCD12864_SetWindow(2,0);
  209.                 }
  210.                 if(i==48)  //第三行满写第四行
  211.                 {
  212.                         LCD12864_SetWindow(3,0);
  213.                 }                        
  214.         }
  215.         zhudisplay();
  216.         LCD12864_WriteCmd(0x36);          //开启拓展指令集
  217.         for(i=0;i<16;i++)
  218.         {
  219.                 LCD12864_WriteCmd(0x90+i);
  220.                 LCD12864_WriteCmd(0x90+2);
  221.                 LCD12864_WriteData(tab[10][j++]);
  222.                 LCD12864_WriteData(tab[10][j++]);                 //显示笑脸
  223.                 LCD12864_WriteCmd(0x90+i);
  224.                 LCD12864_WriteCmd(0x90+5);
  225.                 LCD12864_WriteData(tab[10][k++]);
  226.                 LCD12864_WriteData(tab[10][k++]);
  227.         }
  228.         for(i=0;i<16;i++)
  229.         {
  230.                 LCD12864_WriteCmd(0x80+i);
  231.                 LCD12864_WriteCmd(0x98+2);
  232.                 LCD12864_WriteData(tab[10][j++]);          //显示笑脸
  233.                 LCD12864_WriteData(tab[10][j++]);
  234.                 LCD12864_WriteCmd(0x80+i);
  235.                 LCD12864_WriteCmd(0x98+5);
  236.                 LCD12864_WriteData(tab[10][k++]);
  237.                 LCD12864_WriteData(tab[10][k++]);        
  238.         }
  239.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  240. }
  241. void shua_display()
  242. {
  243.         Ds1302ReadTime();
  244.         if((TIME[2]==0x00)&&(TIME[0]<=5))
  245.                 nyrdisplay();
  246.         if((TIME[1]==0x00)&&(TIME[0]<=3))
  247.         {
  248.                 if((TIME[2]&0x0f)==0)
  249.                 sfmxiangao(0,TIME[2]);
  250.                 sfmxiandi(1,TIME[2]);                //时
  251.                 didi();         //整点报时
  252.         }
  253.         if(TIME[0]<=2)
  254.         {
  255.                 if((TIME[1]&0x0f)==0)
  256.                 sfmxiangao(3,TIME[1]);           //分
  257.                 sfmxiandi(4,TIME[1]);
  258.         }
  259.                 if((TIME[0]&0x0f)==0)        
  260.                 sfmxiangao(6,TIME[0]);           //秒
  261.                 sfmxiandi(7,TIME[0]);               
  262. }
  263. void zhudisplay()
  264. {
  265.         Ds1302ReadTime();
  266.         nyrdisplay();
  267.         sfmxiangao(0,TIME[2]);
  268.         sfmxiandi(1,TIME[2]);                //时
  269.         sfmxiangao(3,TIME[1]);           //分
  270.         sfmxiandi(4,TIME[1]);        
  271.         sfmxiangao(6,TIME[0]);           //秒
  272.         sfmxiandi(7,TIME[0]);        
  273. }      
  274. void int1()  interrupt 3   //采用定时中断1 控制节拍   
  275. {  TH1=0xd8;   
  276.    TL1=0xef;   
  277.    n--;   
  278. }   
  279. void delay (unsigned char m)   //控制频率延时   
  280. {   
  281. unsigned i=3*m;   
  282. while(--i);   
  283. }      
  284. void delayms(unsigned char a)  //豪秒延时子程序   
  285. {   
  286.   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!   
  287. }      
  288. void linshengbofang()   
  289. { unsigned char p=0,m;   //m为频率常数变量   
  290.   unsigned char i=0,j;      
  291.   for(j=0;j<150;j++)   
  292.     {   
  293.      a:p=music_tab[linsheng][i];   
  294.        if(p==0x00)       { i=0, delayms(1000); return;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  295.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符   
  296.             else         {m=music_tab[linsheng-1][i++], n=music_tab[linsheng-1][i++];}  //取频率常数 和 节拍常数   
  297.              TR1=1;                                             //开定时器1   
  298.            while(n!=0) Beep=~Beep,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  299.        TR1=0;                                             //关定时器1   
  300.     }   
  301. }
  302. void naojie()
  303. {
  304.         unsigned char i=0;
  305.         LCD12864_SetWindow(0, 0);
  306.         while(naozhong[i]!='\0')
  307.         {                        
  308.                 LCD12864_WriteData(naozhong[i]);
  309.                 i++;
  310.                 if(i==16)  //第一行满写第三行
  311.                         LCD12864_SetWindow(1,0);
  312.                 if(i==32)  //第三行满写第四行
  313.                         LCD12864_SetWindow(2,0);
  314.                 if(i==48)  //第三行满写第四行
  315.                         LCD12864_SetWindow(3,0);
  316.         }
  317. }
  318. void naoxianguangbiao()          //闹 显  光标闪烁
  319. {
  320.         if(SetPlace==0)
  321.                  LCD12864_SetWindow(2, 6);         //秒光标闪烁          第3行,第7列
  322.         if(SetPlace==1)
  323.                 LCD12864_SetWindow(2, 4);         //分光标闪烁          第3行 第5列
  324.         if(SetPlace==2)
  325.                  LCD12864_SetWindow(2, 2);         //时光标闪烁           第3行 第3列
  326.         if(SetPlace==3)
  327.                  LCD12864_SetWindow(1, 4);         //日光标闪烁           第2行 第5列
  328.         if(SetPlace==4)
  329.                  LCD12864_SetWindow(1, 2);         //月光标闪烁           第2行 第3列
  330.         if(SetPlace==5)
  331.                  LCD12864_SetWindow(1, 7);        //星期光标闪烁           第2行 第8列


  332.         if(SetPlace==6)
  333.                  LCD12864_SetWindow(1, 0);         //年光标闪烁           第2行 第1列

  334.         if(SetPlace==8)           //闹钟设置
  335.                  LCD12864_SetWindow(0, 6);
  336.         if(SetPlace==9)
  337.                 LCD12864_SetWindow(1, 2);
  338.         if(SetPlace==10)
  339.                  LCD12864_SetWindow(1, 4);
  340.         if(SetPlace==11)
  341.                 LCD12864_SetWindow(3, 0);
  342. }
  343. void sfmxiangao(uchar add,uchar bata)
  344. {
  345.         uchar i,j=0;
  346.         LCD12864_WriteCmd(0x36);          //开启拓展指令集
  347.         for(i=0;i<16;i++)
  348.         {
  349.                 LCD12864_WriteCmd(0x90+i);
  350.                 LCD12864_WriteCmd(0x90+add);
  351.                 LCD12864_WriteData(tab[bata/16][j++]);
  352.                 LCD12864_WriteData(tab[bata/16][j++]);
  353.         }
  354.         for(i=0;i<16;i++)
  355.         {
  356.                 LCD12864_WriteCmd(0x80+i);
  357.                 LCD12864_WriteCmd(0x98+add);
  358.                 LCD12864_WriteData(tab[bata/16][j++]);
  359.                 LCD12864_WriteData(tab[bata/16][j++]);        
  360.         }
  361.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  362. }
  363. void sfmxiandi(uchar acc,uchar datb)
  364. {
  365.         uchar i,j=0;
  366.         LCD12864_WriteCmd(0x36);          //开启拓展指令集
  367.         for(i=0;i<16;i++)
  368.         {
  369.                 LCD12864_WriteCmd(0x90+i);
  370.                 LCD12864_WriteCmd(0x90+acc);
  371.                 LCD12864_WriteData(tab[datb&0x0f][j++]);
  372.                 LCD12864_WriteData(tab[datb&0x0f][j++]);
  373.         }
  374.         for(i=0;i<16;i++)
  375.         {
  376.                 LCD12864_WriteCmd(0x80+i);
  377.                 LCD12864_WriteCmd(0x98+acc);
  378.                 LCD12864_WriteData(tab[datb&0x0f][j++]);
  379.                 LCD12864_WriteData(tab[datb&0x0f][j++]);        
  380.         }
  381.         LCD12864_WriteCmd(0x30);         //恢复基本指令集
  382. }
  383. void shixian()                           //调节时间显示
  384. {
  385.         if(SetPlace==0)
  386.         {
  387.                 LCD12864_WriteData(0x30+(TIME[0]/16));                                //秒
  388.                 LCD12864_WriteData(0x30+(TIME[0]&0x0f));
  389.                 LCD12864_SetWindow(2, 6); //第3行,第7列
  390.         }
  391.         if(SetPlace==1)
  392.         {
  393.                 LCD12864_WriteData(0x30+(TIME[1]/16));                                //分
  394.                 LCD12864_WriteData(0x30+(TIME[1]&0x0f));
  395.                 LCD12864_SetWindow(2, 4); //第3行,第5列        
  396.         }
  397.         if(SetPlace==2)
  398.         {
  399.                 LCD12864_WriteData(0x30+(TIME[2]/16));                                //时
  400.                 LCD12864_WriteData(0x30+(TIME[2]&0x0f));
  401.                 LCD12864_SetWindow(2, 2);//第3行,第3 列                                 
  402.         }
  403.         if(SetPlace==3)
  404.         {
  405.                 LCD12864_WriteData(0x30+(TIME[3]/16));                        //日
  406.                 LCD12864_WriteData(0x30+(TIME[3]&0x0f));
  407.                  LCD12864_SetWindow(1, 4);//第2行,第5列
  408.         }
  409.         if(SetPlace==4)
  410.         {
  411.                 LCD12864_WriteData(0x30+(TIME[4]/16));                        //月
  412.                 LCD12864_WriteData(0x30+(TIME[4]&0x0f));
  413.                  LCD12864_SetWindow(1, 2); //第2行,第3列
  414.         }
  415.         if(SetPlace==5)
  416.         {
  417.                 LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]);        //星期
  418.                 LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
  419.                 LCD12864_SetWindow(1, 7); //第2行,第8列
  420.         }

  421.         if(SetPlace==6)
  422.         {
  423.                 LCD12864_WriteData(0x30+(TIME[6]/16));                        //年
  424.                 LCD12864_WriteData(0x30+(TIME[6]&0x0f));
  425.                  LCD12864_SetWindow(1, 0);// 第2行,第1列
  426.         }

  427. }
  428. void naoxian()                          //调节闹钟 显示
  429. {
  430.         uchar zishu=0;
  431.         if(SetPlace==8)           //闹钟设置
  432.         {
  433.                  LCD12864_SetWindow(0, 6);
  434.         }
  435.         if(SetPlace==9)
  436.         {
  437.                 LCD12864_WriteData(0x30+(naoshi/16));                                //时
  438.                 LCD12864_WriteData(0x30+(naoshi&0x0f));
  439.                 LCD12864_SetWindow(1, 2);
  440.         }
  441.         if(SetPlace==10)
  442.         {
  443.                 LCD12864_WriteData(0x30+(naofen/16));                                //分
  444.                 LCD12864_WriteData(0x30+(naofen&0x0f));
  445.                  LCD12864_SetWindow(1, 4);
  446.         }
  447.         if(SetPlace==11)
  448.         {        
  449.                  if(linsheng==1)                                         //显示铃声名字
  450.                 {
  451.                         for(zishu=0;zishu<16;zishu++)
  452.                         {
  453.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  454.                         }
  455.                 }                        
  456.                 if(linsheng==2)
  457.                         for(zishu=16;zishu<32;zishu++)
  458.                         {
  459.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  460.                         }                        
  461.                 if(linsheng==3)
  462.                         for(zishu=32;zishu<48;zishu++)
  463.                         {
  464.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  465.                         }                        
  466.                 if(linsheng==4)
  467.                         for(zishu=48;zishu<64;zishu++)
  468.                         {
  469.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  470.                         }
  471.                 if(linsheng==5)
  472.                         for(zishu=64;zishu<80;zishu++)
  473.                         {
  474.                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  475.                         }
  476.                         LCD12864_SetWindow(3, 0);
  477.         }
  478. }
  479. void didi()
  480. {
  481.         zz=1;
  482.         Delay1ms(80);
  483.         zz=0;
  484.         Delay1ms(80);
  485.         zz=1;
  486.         Delay1ms(80);
  487.         zz=0;
  488.         Delay1ms(80);
  489.         zz=1;
  490.         Delay1ms(80);
  491.         zz=0;
  492.         Delay1ms(80);
  493.         zz=1;
  494.         Delay1ms(200);
  495.         zz=0;

  496. }
  497. void key()
  498. {
  499.         uchar zishu=0;
  500.         if(s1==0)                //检测按键K1是否按下
  501.         {
  502.                 Delay1ms(10);        //消除抖动
  503.                 if((s1==0)&&(keysun>=2))
  504.                 {
  505.                         while(s1==0);                //松手检测
  506.                         if(SetPlace==-1)
  507.                         {
  508.                                 LCD12864_WriteCmd(0x01);   //清屏
  509.                                 biaozhi1=0;
  510.                                 keysun=3;
  511.                                 jiemian();
  512.                                 display();
  513.                         }
  514.                         SetPlace++;
  515.                         LCD12864_WriteCmd(0x0f);  //显示开,开光标
  516.                         if(SetPlace==7)
  517.                         {
  518.                                 LCD12864_WriteCmd(0x0c);  //显示开,关光标        
  519.                                 SetPlace=-1;keysun=2;
  520.                                 biaozhi1=1;
  521.                                 Ds1302Init();
  522.                                 zhujiemian();
  523.                         }
  524.                         naoxianguangbiao();                                       
  525.                 }
  526.         }
  527.         if(s4==0)                                                  //闹钟设置
  528.         {
  529.                 Delay1ms(10);
  530.                 if((s4==0)&&(keysun<=2))
  531.                 {
  532.                         while(s4==0);                //松手检测
  533.                         biaozhi1=0;
  534.                         keysun=1;
  535.                         if(SetPlace==-1)
  536.                         {
  537.                                 LCD12864_WriteCmd(0x01);
  538.                                 naojie();
  539.                                 SetPlace=7;
  540.                                 LCD12864_SetWindow(0, 6);
  541.                                 if(naobiao==0)
  542.                                 {
  543.                                         LCD12864_WriteData(xiqi[18]);
  544.                                         LCD12864_WriteData(xiqi[19]);          //显示关
  545.                                 }
  546.                                 else
  547.                                 {
  548.                                         LCD12864_WriteData(xiqi[16]);
  549.                                         LCD12864_WriteData(xiqi[17]);         //显示开
  550.                                 }
  551.                                 LCD12864_SetWindow(1, 2);        
  552.                                 LCD12864_WriteData(0x30+(naoshi/16));                                //时
  553.                                 LCD12864_WriteData(0x30+(naoshi&0x0f));
  554.                                 LCD12864_SetWindow(1, 4);
  555.                                 LCD12864_WriteData(0x30+(naofen/16));                                //分
  556.                                 LCD12864_WriteData(0x30+(naofen&0x0f));
  557.                                 LCD12864_SetWindow(3, 0);
  558.                                  if(linsheng==1)
  559.                                 {
  560.                                         for(zishu=0;zishu<16;zishu++)
  561.                                         {
  562.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  563.                                         }
  564.                                 }                        
  565.                                 if(linsheng==2)
  566.                                         for(zishu=16;zishu<32;zishu++)
  567.                                         {
  568.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  569.                                         }                        
  570.                                 if(linsheng==3)
  571.                                         for(zishu=32;zishu<48;zishu++)
  572.                                         {
  573.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  574.                                         }                        
  575.                                 if(linsheng==4)
  576.                                         for(zishu=48;zishu<64;zishu++)
  577.                                         {
  578.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  579.                                         }
  580.                                 if(linsheng==5)
  581.                                         for(zishu=64;zishu<80;zishu++)
  582.                                         {
  583.                                                 LCD12864_WriteData(naozhonglinshen[zishu]);
  584.                                         }
  585.                         }
  586.                         SetPlace++;
  587.                         LCD12864_WriteCmd(0x0f);  //显示开,开光标
  588.                         if(SetPlace>=12)
  589.                         {
  590.                                 LCD12864_WriteCmd(0x0c);  //显示开,关光标        
  591.                                 SetPlace=-1;keysun=2;
  592.                                 biaozhi1=1;
  593.                                 LCD12864_WriteCmd(0x01);
  594.                                 zhujiemian();
  595.                         }
  596.                         naoxianguangbiao();
  597.                         naoxian();
  598.                 }
  599.         }
  600.         if(biaozhi1==0)
  601.         {
  602.                 if(s2==0)                //检测按键K2是否按下
  603.                 {
  604.                         Delay1ms(10);        //消除抖动
  605.                         if(s2==0)
  606.                         {
  607.                                 while(s2==0);         //松手检测
  608.                                 if(SetPlace<=7)
  609.                                 {
  610.                                         TIME[SetPlace]++;
  611.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  612.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  613.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  614.                                                 TIME[SetPlace]=0;
  615.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  616.                                                 TIME[SetPlace]=0;
  617.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  618.                                                 TIME[SetPlace]=1;        
  619.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  620.                                                 TIME[SetPlace]=1;
  621.                                         if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                //周只能到7
  622.                                                 TIME[SetPlace]=1;

  623.                                         if((TIME[SetPlace]>=0x99)&&(SetPlace==6))                //年只能到99
  624.                                                 TIME[SetPlace]=1;



  625.                                 }
  626.                                 else
  627.                                 {
  628.                                         if(SetPlace==8)
  629.                                         {
  630.                                                 naobiao=~naobiao;
  631.                                                 if(naobiao==0)
  632.                                                 {
  633.                                                         LCD12864_WriteData(xiqi[18]);
  634.                                                         LCD12864_WriteData(xiqi[19]);
  635.                                                 }
  636.                                                 else
  637.                                                 {
  638.                                                         LCD12864_WriteData(xiqi[16]);
  639.                                                         LCD12864_WriteData(xiqi[17]);
  640.                                                 }
  641.                                         }
  642.                                         if(SetPlace==9)
  643.                                         {
  644.                                                 naoshi++;
  645.                                                 if((naoshi&0x0f)>9)                                         //换成BCD码。
  646.                                                         naoshi=naoshi+6;
  647.                                                 if(naoshi>=0x24)
  648.                                                         naoshi=0;
  649.                                         }
  650.                                         if(SetPlace==10)
  651.                                         {
  652.                                                 naofen++;
  653.                                                 if((naofen&0x0f)>9)                                         //换成BCD码。
  654.                                                         naofen=naofen+6;
  655.                                                 if(naofen>=0x60)
  656.                                                 naofen=0;
  657.                                         }
  658.                                         if(SetPlace==11)
  659.                                         {
  660.                                                 linsheng++;
  661.                                                 if(linsheng==6)
  662.                                                 linsheng=1;
  663.                                         }

  664.                                 }                        
  665.                         }
  666.                         shixian();
  667.                         naoxian();
  668.                 }
  669.                 if(s3==0)                //检测按键K3是否按下
  670.                 {
  671.                         Delay1ms(10);        //消除抖动
  672.                         if(s3==0)
  673.                         {
  674.                                 while(s3==0);     //松手检测
  675.                                 if(SetPlace<=7)
  676.                                 {
  677.                                         TIME[SetPlace]--;
  678.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  679.                                                 TIME[SetPlace]=TIME[SetPlace]-6;
  680.                                         if((TIME[SetPlace]<=-1)&&(SetPlace<2))                //分秒只能到59
  681.                                                 TIME[SetPlace]=0x59;
  682.                                         if((TIME[SetPlace]<=-1)&&(SetPlace==2))                //小时只能到23
  683.                                                 TIME[SetPlace]=0x23;
  684.                                         if((TIME[SetPlace]<=0)&&(SetPlace==3))                //日只能到31
  685.                                                 TIME[SetPlace]=0x31;        
  686.                                         if((TIME[SetPlace]<=0)&&(SetPlace==4))                //月只能到12
  687.                                                 TIME[SetPlace]=0x12;
  688.                                         if((TIME[SetPlace]<=0)&&(SetPlace==5))                //周只能到7
  689.                                                 TIME[SetPlace]=7;
  690.                                         if((TIME[SetPlace]<=0)&&(SetPlace==6))                //年只能到99
  691.                                                 TIME[SetPlace]=0x99;


  692.                                 }
  693.                                 else
  694.                                 {
  695.                                         if(SetPlace==8)
  696.                                         {
  697.                                                 naobiao=~naobiao;
  698.                                                 if(naobiao==0)
  699.                                                 {
  700.                                                         LCD12864_WriteData(xiqi[18]);
  701.                                                         LCD12864_WriteData(xiqi[19]);          //显示开关
  702.                                                 }
  703.                                                 else
  704.                                                 {
  705.                                                         LCD12864_WriteData(xiqi[16]);
  706.                                                         LCD12864_WriteData(xiqi[17]);         //显示开关
  707.                                                 }
  708.                                         }
  709.                                         if(SetPlace==9)                         //闹钟时
  710.                                         {
  711.                                                 naoshi--;
  712.                                                 if((naoshi&0x0f)>9)                                         //换成BCD码。
  713.                                                         naoshi=naoshi-6;
  714.                                                 if(naoshi<0)
  715.                                                 naoshi=0x23;
  716.                                         }
  717.                                         if(SetPlace==10)         //闹钟分
  718.                                         {
  719.                                                 naofen--;
  720.                                                 if((naofen&0x0f)>9)                                         //换成BCD码。
  721.                                                         naofen=naofen-6;
  722.                                                 if(naofen<0)
  723.                                                 naofen=0x59;
  724.                                         }
  725.                                         if(SetPlace==11)        //铃声选择
  726.                                         {
  727.                                                 linsheng--;
  728.                                                 if(linsheng==0)
  729.                                                 linsheng=5;
  730.                                         }
  731.                                 }                        
  732.                         }
  733.                         naoxian();
  734.                         shixian();
  735.                 }
  736.         }                                
  737. }
  738. void jiemian()                          //界面
  739. {        
  740.         unsigned char i=0;
  741.         LCD12864_SetWindow(0, 0);
  742.         while(CharCode[i]!='\0')
  743.         {                        
  744.                 LCD12864_WriteData(CharCode[i]);
  745.                 i++;
  746.                 if(i==16)  //第一行满写第二行
  747.                         LCD12864_SetWindow(1,0);
  748.                 if(i==32)  //第二行满写第三行
  749.                         LCD12864_SetWindow(2,0);
  750.                 if(i==48)  //第三行满写第四行
  751.                         LCD12864_SetWindow(3,0);                        
  752.         }
  753. }
  754. void Delay1ms(unsigned int y)
  755. {
  756.         unsigned int x;
  757.         for(y;y>0;y--)
  758.                 for(x=110;x>0;x--);
  759. }
  760. /*******************************************************************************
  761. * 函数名         : Ds18b20Init
  762. * 函数功能                   : 初始化
  763. * 输入           : 无
  764. * 输出                  : 初始化成功返回1,失败返回0
  765. *******************************************************************************/
  766. unsigned char Ds18b20Init()
  767. {
  768.         unsigned int i;
  769.         DSPORT=0;                         //将总线拉低480us~960us
  770.         i=70;        
  771.         while(i--);//延时642us
  772.         DSPORT=1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  773.         i=0;
  774.         while(DSPORT)        //等待DS18B20拉低总线
  775.         {
  776.                 i++;
  777.                 if(i>5000)//等待>5MS
  778.                         return 0;//初始化失败        
  779.         }
  780.         return 1;//初始化成功
  781. }
  782. /*******************************************************************************
  783. * 函数名         : Ds18b20WriteByte
  784. * 函数功能                   : 向18B20写入一个字节
  785. * 输入           : com
  786. * 输出                  : 无
  787. *******************************************************************************/
  788. void Ds18b20WriteByte(unsigned char dat)
  789. {
  790.         unsigned int i,j;
  791.         for(j=0;j<8;j++)
  792.         {
  793.                 DSPORT=0;                        //每写入一位数据之前先把总线拉低1us
  794.                 i++;
  795.                 DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
  796.                 i=6;
  797.                 while(i--); //延时68us,持续时间最少60us
  798.                 DSPORT=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  799.                 dat>>=1;
  800.         }
  801. }
  802. /*******************************************************************************
  803. * 函数名         : Ds18b20ReadByte
  804. * 函数功能                   : 读取一个字节
  805. * 输入           : com
  806. * 输出                  : 无
  807. *******************************************************************************/
  808. unsigned char Ds18b20ReadByte()
  809. {
  810.         unsigned char byte,bi;
  811.         unsigned int i,j;        
  812.         for(j=8;j>0;j--)
  813.         {
  814.                 DSPORT=0;//先将总线拉低1us
  815.                 i++;
  816.                 DSPORT=1;//然后释放总线
  817.                 i++;
  818.                 i++;//延时6us等待数据稳定
  819.                 bi=DSPORT;         //读取数据,从最低位开始读取
  820.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  821.                 byte=(byte>>1)|(bi<<7);                                                  
  822.                 i=4;                //读取完之后等待48us再接着读取下一个数
  823.                 while(i--);
  824.         }                                
  825.         return byte;
  826. }
  827. /*******************************************************************************
  828. * 函数名         : Ds18b20ChangTemp
  829. * 函数功能                   : 让18b20开始转换温度
  830. * 输入           : com
  831. * 输出                  : 无
  832. *******************************************************************************/
  833. void  Ds18b20ChangTemp()
  834. {
  835.         Ds18b20Init();
  836.         Delay1ms(1);
  837.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  838.         Ds18b20WriteByte(0x44);            //温度转换命令
  839. //        Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了  
  840. }
  841. /*******************************************************************************
  842. * 函数名         : Ds18b20ReadTempCom
  843. * 函数功能                   : 发送读取温度命令
  844. * 输入           : com
  845. * 输出                  : 无
  846. *******************************************************************************/
  847. void  Ds18b20ReadTempCom()
  848. {        
  849.         Ds18b20Init();
  850.         Delay1ms(1);
  851.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  852.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  853. }
  854. /*******************************************************************************
  855. * 函数名         : Ds18b20ReadTemp
  856. * 函数功能                   : 读取温度
  857. * 输入           : com
  858. * 输出                  : 无
  859. *******************************************************************************/

  860. int Ds18b20ReadTemp()
  861. {
  862.         int temp=0;
  863.         unsigned char tmh,tml;
  864.         Ds18b20ChangTemp();                                 //先写入转换命令
  865.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  866.         tml=Ds18b20ReadByte();                //读取温度值共16位,先读低字节
  867.         tmh=Ds18b20ReadByte();                //再读高字节
  868.         temp=tmh;
  869.         temp<<=8;
  870.         temp|=tml;
  871.         return temp;

  872. }
  873. void LcdDisplay(int temp)          //lcd显示
  874. {
  875.    
  876.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
  877.         float tp;  
  878.         if(temp< 0)                                //当温度值为负数
  879.           {
  880.                 LCD12864_SetWindow(3, 5);        //第4行,第6列
  881.             LCD12864_WriteData(0x2d);                  //显示负
  882.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  883.                 temp=temp-1;
  884.                 temp=~temp;
  885.                 tp=temp;
  886.                 temp=tp*0.0625*100+0.5;        
  887.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  888.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  889.                 //算由0.5,还是在小数点后面。
  890.                 datas[2] = temp % 1000 / 100;
  891.                 datas[3] = temp % 100 / 10;               
  892.                          //写地址 80表示初始地址
  893.                 LCD12864_WriteData(0x30+datas[2]); //个位
  894.                 LCD12864_WriteData(0x2e);                 //显示 ‘.’
  895.                 LCD12864_WriteData(0x30+datas[3]); //显示小数点

  896.           }
  897.          else
  898.           {                        
  899.                 LCD12864_SetWindow(3, 5);        //第4行,第6列
  900.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  901.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  902.                 temp=tp*0.0625*100+0.5;        
  903.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  904.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  905.                 //算加上0.5,还是在小数点后面。
  906.         
  907.                 datas[1] = temp % 10000 / 1000;
  908.                 datas[2] = temp % 1000 / 100;
  909.                 datas[3] = temp % 100 / 10;

  910.                
  911.                          //写地址
  912.                 LCD12864_WriteData(0x30+datas[1]); //十位
  913.                 LCD12864_WriteData(0x30+datas[2]); //个位
  914.                 LCD12864_WriteData(0x2e);                 //显示 ‘.’
  915.                 LCD12864_WriteData(0x30+datas[3]); //显示小数点
  916.         }
  917. }
  918. void Ds1302Write(uchar addr, uchar dat)
  919. {
  920.         uchar n;
  921.         RST = 0;
  922.         _nop_();

  923.         SCLK = 0;//先将SCLK置低电平。
  924.         _nop_();
  925.         RST = 1; //然后将RST(CE)置高电平。
  926.         _nop_();

  927.         for (n=0; n<8; n++)//开始传送八位地址命令
  928.         {
  929.                 DSIO = addr & 0x01;//数据从低位开始传送
  930.                 addr >>= 1;
  931.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  932.                 _nop_();
  933.                 SCLK = 0;
  934.                 _nop_();
  935.         }
  936.         for (n=0; n<8; n++)//写入8位数据
  937.         {
  938.                 DSIO = dat & 0x01;
  939.                 dat >>= 1;
  940.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  941.                 _nop_();
  942.                 SCLK = 0;
  943.                 _nop_();        
  944.         }        
  945.                  
  946.         RST = 0;//传送数据结束
  947.         _nop_();
  948. }
  949. uchar Ds1302Read(uchar addr)
  950. {
  951.         uchar n,dat,dat1;
  952.         RST = 0;
  953.         _nop_();

  954.         SCLK = 0;//先将SCLK置低电平。
  955.         _nop_();
  956.         RST = 1;//然后将RST(CE)置高电平。
  957.         _nop_();

  958.         for(n=0; n<8; n++)//开始传送八位地址命令
  959.         {
  960.                 DSIO = addr & 0x01;//数据从低位开始传送
  961.                 addr >>= 1;
  962.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  963.                 _nop_();
  964.                 SCLK = 0;//DS1302下降沿时,放置数据
  965.                 _nop_();
  966.         }
  967.         _nop_();
  968.         for(n=0; n<8; n++)//读取8位数据
  969.         {
  970.                 dat1 = DSIO;//从最低位开始接收
  971.                 dat = (dat>>1) | (dat1<<7);
  972.                 SCLK = 1;
  973.                 _nop_();
  974.                 SCLK = 0;//DS1302下降沿时,放置数据
  975.                 _nop_();
  976.         }

  977.         RST = 0;
  978.         _nop_();        //以下为DS1302复位的稳定时间,必须的。
  979.         SCLK = 1;
  980.         _nop_();
  981.         DSIO = 0;
  982.         _nop_();
  983.         DSIO = 1;
  984.         _nop_();
  985.         return dat;        
  986. }

  987. void Ds1302Init()
  988. {
  989.         uchar n;
  990.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  991.         for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  992.         {
  993.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  994.         }
  995.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  996. }
  997. void Ds1302ReadTime()
  998. {
  999.         uchar n;
  1000.         for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  1001.         {
  1002.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  1003.         }               
  1004. }
  1005. void TimerConfiguration()
  1006. {
  1007.     TMOD = 0x11; //选择工作方式1
  1008.     TH0 = 0x3C;         //设置初始值,定时50MS
  1009.     TL0 = 0xB0;
  1010.     EA = 1;                         //打开总中断
  1011.     ET0 = 1;                 //打开定时器0中断
  1012.     TR0 = 1;                 //启动定时器0
  1013.         zz=0;//关蜂鸣器     
  1014.          TH1=0xd8;TL1=0xef;   
  1015.         ET1=1;
  1016. }
  1017. void Timer0() interrupt 1
  1018. {
  1019.         TH0 = 0x3C;         //设置初始值
  1020.     TL0 = 0xB0;
  1021.         timeji++;
  1022.         if(timeji==200)
  1023.         {
  1024.                 timeji=0;
  1025.                 biaozhi=0;        
  1026.         }
  1027. }

  1028. void display()
  1029. {
  1030.         LCD12864_SetWindow(1, 0);
  1031.         LCD12864_WriteData(0x30+TIME[6]/16);                        //        年
  1032.         LCD12864_WriteData(0x30+(TIME[6]&0x0f));
  1033.         LCD12864_SetWindow(1, 2);
  1034.         LCD12864_WriteData(0x30+TIME[4]/16);                        //月
  1035.         LCD12864_WriteData(0x30+(TIME[4]&0x0f));
  1036.         LCD12864_SetWindow(1, 4);
  1037.         LCD12864_WriteData(0x30+TIME[3]/16);                        //日
  1038.         LCD12864_WriteData(0x30+(TIME[3]&0x0f));
  1039.         LCD12864_SetWindow(1, 7);
  1040.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]);        //星期
  1041.         LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);

  1042.         LCD12864_SetWindow(2, 2);
  1043.         LCD12864_WriteData(0x30+TIME[2]/16);                                //时


  1044. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整源代码在附件里。

全部资料下载地址:
万年历12864资料.rar (1.05 MB, 下载次数: 728)

评分

参与人数 9黑币 +139 收起 理由
18925405284 + 5 回帖助人的奖励!
第一次 + 8
WEIDADETG + 3 共享资料的黑币奖励!
Tmfstorm + 5 绝世好帖!
晓霁_璟 + 5 很给力!
大概发送到 + 3
qjzyx + 6 赞一个!
斯德哥尔摩 + 4 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

admin 发表于 2017-5-23 15:41 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ccd_ln 发表于 2017-11-1 11:25 | 显示全部楼层
谢谢,学习了,
回复

使用道具 举报

xwnc 发表于 2017-11-8 18:35 | 显示全部楼层
楼主太强了,学习学习
回复

使用道具 举报

花猫胖爷 发表于 2017-11-26 20:56 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

cailn2000 发表于 2017-12-1 16:14 | 显示全部楼层
多谢分享!
回复

使用道具 举报

小北 发表于 2017-12-27 17:16 | 显示全部楼层
学习,好
回复

使用道具 举报

jiangkeqin_sy 发表于 2017-12-28 11:22 | 显示全部楼层
下了学习学习
回复

使用道具 举报

754853931@qq.co 发表于 2018-1-3 20:27 | 显示全部楼层
楼主好人学到了!!
回复

使用道具 举报

towangrui40 发表于 2018-1-5 11:36 | 显示全部楼层
楼主太强了,学习学习
回复

使用道具 举报

yuchen173 发表于 2018-1-15 09:13 | 显示全部楼层
我下载后就把借口改了一下,lcd怎么显示全亮了,按键也没反应
回复

使用道具 举报

jiangkeqin_sy 发表于 2018-1-17 11:39 | 显示全部楼层
问一下,我的程序在显示大数字时,当程序比较短时正常,当程序长了出现乱码现象,
回复

使用道具 举报

jiangkeqin_sy 发表于 2018-1-27 13:15 | 显示全部楼层
想下载啊,没有积分啊
回复

使用道具 举报

斯德哥尔摩 发表于 2018-1-31 14:46 | 显示全部楼层
楼主太厉害了  想下载 积分还没够
回复

使用道具 举报

杨占仓 发表于 2018-1-31 21:26 | 显示全部楼层
yuchen173 发表于 2018-1-15 09:13
我下载后就把借口改了一下,lcd怎么显示全亮了,按键也没反应

楼主的pnp三极管怎么会是8050,应该是8550吧??
回复

使用道具 举报

 楼主| lids 发表于 2018-2-11 21:53 | 显示全部楼层
杨占仓 发表于 2018-1-31 21:26
楼主的pnp三极管怎么会是8050,应该是8550吧??

三极管只要是PNP的就可以,我实际用的s9012
回复

使用道具 举报

 楼主| lids 发表于 2018-2-11 21:57 | 显示全部楼层
杨占仓 发表于 2018-1-31 21:26
楼主的pnp三极管怎么会是8050,应该是8550吧??

你检查下的硬件有没有接错,还有液晶的对比度调一下试试
回复

使用道具 举报

18#
无效楼层,该帖已经被删除
obj2557 发表于 2018-2-26 14:08 | 显示全部楼层
多谢分享
回复

使用道具 举报

qjzyx 发表于 2018-2-26 15:18 | 显示全部楼层
收藏,改天也写个玩,谢谢分享
回复

使用道具 举报

longwenwu521 发表于 2018-2-26 15:40 | 显示全部楼层
谢谢分享
回复

使用道具 举报

黑黑黑黑黑黑 发表于 2018-3-8 12:50 | 显示全部楼层
哈哈,谢谢楼主分享
回复

使用道具 举报

23#
无效楼层,该帖已经被删除
lghaizx 发表于 2018-3-21 18:41 | 显示全部楼层
都挺好的,先收藏了,谢谢了
回复

使用道具 举报

l616 发表于 2018-3-22 12:33 | 显示全部楼层
强大,真正的高手!
回复

使用道具 举报

秦时明月21342 发表于 2018-3-23 15:57 | 显示全部楼层
lcd12864万年历那个,我用STC89C52为什么烧写的时候说程序太大了?烧写不了
回复

使用道具 举报

秦时明月21342 发表于 2018-3-23 16:07 | 显示全部楼层
lcd12864万年历那个,我用STC89C52为什么烧写的时候说程序太大了?烧写不了
回复

使用道具 举报

ab560 发表于 2018-3-24 17:05 | 显示全部楼层
学习学习,谢谢分享
回复

使用道具 举报

可爱你个头阿 发表于 2018-3-28 19:46 | 显示全部楼层
萌新求教怎样显示大数字
回复

使用道具 举报

老田8310 发表于 2018-3-29 13:36
大哥,你的文档里,程序是假的吧,只有几行,还害得我下料两次

13828617332 发表于 2018-4-10 16:23 | 显示全部楼层
正需要这种
回复

使用道具 举报

Norway 发表于 2018-4-16 15:01 | 显示全部楼层
谢谢,先试试!
回复

使用道具 举报

zcm1998 发表于 2018-4-18 16:30 | 显示全部楼层
学习一手谢谢了
回复

使用道具 举报

晓霁_璟 发表于 2018-4-27 16:10 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

35#
无效楼层,该帖已经被删除
fanfanfan123 发表于 2018-5-11 10:57 | 显示全部楼层
东西不粗啊
回复

使用道具 举报

小黄蜂 发表于 2018-5-14 16:07 | 显示全部楼层
楼主代码风格
回复

使用道具 举报

jason416 发表于 2018-5-20 18:05 | 显示全部楼层
感谢楼主!很给力
回复

使用道具 举报

xdquan 发表于 2018-5-28 15:25 | 显示全部楼层
下载有毒,被删除了,黑币也被扣了,
回复

使用道具 举报

小_人物 发表于 2018-5-29 08:08 | 显示全部楼层
好贴,向楼主学习!
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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