找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS12887+lcd1602万年历仿真原理图+程序

  [复制链接]
跳转到指定楼层
楼主
下面是仿真原理图:

51单片机驱动DS12887时钟芯片,采用lcd1602液晶屏来显示万年历


仿真工程文件和源码下载:
DS12C887.rar (16.85 KB, 下载次数: 148)



源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. sbit rs=P3^5;
  7. sbit lcden=P3^4;
  8. sbit s1=P3^0;
  9. sbit s2=P3^1;
  10. sbit s3=P3^2;
  11. sbit rd=P3^7;
  12. sbit s4=P3^3;
  13. sbit dsds=P1^7;
  14. sbit dsrw=P1^6;
  15. sbit dsas=P1^5;
  16. sbit dscs=P1^4;
  17. sbit dsirq=P3^3;
  18. uchar count,shi,fen,miao,s1num,week=0,i,day=1,yue=1,year1=0,year2,year3,year4;
  19. uchar code table1[]=" 0000-01-01 MON";         //初始显示
  20. uchar code table2[]="    00:00:00";                 
  21. uchar code table3[7][3]={"MON","TUE","WED","THU","FRI","STA","SUN"};//星期的编码
  22. //*****延时函数
  23. void delay(uchar z)
  24. {
  25.         uchar x,y;
  26.         for(x=z;x>0;x--)
  27.         for(y=110;y>0;y--);       
  28. }
  29. //****写命令函数
  30. void write_com(uchar com)
  31. {
  32.         rs=0;
  33.         lcden=0;
  34.         P0=com;
  35.         delay(5);
  36.         lcden=1;
  37.         delay(5);
  38.         lcden=0;
  39. }
  40. //****写入数据函数
  41. void write_data(uchar date)
  42. {
  43.         rs=1;
  44.         lcden=0;
  45.         P0=date;
  46.         delay(5);
  47.         lcden=1;
  48.         delay(5);
  49.         lcden=0;
  50. }
  51. //****初始化函数
  52. void init()
  53. {
  54.         uchar num;
  55. //        year=year1+year2*10+year3*100+year4*1000;
  56.         wela=0;
  57.         dula=0;
  58.         lcden=0;
  59.         write_com(0x38);
  60.         write_com(0x0c);
  61.         write_com(0x06);
  62.         write_com(0x01);
  63.         write_com(0x80);
  64.         for(num=0;num<15;num++)
  65.         {
  66.                 write_data(table1[num]);
  67.                 delay(20);
  68.         }
  69.         write_com(0x80+0x40);
  70.         for(num=0;num<12;num++)
  71.         {
  72.                 write_data(table2[num]);
  73.                 delay(20);
  74.         }
  75. /*        TMOD=0x01;
  76.         TH0=(65536-50000)/256;
  77.         TL0=(65536-50000)%256;
  78.         EA=1;
  79.         ET0=1;
  80.         TR0=1;                */
  81. }
  82. //*****显示时分秒
  83. void write_sfm(uchar add,uchar date1)
  84. {
  85.         uchar shi,ge;
  86.         shi=date1/10;
  87.         ge=date1%10;
  88.         write_com(add+0x80+0x40);
  89.         write_data(0x30+shi);
  90.         write_data(0x30+ge);
  91. }
  92. //*****显示年月日
  93. void write_sfm1(uchar add,uchar date1)
  94. {
  95.         uchar shi,ge;
  96.         shi=date1/10;
  97.         ge=date1%10;
  98.         write_com(add+0x80);
  99.         write_data(0x30+shi);
  100.         write_data(0x30+ge);
  101. }
  102. void key2();
  103. void key3();
  104. //******键盘扫描函数
  105. void keyscan()
  106. {
  107.         rd=0;
  108.         if(s1==0)//第一个键被按下
  109.         {
  110.                 delay(5);           //************去除抖动
  111.                 if(s1==0)       
  112.                 {
  113.                         s1num++;          //***第一个键没被按下一次,s1num就加1
  114.                         while(!s1);               
  115.                         if(s1num==1)         //当被按下一次时,光标停在秒位上并开始闪烁,始终停止
  116.                         {
  117.                                 TR0=0;
  118.                                 write_com(0x80+0x40+11);
  119.                                 write_com(0x0f);
  120.                         }
  121.                         if(s1num==2)          //被按下第二次,光标停在分位上
  122.                         {
  123.                                 write_com(0x80+0x40+8);
  124.                         }
  125.                         if(s1num==3)         //被按下第三次,光标停在时位上
  126.                         {
  127.                                 write_com(0x80+0x40+5);
  128.                         }
  129.                         if(s1num==4)          //被按下第四次,光标停在显示星期的位上
  130.                         {
  131.                                 write_com(0x80+15);
  132.                         }
  133.                         if(s1num==5)          //被按下第五次,光标停在显示日子的位上
  134.                         {
  135.                                 write_com(0x80+10);
  136.                         }
  137.                         if(s1num==6)                //被按下第六次,光标停在显示月的位上
  138.                         {
  139.                                 write_com(0x80+7);
  140.                         }
  141.                         if(s1num==7)           //被按下第七次,光标停在显示年的个位上
  142.                         {
  143.                                 write_com(0x80+4);
  144.                         }
  145.                         if(s1num==8)                        //被按下第八次,光标停在十位上
  146.                         {
  147.                                 write_com(0x80+3);
  148.                         }
  149.                         if(s1num==9)                   //被按下第九次,光标停在百位上
  150.                         {
  151.                                 write_com(0x80+2);
  152.                         }
  153.                         if(s1num==10)                        //被按下第十次,光标停在千位上
  154.                         {
  155.                                 write_com(0x80+1);
  156.                         }
  157.                         if(s1num==11)                        //被按下第十一次,时钟从设置的时刻开始
  158.                         {
  159.                                 s1num=0;
  160.                                 write_com(0x0c);
  161.                                 TR0=1;
  162.                         }
  163.                 }
  164.                
  165.         }       
  166.         if(s4==0)                                           //第四个键被按下,时钟重新开始走
  167.         {
  168.                 s1num=0;
  169.                 write_com(0x0c);
  170.                 TR0=1;
  171.         }
  172.         if(s1num!=0)
  173.                 {
  174.                         key2();
  175.                         key3();
  176.                 }
  177. }
  178. void key2()                //调整时间加
  179. {
  180.                 if(s2==0)
  181.                         {
  182.                                 delay(5);
  183.                                 if(s2==0)
  184.                                 {
  185.                                         while(!s2);
  186.                                          if(s1num==1)
  187.                                         {
  188.                                                 miao++;               
  189.                                                 if(miao==60)
  190.                                                         miao=0;       
  191.                                                 write_sfm(10,miao);
  192.                                                 write_com(0x80+0x40+11);
  193.                                                
  194.                                         }
  195.                                         if(s1num==2)
  196.                                         {
  197.                                                 fen++;
  198.                                                 if(fen==60)
  199.                                                         fen=0;
  200.                                                 write_sfm(7,fen);         
  201.                                                 write_com(0x80+0x40+8);
  202.                                         }
  203.                                         if(s1num==3)
  204.                                         {
  205.                                                 shi++;
  206.                                                 if(shi==24)
  207.                                                         shi=0;
  208.                                                 write_sfm(4,shi);       
  209.                                                 write_com(0x80+0x40+5);
  210.                                         }
  211.                                         if(s1num==4)
  212.                                         {
  213.                                                 week++;
  214.                                                 switch(week)
  215.                                                 {
  216.                                                         case 0:write_com(0x80+12);
  217.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  218.                                                         case 1:write_com(0x80+12);
  219.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  220.                                                         case 2:write_com(0x80+12);
  221.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  222.                                                         case 3:write_com(0x80+12);
  223.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  224.                                                         case 4:write_com(0x80+12);
  225.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  226.                                                         case 5:write_com(0x80+12);
  227.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  228.                                                         case 6:write_com(0x80+12);
  229.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  230.                                                         case 7:write_com(0x80+12); week=0;
  231.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  232.                                                 }
  233.                                         }
  234.                                         if(s1num==5)
  235.                                         {
  236.                                                        
  237.                                                 if((yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||12)&&day==31)
  238.                                                         day=0;
  239.                                                 if((yue==2||yue==4||yue==6||yue==9||yue==11)&&day==30)
  240.                                                         day=0;
  241.                                                 day++;                                           
  242.                                                 write_sfm1(9,day);       
  243.                                                 write_com(0x80+10);       
  244.                                        
  245.                                         }
  246.                                         if(s1num==6)
  247.                                         {
  248.                                                 if(yue==12)
  249.                                                         yue=0;
  250.                                                 yue++;
  251.                                                 write_sfm1(6,yue);
  252.                                                 write_com(0x80+7);       
  253.                                         }
  254.                                         if(s1num==7)
  255.                                         {
  256.                                                 if(year1==9)
  257.                                                 {
  258.                                                         year1=0;
  259.                                                          write_com(0x80+4);
  260.                                                         write_data(0x30+year1);
  261.                                                         write_com(0x80+4);
  262.                                                 }
  263.                                                 else
  264.                                                 {
  265.                                                         year1++;
  266.                                                         write_com(0x80+4);
  267.                                                         write_data(0x30+year1);
  268.                                                         write_com(0x80+4);
  269.                                                 }
  270.                                         }
  271.                                                 if(s1num==8)
  272.                                         {
  273.                                                 if(year2==9)
  274.                                                 {
  275.                                                         year2=0;
  276.                                                          write_com(0x80+3);
  277.                                                         write_data(0x30+year2);
  278.                                                         write_com(0x80+3);
  279.                                                 }
  280.                                                 else
  281.                                                 {
  282.                                                         year2++;
  283.                                                         write_com(0x80+3);
  284.                                                         write_data(0x30+year2);
  285.                                                         write_com(0x80+3);
  286.                                                 }
  287.                                         }
  288.                                                 if(s1num==9)
  289.                                         {
  290.                                                 if(year3==9)
  291.                                                 {
  292.                                                         year3=0;
  293.                                                          write_com(0x80+2);
  294.                                                         write_data(0x30+year3);
  295.                                                         write_com(0x80+2);
  296.                                                 }
  297.                                                 else
  298.                                                 {
  299.                                                         year3++;
  300.                                                         write_com(0x80+2);
  301.                                                         write_data(0x30+year3);
  302.                                                         write_com(0x80+2);
  303.                                                 }
  304.                                         }
  305.                                                 if(s1num==10)
  306.                                         {
  307.                                                 if(year4==9)
  308.                                                 {
  309.                                                         year4=0;
  310.                                                          write_com(0x80+1);
  311.                                                         write_data(0x30+year4);
  312.                                                         write_com(0x80+1);
  313.                                                 }
  314.                                                 else
  315.                                                 {
  316.                                                         year4++;
  317.                                                         write_com(0x80+1);
  318.                                                         write_data(0x30+year4);
  319.                                                         write_com(0x80+1);
  320.                                                 }
  321.                                         }
  322.                                 }
  323.                         }
  324. }
  325. void key3()                                   //调整时间减
  326. {
  327.         if(s3==0)
  328.                         {
  329.                                 delay(5);
  330.                                 if(s3==0)
  331.                                 {
  332.                                         while(!s3);
  333.                                         if(s1num==1)
  334.                                         {
  335.                                                 if(miao==0)
  336.                                                 {       
  337.                                                         miao=60;
  338.                                                         write_sfm(10,miao);
  339.                                                         write_com(0x80+0x40+11);
  340.                                                 }       
  341.                                                 miao--;               
  342.                                                 write_sfm(10,miao);
  343.                                                 write_com(0x80+0x40+11);
  344.                                                
  345.                                         }
  346.                                         if(s1num==2)
  347.                                         {
  348.                                                
  349.                                                 if(fen==0)
  350.                                                 {
  351.                                                         fen=60;
  352.                                                         write_sfm(7,fen);         
  353.                                                         write_com(0x80+0x40+8);
  354.                                                 }
  355.                                                 fen--;
  356.                                                 write_sfm(7,fen);         
  357.                                                 write_com(0x80+0x40+8);
  358.                                         }
  359.                                         if(s1num==3)
  360.                                         {
  361.                                                
  362.                                                 if(shi==0)
  363.                                                 {
  364.                                                         shi=24;
  365.                                                         write_sfm(4,shi);       
  366.                                                         write_com(0x80+0x40+5);
  367.                                                 }          
  368.                                                 shi--;
  369.                                                 write_sfm(4,shi);       
  370.                                                 write_com(0x80+0x40+5);
  371.                                         }
  372.                                         if(s1num==4)
  373.                                         {
  374.                                                 if(week==0)
  375.                                            {
  376.                                                    week=7;
  377.                                                 write_com(0x80+12);
  378.                                                 for(i=0;i<3;i++)
  379.                                                          write_data(table3[week][i]);
  380.                                                 }
  381.                                                 week--;
  382.                                                 switch(week)
  383.                                                 {
  384.                                                         case 0:write_com(0x80+12);
  385.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  386.                                                         case 1:write_com(0x80+12);
  387.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  388.                                                         case 2:write_com(0x80+12);
  389.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  390.                                                         case 3:write_com(0x80+12);
  391.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  392.                                                         case 4:write_com(0x80+12);
  393.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  394.                                                         case 5:write_com(0x80+12);
  395.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  396.                                                         case 6:write_com(0x80+12);
  397.                                                         for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  398.                                                 }
  399.                                         }
  400.                                         if(s1num==5)
  401.                                         {
  402.                                                 day--;       
  403.                                                 if((yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||12)&&day==0)
  404.                                                 {       
  405.                                                         day=31;
  406.                                                         write_sfm1(9,day);       
  407.                                                         write_com(0x80+10);
  408.                                                 }       
  409.                                                 else if((yue==2||yue==4||yue==6||yue==9||yue==11)&&day==0)
  410.                                                 {
  411.                                                         day=30;
  412.                                                         write_sfm1(9,day);       
  413.                                                         write_com(0x80+10);
  414.                                                 }                                   
  415.                                                 write_sfm1(9,day);       
  416.                                                 write_com(0x80+10);       
  417.                                         }
  418.                                         if(s1num==6)
  419.                                         {
  420.                                                 yue--;
  421.                                                 if(yue==0)
  422.                                                 {
  423.                                                         yue=12;
  424.                                                         write_sfm1(6,yue);
  425.                                                         write_com(0x80+7);
  426.                                                 }       
  427.                                                 write_sfm1(6,yue);
  428.                                                 write_com(0x80+7);       
  429.                                         }
  430.                                         if(s1num==7)
  431.                                         {
  432.                                                 if(year1==0)
  433.                                                 {
  434.                                                         year1=9;
  435.                                                          write_com(0x80+4);
  436.                                                         write_data(0x30+year1);
  437.                                                         write_com(0x80+4);
  438.                                                 }
  439.                                                 else
  440.                                                 {
  441.                                                         year1--;
  442.                                                         write_com(0x80+4);
  443.                                                         write_data(0x30+year1);
  444.                                                         write_com(0x80+4);
  445.                                                 }
  446.                                         }
  447.                                         if(s1num==8)
  448.                                         {
  449.                                                 if(year2==0)
  450.                                                 {
  451.                                                         year2=9;
  452.                                                         write_com(0x80+3);
  453.                                                         write_data(0x30+year2);
  454.                                                         write_com(0x80+3);
  455.                                                 }
  456.                                                 else
  457.                                                 {
  458.                                                         year2--;
  459.                                                         write_com(0x80+3);
  460.                                                         write_data(0x30+year2);
  461.                                                         write_com(0x80+3);
  462.                                                 }
  463.                                         }
  464.                                         if(s1num==9)
  465.                                         {
  466.                                                 if(year3==0)
  467.                                                 {
  468.                                                         year3=9;
  469.                                                          write_com(0x80+2);
  470.                                                         write_data(0x30+year3);
  471.                                                         write_com(0x80+2);
  472.                                                 }
  473.                                                 else
  474.                                                 {
  475.                                                         year3--;
  476.                                                         write_com(0x80+2);
  477.                                                         write_data(0x30+year3);
  478.                                                         write_com(0x80+2);
  479.                                                 }
  480.                                         }
  481.                                         if(s1num==10)
  482.                                         {
  483.                                                 if(year4==0)
  484.                                                 {
  485.                                                         year4=9;
  486.                                                          write_com(0x80+1);
  487.                                                         write_data(0x30+year4);
  488.                                                         write_com(0x80+1);
  489.                                                 }
  490.                                                 else
  491.                                                 {
  492.                                                         year4--;
  493.                                                         write_com(0x80+1);
  494.                                                         write_data(0x30+year4);
  495.                                                         write_com(0x80+1);
  496.                                                 }
  497.                                         }
  498.                                 }
  499.                         }
  500. }
  501. void write_ds(uchar add,uchar date)
  502. {
  503.         dsas=1;
  504.         dsds=1;
  505.         dsrw=1;
  506.         dscs=0;
  507.         P0=add;
  508.         dsas=0;
  509.         dsrw=0;
  510.         P0=date;
  511.         dsrw=1;
  512.         dsas=1;
  513.         dscs=1;       
  514. }
  515. uchar read_ds(uchar add)
  516. {
  517.         uchar ds_date;
  518.         dscs=0;
  519.         dsas=1;
  520.         dsds=1;
  521.         dsrw=1;
  522.         P0=add;
  523.         dsas=0;
  524.         dsds=0;
  525.         P0=0xff;
  526.         ds_date=P0;
  527.         dsds=1;
  528.         dsas=1;
  529.         dscs=1;                       
  530.         return ds_date;
  531. }
  532. void main()
  533. {
  534.         init();
  535.         while(1)
  536.         {
  537.         //        keyscan();
  538.                 miao=read_ds(0);
  539.                 write_sfm(10,miao);
  540.         }
  541. }
  542. //定时器零的中断函数
  543. /*void time0() interrupt 1
  544. {
  545.         TH0=(65536-50000)/256;
  546.         TL0=(65536-50000)%256;
  547.         count++;
  548.                 if(count==18)
  549.                         {
  550.                                         count=0;
  551.                                         miao++;
  552.                                         if(miao==60)
  553.                                         {
  554.                                                 miao=0;
  555.                                                 fen++;
  556.                                                 if(fen==60)
  557.                                                 {
  558.                                                         fen=0;
  559.                                                         shi++;
  560.                                                         if(shi==24)
  561.                                                         {
  562.                                                                 shi=0;
  563.                                                                 day++;
  564.                                                         /*        week++;
  565.                                                                 switch(week)
  566.                                                                 {
  567.                                                                                 case 0:write_com(0x80+12);
  568.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  569.                                                                                 case 1:write_com(0x80+12);
  570.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  571.                                                                                 case 2:write_com(0x80+12);
  572.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  573.                                                                                 case 3:write_com(0x80+12);
  574.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  575.                                                                                 case 4:write_com(0x80+12);
  576.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  577.                                                                                 case 5:write_com(0x80+12);
  578.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  579.                                                                                 case 6:write_com(0x80+12);
  580.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  581.                                                                                 case 7:write_com(0x80+12); week=0;
  582.                                                                                 for(i=0;i<3;i++) write_data(table3[week][i]);   break;
  583.                                                                 }*/
  584.                                                         /*        if(((yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||12)&&(day==32))||((yue==2||yue==4||yue==6||yue==9||yue==11)&&(day==31)))
  585.                                                                 {
  586.                                                                         day=1;
  587.                                                                         yue++;
  588.                                                                         if(yue==13)
  589.                                                                         {
  590.                                                                                 yue=1;
  591.                                                                                 year1++;
  592.                                                                                 if(year1==10)
  593.                                                                                 {
  594.                                                                                         year1=0;
  595.                                                                                         year2++;
  596.                                                                                         if(year2==10)
  597.                                                                                         {
  598.                                                                                                 year2=0;
  599.                                                                                                 year3++;
  600.                                                                                                 if(year3==10)
  601.                                                                                                 {
  602.                                                                                                         year3=0;
  603.                                                                                                         year4++;
  604.                                                                                                         write_com(0x80+1);
  605.                                                                                                         write_data(0x30+year4);
  606.                                                                                                 }
  607.                                                                                                 write_com(0x80+2);
  608.                                                                                                 write_data(0x30+year3);
  609.                                                                                         }
  610.                                                                                         write_com(0x80+3);
  611.                                                                                         write_data(0x30+year2);
  612.                                                                                 }
  613.                                                                                 write_com(0x80+4);
  614.                                                                                 write_data(0x30+year1);
  615.                                                                         }
  616.                                                                         write_sfm1(6,yue);
  617.                                                                 }
  618.                                                                 write_sfm1(9,day);
  619.                                                         }
  620.                                                         write_sfm(4,shi);
  621.                                                 }
  622.                                                 write_sfm(7,fen);
  623.                                         }
  624.                                         write_sfm(10,miao);
  625.                         }       
  626. }                */
复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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