找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS1302+lcd1602按钮调时程序加仿真

[复制链接]
跳转到指定楼层
楼主
ID:70751 发表于 2014-12-26 12:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
弄了2天,终于弄好的,仿真加程序!

ds1302 1602最终版.rar

19.1 KB, 下载次数: 129, 下载积分: 黑币 -5

评分

参与人数 2黑币 +60 收起 理由
JACKLI + 15 共享资料的黑币奖励!
admin + 45 共享资料的积分奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2014-12-26 13:03 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
ID:70976 发表于 2014-12-26 14:27 | 只看该作者
本帖最后由 daniu 于 2014-12-26 14:28 编辑

好东西 还有仿真 适合初学者这里贴一下楼主的代码:
  1. #include<reg51.h>      
  2. #include<intrins.h>   
  3.                      
  4. #define        uint unsigned int
  5. #define uchar unsigned char

  6. uchar second,minute,hour,day,month,year,week,keynum;

  7. sbit daio=P3^6;   
  8. sbit rst=P3^4;     
  9. sbit sclk=P3^5;   

  10. sbit rs=P2^0;            
  11. sbit rw=P2^1;            
  12. sbit ep=P2^2;            
  13.            
  14. sbit keyfw=P2^5;
  15. sbit keyjia=P2^6;
  16. sbit keyjian=P2^7;

  17. void delaynus(unsigned char n)
  18. {
  19. unsigned char i;
  20. for(i=0;i<n;i++);
  21. }

  22. void write1302(uchar dat)
  23. {
  24.   uchar i;
  25.   sclk=0;            
  26.   delaynus(2);        
  27.   for(i=0;i<8;i++)      
  28.     {
  29.                 daio=dat&0x01;  
  30.                 delaynus(2);        
  31.                 sclk=1;            
  32.                 delaynus(2);      
  33.                 sclk=0;            
  34.              dat>>=1;         
  35.    }

  36. }

  37. void writeset1302(uchar add,uchar dat)
  38. {
  39.         rst=0;            
  40.         sclk=0;           
  41.         rst=1;            
  42.         delaynus(2);      
  43.         write1302(add);   
  44.         write1302(dat);   
  45.         sclk=1;           
  46.         rst=0;           
  47. }

  48. uchar read1302()
  49. {
  50.    uchar i,dat;
  51.    delaynus(2);        
  52.   for(i=0;i<8;i++)   
  53.   {
  54.    dat>>=1;      
  55.    if(daio==1)      
  56.    dat|=0x80;     
  57.    sclk=1;        
  58.    delaynus(2);   
  59.    sclk=0;        
  60.    delaynus(2);                                      
  61.    }  
  62.   return dat;        
  63. }

  64.   
  65. uchar readset1302(uchar add)
  66. {
  67.   uchar dat;
  68.   rst=0;                 
  69.   sclk=0;                 
  70.   rst=1;                 
  71.   write1302(add);      
  72.   dat=read1302();        
  73.   sclk=1;               
  74.   rst=0;               
  75.   return dat;           
  76. }

  77. void Init_1302()
  78. {
  79.         writeset1302(0x8E,0x00);                  
  80.         writeset1302(0x80,((56/10)<<4|(56%10)));            
  81.         writeset1302(0x82,((59/10)<<4|(59%10)));   
  82.         writeset1302(0x84,((23/10)<<4|(23%10)));  
  83.         writeset1302(0x86,((26/10)<<4|(26%10)));  
  84.         writeset1302(0x88,((12/10)<<4|(12%10)));
  85.         writeset1302(0x8a,((5/10)<<4|(5%10)));
  86.         writeset1302(0x8c,((14/10)<<4|(14%10)));   
  87. }


  88. void delay1ms()
  89. {
  90.    unsigned char i,j;
  91.   for(i=0;i<10;i++)
  92.    for(j=0;j<33;j++);   
  93. }

  94. void delaynms(unsigned char n)
  95. {
  96.    unsigned char i;
  97. for(i=0;i<n;i++)
  98.     delay1ms();
  99. }

  100. void delay(uint z)
  101. {
  102.   uint x,y;
  103.   for(x=z;x>0;x--)
  104.   for(y=110;y>0;y--);

  105. }

  106. void write_com(uchar com)
  107. {
  108. rs=0;
  109. rw=0;
  110. ep=0;
  111. P0=com;
  112. delay(2);
  113. ep=1;
  114. delay(2);
  115. ep=0;
  116. delay(2);
  117. }

  118. void write_dat(uchar dat)
  119. {
  120. rs=1;
  121. rw=0;
  122. ep=0;
  123. P0=dat;
  124. delay(2);
  125. ep=1;
  126. delay(2);
  127. ep=0;
  128. delay(2);
  129. }
  130. void write_zfc(uchar *p)
  131. {
  132.   while(*p!=0)
  133.   write_dat(*p++);
  134. }
  135. void init_1602()
  136. {
  137. write_com(0x38);
  138. write_com(0x01);
  139. write_com(0x06);
  140. write_com(0x0c);

  141. write_com(0x80);
  142. write_zfc(" 20  -  -  ");
  143. write_com(0xc0);
  144. write_zfc("     :  :  ");
  145. }
  146. void write_1602(uchar add,uchar dat)
  147. {
  148. write_com(add);
  149. write_dat(dat+0x30);
  150. }

  151. void DisplaySecond(uchar x)
  152. {
  153. unsigned char shi,ge;      
  154. shi=x/10;
  155. ge=x%10;   
  156.    
  157. write_1602(0xc0+9,shi);
  158. write_1602(0xc0+10,ge);
  159. delaynms(50);            
  160. }

  161. void DisplayMinute(uchar x)
  162. {
  163. unsigned char shi,ge;      
  164. shi=x/10;
  165. ge=x%10;      
  166. write_1602(0xc0+6,shi );
  167. write_1602(0xc0+7,ge );
  168. delaynms(50);         
  169. }

  170. void DisplayHour(uchar x)
  171. {
  172. unsigned char shi,ge;   
  173. shi=x/10;
  174. ge=x%10;      
  175. write_1602(0xc0+3,shi);
  176. write_1602(0xc0+4,ge);
  177. delaynms(50);            
  178. }

  179. void DisplayDay(uchar x)
  180. {
  181. unsigned char shi,ge;      
  182. shi=x/10;
  183. ge=x%10;      
  184. write_1602(0x80+9,shi );
  185. write_1602(0x80+10,ge );
  186. delaynms(50);              
  187. }

  188. void Displayweek()
  189. {                                          
  190.    write_1602(0x80+12,week+0x30);
  191.    switch(week)
  192.    {
  193.             case 1: write_com(0x80+12);
  194.                          write_zfc("mon");
  195.          break;
  196.          case 2:write_com(0x80+12);
  197.                          write_zfc("tue");
  198.          break;
  199.          case 3:write_com(0x80+12);
  200.                 write_zfc("wed");
  201.          break;
  202.          case 4:write_com(0x80+12);
  203.                 write_zfc("thu");
  204.          break;
  205.          case 5:write_com(0x80+12);
  206.                 write_zfc("fri");
  207.          break;
  208.          case 6:write_com(0x80+12);
  209.                 write_zfc("sta");
  210.          break;
  211.          case 7:write_com(0x80+12);
  212.                 write_zfc("sun");
  213.          break;
  214.    }
  215.    

  216. }
  217.   
  218. void DisplayMonth(uchar x)
  219. {
  220. uchar shi,ge;     
  221. shi=x/10;
  222. ge=x%10;      
  223. write_1602(0x80+6,shi );
  224. write_1602(0x80+7,ge );
  225. delaynms(50);            
  226. }

  227. void DisplayYear(unsigned char x)
  228. {
  229. unsigned char shi,ge;  
  230. shi=x/10;
  231. ge=x%10;      
  232. write_1602(0x80+3,shi);
  233. write_1602(0x80+4,ge);
  234. delaynms(50);              
  235. }

  236. void keyscan()
  237. {
  238.   if(keyfw==0)
  239.   {
  240.           delay(2);
  241.         if(keyfw==0)
  242.         {
  243.           while(!keyfw);
  244.           {
  245.              keynum++;
  246.                  switch(keynum)
  247.                  {
  248.                   case 1:write_com(0x0f);
  249.                          write_com(0xc0+10);
  250.                   break;

  251.                   case 2:write_com(0x0f);
  252.                          write_com(0xc0+7);
  253.                   break;

  254.                   case 3:write_com(0x0f);
  255.                          write_com(0xc0+4);
  256.                   break;

  257.                   case 4:write_com(0x0f);
  258.                          write_com(0x80+12);
  259.                   break;

  260.                   case 5:write_com(0x0f);
  261.                          write_com(0x80+10);
  262.                   break;

  263.                   case 6:write_com(0x0f);
  264.                          write_com(0x80+7);
  265.                   break;

  266.                   case 7:write_com(0x0f);
  267.                          write_com(0x80+4);
  268.                   break;

  269.                           case 8: keynum=0;
  270.             write_com(0x0c);
  271.                 writeset1302(0x80,((second/10)<<4|(second%10)));            
  272.                 writeset1302(0x82,((minute/10)<<4|(minute%10)));   
  273.                 writeset1302(0x84,((hour/10)<<4|(hour%10)));  
  274.                 writeset1302(0x86,((day/10)<<4|(day%10)));  
  275.                 writeset1302(0x88,((month/10)<<4|(month%10)));
  276.                 writeset1302(0x8a,((week/10)<<4|(week%10)));
  277.                 writeset1302(0x8c,((year/10)<<4|(year%10)));  
  278.                                 
  279.                 break;
  280.                  
  281.                  }
  282.           }
  283.         
  284.         }
  285.   
  286.   }

  287. if(keynum!=0)
  288.   {
  289.           if(keyjia==0)
  290.         {
  291.          delay(5);
  292.          if(keyjia==0)
  293.          {
  294.                  while(!keyjia);
  295.                 {
  296.                   switch(keynum)
  297.                   {
  298.                   case 1:second++;
  299.                          if(second==60)
  300.                                  second=0;
  301.                          write_com(0xc0+12);
  302.                                  DisplaySecond(second);
  303.                   break;

  304.                   case 2:minute++;
  305.                          if(minute==60)
  306.                                  minute=0;
  307.                                  DisplayMinute(minute);
  308.                          write_com(0xc0+7);
  309.                   break;

  310.                   case 3:hour++;
  311.                                    if(hour==24)
  312.                                   hour=0;
  313.                           DisplayHour(hour);
  314.                           write_com(0xc0+4);
  315.                   break;

  316.                   case 4:week++;
  317.                           if(week==8)
  318.                                    week=0;
  319.                                  Displayweek();
  320.                          write_com(0x80+12);
  321.                   break;

  322.                   case 5:day++;
  323.                          if(day==32)
  324.                                  day=1;
  325.                                  DisplayDay(day);
  326.                          write_com(0x80+10);
  327.                   break;

  328.                   case 6:month++;
  329.                              if(month==13)
  330.                                    month=1;
  331.                                    DisplayMonth(month);
  332.                          write_com(0x80+7);
  333.                   break;

  334.                   case 7:year++;
  335.                          if(year==100)
  336.                                  year=0;
  337.                                  DisplayYear(year);
  338.                          write_com(0x80+4);
  339.                   break;
  340.                  
  341.                   }
  342.                
  343.                 }
  344.          
  345.          }
  346.         
  347.         }
  348.   
  349.   
  350.   }

  351. if(keynum!=0)
  352.   {
  353.           if(keyjian==0)
  354.         {
  355.          delay(2);
  356.          if(keyjian==0)
  357.          {
  358.                  while(!keyjian);
  359.                 {
  360.                   switch(keynum)
  361.                   {
  362.                   case 1:second--;
  363.                          if(second==-1)
  364.                                  second=59;
  365.                          write_com(0xc0+12);
  366.                                  DisplaySecond(second);
  367.                   break;

  368.                   case 2:minute--;
  369.                          if(minute==-1)
  370.                                  minute=59;
  371.                                  DisplayMinute(minute);
  372.                          write_com(0xc0+7);
  373.                   break;

  374.                   case 3:hour--;
  375.                                    if(hour==-1)
  376.                                   hour=23;
  377.                           DisplayHour(hour);
  378.                           write_com(0xc0+4);
  379.                   break;

  380.                   case 4:week--;
  381.                           if(week==-1)
  382.                                    week=7;
  383.                                  Displayweek();
  384.                          write_com(0x80+12);
  385.                   break;

  386.                   case 5:day++;
  387.                          if(day==0)
  388.                                  day=31;
  389.                                  DisplayDay(day);
  390.                          write_com(0x80+10);
  391.                   break;

  392.                   case 6:month--;
  393.                              if(month==0)
  394.                                    month=12;
  395.                                    DisplayMonth(month);
  396.                          write_com(0x80+7);
  397.                   break;

  398.                   case 7:year--;
  399.                          if(year==-1)
  400.                                  year=99;
  401.                                  DisplayYear(year);
  402.                          write_com(0x80+4);
  403.                   break;
  404.                  
  405.                   }
  406.                
  407.                 }
  408.          
  409.          }
  410.         
  411.         }
  412.   
  413.   
  414.   }


  415. }


  416. void main()
  417. {
  418.       
  419.   uchar ReadValue;   
  420.   init_1602();
  421.   Init_1302();        

  422.   while(1)
  423.     {
  424.         keyscan();
  425.   if(keynum==0)
  426.   {
  427.                 ReadValue =readset1302(0x8b);   
  428.                    week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
  429.                    Displayweek();
  430.                
  431.                 ReadValue = readset1302(0x81);   
  432.                      second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  433.                    DisplaySecond(second);         
  434.                
  435.                 ReadValue = readset1302(0x83);   
  436.                      minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);  
  437.                    DisplayMinute(minute);        
  438.                
  439.                 ReadValue = readset1302(0x85);   
  440.                      hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);  
  441.                    DisplayHour(hour);               
  442.                                                                                                                           
  443.                 ReadValue = readset1302(0x87);   
  444.                      day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);  
  445.                    DisplayDay(day);               
  446.                
  447.                 ReadValue = readset1302(0x89);   
  448.                      month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);  
  449.                    DisplayMonth(month);            
  450.                
  451.                 ReadValue = readset1302(0x8d);   
  452.                      year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);  
  453.                    DisplayYear(year);
  454.    }            
  455.   }
  456. }
复制代码
回复

使用道具 举报

地板
ID:96326 发表于 2015-12-7 11:04 | 只看该作者
感谢提供分享!
回复

使用道具 举报

5#
ID:96326 发表于 2015-12-7 11:05 | 只看该作者
感谢提供分享,学习一下。
回复

使用道具 举报

6#
ID:117907 发表于 2016-5-2 10:07 | 只看该作者
不需要单片机么?
回复

使用道具 举报

7#
ID:308395 发表于 2018-4-26 16:33 | 只看该作者
感觉楼主程序不够好,显示2014年,而不是现在时间,没仔细看程序
回复

使用道具 举报

8#
ID:312635 发表于 2018-4-29 13:20 | 只看该作者
厉害了 老哥
回复

使用道具 举报

9#
ID:408168 发表于 2018-10-18 21:53 | 只看该作者
厉害了 老哥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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