久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3067|回復(fù): 2
收起左側(cè)

基于LCD1602的萬(wàn)年歷單片機(jī)源碼 帶鬧鐘

[復(fù)制鏈接]
ID:279910 發(fā)表于 2018-1-26 12:35 | 顯示全部樓層 |閱讀模式
基于LCD1602的萬(wàn)年歷,帶鬧鐘

單片機(jī)源程序如下:
  1.   #include <reg52.h>                         
  2. #define uint unsigned int          
  3. #define uchar unsigned char

  4. sbit lcd_rs=P2^6;        //rs為寄存器選擇 高電平時(shí)選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器
  5. sbit lcd_rw=P2^5;        //R/W 為讀寫(xiě)信號(hào)線(xiàn),高電平時(shí)進(jìn)行讀操作,低電平進(jìn)行寫(xiě)操作
  6.                     //當(dāng) RS 和 R/W 共同為低電平時(shí),可以寫(xiě)入指令或顯示地址
  7. sbit lcd_en=P2^7; //液晶控制端
  8. sbit key_set=P1^4;//設(shè)置鍵
  9. sbit key_up=P1^5;        //加鍵同時(shí)也是鬧鐘能夠停止按鈕
  10. sbit key_down=P1^6; //  減鍵同時(shí)也是翻屏按鈕
  11. sbit key_out=P1^7;  //鍵 盤(pán)控制端口
  12. uchar count;      //定時(shí)器計(jì)數(shù)變量
  13. uchar hour,min,sec,hour1,hour2,sec1,sec2,min1,min2;    //時(shí)間變量
  14. uchar  yue, ri,nian1, nian2, nian3, nian4, yue1, yue2, ri1, ri2;  //月日變量
  15. uint  nian; // 年變量
  16. uchar nao1=0, nao2=0, nao3=0, nao11, nao12, nao21, nao22;  //設(shè)置鬧鐘變量
  17. uchar count1;  // 星期計(jì)數(shù)變量
  18. uchar ww=0,qq=0,nao=1,flag;  //計(jì)數(shù)變量鍵盤(pán)設(shè)置端口,鬧鐘時(shí)間是否設(shè)置標(biāo)志量,鬧鐘標(biāo)志變量,設(shè)置鍵標(biāo)志量
  19. uchar code table[]={
  20.    0x00,0x04,0x0E,0x0E,0x0E,0x0E,0x1F,0x1F,
  21.    0x04,0x08,0x00,0x1E,0x00,0x08,0x04,0x00
  22. };//設(shè)置鬧鐘圖片

  23. void lcd_delay(uint m)          //延時(shí)函數(shù) (字符型變量m定義)
  24. {
  25.                 while(m--);                                                                  //無(wú)限循環(huán)體
  26. }

  27. void read1602()                //忙檢測(cè) 作用防止亂碼
  28. {
  29.         uchar i;
  30.                 i=254;
  31.                 P0=0xff;  //
  32.                 lcd_rs=0; //讀寫(xiě)命令
  33.                 lcd_rw=1; //讀命令/數(shù)據(jù)
  34.                 lcd_en=1; //液晶模塊執(zhí)行命令
  35.                 while(i--);//若一段時(shí)間以后仍低,則認(rèn)為是不忙
  36.                 lcd_en=0;
  37. }

  38. void write1602(uchar wdata,bit rw)//向LCD1602寫(xiě)數(shù)據(jù)(rw=1)或者命令(rw=0)
  39. {      
  40.         read1602();        //防止數(shù)據(jù)丟失
  41.                 lcd_rs=rw;                     
  42.                 P0=wdata;
  43.         lcd_rw=0;
  44.                 lcd_delay(1);           
  45.                 lcd_en=1;
  46.                 lcd_delay(1);
  47.                 lcd_en=0;
  48. }

  49. void lcd_init()           //LCD1602液晶的初始化
  50. {
  51.                
  52.                 lcd_delay(1500);
  53.                
  54.             write1602(0x38,0);         //置功能,8位數(shù)據(jù),2行顯示,5x7字符(指令6)
  55.        
  56.                 write1602(0x0c,0);         //只打開(kāi)屏顯 (指令4)
  57.        
  58.                 write1602(0x06,0);         //左到右顯示,自加1  (指令3)
  59.        
  60.             write1602(0x01,0);         //清屏         (指令1)
  61.         
  62.                 write1602(0x80,0);           //(指令8)

  63. }

  64. void init()                                                //定時(shí)器初始化
  65. {
  66.         count=0;
  67.         hour=23; //小時(shí)初值
  68.         min=59;  //分鐘初值
  69.         sec=50;  //秒初值                                                                                                                                                                          
  70.         nian=2018; //年初值
  71.         yue=01;  //月初值
  72.         ri=01;   //日初值
  73.         count1=1;//星期初值
  74.         TMOD=0x01; //中斷T0工作方式,方式1,16位定時(shí)器
  75.         TH0=(65536-50000)/256;
  76.         TL0=(65536-50000)%256; //計(jì)數(shù)器初值,為50ms進(jìn)入一次中斷子程序
  77.         TR0=1; //允許T0計(jì)數(shù)
  78.         ET0=1; //定時(shí)器T0溢出中斷允許
  79.         EA=1; //開(kāi)中斷
  80. }

  81. void lcd_printf(uchar *str)//顯示字符串
  82. {   read1602();
  83.         while(*str!='\0')  
  84.         {
  85.                 write1602(*str,1);          //寫(xiě)入數(shù)據(jù)
  86.                 str++;
  87.                 lcd_delay(1);
  88.         }
  89. }

  90. void lcd_moveto(uchar x,uchar y)//指定顯示的行列坐標(biāo)
  91. {
  92.         if(x==0)
  93.                 write1602(0x80|y,0);   
  94.         if(x==1)
  95.                 write1602(0xc0|y,0);
  96. }

  97. void fengjie1(uchar a,uchar b, uchar c )//將時(shí)分秒兩位數(shù)分解為兩個(gè)數(shù)
  98. {
  99.             hour1=a/10;
  100.                         hour2=a%10;
  101.                         min1=b/10;
  102.                         min2=b%10;
  103.                         sec1=c/10;
  104.                         sec2=c%10;       
  105. }

  106. void fengjie2(uint a,uchar b, uchar c ) //將年月日分解為兩個(gè)數(shù)
  107. {
  108.             nian4=a%10;
  109.             a=(a-nian4)/10;
  110.             nian3=a%10;
  111.             a=(a-nian3)/10;
  112.             nian2=a%10;
  113.             nian1=a/10;
  114.                         yue1=b/10;
  115.                         yue2=b%10;
  116.                         ri1=c/10;
  117.                         ri2=c%10;
  118. }
  119. void fengjie3(uchar a, uchar b )//將鬧鐘分解為兩個(gè)數(shù)
  120. {
  121.             nao11=a/10;
  122.                         nao12=a%10;
  123.                         nao21=b/10;
  124.                         nao22=b%10;
  125. }
  126. void display1(uchar hour1,uchar hour2,uchar min1,uchar min2,uchar sec1,uchar sec2)         //顯示時(shí)間程序
  127. {
  128.        
  129.     lcd_moveto(1,0); //定位在第二行第一列
  130.         write1602(hour1+48,1);                   //字符0-9對(duì)應(yīng)十進(jìn)制48-57
  131.         write1602(hour2+48,1);
  132.         lcd_printf(":");
  133.         write1602(min1+48,1);
  134.         write1602(min2+48,1);
  135.         lcd_printf(":");
  136.         write1602(sec1+48,1);
  137.         write1602(sec2+48,1);

  138. }

  139. void display2(uchar nian1,uchar nian2,uchar nian3,uchar nian4,uchar yue1,uchar yue2, uchar ri1, uchar ri2 )  //顯示日期程序
  140. {
  141.     lcd_moveto(0,0); //定位在第一行第一列
  142.         write1602(nian1+48,1);
  143.         write1602(nian2+48,1);
  144.         write1602(nian3+48,1);
  145.         write1602(nian4+48,1);
  146.         lcd_printf("-");
  147.         write1602(yue1+48,1);
  148.         write1602(yue2+48,1);
  149.         lcd_printf("-");
  150.         write1602(ri1+48,1);
  151.         write1602(ri2+48,1);
  152. }

  153. void display3(uchar we)                 //星期送顯示
  154. {
  155.         lcd_moveto(0,12);
  156.         switch(we)
  157.         {
  158.                 case 1: lcd_printf("M");
  159.                                 lcd_printf("0");
  160.                                  lcd_printf("N");
  161.                                  break;
  162.                 case 2: lcd_printf("T");
  163.                                 lcd_printf("U");
  164.                                  lcd_printf("E");
  165.                                  break;
  166.                 case 3: lcd_printf("W");
  167.                                 lcd_printf("E");
  168.                                  lcd_printf("D");
  169.                                  break;
  170.                 case 4: lcd_printf("T");
  171.                                 lcd_printf("H");
  172.                                  lcd_printf("U");
  173.                                  break;       
  174.                 case 5: lcd_printf("F");
  175.                                 lcd_printf("R");
  176.                                  lcd_printf("T");
  177.                                  break;
  178.                 case 6: lcd_printf("S");
  179.                                 lcd_printf("A");
  180.                                  lcd_printf("T");
  181.                                  break;
  182.                 case 7: lcd_printf("S");
  183.                                 lcd_printf("U");
  184.                                  lcd_printf("N");
  185.                                  break;                                                                                                                  
  186.         }       
  187. }

  188. void display4(uchar nao11,uchar nao12,uchar nao21, uchar nao22) //顯示鬧鐘時(shí)刻
  189. {
  190.     lcd_moveto(1,6); //定位在第二行第6列
  191.     if(nao==1)        //打開(kāi)鬧鐘
  192.         {write1602(nao11+48,1);//顯示鬧鐘時(shí)間
  193.         write1602(nao12+48,1);
  194.         lcd_printf(":");
  195.         write1602(nao21+48,1);
  196.         write1602(nao22+48,1);
  197.         }
  198.         if(nao==0)         //關(guān)閉鬧鐘
  199.         {lcd_printf("N");
  200.         lcd_printf("O");
  201.     lcd_printf(":");
  202.     lcd_printf("N");
  203.         lcd_printf("O");
  204.         }
  205. }

  206. void display5()          //顯示鬧鐘圖片
  207. {
  208. lcd_moveto(1,13);
  209.         if(nao==1)//如果鬧鐘打開(kāi)顯示鬧鐘圖片
  210.         {
  211.   write1602(0x00,1); //
  212.         write1602(0x01,1); //?
  213.         }
  214.         if(nao==0)
  215.         {
  216.          lcd_printf(" ");
  217.          lcd_printf(" ");
  218.         }
  219. }
  220. void zimo()         //字模顯示
  221. {
  222.                 uint i;
  223.                 write1602(0x40,0); //寫(xiě)圖片的指令
  224.                 for(i=0;i<16;i++)
  225.                 {
  226.                 write1602(table[i],1);                                                  
  227.                 }
  228. }
  229. void key()  //鍵盤(pán)程序
  230. {

  231.      if(key_set==0)
  232.      {
  233.          flag=1;
  234.      ww++;
  235.          if(ww==8)
  236.          ww=0;
  237.          while(!key_set);
  238.          }
  239.          switch(ww)
  240.         {
  241.         case 0:  //        清零
  242.                if(key_up==0)
  243.                {
  244.            while(!key_up);
  245.                     if(qq==1)
  246.                                          {
  247.                                                  qq=0;
  248.                                          }
  249.                                          else
  250.                                          {
  251.                    nao=!nao;   //開(kāi)關(guān)鬧鐘的作用
  252.                    } }
  253.                break;
  254.         case 1:  //鍵盤(pán)調(diào)整年
  255.            lcd_delay(1000);
  256.                lcd_moveto(0,3);
  257.            lcd_printf("-");
  258.            lcd_delay(1000);
  259.                if(key_up==0)
  260.                    {
  261.            while(!key_up);        //按鍵是否抬起
  262.                    nian++;
  263.                    }
  264.                    if(key_down==0)
  265.                    {
  266.            while(!key_down);
  267.                    nian--;
  268.                    }
  269.                break;
  270.                           
  271.     case 2:  //鍵盤(pán)調(diào)整月
  272.                lcd_delay(1000);
  273.                lcd_moveto(0,6);
  274.            lcd_printf("-");
  275.            lcd_delay(1000);
  276.            if(key_up==0)
  277.                    {
  278.            while(!key_up);
  279.                    yue++;
  280.                    if(yue>12)
  281.                    yue=1;
  282.                    }
  283.                    if(key_down==0)
  284.                    {
  285.            while(!key_down);
  286.                    if(yue==1)
  287.                    yue=12;
  288.                    else
  289.                    yue--;
  290.                    }
  291.                break;

  292.     case 3: //鍵盤(pán)調(diào)節(jié)日期
  293.            lcd_delay(1000);
  294.                lcd_moveto(0,9);
  295.            lcd_printf("-");
  296.            lcd_delay(1000);
  297.                if(key_up==0)
  298.                    {
  299.            while(!key_up);
  300.                    ri++;
  301.                    if(ri>31)
  302.                    ri=1;
  303.                    }
  304.                    if(key_down==0)
  305.                    {
  306.            while(!key_down);
  307.                    if(ri==1)
  308.                    ri=31;
  309.                    else
  310.                    ri--;
  311.                    }
  312.                break;

  313.     case 4:  //鍵盤(pán)調(diào)整星期
  314.            lcd_delay(1000);
  315.                lcd_moveto(0,12);
  316.            lcd_printf("-");
  317.            lcd_printf("-");
  318.            lcd_printf("-");
  319.            lcd_delay(1000);

  320.                if(key_up==0)
  321.                    {
  322.            while(!key_up);
  323.                    count1++;
  324.                    if(count1>7)
  325.                    count1=1;
  326.                    }
  327.                    if(key_down==0)
  328.                    {
  329.            while(!key_down);
  330.                    if(count1==1)
  331.                    count1=7;
  332.                    else
  333.                    count1--;
  334.                    }
  335.                break;
  336.     case 5: //鍵盤(pán)調(diào)整時(shí)
  337.            lcd_delay(1000);
  338.                lcd_moveto(1,1);
  339.            lcd_printf("-");
  340.            lcd_delay(1000);
  341.            if(key_up==0)
  342.                    {
  343.            while(!key_up);
  344.                    hour++;
  345.                    if( hour>23)
  346.                     hour=0;
  347.                    }
  348.                    if(key_down==0)
  349.                    {
  350.            while(!key_down);
  351.                    if( hour==0)
  352.                     hour=23;
  353.                    else
  354.                     hour--;
  355.                    }
  356.                break;
  357.         case 6: //鍵盤(pán)調(diào)整分
  358.           lcd_delay(1000);
  359.                lcd_moveto(1,4);
  360.            lcd_printf("-");
  361.            lcd_delay(1000);
  362.            if(key_up==0)
  363.                    {
  364.            while(!key_up);
  365.                    min++;
  366.                    if( min>59)
  367.                     min=0;
  368.                    }
  369.                    if(key_down==0)
  370.                    {
  371.            while(!key_down);
  372.                    if( min==0)
  373.                     min=59;
  374.                    else
  375.                     min--;
  376.                    }
  377.                break;
  378.     case 7: //鍵盤(pán)調(diào)整秒

  379.            lcd_delay(1000);
  380.                lcd_moveto(1,7);
  381.            lcd_printf("-");
  382.            lcd_delay(1000);
  383.            if(key_up==0)
  384.                    {
  385.            while(!key_up);
  386.                    sec++;
  387.                    if( sec>59)
  388.                    sec=0;
  389.                    }
  390.                    if(key_down==0)
  391.                    {
  392.            while(!key_down);
  393.                    if(sec==0)
  394.                     sec=59;
  395.                    else
  396.                     sec--;
  397.                    }
  398.                break;
  399.                    }
  400.         if(key_out==0)
  401.         {
  402.      while(!key_out);
  403.                 flag=0;
  404.          ww=0;
  405.         }
  406. }
  407. void key1()  //        調(diào)整鬧鐘時(shí)間
  408. {
  409.      if(key_set==0)
  410.      {
  411.                          flag=1;
  412.      ww++;
  413.          if(ww==3)
  414.          ww=0;
  415.          while(!key_set);
  416.          }
  417.          switch(ww)
  418.         {
  419.                    case 0:  //退出設(shè)置
  420.                if(key_up==0)
  421.                {
  422.            while(!key_up);
  423.                    nao=!nao;   //如果鬧鐘開(kāi)按下后則關(guān),反之同理
  424.                    }
  425.                if(key_down==0)
  426.                {
  427.            while(!key_down);
  428.                qq=0; //
  429.                }
  430.                break;
  431.                 case 1: // 調(diào)試鬧鐘的時(shí)
  432.           lcd_delay(1000);                       
  433.                lcd_moveto(1,7);
  434.            lcd_printf("-");
  435.            lcd_delay(1000);
  436.          
  437.                if(nao==1)
  438.            {if(key_up==0)
  439.                    {
  440.            while(!key_up);
  441.                    nao1++;
  442.                    if( nao1>23)
  443.                     nao1=0;
  444.                    }
  445.                    if(key_down==0)
  446.                    {
  447.            while(!key_down);
  448.                    if( nao1==0)
  449.                     nao1=23;
  450.                    else
  451.                     nao1--;
  452.                    }
  453.                break;
  454.                    }
  455.                    else break;

  456.     case 2: // 調(diào)試鬧鐘的分
  457.          lcd_delay(1000);
  458.                lcd_moveto(1,10);
  459.            lcd_printf("-");
  460.            lcd_delay(1000);
  461.                if(nao==1)
  462.            {if(key_up==0)
  463.                    {
  464.            while(!key_up);
  465.                    nao2++;
  466.                    if( nao2>59)
  467.                     nao2=0;
  468.                    }
  469.                    if(key_down==0)
  470.                    {
  471.            while(!key_down);
  472.                    if( nao2==0)
  473.                     nao2=59;
  474.                    else
  475.                     nao2--;
  476.                    }
  477.                break;
  478.                    }
  479.                    else break;
  480.                   
  481.            default:break;
  482.         }
  483.         if(key_out==0)
  484.         {
  485.      while(!key_out);
  486.                 flag=0;
  487.          ww=0;
  488.         }
  489. }

  490. void count0(void) interrupt 1  //中斷函數(shù),進(jìn)行時(shí)期的累加  12m晶振
  491. {
  492.         TH0=(65536-50000)/256;
  493.         TL0=(65536-50000)%256;
  494.         count++;
  495.         if(count==20) //計(jì)時(shí)到達(dá)一秒
  496.          {
  497.                  count=0;
  498.                  sec++;
  499.                   if(sec==60) //計(jì)時(shí)到達(dá)一分
  500.                   {
  501.                         sec=0;
  502.                         min++;
  503.                          if(min==60) //計(jì)時(shí)到達(dá)一小時(shí)
  504.                          {
  505.                                 min=0;
  506.                                 hour++;
  507.                                  if(hour==24) //計(jì)時(shí)到達(dá)一天
  508.                                         {
  509.                                                   hour=0;
  510.                                                 ri++;
  511.                                                 count1++;
  512.                                                 if(count1==8) //計(jì)時(shí)到達(dá)一周
  513.                                                 {
  514.                          count1=1;
  515.                                                 }
  516.                                                 if(yue==1|yue==3|yue==5|yue==7|yue==8|yue==10|yue==12)
  517.                                                 {
  518.                          if(ri>31) //計(jì)時(shí)到達(dá)一個(gè)月31天
  519.                                                  {
  520.                                                  ri=1;
  521.                                                  yue++;
  522.                                                  if(yue>12) //計(jì)時(shí)到達(dá)一年
  523.                                                  {
  524.                                                  yue=1;
  525.                                                  nian++;
  526.                                                  }
  527.                                                  }
  528.                                                 }
  529.                                                 if(yue==4|yue==6|yue==9|yue==11)
  530.                                                 {
  531.                                                 if(ri>30) //計(jì)時(shí)到達(dá)一個(gè)月30天
  532.                                                  {
  533.                                                  ri=1;
  534.                                                  yue++;
  535.                                                  if(yue>12) //計(jì)時(shí)到達(dá)一年
  536.                                                  {
  537.                                                  yue=1;
  538.                                                  nian++;
  539.                                                  }
  540.                                                  }
  541.                                                 }
  542.                                                 if(yue==2)
  543.                                                 {
  544.                                                 if(nian%4==0)
  545.                                                 {
  546.                                                 if(ri>29)//計(jì)時(shí)到達(dá)一個(gè)月29天
  547.                                                  {
  548.                                                  ri=1;
  549.                                                  yue++;
  550.                                                  if(yue>12)
  551.                                                  {
  552.                                                  yue=1;
  553.                                                  nian++;
  554.                                                  }
  555.                                                  }
  556.                                                 }
  557.                                                 else
  558.                                                 {
  559.                                                 if(ri>28) //計(jì)時(shí)到達(dá)一個(gè)月28天
  560.                                                  {
  561.                                                  ri=1;
  562.                                                  yue++;
  563.                                                  if(yue>12)
  564.                                                  {
  565.                                                  yue=1;
  566.                                                  nian++;
  567.                                                  }
  568.                                                  }
  569.                                                 }

  570.                                                 }
  571.                                         }
  572.                          }
  573.                   }

  574.          }
  575. }

  576. void linsheng()  //鬧鐘發(fā)生器
  577. {    if(nao==1)
  578.      {if(hour==nao1&min==nao2&sec==nao3)//滿(mǎn)足時(shí)間?
  579.          qq=1;//是否設(shè)置鬧鐘時(shí)間
  580.          if(qq==1)
  581.          {
  582.       key_out=0;
  583.       lcd_delay(10000);
  584.           key_out=1;
  585.           lcd_delay(1000);
  586.          }
  587.          }
  588. }
  589. void main()
  590. ……………………

  591. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
新建文件夾.rar (47.06 KB, 下載次數(shù): 44)
回復(fù)

使用道具 舉報(bào)

ID:684165 發(fā)表于 2020-1-11 16:33 | 顯示全部樓層
這個(gè)鬧鐘訂好時(shí)間后,好像不響啊!
回復(fù)

使用道具 舉報(bào)

ID:684165 發(fā)表于 2020-1-11 16:34 | 顯示全部樓層
鬧鐘定好時(shí)間后,好像不響啊! 難受&#128555;
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区在线观看 | 欧美国产日韩精品 | 99精品在线 | 男女视频免费 | 99久久精品一区二区毛片吞精 | 欧美亚洲视频 | 久久国产日韩欧美 | 欧美精品一区二区三区在线播放 | 一区二区三区国产在线观看 | 天天精品在线 | 国产精品一区一区三区 | www.蜜桃av | 不卡的av电影 | 黄色电影在线免费观看 | 中文精品视频 | 精品亚洲永久免费精品 | 麻豆天堂 | 久久久一区二区三区四区 | 黑人巨大精品欧美一区二区免费 | av网站在线看| 91久久久精品国产一区二区蜜臀 | 黄色在线免费观看 | 国产一区二区高清在线 | 国产日韩欧美在线观看 | 国产日韩av一区二区 | 请别相信他免费喜剧电影在线观看 | 日韩成人在线电影 | 天天插天天射天天干 | 欧美福利影院 | 国产精品久久久久久久免费大片 | 神马影院一区二区三区 | 国产高清无av久久 | 国产一区二区视频免费在线观看 | 国产目拍亚洲精品99久久精品 | 视频在线一区二区 | 日日夜夜视频 | 亚洲一区电影 | 国产一区免费视频 | 久热m3u8 | 免费国产视频在线观看 | 欧美日韩精品国产 |