找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864液晶和DS1302时钟芯片共同实现万年历的功能的单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:349319 发表于 2018-6-11 11:19 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
LCD1286程序,C语言
  1. /*******************************************************
  2. 效果:  12864液晶和DS1302时钟芯片共同实现万年历的功能
  3. 工作于:KX-1A开发板
  4. 作者:        科信电子工作室
  5. 说明:  由于前面程序代码的注释都比较详细了,此万年历程序
  6. 可以说是对前面程序的大综合,所以有些注释没有标注,有不懂
  7. 的地方可以参考前面的程序,敬请大家谅解。
  8. ********************************************************/
  9. #include<reg51.h>
  10. #define uint unsigned int
  11. #define uchar unsigned char
  12. sbit RS=P2^0;
  13. sbit RW=P2^1;
  14. sbit EN=P2^2;
  15. sbit S=P1^0;
  16. sbit FUN=P1^4;
  17. sbit OK=P1^5;
  18. sbit INC=P1^6;
  19. sbit DEC=P1^7;
  20. sbit RST=P3^5;
  21. sbit SDA=P3^4;
  22. sbit SCL=P3^3;
  23. uchar hour=20;
  24. uchar min=30;
  25. uchar sec=10;
  26. uchar year=10;
  27. uchar mon=3;
  28. uchar date=6;
  29. uchar day=6;
  30. uchar flag=0;
  31. uchar num=0;
  32. uchar i=6;
  33. void delay(uint i)
  34. {
  35.    uint j;
  36.    for(;i>0;i--)
  37.    for(j=0;j<125;j++);
  38. }
  39. void Write_Ds1302_Byte(uchar temp)
  40. {
  41.    uchar i;
  42.    for(i=0;i<8;i++)
  43.    {
  44.       SCL=0;
  45.       SDA=temp&0x01;//只传最后一位
  46.       temp>>=1;
  47.       SCL=1;
  48.    }
  49. }
  50. void Write_Ds1302(uchar address,uchar dat)
  51. {
  52.    RST=0;
  53.    SCL=0;
  54.    RST=1;   
  55.    Write_Ds1302_Byte(address);
  56.    Write_Ds1302_Byte(dat);
  57.    SCL=1;
  58.    RST=0;
  59. }
  60. uchar Read_Ds1302(uchar address)
  61. {
  62.    uchar i,temp=0x00;
  63.    RST=0;
  64.    SCL=0;
  65.    RST=1;
  66.    Write_Ds1302_Byte(address);
  67.    for(i=0;i<8;i++)
  68.    {
  69.       temp>>=1;
  70.           SCL=0;
  71.           if(SDA)
  72.           temp=temp|0x80;
  73.           SCL=1;
  74.    }
  75.    RST=0;
  76.    SDA=0;
  77.    return temp;
  78. }
  79. void Check_Busy(void)
  80. {
  81.    RW=1;//RW=1为读
  82.    RS=0;//RS=0为指令
  83.    EN=1;
  84.    while(P0&0X80);     
  85. }
  86. void Write_com(uchar com)
  87. {
  88.    //Check_Busy();
  89.    RW=0;
  90.    RS=0;
  91.    P0=com;
  92.    EN=1;
  93.    delay(1);
  94.    EN=0;
  95. }
  96. void Write_dat(uchar dat)
  97. {
  98.    //Check_Busy();
  99.    RW=0;
  100.    RS=1;
  101.    P0=dat;
  102.    EN=1;
  103.    delay(1);
  104.    EN=0;               
  105. }
  106. void Lcd_Pos(uchar Xpos,uchar Ypos)
  107. {   
  108.    uchar tmp;
  109.    Xpos&=0x0f;
  110.    Ypos&=0x03;
  111.    tmp=Xpos;
  112.    if(Ypos==0)
  113.    tmp|=0x80;
  114.    if(Ypos==1)
  115.    tmp|=0x90;
  116.    if(Ypos==2)
  117.    tmp|=0x88;
  118.    if(Ypos==3)
  119.    tmp|=0x98;
  120.    Write_com(tmp);
  121. }
  122. void Write_LCD_String(uchar x,uchar y,uchar *s)
  123. {
  124.    Lcd_Pos(x,y);
  125.    Lcd_Pos(x,y);
  126.    while (*s!='\0')              
  127.    {                           
  128.       Write_dat(*s);
  129.       s++;
  130.       delay(1);
  131.    }
  132. }
  133. void LCD_Rst(void)
  134. {
  135.    Write_com(0x30);//功能设定,基本指令
  136.    Check_Busy();
  137.    Write_com(0x01);//清屏指令
  138.    Write_com(0x06);//光标移动设置
  139.    Write_com(0x0c);//整体显示,没有光标,游标位置反白禁止
  140.    delay(5);
  141. }
  142. void Write_day(uchar Sel)
  143. {
  144.    switch (Sel)
  145.    {
  146.       case 1:Write_LCD_String(6,1,"一");break;
  147.           case 2:Write_LCD_String(6,1,"二");break;
  148.           case 3:Lcd_Pos(6,1);Write_dat(0xc8);Write_dat(0xfd);break;
  149.           case 4:Write_LCD_String(6,1,"四");break;
  150.           case 5:Write_LCD_String(6,1,"五");break;
  151.       case 6:Write_LCD_String(6,1,"六");break;
  152.           case 7:Write_LCD_String(6,1,"日");break;
  153.           default :break;
  154.    }
  155. }
  156. void Updat_Time(void)
  157. {

  158.    Lcd_Pos(3,0);Write_dat(0x30+(year/10));Write_dat(0x30+(year%10));
  159.    Lcd_Pos(0,1);Write_dat(0x30+(mon/10));Write_dat(0x30+(mon%10));
  160.    Lcd_Pos(2,1);Write_dat(0x30+(date/10));Write_dat(0x30+(date%10));
  161.    Lcd_Pos(0,2);Write_dat(0x30+(hour/10));Write_dat(0x30+(hour%10));
  162.    Lcd_Pos(2,2);Write_dat(0x30+(min/10));Write_dat(0x30+(min%10));
  163.    Lcd_Pos(4,2);Write_dat(0x30+(sec/10));Write_dat(0x30+(sec%10));
  164.    Write_day(day);
  165. }
  166. void Write_Time(void)
  167. {
  168.    Write_Ds1302(0x8e,0x00);
  169.    Write_Ds1302(0x8c,(year/10)*16+year%10);
  170.    Write_Ds1302(0x88,(mon/10)*16+mon%10);
  171.    Write_Ds1302(0x86,(date/10)*16+date%10);
  172.    Write_Ds1302(0x84,(hour/10)*16+hour%10);
  173.    Write_Ds1302(0x82,(min/10)*16+min%10);
  174.    Write_Ds1302(0x80,(sec/10)*16+sec%10);
  175.    Write_Ds1302(0x8a,(day/10)*16+day%10);
  176.    Write_Ds1302(0x8e,0x80);
  177. }
  178. void Read_Time(void)
  179. {
  180.    year=(Read_Ds1302(0x8d)>>4)*10+Read_Ds1302(0x8d)%16;
  181.    mon=(Read_Ds1302(0x89)>>4)*10+Read_Ds1302(0x89)%16;
  182.    date=(Read_Ds1302(0x87)>>4)*10+Read_Ds1302(0x87)%16;
  183.    hour=(Read_Ds1302(0x85)>>4)*10+Read_Ds1302(0x85)%16;
  184.    min=(Read_Ds1302(0x83)>>4)*10+Read_Ds1302(0x83)%16;
  185.    sec=(Read_Ds1302(0x81)>>4)*10+Read_Ds1302(0x81)%16;
  186.    day=(Read_Ds1302(0x8b)>>4)*10+Read_Ds1302(0x8b)%16;
  187.    Updat_Time();
  188. }
  189. void Set_Time(void)
  190. {
  191.    if(FUN==0)
  192.    {
  193.       delay(10);
  194.           if(FUN==0)
  195.           {
  196.              while(!FUN);
  197.                  flag=1;
  198.          num++;
  199.                  if(num==8)
  200.                  num=1;
  201.           }
  202.    }
  203.    if(flag)
  204.    {
  205.           if(num==1)
  206.           {
  207.          Lcd_Pos(0,2);
  208.              Write_com(0x0d);
  209.                  if(INC==0)
  210.                  {
  211.                     delay(10);
  212.                         if(INC==0)
  213.                         {
  214.                            while(!INC);
  215.                            hour++;
  216.                            if(hour==24)
  217.                            hour=0;
  218.                            Updat_Time();
  219.                         }
  220.                        
  221.                  }
  222.                  if(DEC==0)
  223.                  {
  224.                         delay(10);
  225.                         if(DEC==0)
  226.                         {
  227.                            while(!DEC);
  228.                            hour--;
  229.                            if(hour==-1)
  230.                            hour=23;
  231.                Updat_Time();
  232.                         }
  233.                  }
  234.           }  
  235.       if(num==2)
  236.       {
  237.          Lcd_Pos(2,2);
  238.              Write_com(0x0d);
  239.                  if(INC==0)
  240.                  {
  241.                     delay(10);
  242.                         if(INC==0)
  243.                         {
  244.                            while(!INC);
  245.                            min++;
  246.                            if(min==60)
  247.                            min=0;
  248.                            Updat_Time();
  249.                         }
  250.                        
  251.                        
  252.                  }
  253.                  if(DEC==0)
  254.                  {
  255.                         delay(10);
  256.                         if(DEC==0)
  257.                         {
  258.                            while(!DEC);
  259.                            min--;
  260.                            if(min==-1)
  261.                            min=59;
  262.                            Updat_Time();
  263.                         }
  264.                  }
  265.       }
  266.       if(num==3)
  267.       {
  268.          Lcd_Pos(4,2);
  269.                  Write_com(0x0d);
  270.                  if(INC==0)
  271.                  {
  272.                     delay(10);
  273.                         if(INC==0)
  274.                         {
  275.                            while(!INC);
  276.                            sec++;
  277.                            if(sec==60)
  278.                            sec=0;
  279.                            Updat_Time();
  280.                         }
  281.                  }
  282.                  if(DEC==0)
  283.                  {
  284.                     delay(10);
  285.                     if(DEC==0)
  286.                         {
  287.                            while(!DEC);
  288.                            sec--;
  289.                            if(sec==-1)
  290.                            sec=59;
  291.                            Updat_Time();
  292.                         }
  293.                  }
  294.       }
  295.           if(num==4)
  296.           {
  297.          Lcd_Pos(3,0);
  298.                  Write_com(0x0d);
  299.                  if(INC==0)
  300.                  {
  301.                     delay(10);
  302.                         if(INC==0)
  303.                         {
  304.                            while(!INC);
  305.                            year++;
  306.                            if(year==100)
  307.                            year=0;
  308.                            Updat_Time();
  309.                         }
  310.                  }
  311.                  if(DEC==0)
  312.                  {
  313.                     delay(10);
  314.                     if(DEC==0)
  315.                         {
  316.                            while(!DEC);
  317.                            year--;
  318.                            if(year==-1)
  319.                            sec=99;
  320.                            Updat_Time();
  321.                         }
  322.                  }
  323.           }
  324.       if(num==5)
  325.           {
  326.                  Lcd_Pos(0,1);
  327.                  Write_com(0x0d);
  328.          if(INC==0)
  329.                  {
  330.                     delay(10);
  331.                         if(INC==0)
  332.                         {
  333.                            while(!INC);
  334.                            mon++;
  335.                            if(mon==13)
  336.                            mon=1;
  337.                            Updat_Time();
  338.                         }
  339.                  }
  340.                  if(DEC==0)
  341.                  {
  342.                     delay(10);
  343.                         if(DEC==0)
  344.                         {
  345.                            while(!DEC);
  346.                            mon--;
  347.                            if(mon==0)
  348.                            mon=12;
  349.                            Updat_Time();
  350.                         }
  351.                  }
  352.           }
  353.           if(num==6)
  354.           {
  355.                  Lcd_Pos(2,1);
  356.                  Write_com(0x0d);
  357.                  if(INC==0)
  358.                  {
  359.                     delay(10);
  360.                         if(INC==0)
  361.                         {
  362.                            while(!INC);
  363.                date++;
  364.                            if(date==32)
  365.                            date=1;
  366.                            Updat_Time();
  367.                         }
  368.                  }
  369.                  if(DEC==0)
  370.                  {
  371.                     delay(10);
  372.                         if(DEC==0)
  373.                         {
  374.                            while(!DEC);
  375.                            date--;
  376.                            if(date==0)
  377.                            date=31;
  378.                            Updat_Time();
  379.                         }
  380.                  }
  381.           }
  382.           if(num==7)
  383.           {
  384.                  Lcd_Pos(6,1);
  385.                  Write_com(0x0d);
  386.                  if(INC==0)
  387.                  {
  388.                     delay(10);
  389.                         if(INC==0)
  390.                         {
  391.                            while(!INC);
  392.                            day++;
  393.                            if(day==8)
  394.                            day=1;
  395.                            Updat_Time();
  396.                         }
  397.                  }
  398.                  if(DEC==0)
  399.                  {
  400.                     delay(10);
  401.                         if(DEC==0)
  402.                 {
  403.                            while(!DEC);
  404.                            day--;
  405.                            if(day==0)
  406.                            day=7;
  407.                            Updat_Time();
  408.                         }
  409.                  }
  410.           }
  411.    }
  412.    if(OK==0)
  413.    {
  414.       delay(10);
  415.           if(OK==0)
  416.           {
  417.              while(!OK);
  418.                  flag=0;
  419.                  num=0;
  420.                  Write_com(0x0c);
  421.                  Write_Time();
  422.           }
  423.    }
  424. }
  425. void Festival(void)
  426. {
  427.    if (mon == 1 && date== 1 )  { Write_LCD_String(0,3,"Happy New Year!!"); }
  428.    else
  429.    if (mon == 1 && date== 28 ) { Write_LCD_String(0,3,"  世界麻风日    "); }
  430.    else
  431.    if (mon == 2 && date== 2 )  { Write_LCD_String(0,3,"  世界湿地日    "); }
  432.    else
  433.    if (mon == 2 && date== 13 ) { Write_LCD_String(0,3,"  明天情人节了  "); }
  434.    else
  435.    if (mon == 2 && date== 14 ) { Write_LCD_String(0,3,"  今天是情人节  "); }
  436.    else
  437.    if (mon == 3 && date== 1 )  { Write_LCD_String(0,3,"  国际海豹日    "); }
  438.    else
  439.    if (mon == 3 && date== 3 )  { Write_LCD_String(0,3,"  全国爱耳日    "); }
  440.    else
  441.    if (mon == 3 && date== 8 )  { Write_LCD_String(0,3,"   3.8妇女节    "); }
  442.    else  
  443.    if (mon == 3 && date== 12 ) { Write_LCD_String(0,3,"    植树节      "); }
  444.    else
  445.    if (mon == 3 && date== 14 ) { Write_LCD_String(0,3,"  国际警察日    "); }
  446.    else
  447.    if (mon == 3 && date== 15 ) { Write_LCD_String(0,3,"  消费者权益日  "); }
  448.    else  
  449.    if (mon == 3 && date== 17 ) { Write_LCD_String(0,3,"  国际航海日    "); }
  450.    else
  451.    if (mon == 3 && date== 21 ) { Write_LCD_String(0,3,"  世界森林日    "); }
  452.    else  
  453.    if (mon == 3 && date== 22 ) { Write_LCD_String(0,3,"    世界水日    "); }
  454.    else  
  455.    if (mon == 3 && date== 23 ) { Write_LCD_String(0,3,"  世界气象日    "); }
  456.    else  
  457.    if (mon == 3 && date== 24 ) { Write_LCD_String(0,3,"世界防治结核病日"); }
  458.    else   
  459.    if (mon == 4 && date== 1 )  { Write_LCD_String(0,3,"愚人节  小心上当"); }
  460.    else
  461.    if (mon == 4 && date== 7 )  { Write_LCD_String(0,3,"  世界卫生日    "); }
  462.    else
  463.    if (mon == 4 && date== 8 )  { Write_LCD_String(0,3,"    复活节      "); }
  464.    else
  465.    if (mon == 4 && date== 13 ) { Write_LCD_String(0,3,"  黑色星期五    "); }
  466.    else   
  467.    if (mon == 5 && date== 1 )  { Write_LCD_String(0,3,"  劳动节  放假  "); }
  468.    else
  469.    if (mon == 5 && date== 4 )  { Write_LCD_String(0,3,"    青年节      "); }
  470.    else
  471.    if (mon == 5 && date== 8 )  { Write_LCD_String(0,3,"  世界红十字日  "); }
  472.    else
  473.    if (mon == 5 && date== 12 ) { Write_LCD_String(0,3,"  国际护士节    "); }
  474.    else
  475.    if (mon == 5 && date== 5 )  { Write_LCD_String(0,3,"近日注意母亲节  "); }
  476.    else  
  477.    if (mon == 5 && date== 15 ) { Write_LCD_String(0,3,"  国际家庭日    "); }
  478.    else
  479.    if (mon == 5 && date== 31 ) { Write_LCD_String(0,3,"  世界无烟日    "); }
  480.    else   
  481.    if (mon == 6 && date== 1 )  { Write_LCD_String(0,3,"  国际儿童节    "); }
  482.    else
  483.    if (mon == 6 && date== 5 )  { Write_LCD_String(0,3,"  世界环境日    "); }
  484.    else  
  485.    if (mon == 6 && date== 26 ) { Write_LCD_String(0,3,"  国际禁毒日    "); }
  486.    else  
  487.    if (mon == 6 && date== 6 )  { Write_LCD_String(0,3,"  全国爱眼日    "); }
  488.    else  
  489.    if (mon == 6 && date== 13 ) { Write_LCD_String(0,3,"近日注意父亲节  "); }
  490.    else
  491.    if (mon == 6 && date== 15 ) { Write_LCD_String(0,3,"近日注意父亲节  "); }
  492.    else   
  493.    if (mon == 7 && date== 1 )  { Write_LCD_String(0,3,"香港回归记念日  "); }
  494.    else
  495.    if (mon == 7 && date== 7 )  { Write_LCD_String(0,3,"抗日战争记念日  "); }
  496.    else
  497.    if (mon == 7 && date== 11 ) { Write_LCD_String(0,3,"  世界人口日    "); }
  498.    else
  499.    if (mon == 8 && date== 1 )  { Write_LCD_String(0,3,"  八一建军节    "); }
  500.    else
  501.    if (mon == 8 && date== 8 )  { Write_LCD_String(0,3,"  中国男子节    "); }
  502.    else
  503.    if (mon == 8 && date== 15 ) { Write_LCD_String(0,3,"抗战胜利记念日  "); }
  504.    else
  505.    if (mon == 9 && date== 10 ) { Write_LCD_String(0,3,"  中国教师节    "); }
  506.    else
  507.    if (mon == 9 && date== 18 ) { Write_LCD_String(0,3,"九·一八事变记念"); }
  508.    else
  509.    if (mon == 9 && date== 20 ) { Write_LCD_String(0,3,"  国际爱牙日    "); }
  510.    else
  511.    if (mon == 9 && date== 27 ) { Write_LCD_String(0,3,"  世界旅游日    "); }
  512.    else
  513.    if (mon == 10 && date== 1 ) { Write_LCD_String(0,3,"  中国国庆节    "); }
  514.    else
  515.    if (mon == 10 && date== 4 ) { Write_LCD_String(0,3,"  世界动物日    "); }
  516.    else
  517.    if (mon == 10 && date== 24 ){ Write_LCD_String(0,3,"    联合国日    "); }
  518.    else
  519.    if (mon == 10 && date== 12 ){ Write_LCD_String(0,3,"明天国际教师节  "); }
  520.    else
  521.    if (mon == 10 && date== 13 ){ Write_LCD_String(0,3,"  国际教师节    "); }
  522.    else
  523.    if (mon == 11 && date== 10 ){ Write_LCD_String(0,3,"  世界青年节    "); }
  524.    else
  525.    if (mon == 11 && date== 17 ){ Write_LCD_String(0,3,"  世界学生节    "); }
  526.    else
  527.    if (mon == 12 && date== 1 ) { Write_LCD_String(0,3,"  世界艾滋病日  "); }
  528.    else
  529.    if (mon == 12 && date== 23 ){ Write_LCD_String(0,3,"  明晚平安夜    "); }
  530.    else
  531.    if (mon == 12 && date== 24 ){ Write_LCD_String(0,3,"  今晚平安夜    "); }
  532.    else
  533.    if (mon == 12 && date== 25 ){ Write_LCD_String(0,3,"    圣诞快乐    "); }
  534.    else
  535.    if (mon == 12 && date== 31 ){ Write_LCD_String(0,3,"    明日新年    "); }
  536.    else
  537.    {
  538.           if(hour >= 4 && hour<  6 )  { Write_LCD_String(0,3,"★★__▲▲__凌晨"); }
  539.       if(hour >= 6 && hour<  8 )  { Write_LCD_String(0,3,"☆○__▲△__早晨"); }
  540.       if(hour >= 8 && hour<  12 ) { Write_LCD_String(0,3,"__●__▲▲__上午"); }
  541.       if(hour == 12)              { Write_LCD_String(0,3,"____▲●▲__中午"); }
  542.       if(hour >= 13 && hour<  18 ){ Write_LCD_String(0,3,"__▲▲__●__下午"); }
  543.       if(hour >= 18 && hour<  22 ){ Write_LCD_String(0,3,"△▲__●☆__晚上"); }
  544.       if(hour >= 22 && hour<= 23 ){ Write_LCD_String(0,3,"△▲__★☆__夜里"); }
  545.       if(hour >= 0 && hour<  4 )  { Write_LCD_String(0,3,"__★▲▲★__深夜"); }
  546.     }
  547. }
  548. void System_Init(void)
  549. {
  550.    S=0;
  551.    LCD_Rst();
  552.    Write_LCD_String(0,1,"系统初始化");
  553.    Lcd_Pos(5,1);
  554.    while(i--)
  555.    {
  556.       Write_dat(0x3e);
  557.       delay(300);
  558.    }
  559.    Write_com(0x01);
  560.    Write_LCD_String(0,1,"您好!欢迎使用!");
  561.    delay(1500);
  562.    Write_com(0x01);
  563.    Write_LCD_String(2,0,"2010年");
  564.    Write_LCD_String(0,1,"01月18日星期一");
  565.    Write_LCD_String(0,2,"10时17分30秒");
  566. }
  567. void main(void)
  568. {     
  569.    System_Init();  
  570.    Write_Time();       
  571.    while(1)
  572.    {
  573.       Set_Time();
  574.       if(!flag)
  575.           {             
  576.              Read_Time();
  577.                  Festival();
  578.           }
  579.           
  580.    }      
  581. }
  582. //***************************GND**************************************

复制代码


12864.rar

3.06 KB, 下载次数: 64, 下载积分: 黑币 -5

lcd

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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