久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 50318|回復: 117
收起左側(cè)

LCD12864大數(shù)字顯示萬年歷制作,有單片機代碼有圖有真相

  [復制鏈接]
ID:140489 發(fā)表于 2017-5-23 12:07 | 顯示全部樓層 |閱讀模式
51單片機主控的的12864萬年歷,有圖有真相附件里面有原理圖,完整源代碼,實物測試通過;時分秒大數(shù)字顯示
單片機型號:STC90C516RD+,用STC89C516RD+也可以.
實物圖.jpg
DS1302用現(xiàn)成模塊,可以自己網(wǎng)上找電路圖焊
DS18B20引腳看清楚不要搞錯
12864為并行方式,PSB跟RST接高電平就行,對比度通過103電位器調(diào)背光,可用單片機控制或
用熱釋電模塊控制。
鬧鐘數(shù)據(jù)掉電會丟失,可以自己改改程序,用24C02或其它芯片

電路圖簡單,接線時看程序接或自己接好后改程序的定義
原理圖.jpg

所需元器件:
1.單片機最小系統(tǒng),包括上電復位電路跟時鐘電路
2.12864液晶屏1個
3.DS18B20數(shù)字溫度芯片(三腳)
4.DS1302模塊
5.蜂鳴器(有源跟無源各一),三極管8050(3個),103電位器用在12864調(diào)對比度
6.按鍵5個,開關(guān)一個,導線若干,烙鐵,焊錫,
7.其他自己發(fā)揮擴展

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驅(qū)動

  9. sbit wei = P2^6;
  10. sbit duan= P2^7;
  11. sbit s1=P3^0;                          //調(diào)節(jié)時間
  12. sbit s2=P3^1;                           //加
  13. sbit s3=P3^2;                                 //減
  14. sbit s4=P3^3;                                  //調(diào)節(jié)鬧鐘
  15. sbit Beep=P1^7;                        //揚聲器   用三極管8050驅(qū)動
  16. //---定義全局函數(shù)---//
  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;                          //參數(shù)定義
  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[]="    調(diào)整時間      年  月  日周  時間  點  分  秒   ";
  40. uchar code CharCode1[]="20  -  -    周                                              . ℃";
  41. uchar code xiqi[]="  一二三四五六日開關(guān)";
  42. uchar code naozhong[]="  設(shè)置鬧鐘            點  分        鈴聲選擇      ";
  43. uchar code naozhonglinshen[]="1.天空之城      2.月亮代表我的心3.你是風兒我是沙4.莫斯科郊外的晚5.經(jīng)典鈴聲  嘀嘀";

  44. //uchar code tab[11][64]={
  45. //{/*--  調(diào)入了一幅圖像:D:\設(shè)計\打印\數(shù)字取模圖片\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. //圖片數(shù)字圓體
  53. /******************************************************************************/
  54. //uchar code tab[12][64]={
  55. //        {// 圖片數(shù)字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. //圖片數(shù)字方體
  62. /******************************************************************************/
  63. uchar code tab[12][64]={
  64.         {// 圖片數(shù)字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();                        //原來的程序,沒有調(diào)用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()                  //年月日顯示函數(shù)
  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 控制節(jié)拍   
  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--); 各位可編譯一下看看匯編結(jié)果就知道了!   
  287. }      
  288. void linshengbofang()   
  289. { unsigned char p=0,m;   //m為頻率常數(shù)變量   
  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;}     //如果碰到結(jié)束符,延時1秒,回到開始再來一遍   
  295.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延時100ms,繼續(xù)取下一音符   
  296.             else         {m=music_tab[linsheng-1][i++], n=music_tab[linsheng-1][i++];}  //取頻率常數(shù) 和 節(jié)拍常數(shù)   
  297.              TR1=1;                                             //開定時器1   
  298.            while(n!=0) Beep=~Beep,delay(m);                         //等待節(jié)拍完成, 通過P1口輸出音頻(可多聲道哦!)   
  299.        TR1=0;                                             //關(guān)定時器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)           //鬧鐘設(shè)置
  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()                           //調(diào)節(jié)時間顯示
  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()                          //調(diào)節(jié)鬧鐘 顯示
  429. {
  430.         uchar zishu=0;
  431.         if(SetPlace==8)           //鬧鐘設(shè)置
  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);  //顯示開,關(guān)光標        
  519.                                 SetPlace=-1;keysun=2;
  520.                                 biaozhi1=1;
  521.                                 Ds1302Init();
  522.                                 zhujiemian();
  523.                         }
  524.                         naoxianguangbiao();                                       
  525.                 }
  526.         }
  527.         if(s4==0)                                                  //鬧鐘設(shè)置
  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]);          //顯示關(guān)
  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);  //顯示開,關(guān)光標        
  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]);          //顯示開關(guān)
  702.                                                 }
  703.                                                 else
  704.                                                 {
  705.                                                         LCD12864_WriteData(xiqi[16]);
  706.                                                         LCD12864_WriteData(xiqi[17]);         //顯示開關(guān)
  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. * 函數(shù)名         : Ds18b20Init
  762. * 函數(shù)功能                   : 初始化
  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. * 函數(shù)名         : Ds18b20WriteByte
  784. * 函數(shù)功能                   : 向18B20寫入一個字節(jié)
  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;                        //每寫入一位數(shù)據(jù)之前先把總線拉低1us
  794.                 i++;
  795.                 DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始
  796.                 i=6;
  797.                 while(i--); //延時68us,持續(xù)時間最少60us
  798.                 DSPORT=1;        //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數(shù)值
  799.                 dat>>=1;
  800.         }
  801. }
  802. /*******************************************************************************
  803. * 函數(shù)名         : Ds18b20ReadByte
  804. * 函數(shù)功能                   : 讀取一個字節(jié)
  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等待數(shù)據(jù)穩(wěn)定
  819.                 bi=DSPORT;         //讀取數(shù)據(jù),從最低位開始讀取
  820.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
  821.                 byte=(byte>>1)|(bi<<7);                                                  
  822.                 i=4;                //讀取完之后等待48us再接著讀取下一個數(shù)
  823.                 while(i--);
  824.         }                                
  825.         return byte;
  826. }
  827. /*******************************************************************************
  828. * 函數(shù)名         : Ds18b20ChangTemp
  829. * 函數(shù)功能                   : 讓18b20開始轉(zhuǎn)換溫度
  830. * 輸入           : com
  831. * 輸出                  : 無
  832. *******************************************************************************/
  833. void  Ds18b20ChangTemp()
  834. {
  835.         Ds18b20Init();
  836.         Delay1ms(1);
  837.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  838.         Ds18b20WriteByte(0x44);            //溫度轉(zhuǎn)換命令
  839. //        Delay1ms(100);        //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了  
  840. }
  841. /*******************************************************************************
  842. * 函數(shù)名         : Ds18b20ReadTempCom
  843. * 函數(shù)功能                   : 發(fā)送讀取溫度命令
  844. * 輸入           : com
  845. * 輸出                  : 無
  846. *******************************************************************************/
  847. void  Ds18b20ReadTempCom()
  848. {        
  849.         Ds18b20Init();
  850.         Delay1ms(1);
  851.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  852.         Ds18b20WriteByte(0xbe);         //發(fā)送讀取溫度命令
  853. }
  854. /*******************************************************************************
  855. * 函數(shù)名         : Ds18b20ReadTemp
  856. * 函數(shù)功能                   : 讀取溫度
  857. * 輸入           : com
  858. * 輸出                  : 無
  859. *******************************************************************************/

  860. int Ds18b20ReadTemp()
  861. {
  862.         int temp=0;
  863.         unsigned char tmh,tml;
  864.         Ds18b20ChangTemp();                                 //先寫入轉(zhuǎn)換命令
  865.         Ds18b20ReadTempCom();                        //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  866.         tml=Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節(jié)
  867.         tmh=Ds18b20ReadByte();                //再讀高字節(jié)
  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}; //定義數(shù)組
  877.         float tp;  
  878.         if(temp< 0)                                //當溫度值為負數(shù)
  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.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  888.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  889.                 //算由0.5,還是在小數(shù)點后面。
  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]); //顯示小數(shù)點

  896.           }
  897.          else
  898.           {                        
  899.                 LCD12864_SetWindow(3, 5);        //第4行,第6列
  900.                 tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  901.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
  902.                 temp=tp*0.0625*100+0.5;        
  903.                 //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  904.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  905.                 //算加上0.5,還是在小數(shù)點后面。
  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]); //顯示小數(shù)點
  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;//數(shù)據(jù)從低位開始傳送
  930.                 addr >>= 1;
  931.                 SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
  932.                 _nop_();
  933.                 SCLK = 0;
  934.                 _nop_();
  935.         }
  936.         for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
  937.         {
  938.                 DSIO = dat & 0x01;
  939.                 dat >>= 1;
  940.                 SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
  941.                 _nop_();
  942.                 SCLK = 0;
  943.                 _nop_();        
  944.         }        
  945.                  
  946.         RST = 0;//傳送數(shù)據(jù)結(jié)束
  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;//數(shù)據(jù)從低位開始傳送
  961.                 addr >>= 1;
  962.                 SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
  963.                 _nop_();
  964.                 SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
  965.                 _nop_();
  966.         }
  967.         _nop_();
  968.         for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
  969.         {
  970.                 dat1 = DSIO;//從最低位開始接收
  971.                 dat = (dat>>1) | (dat1<<7);
  972.                 SCLK = 1;
  973.                 _nop_();
  974.                 SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
  975.                 _nop_();
  976.         }

  977.         RST = 0;
  978.         _nop_();        //以下為DS1302復位的穩(wěn)定時間,必須的。
  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);                 //禁止寫保護,就是關(guān)閉寫保護功能
  991.         for (n=0; n<7; n++)//寫入7個字節(jié)的時鐘信號:分秒時日月周年
  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個字節(jié)的時鐘信號:分秒時日月周年
  1001.         {
  1002.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  1003.         }               
  1004. }
  1005. void TimerConfiguration()
  1006. {
  1007.     TMOD = 0x11; //選擇工作方式1
  1008.     TH0 = 0x3C;         //設(shè)置初始值,定時50MS
  1009.     TL0 = 0xB0;
  1010.     EA = 1;                         //打開總中斷
  1011.     ET0 = 1;                 //打開定時器0中斷
  1012.     TR0 = 1;                 //啟動定時器0
  1013.         zz=0;//關(guān)蜂鳴器     
  1014.          TH1=0xd8;TL1=0xef;   
  1015.         ET1=1;
  1016. }
  1017. void Timer0() interrupt 1
  1018. {
  1019.         TH0 = 0x3C;         //設(shè)置初始值
  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, 下載次數(shù): 1346)

評分

參與人數(shù) 10黑幣 +144 收起 理由
zzt223 + 5 很給力!
18925405284 + 5 回帖助人的獎勵!
第一次 + 8
WEIDADETG + 3 共享資料的黑幣獎勵!
Tmfstorm + 5 絕世好帖!
曉霽_璟 + 5 很給力!
大概發(fā)送到 + 3
qjzyx + 6 贊一個!
斯德哥爾摩 + 4 很給力!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1 發(fā)表于 2017-5-23 15:41 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:243682 發(fā)表于 2017-11-1 11:25 | 顯示全部樓層
謝謝,學習了,
回復

使用道具 舉報

ID:246166 發(fā)表于 2017-11-8 18:35 | 顯示全部樓層
樓主太強了,學習學習
回復

使用道具 舉報

ID:253911 發(fā)表于 2017-11-26 20:56 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:256154 發(fā)表于 2017-12-1 16:14 | 顯示全部樓層
多謝分享!
回復

使用道具 舉報

ID:267862 發(fā)表于 2017-12-27 17:16 | 顯示全部樓層
學習,好
回復

使用道具 舉報

ID:267330 發(fā)表于 2017-12-28 11:22 | 顯示全部樓層
下了學習學習
回復

使用道具 舉報

ID:271028 發(fā)表于 2018-1-3 20:27 | 顯示全部樓層
樓主好人學到了!!
回復

使用道具 舉報

ID:138292 發(fā)表于 2018-1-5 11:36 | 顯示全部樓層
樓主太強了,學習學習
回復

使用道具 舉報

ID:256906 發(fā)表于 2018-1-15 09:13 | 顯示全部樓層
我下載后就把借口改了一下,lcd怎么顯示全亮了,按鍵也沒反應
回復

使用道具 舉報

ID:267330 發(fā)表于 2018-1-17 11:39 | 顯示全部樓層
問一下,我的程序在顯示大數(shù)字時,當程序比較短時正常,當程序長了出現(xiàn)亂碼現(xiàn)象,
回復

使用道具 舉報

ID:267330 發(fā)表于 2018-1-27 13:15 | 顯示全部樓層
想下載啊,沒有積分啊
回復

使用道具 舉報

ID:281160 發(fā)表于 2018-1-31 14:46 | 顯示全部樓層
樓主太厲害了  想下載 積分還沒夠
回復

使用道具 舉報

ID:263912 發(fā)表于 2018-1-31 21:26 | 顯示全部樓層
yuchen173 發(fā)表于 2018-1-15 09:13
我下載后就把借口改了一下,lcd怎么顯示全亮了,按鍵也沒反應

樓主的pnp三極管怎么會是8050,應該是8550吧??
回復

使用道具 舉報

ID:140489 發(fā)表于 2018-2-11 21:53 | 顯示全部樓層
楊占倉 發(fā)表于 2018-1-31 21:26
樓主的pnp三極管怎么會是8050,應該是8550吧??

三極管只要是PNP的就可以,我實際用的s9012
回復

使用道具 舉報

ID:140489 發(fā)表于 2018-2-11 21:57 | 顯示全部樓層
楊占倉 發(fā)表于 2018-1-31 21:26
樓主的pnp三極管怎么會是8050,應該是8550吧??

你檢查下的硬件有沒有接錯,還有液晶的對比度調(diào)一下試試
回復

使用道具 舉報

ID:263734 發(fā)表于 2018-2-26 14:08 | 顯示全部樓層
多謝分享
回復

使用道具 舉報

ID:266116 發(fā)表于 2018-2-26 15:18 | 顯示全部樓層
收藏,改天也寫個玩,謝謝分享
回復

使用道具 舉報

ID:263726 發(fā)表于 2018-2-26 15:40 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:289136 發(fā)表于 2018-3-8 12:50 | 顯示全部樓層
哈哈,謝謝樓主分享
回復

使用道具 舉報

ID:291767 發(fā)表于 2018-3-21 18:41 | 顯示全部樓層
都挺好的,先收藏了,謝謝了
回復

使用道具 舉報

ID:211360 發(fā)表于 2018-3-22 12:33 | 顯示全部樓層
強大,真正的高手!
回復

使用道具 舉報

ID:295966 發(fā)表于 2018-3-23 15:57 | 顯示全部樓層
lcd12864萬年歷那個,我用STC89C52為什么燒寫的時候說程序太大了?燒寫不了
回復

使用道具 舉報

ID:295966 發(fā)表于 2018-3-23 16:07 | 顯示全部樓層
lcd12864萬年歷那個,我用STC89C52為什么燒寫的時候說程序太大了?燒寫不了
回復

使用道具 舉報

ID:7503 發(fā)表于 2018-3-24 17:05 | 顯示全部樓層
學習學習,謝謝分享
回復

使用道具 舉報

ID:298502 發(fā)表于 2018-3-28 19:46 | 顯示全部樓層
萌新求教怎樣顯示大數(shù)字
回復

使用道具 舉報

ID:305245 發(fā)表于 2018-4-10 16:23 | 顯示全部樓層
正需要這種
回復

使用道具 舉報

ID:303570 發(fā)表于 2018-4-16 15:01 | 顯示全部樓層
謝謝,先試試!
回復

使用道具 舉報

ID:310944 發(fā)表于 2018-4-18 16:30 | 顯示全部樓層
學習一手謝謝了
回復

使用道具 舉報

ID:317875 發(fā)表于 2018-4-27 16:10 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:327420 發(fā)表于 2018-5-11 10:57 | 顯示全部樓層
東西不粗啊
回復

使用道具 舉報

ID:130753 發(fā)表于 2018-5-14 16:07 | 顯示全部樓層
樓主代碼風格
回復

使用道具 舉報

ID:290463 發(fā)表于 2018-5-20 18:05 | 顯示全部樓層
感謝樓主!很給力
回復

使用道具 舉報

ID:49048 發(fā)表于 2018-5-28 15:25 | 顯示全部樓層
下載有毒,被刪除了,黑幣也被扣了,
回復

使用道具 舉報

ID:339506 發(fā)表于 2018-5-29 08:08 | 顯示全部樓層
好貼,向樓主學習!
回復

使用道具 舉報

ID:327790 發(fā)表于 2018-6-8 15:36 | 顯示全部樓層
樓主,溫度顯示不出來是什么鬼呀?
回復

使用道具 舉報

ID:140489 發(fā)表于 2018-6-11 14:43 | 顯示全部樓層
你晶振是不是11.0592MHz的,還有你DS18B20有沒有壞
回復

使用道具 舉報

ID:349516 發(fā)表于 2018-6-11 15:26 | 顯示全部樓層
不錯不錯
回復

使用道具 舉報

ID:329182 發(fā)表于 2018-6-20 22:45 | 顯示全部樓層
很不錯的,棒棒的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品自拍av | 81精品国产乱码久久久久久 | 看av网| 天天躁日日躁狠狠躁2018小说 | 久久不卡 | 精品久久视频 | 欧美精品在线免费观看 | 久久91精品国产 | 国产黄色大片 | 黑人一级片视频 | 国产一级片免费看 | 99精品免费视频 | 日本不卡一区 | 台湾佬成人网 | 国产精品国产三级国产aⅴ中文 | 亚洲男人天堂 | 亚洲精品视频观看 | 网址黄| 欧美不卡一区 | 人人九九精| 久久久久久久综合 | 午夜欧美一区二区三区在线播放 | 久久久精品网 | 欧美日韩在线观看一区 | 国产成人精品久久二区二区91 | 亚洲国产69 | 日韩欧美亚洲综合 | 国产精品99久久久久久www | 日本在线精品视频 | 欧美精品一区在线 | 国产午夜精品视频 | 福利网站导航 | 午夜影院在线观看 | 成年免费大片黄在线观看一级 | 先锋影音资源网站 | 一区二区三区回区在观看免费视频 | 在线观看日本高清二区 | 国产精品资源在线 | 亚洲高清在线免费观看 | 女同久久另类99精品国产 | 色资源av|