找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10200|回复: 29
收起左侧

资料齐全的适合新手制作的1602液晶显示单片机数字钟

  [复制链接]
ID:76686 发表于 2015-4-11 17:46 | 显示全部楼层 |阅读模式
本帖最后由 dzdiy 于 2015-4-11 17:47 编辑

    1602液晶显示单片机桌面数字钟,功能主要有:温度、时间、日期、星期显示以及调节。有多级菜单显示。第一级菜单调节时间、日期。第二级菜单显示自定义信息。附件中有源程序、电路图,需要的自己下载,下载地址:1602液晶显示单片机桌面数字钟程序资料包














下面是程序源码:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit DQ=P2^1;
  6. sbit light=P2^7;
  7. sbit k1=P1^0;
  8. sbit k2=P1^1;
  9. sbit k3=P1^2;
  10. sbit k4=P1^3;
  11. sbit k5=P1^4;
  12. sbit LED1=P1^3;
  13. sbit LED2=P1^4;

  14. sbit DS1302_CE=P3^5;
  15. sbit DS1302_IO=P3^6;
  16. sbit DS1302_SCLK=P3^7;

  17. sbit LCD1602_RS=P2^4;
  18. sbit LCD1602_RW=P2^5;
  19. sbit LCD1602_EN=P2^6;

  20. extern uchar wendu[4];
  21. extern void get_wendu();

  22. extern void LCD1602_init();
  23. extern void LCD1602_wcmd(uchar cmd);
  24. extern void LCD1602_wdat(uchar dat);
  25. extern void LCD1602_pos(uchar x,bit y);         //定义显示位置,x为列,y为行,0上1下
  26. extern void LCD1602_dischar(uchar x,bit y,uchar dat); //在指定位置显示字符
  27. extern void LCD1602_prints(uchar x,bit y,uchar *p);  //显示字符串

  28. extern uchar dt[7];
  29. extern void set_time();
  30. extern void get_time();
  31. extern void DS1302_init();

  32. /**************************DS1302 *********************************/

  33. uchar dt[7];

  34. void DS1302_write_byte(uchar dat)
  35. {
  36.   char i;

  37.   for(i=0;i<8;i++)
  38.   {
  39.     DS1302_SCLK = 0;
  40.         _nop_();
  41.         _nop_();
  42.         dat >>= 1;
  43.         DS1302_IO = CY;
  44.         DS1302_SCLK=1;
  45.         _nop_();
  46.         _nop_();
  47.   }
  48. }

  49. uchar DS1302_read_byte()
  50. {
  51.   uchar i;
  52.   uchar dat = 0;
  53.   for(i=0;i<8;i++)
  54.   {
  55.     DS1302_SCLK = 0;
  56.         _nop_();
  57.         _nop_();
  58.         dat >>= 1;
  59.         if(DS1302_IO) dat |= 0x80;
  60.         DS1302_SCLK =1;
  61.         _nop_();
  62.         _nop_();
  63.   }
  64.   return dat;
  65. }


  66. void DS1302_write(uchar address,uchar dat)
  67. {
  68.   DS1302_CE=0;
  69.   _nop_();
  70.   _nop_();
  71.   DS1302_SCLK=0;
  72.   _nop_();
  73.   _nop_();
  74.   DS1302_CE=1;
  75.   _nop_();
  76.   _nop_();
  77.   DS1302_write_byte(address);
  78.   DS1302_write_byte(dat);
  79.   DS1302_SCLK=1;
  80.   DS1302_CE=0;
  81. }


  82. uchar DS1302_read(uchar address)
  83. {
  84.   uchar dat;
  85.   DS1302_CE=0;
  86.   _nop_();
  87.   _nop_();                                         
  88.   DS1302_SCLK=0;
  89.   _nop_();
  90.   _nop_();
  91.   DS1302_CE=1;
  92.   _nop_();
  93.   _nop_();
  94.   DS1302_write_byte(address);
  95.   dat =DS1302_read_byte();
  96.   DS1302_SCLK=1;
  97.   DS1302_CE=0;
  98.   dat=dat/16*10+dat%16;
  99.   return dat;
  100. }

  101. void DS1302_init()
  102. {
  103.   DS1302_write(0x8e,0x00);
  104.   DS1302_write(0x80,0x00);
  105.   DS1302_write(0x82,0x00);
  106.   DS1302_write(0x84,0x12);
  107.   DS1302_write(0x86,0x10);
  108.   DS1302_write(0x88,0x11);
  109.   DS1302_write(0x8a,0x06);
  110.   DS1302_write(0x8c,0x12);
  111.   DS1302_write(0x8e,0x80);
  112. }

  113. void set_time()
  114. {
  115.   uchar i,j=0x80;
  116.   for(i=0;i<7;i++)
  117.   {
  118.     dt[i]=dt[i]/10*16+dt[i]%10;
  119.   }
  120.   DS1302_write(0x8e,0x00);
  121.   DS1302_write(0x80,0x00);
  122.   for(i=0;i<7;i++)
  123.   {
  124.     DS1302_write(j,dt[i]);
  125.     j+=2;
  126.   }
  127.   DS1302_write(0x8e,0x80);
  128. }

  129. void get_time()
  130. {
  131.   dt[0] =DS1302_read(0x81);
  132.   dt[1] =DS1302_read(0x83);
  133.   dt[2] =DS1302_read(0x85);
  134.   dt[3] =DS1302_read(0x87);
  135.   dt[4] =DS1302_read(0x89);
  136.   dt[5] =DS1302_read(0x8b);
  137.   dt[6] =DS1302_read(0x8d);
  138. }

  139. void chaongdiaon()                                   //充电
  140. {
  141. DS1302_write(0x8e,0x00);           /* 控制命令,WP=0,解除写保护*/
  142.   _nop_();
  143.   _nop_();
  144. DS1302_write(0x90, 0xa6);    //使能充电   用一个二极管  用4k电阻
  145. DS1302_write(0x8e,0x80);           /* 控制命令,WP=1,写保护*/
  146.   _nop_();
  147.   _nop_();
  148. }
  149. /*********************************   LCD  1602      ******************/
  150. uchar code self_char[]={
  151.                                                 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, //年
  152.                                                 0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x01, //月
  153.                                                 0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //日
  154.                                                 0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //温度标志— —摄氏度
  155.                                                 0x00,0x04,0x0E,0x1F,0x0E,0x04,0x00,0x00, //符号◆
  156.                                                 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //全开
  157.                                                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //
  158.                                                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00         //
  159.                                            };

  160. bit lcd_busy()
  161. {
  162.   bit result;
  163.   LCD1602_RS=0;
  164.   LCD1602_RW=1;
  165.   LCD1602_EN=1;
  166.   _nop_();
  167.   _nop_();
  168.   _nop_();
  169.   _nop_();
  170.   result = (bit)(P0&0x80);
  171.   LCD1602_EN=0;
  172.   return(result);
  173. }

  174. void LCD1602_wcmd(uchar cmd)
  175. {
  176.   while(lcd_busy());
  177.   LCD1602_RS=0;
  178.   LCD1602_RW=0;
  179.   _nop_();
  180.   _nop_();
  181.   LCD1602_EN=1;
  182.   _nop_();
  183.   _nop_();
  184.   _nop_();
  185.   _nop_();
  186.   P0=cmd;
  187.   _nop_();
  188.   _nop_();
  189.   _nop_();
  190.   _nop_();
  191.   LCD1602_EN=0;
  192. }

  193. void LCD1602_wdat(uchar dat)
  194. {
  195.   while(lcd_busy());
  196.   LCD1602_RS=1;
  197.   LCD1602_RW=0;
  198.   LCD1602_EN=1;
  199.   _nop_();
  200.   _nop_();
  201.   _nop_();
  202.   _nop_();
  203.   P0=dat;
  204.   _nop_();
  205.   _nop_();
  206.   _nop_();
  207.   _nop_();
  208.   LCD1602_EN=0;
  209. }

  210. void LCD1602_pos(uchar x,bit y)                //指定坐标,x为列,0~15,y为行,0为第一行,1为第二行。
  211. {
  212.   if(y)LCD1602_wcmd(x|0xc0);
  213.   else LCD1602_wcmd(x|0x80);
  214. }

  215. void LCD1602_dischar(uchar x,bit y,uchar dat)        //指定位置显示一个字符
  216. {
  217.   LCD1602_pos(x,y);
  218.   LCD1602_wdat(dat);
  219. }

  220. void LCD1602_prints(uchar x,bit y,uchar *p)                                        //指定位置显示字符串
  221. {
  222.   LCD1602_pos(x,y);
  223.   while((*p) != '\0') {LCD1602_wdat(*p);p++;}
  224. }

  225. void LCD1602_init()
  226. {
  227.   uchar i;
  228.   LCD1602_wcmd(0x40);
  229.   for(i=0;i<64;i++)
  230.         {
  231.           LCD1602_wdat(self_char[i]);
  232.         }
  233.   LCD1602_wcmd(0x38);
  234.   LCD1602_wcmd(0x38);
  235.   LCD1602_wcmd(0x0c);
  236.   LCD1602_wcmd(0x06);
  237.   LCD1602_wcmd(0x01);
  238. }
  239. /****************************   18B20   ************************************/
  240. uchar wendu[4];

  241. void delay_18b20(uchar i)
  242. {
  243.   int j;
  244.   for(j=0;j<i;j++);
  245. }

  246. uchar init_18b20()
  247. {
  248.   uchar i;
  249.   DQ=0;
  250.   delay_18b20(30);
  251.   DQ=1;
  252.   delay_18b20(3);
  253.   i=DQ;
  254.   delay_18b20(20);
  255.   return(i);
  256. }

  257. uchar read_18b20_bit()
  258. {
  259.   uchar i;
  260.   DQ=0;
  261.   DQ=1;
  262.   for(i=0;i<3;i++);
  263.   return(DQ);
  264. }

  265. void write_18b20_bit(unsigned xbit)
  266. {
  267.   DQ=0;
  268.   if(xbit==1)
  269.   DQ=1;
  270.   delay_18b20(5);
  271.   DQ=1;
  272. }

  273. uchar read_18b20_byte()
  274. {
  275.   uchar i,j,value;
  276.   j=1;
  277.   value=0;
  278.   for(i=0;i<8;i++)
  279.   {
  280.         if(read_18b20_bit())
  281.         {
  282.           value=value+(j<<i);
  283.         }
  284.         delay_18b20(6);
  285.   }
  286.   return(value);
  287. }

  288. void write_18b20_byte(uchar x)
  289. {
  290.   uchar i,j;
  291.   for(i=0;i<8;i++)
  292.   {
  293.         j=x>>i;
  294.         j=j&0x01;
  295.         write_18b20_bit(j);
  296.         delay_18b20(5);
  297.   }
  298. }

  299. void get_wendu()
  300. {
  301.   uchar a,b;
  302.   float get_temp;
  303.   int temp1,temp2;
  304.   init_18b20();
  305.   write_18b20_byte(0xcc);
  306.   write_18b20_byte(0x44);
  307.   init_18b20();
  308.   write_18b20_byte(0xcc);
  309.   write_18b20_byte(0xbe);
  310.   a=read_18b20_byte();         //低8位
  311.   b=read_18b20_byte();         //高8位
  312.   temp1=b;
  313.   temp1=temp1<<8;
  314.   temp1=temp1|a;
  315.   if(b&0xfc)
  316.         {wendu[0]=1;temp1=~temp1+1;}                //0正1负
  317.   else
  318.     wendu[0]=0;
  319.   get_temp=temp1*0.0625;
  320.   temp2=get_temp*10+0.5;
  321.   wendu[1]=temp2%1000/100;
  322.   wendu[2]=temp2%1000%100/10;
  323.   wendu[3]=temp2%1000%100%10;
  324. }


  325. /*******************************          主程序         ***************/

  326. uchar mode=0,OK=0;
  327. uchar dis1[16],dis2[16];
  328. //uchar IRCOM[7],IRCODE=0;
  329. uchar NUM1,NUM2;
  330. uchar count;
  331. bit L=0,select=0,DIS_EN=1,SHAN;

  332. void delay(uint i)
  333. {
  334.   uchar j;
  335.   while(i-- !=0)
  336.   {
  337.     for(j=0;j<120;j++);
  338.   }
  339. }

  340. void delay1(uchar i)
  341. {
  342.   uchar j;
  343.   while(i--)
  344.   {for(j=0;j<13;j++){}}
  345. }


  346. void get_dis()
  347. {
  348.   dis1[0]='2';
  349.   dis1[1]='0';
  350.   dis1[2]=0x30+dt[6]/10;
  351.   dis1[3]=0x30+dt[6]%10;
  352.   dis1[4]=0;
  353.   dis1[5]=0x30+dt[4]/10;
  354.   dis1[6]=0x30+dt[4]%10;
  355.   dis1[7]=1;
  356.   dis1[8]=0x30+dt[3]/10;
  357.   dis1[9]=0x30+dt[3]%10;
  358.   dis1[10]=2;
  359.   dis1[11]=' ';
  360.   dis1[12]=' ';
  361.   switch(dt[5])
  362.   {
  363.         case 1: {
  364.                           dis1[13]='M';
  365.                           dis1[14]='o';
  366.                           dis1[15]='n';
  367.                         }
  368.                         break;
  369.         case 2: {
  370.                           dis1[13]='T';
  371.                           dis1[14]='u';
  372.                           dis1[15]='e';
  373.                         }
  374.                         break;
  375.         case 3: {
  376.                           dis1[13]='W';
  377.                           dis1[14]='e';
  378.                           dis1[15]='d';
  379.                         }
  380.                         break;
  381.         case 4: {
  382.                           dis1[13]='T';
  383.                           dis1[14]='h';
  384.                           dis1[15]='u';
  385.                         }
  386.                         break;
  387.         case 5: {
  388.                           dis1[13]='F';
  389.                           dis1[14]='r';
  390.                           dis1[15]='i';
  391.                         }
  392.                         break;
  393.         case 6: {
  394.                           dis1[13]='S';
  395.                           dis1[14]='a';
  396.                           dis1[15]='t';
  397.                         }
  398.                         break;
  399.         case 7: {
  400.                           dis1[13]='S';
  401.                           dis1[14]='u';
  402.                           dis1[15]='n';
  403.                         }
  404.                         break;
  405.   }
  406.   dis2[0]=' ';
  407.   dis2[1]=0x30+dt[2]/10;
  408.   dis2[2]=0x30+dt[2]%10;
  409.   dis2[3]=':';
  410.   dis2[4]=0x30+dt[1]/10;
  411.   dis2[5]=0x30+dt[1]%10;
  412.   dis2[6]=':';
  413.   dis2[7]=0x30+dt[0]/10;
  414.   dis2[8]=0x30+dt[0]%10;
  415.   dis2[9]=' ';
  416.   if(wendu[0]==1)
  417.         dis2[10]=0x2d;
  418.   else
  419.         dis2[10]=' ';
  420.   dis2[11]=0x30+wendu[1];
  421.   dis2[12]=0x30+wendu[2];
  422.   dis2[13]='.';
  423.   dis2[14]=0x30+wendu[3];
  424.   dis2[15]=3;
  425. }

  426. void keyscan()
  427. {
  428.   if(k1==0)
  429.   {
  430.         delay(10);
  431.         if(k1==0)
  432.         {
  433.            while(!k1);

  434.           mode++;
  435.           if(mode==1 && OK==0)
  436.                 LCD1602_wcmd(0x01);         
  437.           if(mode==2 && OK==0)        
  438.           {
  439.                 mode=0;
  440.                 select=0;
  441.           }
  442.           if(select==0 && OK==1)
  443.           {
  444.                 if(mode==7)
  445.                   mode=1;
  446.           }
  447.           if(select==1 && OK==1)
  448.           {
  449.                 if(mode==6)
  450.                   mode=1;
  451.           }

  452.         }
  453.   }
  454. if(k2==0)
  455.   {
  456.         delay(10);
  457.         if(k2==0)
  458.         {
  459.           while(!k2);
  460.           if(mode==1 && OK==0)
  461.             {select=~select;LCD1602_wcmd(0x01);}
  462.           NUM1++;

  463.         }
  464.   }
  465.   if(k3==0)
  466.   {
  467.         delay(10);
  468.         if(k3==0)
  469.         {
  470.           while(!k3);
  471.           if(mode==1 && OK==0)
  472.             {select=~select;LCD1602_wcmd(0x01);}
  473.           NUM2++;

  474.         }
  475.   }
  476.   if(k4==0)
  477.   {
  478.         delay(10);
  479.         if(k4==0)
  480.         {
  481.           while(!k4);
  482.           if(mode==0)
  483.                 light=~light;
  484.           if(mode !=0)
  485.           {
  486.             LCD1602_wcmd(0x01);
  487.                 OK++;
  488.                 NUM1=0;
  489.                 NUM2=0;
  490.                 if(OK==2)
  491.                 {
  492.                   LCD1602_wcmd(0x01);

  493.                   set_time();
  494. //                  set_alarm();
  495.                   mode=0;
  496.                   select=0;
  497.                   OK=0;
  498.                 }
  499.           }

  500.         }
  501.   }
  502.   if(k5==0)
  503.   {
  504.         delay(100);
  505.         if(k5==0)
  506.         {
  507.           while(!k5);
  508.           DS1302_init();

  509.         }
  510.   }        
  511. }        





  512. void display()
  513. {
  514.   get_wendu();
  515.   get_dis();
  516. /*  if(alarm[0]==1)
  517.         {LED2=1;}  */

  518.   if(mode==0)        //正常模式                                         
  519.   {
  520.         uchar i;
  521.         LED1=1;
  522.         get_time();
  523. //        get_alarm();
  524.         LCD1602_pos(0,0);
  525.         for(i=0;i<16;i++)
  526.           LCD1602_wdat(dis1[i]);
  527.         LCD1602_pos(0,1);
  528.         for(i=0;i<16;i++)
  529.           LCD1602_wdat(dis2[i]);
  530.   }

  531.   if(mode==1&&OK==0)  //菜单模式
  532.   {
  533.         LCD1602_prints(1,0,"1.Set Time");
  534.         LCD1602_prints(1,1,"2.About...");
  535.         if(select)
  536.           LCD1602_dischar(0,1,4);
  537.         else
  538.           LCD1602_dischar(0,0,4);
  539.   }

  540.   if(OK==1&&select==0)          //调日期模式
  541.   {
  542.         uchar i;
  543.         LCD1602_pos(0,0);
  544.         for(i=0;i<16;i++)
  545.           LCD1602_wdat(dis1[i]);
  546.         LCD1602_pos(0,1);
  547.         for(i=0;i<10;i++)
  548.           LCD1602_wdat(dis2[i]);
  549.         LCD1602_prints(10,1,"Set...");
  550.         if(SHAN==1) LCD1602_prints(10,1,"Set.  ");

  551.         if(mode==1)                  //调分模式,秒位清零
  552.         {
  553.           dt[0]=0;
  554.           LCD1602_dischar(7,1,0x30+dt[0]/10);
  555.           LCD1602_dischar(8,1,0x30+dt[0]%10);
  556.           if(NUM1!=0)
  557.                 {
  558.                   dt[1]++;
  559.                   if(dt[1]==60)
  560.                         dt[1]=0;
  561.                   LCD1602_dischar(4,1,0x30+dt[1]/10);
  562.                   LCD1602_dischar(5,1,0x30+dt[1]%10);
  563.                   NUM1=0;
  564.                 }
  565.                 if(NUM2!=0)
  566.                 {
  567.                   dt[1]--;
  568.                   if(dt[1]==-1)
  569.                         dt[1]=59;
  570.                   LCD1602_dischar(4,1,0x30+dt[1]/10);
  571.                   LCD1602_dischar(5,1,0x30+dt[1]%10);
  572.                   NUM2=0;
  573.                 }
  574.                 if(SHAN==1) LCD1602_dischar(5,1,5);
  575.                
  576.         }
  577.           else

  578.            if(mode==2)         //调时模式
  579.            {
  580.                     if(NUM1!=0)
  581.                  {
  582.                    dt[2]++;
  583.                    if(dt[2]==24)
  584.                          dt[2]=0;
  585.                    LCD1602_dischar(1,1,0x30+dt[2]/10);
  586.                    LCD1602_dischar(2,1,0x30+dt[2]%10);
  587.                    NUM1=0;
  588.                  }
  589.                  if(NUM2!=0)
  590.                  {
  591.                    dt[2]--;
  592.                    if(dt[2]==-1)
  593.                          dt[2]=23;
  594.                    LCD1602_dischar(1,1,0x30+dt[2]/10);
  595.                    LCD1602_dischar(2,1,0x30+dt[2]%10);
  596.                    NUM2=0;
  597.                  }
  598.                   if(SHAN==1) LCD1602_dischar(2,1,5);
  599.             }
  600.                 if(mode==3)        //调星期状态
  601.            {
  602.                     if(NUM1!=0)
  603.                  {
  604.                    dt[5]++;
  605.                    if(dt[5]==8)
  606.                          dt[5]=1;
  607.                    switch(dt[5])
  608.                    {
  609.                             case 1: LCD1602_prints(13,0,"Mon");break;
  610.                          case 2: LCD1602_prints(13,0,"Tue");break;
  611.                          case 3: LCD1602_prints(13,0,"Wed");break;
  612.                          case 4: LCD1602_prints(13,0,"Thu");break;
  613.                          case 5: LCD1602_prints(13,0,"Fri");break;
  614.                          case 6: LCD1602_prints(13,0,"Sat");break;
  615.                          case 7: LCD1602_prints(13,0,"Sun");break;
  616.                    }
  617.                    NUM1=0;
  618.                  }
  619.                  if(NUM2!=0)
  620.                  {
  621.                    dt[5]--;
  622.                    if(dt[5]==0)
  623.                          dt[5]=7;
  624.                    switch(dt[5])
  625.                    {
  626.                             case 1: LCD1602_prints(13,0,"Mon");break;
  627.                          case 2: LCD1602_prints(13,0,"Tue");break;
  628.                          case 3: LCD1602_prints(13,0,"Wed");break;
  629.                          case 4: LCD1602_prints(13,0,"Thu");break;
  630.                          case 5: LCD1602_prints(13,0,"Fri");break;
  631.                          case 6: LCD1602_prints(13,0,"Sat");break;
  632.                          case 7: LCD1602_prints(13,0,"Sun");break;
  633.                    }
  634.                    NUM2=0;
  635.                  }
  636.                   if(SHAN==1) LCD1602_dischar(15,0,5);
  637.             }
  638.                 if(mode==4)          //调日模式
  639.            {
  640.                     if(NUM1!=0)
  641.                  {
  642.                    dt[3]++;
  643.                    if(dt[3]==32)
  644.                          dt[3]=1;
  645.                    LCD1602_dischar(8,0,0x30+dt[3]/10);
  646.                    LCD1602_dischar(9,0,0x30+dt[3]%10);
  647.                    NUM1=0;
  648.                  }
  649.                  if(NUM2!=0)
  650.                  {
  651.                    dt[3]--;
  652.                    if(dt[3]==0)
  653.                          dt[3]=31;
  654.                    LCD1602_dischar(8,0,0x30+dt[3]/10);
  655.                    LCD1602_dischar(9,0,0x30+dt[3]%10);
  656.                    NUM2=0;
  657.                  }
  658.                   if(SHAN==1) LCD1602_dischar(9,0,5);
  659.             }
  660.                 if(mode==5)                //调月模式
  661.            {
  662.                     if(NUM1!=0)
  663.                  {
  664.                    dt[4]++;
  665.                    if(dt[4]==13)
  666.                          dt[4]=1;
  667.                    LCD1602_dischar(5,0,0x30+dt[4]/10);
  668.                    LCD1602_dischar(6,0,0x30+dt[4]%10);
  669.                    NUM1=0;
  670.                  }
  671.                  if(NUM2!=0)
  672.                  {
  673.                    dt[4]--;
  674.                    if(dt[4]==0)
  675.                          dt[4]=12;
  676.                    LCD1602_dischar(5,0,0x30+dt[4]/10);
  677.                    LCD1602_dischar(6,0,0x30+dt[4]%10);
  678.                    NUM2=0;
  679.                  }
  680.                   if(SHAN==1) LCD1602_dischar(6,0,5);
  681.             }
  682.                 if(mode==6)          //调年模式
  683.            {
  684.                     if(NUM1!=0)
  685.                  {
  686.                    dt[6]++;
  687.                    if(dt[6]==100)
  688.                          dt[6]=0;
  689.                    LCD1602_dischar(2,0,0x30+dt[6]/10);
  690.                    LCD1602_dischar(3,0,0x30+dt[6]%10);
  691.                    NUM1=0;
  692.                  }
  693.                  if(NUM2!=0)
  694.                  {
  695.                    dt[6]--;
  696.                    if(dt[6]==-1)
  697.                          dt[6]=99;
  698.                    LCD1602_dischar(2,0,0x30+dt[6]/10);
  699.                    LCD1602_dischar(3,0,0x30+dt[6]%10);
  700.                    NUM2=0;
  701.                  }
  702.                   if(SHAN==1) LCD1602_dischar(3,0,5);
  703.             }
  704.   }

  705.   if(OK==1&&select==1)        //调闹铃模式
  706.   {


  707.           LCD1602_prints(0,0," Birthday gift  ");
  708.           LCD1602_prints(0,1,"        --by HJL");

  709.           delay(2000);
  710.           LCD1602_wcmd(0x01);
  711.           LCD1602_prints(0,0,"2013-12-04 Is   ");
  712.           LCD1602_prints(0,1,"LiYunL birthday!");

  713.           delay(2000);
  714.           LCD1602_wcmd(0x01);
  715.           LCD1602_prints(0,0,"Friends together");
  716.           LCD1602_prints(0,1,"for life...     ");

  717.           delay(2000);
  718.           LCD1602_wcmd(0x01);
  719.             mode=1 ;
  720.           OK=0;
  721.   }
  722. }
  723. void diy()
  724. {
  725.   LCD1602_init();
  726.   delay(1);
  727.   LCD1602_prints(0,0," Digital Clock  ");
  728.   LCD1602_prints(0,1,"v1.1.0  --by HJL");
  729.   delay(1000);
  730.   LCD1602_wcmd(0x01);            
  731. }



  732. void main()
  733. {
  734.   IT0=1;          //外部中断0为下降沿触发
  735.   EX0=1;          //
  736.   TMOD=0x01;
  737.   TH0=0x3C;                //50ms
  738.   TL0=0xB0;
  739.   EA=1;
  740.   ET0=1;
  741.   TR0=1;

  742.   get_wendu();

  743.   diy();
  744.   chaongdiaon();



  745.   while(1)
  746.   {
  747.     P1=0xff;
  748.           keyscan();
  749.         display();
  750.   }
  751. }



  752. void timer0() interrupt 1
  753. {
  754.   TH0=0x3C;
  755.   TL0=0xB0;
  756.   count++;
  757.   if(count==10)
  758.   {
  759.         count=0;
  760.         SHAN=~SHAN;
  761.   }
  762. }
复制代码

hex工程文件及pcb文件下载: 1602液晶显示桌面数字钟.zip (124.77 KB, 下载次数: 185)

评分

参与人数 5黑币 +19 收起 理由
domerawind + 5 赞一个!
vvv64 + 5
wpq201800 + 5 赞一个!
pilote + 1 很给力!
qjzyx + 3 赞一个!

查看全部评分

回复

使用道具 举报

ID:83912 发表于 2015-6-28 22:07 | 显示全部楼层
支持下
回复

使用道具 举报

ID:84566 发表于 2015-7-3 17:24 | 显示全部楼层
谢谢楼主,也想学习多级菜单的切换方式
回复

使用道具 举报

ID:194054 发表于 2017-4-27 00:32 | 显示全部楼层
新手学习谢谢楼主
回复

使用道具 举报

ID:204418 发表于 2017-5-26 15:18 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:204418 发表于 2017-5-26 17:07 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:65651 发表于 2017-7-5 16:02 | 显示全部楼层
没有原理图
回复

使用道具 举报

ID:231237 发表于 2017-9-22 20:44 | 显示全部楼层
佩服啊!顶!d=====( ̄▽ ̄*)b!顺带学习一下
回复

使用道具 举报

ID:230847 发表于 2017-9-23 18:32 | 显示全部楼层
正在学习这方面知识。谢谢楼主
回复

使用道具 举报

ID:71549 发表于 2017-9-25 20:04 | 显示全部楼层
新手学习谢谢楼主
回复

使用道具 举报

ID:121019 发表于 2017-10-12 23:29 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:266116 发表于 2018-1-23 21:23 | 显示全部楼层
做个玩,谢谢分享
回复

使用道具 举报

ID:272625 发表于 2018-1-24 22:17 | 显示全部楼层

谢谢分享
回复

使用道具 举报

ID:272625 发表于 2018-1-24 22:18 | 显示全部楼层

有,在程序压缩包里
回复

使用道具 举报

ID:272625 发表于 2018-1-24 22:21 | 显示全部楼层
我就想知道楼主的铜帽在哪里买的?
回复

使用道具 举报

ID:293351 发表于 2018-3-30 21:08 | 显示全部楼层
厉害呀我的哥,向你致敬!
回复

使用道具 举报

ID:276761 发表于 2018-3-30 22:13 | 显示全部楼层
正想做一个,下载来参考
回复

使用道具 举报

ID:323270 发表于 2018-5-6 13:08 | 显示全部楼层
很好 谢谢
回复

使用道具 举报

ID:324272 发表于 2018-5-7 16:22 来自手机 | 显示全部楼层
新手做,可以吗?
回复

使用道具 举报

ID:353831 发表于 2018-6-27 23:27 | 显示全部楼层
楼主,没有闹钟功能
回复

使用道具 举报

ID:353235 发表于 2018-6-29 12:52 来自手机 | 显示全部楼层
楼主是否提供原理图
回复

使用道具 举报

ID:336636 发表于 2018-8-4 11:27 | 显示全部楼层
我喜欢,适合我这样子的新手
回复

使用道具 举报

ID:356605 发表于 2018-8-5 16:25 | 显示全部楼层
SCHDOC  SCHDOCPREVIE 怎样才能正常打开这类文件?
回复

使用道具 举报

ID:380389 发表于 2018-8-8 06:44 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:66287 发表于 2018-8-8 14:21 | 显示全部楼层
这么长的程序,没有注释,读起来真心累呀
回复

使用道具 举报

ID:304909 发表于 2018-8-8 15:21 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:380389 发表于 2018-8-12 21:28 来自手机 | 显示全部楼层
好资料收藏
回复

使用道具 举报

ID:385854 发表于 2018-8-13 16:17 | 显示全部楼层
请问楼主,如何加入闹钟的功能?
回复

使用道具 举报

ID:384558 发表于 2018-8-14 12:03 | 显示全部楼层
支持,学习下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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