找回密码
 立即注册

QQ登录

只需一步,快速开始

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

万年历终极版单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:192611 发表于 2017-4-23 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
12864液晶显示:
新建文件夹.zip (42.16 KB, 下载次数: 8)

万年历终极版:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar x,y;      //清屏时定义的起始地址

  6. uchar flag1,flag2;     //标志位  温湿度传感器时使用

  7. uchar wei;            //位定义
  8. uchar zijie;    // 字节定义
  9. uchar wdzs,wdxs,sdzs,sdxs,jiaoyan;
  10. uchar WZ,WX,SZ,SX,JY;

  11. sbit  rs=P0^0;          //液晶3个端口的定义
  12. sbit  rw=P0^1;
  13. sbit   e=P0^2;
  14. sbit  SJ=P0^3;  //温湿度传感器接口
  15.        
  16. sbit  sck=P0^4;         //时钟芯片DS1302
  17. sbit  io=P0^5;
  18. sbit  rst=P0^6;

  19. sbit key1=P2^2;
  20. sbit key2=P2^1;
  21. sbit key3=P2^0;

  22. uchar time_data[7]={13,1,11,11,00,00,00};//年,周,月,日,时,分,秒         
  23. uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
  24. uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
  25. uchar disp[13]="";
  26. uchar time_data1[7]=""; //用来存放从1302中读出的时间
  27. uchar time_data2[7]="";

  28. uchar table1[]="温度";
  29. uchar table2[]="湿度";
  30. uchar table3[4]="";
  31. uchar table4[4]="";
  32. uchar table5[]="温湿度万年历"; //可显示任意汉字数字及字符                         
  33. uchar code image[]=
  34. {0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x10,0xE7,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
  35. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x92,0x00,0x00,0x00,0x00,0x00,0x00,
  36. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x18,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  37. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x28,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x28,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x24,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x3C,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x44,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  43. 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x3C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,//HAUT
  45. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
  46. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,
  47. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x01,0x80,0x00,
  48. 0x00,0x60,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xE0,0x00,0x01,0x80,0x00,
  49. 0x00,0x63,0xE0,0x18,0x00,0x0E,0x01,0xB0,0x00,0xC0,0x07,0xE0,0x00,0x03,0x40,0x00,
  50. 0x00,0x3F,0x80,0x7C,0x01,0xF8,0x00,0xF0,0x00,0xC0,0x00,0xF8,0x00,0x02,0x40,0x00,
  51. 0x00,0xC7,0x80,0x33,0x80,0x30,0x00,0xF0,0x01,0x98,0x1F,0x98,0x00,0x02,0x40,0x00,
  52. 0x00,0x3F,0x80,0xFF,0x80,0x30,0x06,0xFC,0x0F,0xF0,0x1F,0xC0,0x00,0x02,0x40,0x00,
  53. 0x00,0x1F,0x81,0xF9,0x80,0x30,0x03,0xF8,0x01,0x80,0x01,0x80,0x00,0x06,0x20,0x00,
  54. 0x00,0x6D,0x81,0xF9,0x80,0x30,0x03,0xF0,0x01,0xC0,0x01,0xF8,0x00,0x38,0x1C,0x00,
  55. 0x00,0xC1,0x81,0xBF,0x80,0x30,0x00,0xF0,0x01,0xE0,0x1F,0x80,0x01,0xE0,0x03,0x80,
  56. 0x00,0xC1,0x81,0xF9,0x83,0xFF,0x80,0xFF,0x03,0x30,0x01,0x80,0x00,0xC0,0x03,0x00,
  57. 0x00,0x03,0x81,0xB7,0x80,0x00,0x07,0xE0,0x06,0x38,0x01,0x80,0x00,0x38,0x3E,0x00,
  58. 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x0C,0x03,0x80,0x00,0x04,0x20,0x00,
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,
  60. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,
  61. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,
  62. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00,
  63. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,//河南工业大学
  64. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  65. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  66. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  67. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  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. 0x30,0x03,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  73. 0x1F,0xEB,0x08,0x10,0x06,0x0E,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  74. 0x04,0x2B,0x3D,0xFF,0x1A,0x11,0x09,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  75. 0x35,0xAB,0x09,0x01,0x02,0x01,0x10,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  76. 0x1D,0xAB,0x08,0xC6,0x02,0x0E,0x10,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  77. 0x05,0xAB,0x0D,0x83,0x02,0x01,0x10,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  78. 0x0D,0xAB,0x18,0xFE,0x02,0x01,0x10,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  79. 0x19,0x8B,0x28,0x10,0x02,0x11,0x19,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  80. 0x33,0xC7,0x08,0x10,0x02,0x0E,0x0F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  81. 0x26,0x73,0x39,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  82. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  83. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  84. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  86. 0x00,0x00,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,0x00,0x00,
  88. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  89. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  94. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  95. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  96. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  97. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  98. };//显示一幅图片(可以是任意一张图片)         
  99. void delay_50us(uchar z);
  100. void delay_50ms(uchar z);
  101. void delay_1s(uchar z);
  102. void write_12864com(uchar com);
  103. void write_12864dat(uchar dat);
  104. void ini();       
  105. void clear();
  106. void picture( uchar*p);
  107. void display1();  //显示汉字
  108. void display2(); //显示温湿度
  109. void Delay (uint z) ;
  110. void delay_1ms(void);
  111. void Delay_nms(uchar n);
  112. void delay_10us()  ;
  113. void jieshou (void) ;
  114. void read (void) ;
  115. void write_1302_byte(uchar dat);
  116. void write_1302(uchar add,uchar dat);
  117. uchar read_1302(uchar add);
  118. void set_rct();
  119. void read_rct(void)        ;
  120. void time_pros(void);
  121. void display3();//显示日期
  122. void display4();//显示时间       
  123. void tiaoshi();//时间调整

  124. void main()
  125. {        
  126. ini();   //液晶初始化
  127. set_rct();  //对时           
  128. clear();   //清屏
  129. picture(image);  // 显示图片
  130. delay_1s(10);
  131. clear();  //清屏
  132.          
  133. while(1)
  134. {       
  135. display1();//显示第一行汉字          
  136. display2();//显示温湿度(第二行)
  137. read(); //读取温湿度
  138. delay_1s(2);
  139. tiaoshi ();
  140. read_rct();//读取时间
  141. time_pros(); //时间处理函数
  142. display3();  //用来显示日期 (第三行)
  143. display4(); //用来显示时间(第四行)          
  144. }
  145. }
  146. void delay_50us(uchar z)        //延时50微妙
  147. {  
  148.   uint j;  
  149.   for(;z>0;z--)
  150.   for (j=19;j>0;j--);
  151. }   
  152. void delay_50ms(uchar z)        //延时50毫秒
  153. {  uint j;
  154.    for(;z>0;z--)
  155.      for (j=6000;j>0;j--);
  156. }
  157. void delay_1s(uchar z)           //延时1秒
  158. {  
  159.             uint i,j,k;
  160.            for (i=z;i>0;i--)
  161.      for(j=600;j>0;j--)
  162.      for(k=10;k>0;k--);
  163. }
  164. void Delay (uint z)  
  165.   {       
  166.     uchar x,y;
  167.     for(x=z;x>0;x--);
  168.       for(y=110;y>0;y--);
  169.   }
  170. /****************lcd12864程序****************/
  171. void write_12864com(uchar com)//写指令
  172.   {  rw=0;
  173.      rs=0;
  174.      delay_50us(1);
  175.      P1=com;//数据接口
  176.      e=1;
  177.      delay_50us(10);
  178.      e=0;
  179.      delay_50us(2);
  180.    }
  181. void write_12864dat(uchar dat)//写数据
  182.   {  rw=0;
  183.      rs=1;
  184.      delay_50us(1);
  185.      P1=dat;//数据接口
  186.      e=1;
  187.      delay_50us(10);
  188.      e=0;
  189.      delay_50us(2);
  190. }
  191. void ini()//初始化
  192. { delay_50ms(2);
  193.   write_12864com(0x30);//
  194.   delay_50us(4);
  195.   write_12864com(0x30);
  196.   delay_50us(4);
  197.   write_12864com(0x0c);//显示游标 ,反写 ,光标
  198.   delay_50us(4);
  199.   write_12864com(0x01); //清除显示
  200.   delay_50us(240);
  201. //write_12864com(0x06); //模式设置
  202. //delay_50us(10);
  203. }
  204. void clear(void)
  205. {  uchar i,j,k;
  206.    x=0x80;
  207.    y=0x80;
  208.    write_12864com(0x34); //打开扩展指令集
  209.    for (i=0;i<2;i++)
  210.    {
  211.      for (j=0;j<32;j++)
  212.        {  write_12864com(y+j);
  213.           write_12864com(x);
  214.           for (k=0;k<16;k++)
  215.           {
  216.              write_12864dat(0x00);
  217.               }

  218.         }
  219.         x=0x88;
  220.     }
  221.     write_12864com(0x36);//打开绘图显示
  222.     write_12864com(0x30);
  223. }
  224. void picture( uchar*p)       
  225. {
  226. uchar i,j,k;
  227. x=0x80;
  228. y=0x80;
  229. write_12864com(0x34);
  230. for (i=0;i<2;i++)
  231.   {
  232.   for (j=0;j<32;j++)
  233.    {
  234.      write_12864com(y+j);
  235.      write_12864com(x);
  236.      for (k=0;k<16;k++)
  237.     {
  238.       write_12864dat(*p++);
  239.         }
  240.       }
  241.   x=0x88;
  242.   }
  243.   write_12864com(0x36);
  244.   write_12864com(0x30);       
  245. }
  246. void display1()    //显示汉字  温湿度万年历
  247. {  uchar i,a;
  248.    a=0;
  249.    write_12864com(0x80);//地址
  250.    write_12864dat(0x20);
  251.    write_12864dat(0x01);
  252.    write_12864dat(0x01);
  253.    write_12864dat(0x20);
  254.    for (i=4;i<16;i++)
  255.      {
  256.         write_12864dat(table5[a]);
  257.         a++;
  258.         delay_50us(1);
  259.       }       
  260. }
  261. void display2()//显示汉字 用数组  温湿度
  262. {       
  263.   uchar i,a,b,c,d;
  264.   a=0;
  265.   b=0;
  266.   c=0;
  267.   d=0;
  268.   write_12864com(0x90);//地址
  269.   for (i=0;i<4;i++)
  270.     {
  271.       write_12864dat(table1[a]);
  272.       a++;
  273.       delay_50us(1);
  274.     }
  275.   for (i=4;i<8;i++)
  276.     {
  277.       write_12864dat(table3[b]);
  278.       b++;
  279.       delay_50us(1);               
  280.    }
  281.    for (i=8;i<12;i++)
  282.    {
  283.       write_12864dat(table2[c]);
  284.       c++;
  285.       delay_50us(1);
  286.     }
  287.   for (i=12;i<16;i++)
  288.     {
  289.       write_12864dat(table4[d]);
  290.       d++;
  291.       delay_50us(1);               
  292.      }  
  293. }
  294. void display3()         //显示日期
  295. {       
  296.   uchar a;
  297.   if (disp[10]==0x31) a=0;
  298.   if (disp[10]==0x32) a=1;
  299.   if (disp[10]==0x33) a=2;
  300.   if (disp[10]==0x34) a=3;
  301.   if (disp[10]==0x35) a=4;
  302.   if (disp[10]==0x36) a=5;
  303.   if (disp[10]==0x37) a=6;
  304.   write_12864com(0x88);
  305.   write_12864dat(0x32);        //2
  306.   write_12864dat(0x30);         //0
  307.   write_12864dat(disp[12]);                                                               
  308.   write_12864dat(disp[11]);
  309.   write_12864dat(0xa3);
  310.   write_12864dat(0xad);
  311.   write_12864dat(disp[9]);
  312.   write_12864dat(disp[8]);
  313.   write_12864dat(0xa3);
  314.   write_12864dat(0xad);                               
  315.   write_12864dat(disp[7]);
  316.   write_12864dat(disp[6]);
  317.   write_12864dat(0x20);
  318.   write_12864dat(0x20);
  319.   write_12864dat(0xa2);
  320.   write_12864dat(0xe5+a);
  321. }       
  322. void display4()        //显示时间
  323. {
  324.   write_12864com(0x98);
  325.   write_12864dat(0x20);
  326.   write_12864dat(0x20);
  327.   write_12864dat(disp[5]);
  328.   write_12864dat(disp[4]);
  329.   write_12864dat(0xa1);
  330.   write_12864dat(0xc3);
  331.   write_12864dat(disp[3]);
  332.   write_12864dat(disp[2]);
  333.   write_12864dat(0xa1);
  334.   write_12864dat(0xc3);                                                       
  335.   write_12864dat(disp[1]);
  336.   write_12864dat(disp[0]);
  337.   write_12864dat(0x20);       
  338.   write_12864dat(0x20);
  339.   write_12864dat(0x20);
  340.   write_12864dat(0x20);       
  341. }
  342. /****************DHT11程序****************/

  343.      void delay_10us(void) //10微秒
  344.   {
  345.   _nop_();
  346.   _nop_();
  347.   _nop_();
  348.   }
  349.   void delay_1ms(void) //1毫秒
  350. {
  351.           uchar i;
  352.         for(i=0;i<70;i++)
  353.         {
  354.                 delay_10us();
  355.         }  
  356. }
  357.    void Delay_nms(uchar n)//n毫秒
  358. {
  359.         uchar x;
  360.     for(x=n;x>0;x--)
  361.         delay_1ms();
  362. }
  363. void jieshou (void) //数据0 1确认
  364.   {  
  365.     uchar i;
  366.         uchar flag;
  367.     zijie=0;
  368.     for(i=0;i<8;i++)      
  369.       {  
  370.      flag=2;  
  371.      while((!SJ)&&flag++); //1bit是否结束
  372.      delay_10us();     
  373.      delay_10us();  
  374.      delay_10us();
  375.          zijie<<=1;
  376. //         delay_10us();  
  377. /*    if(SJ)
  378.       {
  379.         wei=1; // 超过28us依然为高电平 表示为1
  380.         flag=2;  
  381.         while((SJ)&&flag++);  
  382.       }
  383.       else
  384.         wei=0;
  385.         zijie<<=1;  
  386.         zijie|=wei;  
  387.     }  */
  388.      if(SJ)
  389.       {
  390.         wei=1; // 超过28us依然为高电平 表示为1
  391.         
  392.                 zijie|=wei;  
  393.       }
  394.           flag=2;  
  395.         while((SJ)&&flag++);  
  396.     }
  397. //        return zijie;  
  398. }
  399. void read (void)
  400. {  
  401. uchar flag;
  402.    SJ=0; //数据
  403. //主机拉低高于18ms
  404.         Delay_nms(10);
  405.         Delay_nms(10);
  406.         Delay_nms(10);   
  407.    SJ=1;  
  408.    delay_10us();  
  409.    delay_10us();  
  410.    delay_10us();  
  411. //  delay_10us();   
  412. //  SJ=1;      //主机设为输入 判断从机响应信号   
  413.    if(!SJ)
  414.   {         
  415.     flag=1;  
  416.     while((!SJ)&&flag++);//判断从机是否发出 80us 的低电平响应号是否结束      
  417.     flag=1;  
  418.     while((SJ)&&flag++); //判断从机是否发出 80us 的高电平 如发据接收状态   
  419.     jieshou(); //数据接收状态
  420.     sdzs=zijie; //湿度整数8位
  421.     jieshou();  
  422.     sdxs=zijie;//湿度小数8位
  423.     jieshou();
  424.         wdzs=zijie; //温度整数8位
  425.     jieshou();  
  426.     wdxs=zijie;   //温度小数8位
  427.     jieshou();   
  428.     jiaoyan=zijie;    //校验位
  429. //SJ=1;      
  430. //JY=(sdzs+sdxs+wdzs+wdxs);
  431. //if(JY==jiaoyan)  //数据校验 正确执行   
  432.   if((sdzs+sdxs+wdzs+wdxs)==jiaoyan)//数据校验 正确执行
  433.   {            
  434.     SZ=sdzs;
  435.     SX=sdxs;
  436.     WZ=wdzs;
  437.     WX=wdxs;                       
  438.   JY=jiaoyan;
  439.   }
  440.   else
  441.   {
  442.           SZ=0;
  443.         SX=0;
  444.         WZ=0;
  445.         WX=0;
  446.   }
  447. }                           
  448. table3[0]=0x3a;
  449. table3[1]=(char)(0x30+WZ/10);
  450. table3[2]=(char)(0x30+WZ%10);
  451. table3[3]=0x63;

  452. table4[0]=0x3a;
  453. table4[1]=(char)(0x30+SZ/10);
  454. table4[2]=(char)(0x30+SZ%10);       
  455. table4[3]=0x25;
  456. }
  457. /***************DS1302程序*********************/

  458. void write_1302_byte(uchar dat)  //写字节
  459.    {
  460.    uchar i;
  461.    for (i=0;i<8;i++)
  462.    {
  463.   sck=0;
  464.   io=dat&0x01;
  465.   dat>>=1;
  466.   sck=1;
  467.   }
  468. }
  469. void write_1302(uchar add,uchar dat)
  470. {  rst=0;
  471.   _nop_();
  472.   sck=0;
  473.   _nop_();
  474.   rst=1;
  475.   _nop_();
  476.   write_1302_byte(add);
  477.   write_1302_byte(dat);
  478.   rst=0;
  479.   _nop_();
  480.   io=1;
  481.   sck=1;       
  482. }
  483. uchar read_1302(uchar add)
  484.   {  uchar i,value;
  485.      rst=0;
  486.     _nop_();
  487.     sck=0;
  488.     _nop_();
  489.     rst=1;
  490.     _nop_();
  491.     write_1302_byte(add);
  492.     for (i=0;i<8;i++)
  493.       {
  494.         value>>=1;
  495.         sck=0;
  496.         if(io)
  497.         value=value|0x80;
  498.         sck=1;
  499.       }
  500.     rst=0;
  501.     _nop_();
  502.     sck=0;
  503.     _nop_();
  504.     sck=1;
  505.     io=1;
  506.     return value;
  507. }
  508. void set_rct(void)//设置时间
  509.   {  uchar i;
  510.      for(i=0;i<7;i++)   //10进制转换16进制
  511.       {
  512.         time_data1[i]=time_data[i]%10+time_data[i]/10*16;       
  513.       }
  514.       write_1302(0x8e,0x00);//去除写保护
  515.       for(i=0;i<7;i++)
  516.         {
  517.            write_1302(write_add[i],time_data1[i]);       
  518.          }
  519.          write_1302(0x8e,0x80);//添加写保护                        
  520.   }
  521. void read_rct(void)  //对时间
  522.   {  uchar i;
  523.    for(i=0;i<7;i++)
  524.    {
  525.    time_data2[i]=read_1302(read_add[i]); //此时数组里面是从里面读出来的时间(16进制的)
  526.     }
  527.   }
  528. void time_pros(void) //处理函数
  529. {
  530.   disp[0]=(char)(time_data2[6]%16+0x30);  //6表示秒
  531.   disp[1]=(char)(time_data2[6]/16+0x30);
  532.   disp[2]=(char)(time_data2[5]%16+0x30); //5表示分
  533.   disp[3]=(char)(time_data2[5]/16+0x30);       
  534.   disp[4]=(char)(time_data2[4]%16+0x30);  //4表示时
  535.   disp[5]=(char)(time_data2[4]/16+0x30);       
  536.   disp[6]=(char)(time_data2[3]%16+0x30); //3表示日
  537.   disp[7]=(char)(time_data2[3]/16+0x30);       
  538.   disp[8]=(char)(time_data2[2]%16+0x30); //2表示月
  539.   disp[9]=(char)(time_data2[2]/16+0x30);
  540.   disp[10]=(char)(time_data2[1]%16+0x30); //1表示周
  541.   disp[11]=(char)(time_data2[0]%16+0x30);  //0表示年
  542.   disp[12]=(char)(time_data2[0]/16+0x30);                       
  543. }
  544. void tiaoshi () //时间调整
  545. {       
  546. if (key1==0)
  547.   {       
  548.     Delay(10);
  549.     if(key1==0);
  550.      {
  551.        flag1++;
  552.        if (flag1==1|flag1==2|flag1==3|flag1==4|flag1==5|flag1==6)
  553.         {
  554.           write_1302(0x8e,0x00);//允许写
  555.           write_1302(0x80,0x80); //时钟停止
  556.          }
  557.    if(flag1==7)
  558.      {
  559.        flag1=0;
  560.        write_1302(0x80,0x00); //启动时钟
  561.        write_1302(0x8e,0x80);// 进制写(添加写保护)
  562.      }
  563.    }
  564.    while(!key1);
  565. //Delay(10);
  566. //while(!key1);
  567. }  
  568.   if (key2==0)
  569.    {       
  570.      Delay(10);
  571.      if (key2==0)
  572.        {
  573.          switch(flag1)
  574.            {
  575.              case 1:         
  576.                {                
  577. time_data[0]=time_data[0]+1;
  578. if(time_data[0]==100)
  579. time_data[0]=0;
  580.     }   break;
  581. case 2:
  582. {
  583. time_data[2]=time_data[2]+1;
  584. if(time_data[2]==13)
  585. time_data[2]=1;
  586. }   break;               
  587. case 3:
  588. {
  589. time_data[3]=time_data[3]+1;
  590. if(time_data[3]==32)
  591. time_data[3]=1;
  592. }   break;               
  593. case 4:
  594. {
  595. time_data[1]=time_data[1]+1;
  596. if(time_data[1]==8)
  597. time_data[1]=1;
  598. }   break;
  599. case 5:
  600. {
  601. time_data[4]=time_data[4]+1;
  602. if(time_data[4]==24)
  603. time_data[4]=00;
  604. }   break;       
  605. case 6:
  606. {
  607. time_data[5]=time_data[5]+1;
  608. if(time_data[5]==60)
  609. time_data[5]=00;
  610. }  break;
  611.    }               
  612. }       
  613. while(!key2);  
  614. set_rct();
  615. }
  616. if (key3==0)
  617.   {       
  618.     Delay(10);
  619.     if (key3==0)
  620.       {
  621.         switch(flag1)
  622.          {
  623. case 1:         
  624. {
  625. time_data[0]=time_data[0]-1;
  626. if(time_data[0]==-1)
  627. time_data[0]=99;
  628. }   break;
  629. case 2:
  630. {
  631. time_data[2]=time_data[2]-1;
  632. if(time_data[2]==0)
  633. time_data[2]=12;
  634. }   break;               
  635. case 3:
  636. {
  637. time_data[3]=time_data[3]-1;
  638. if(time_data[3]==0)
  639. time_data[3]=31;
  640. }   break;               
  641. case 4:
  642. {
  643. time_data[1]=time_data[1]-1;
  644. if(time_data[1]==0)
  645. time_data[1]=7;
  646. }   break;       
  647. case 5:
  648. {
  649. time_data[4]=time_data[4]-1;
  650.             if(time_data[4]==-1)
  651. time_data[4]=23;
  652. }   break;       
  653. case 6:
  654. {
  655. time_data[5]=time_data[5]-1;
  656. if(time_data[5]==-1)
  657. time_data[5]=59;
  658. }   break;                                       
  659.         }
  660.         while(!key3);
  661.         set_rct();
  662.   }
  663. }
  664. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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