<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        定時器時鐘+按鍵調整+1602顯示

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年05月02日   【字體:

         #include<reg51.h>

        #define uchar unsigned char
        #define uint unsigned int
        uchar code  table[]="00:00:00   XINQI";
        uchar code table1[]="2000-01-01 * 1 *";
        uchar code table2[]={0x80,0x87,0x86,0x84,0x83,0x81,0x80,
                0xc2,0xc3,0xc5,0xc6,0xc8,0xc9,0xcd};
        sbit lcde=P2^7;
        sbit rd=P2^6;
        sbit rw=P2^5;
        sbit k1=P2^0;
        sbit k2=P2^1;
        sbit k3=P2^2;
        sbit k4=P2^3;
        uchar tt,shi,fen,miao,nian,yue=1,ri=1,xinqi=1,temp;
         
        void delay(uchar z)
        {
         uchar x,y;
         for(x=z;x>0;x--)
          for(y=110;y>0;y--);
        }
         
        void write_com(uchar com)//寫命令
        {
         lcde=0;
         rd=0;
         rw=0;
         P0=com;
         delay(5);
         lcde=1;
         delay(5);
         lcde=0;
        }
         
        void write_dat(uchar dat)//寫數據
        {
         lcde=0;
         rd=1;
         rw=0;
         P0=dat;
         delay(5);
         lcde=1;
         delay(5);
         lcde=0;
        }
         
        void init()
        {
         uchar num;
         lcde=0;
         write_com(0x38);
         write_com(0x0c);
         write_com(0x06);
         write_com(0x01);
         for(num=0;num<16;num++)
          write_dat(table[num]);
         write_com(0xc0);
         for(num=0;num<16;num++)
          write_dat(table1[num]);
         
         TMOD=0x01;
         TH0=(65536-50000)/256;
         TL0=(65536-50000)%6;
         EA=1;
         ET0=1;
         TR0=1;
        }
         
        void write_sfm(uchar add,uchar date)//寫時分秒
        {
         write_com(0x80+add);
         write_dat(date/10+'0');
         write_dat(date+'0'); 
        }
         
        void write_nyr(uchar addr,uchar dater)//寫年月日
        {
         write_com(0xc0+addr);
         write_dat(dater/10+'0');
         write_dat(dater+'0'); 
        }
        void write_xinqi(uchar addrr,uchar xinqi)//寫星期
        {
         write_com(0xc0+addrr);
         write_dat(xinqi+'0');
        }
         
        void ksycan()
        {
         if(k1==0)//功能鍵
         {
          delay(5);
          if(k1==0)
          {
           while(!k1);
           TR0=0;
           temp++;
           if(temp==14)
           temp=1;
           write_com(table2[temp]);//光標定位在秒個位
           write_com(0x0f);//開光標閃爍 
          }
         }
         if(temp!=0)
         {
          if(k2==0)//加調整
          {
           delay(5);
           if(k2==0)
           {
            while(!k2);
            if(temp==1)
            {
             miao=(miao/10)*10+(miao+1);//按一次秒個位+1
             write_sfm(6,miao);//刷新秒顯示
            }
            if(temp==2)
            {
             miao=(miao/10+1)%6*10+(miao);//按一次秒十位+1
             write_sfm(6,miao);
            }
            if(temp==3)
            {
             fen=(fen/10)*10+(fen+1);
             write_sfm(3,fen);
            }
            if(temp==4)
            {
             fen=(fen/10+1)%6*10+(fen);
             write_sfm(3,fen);
            }
            if(temp==5)
            {
             shi=(shi/10)*10+(shi+1);
             write_sfm(0,shi);
            }
            if(temp==6)
            {
             shi=(shi/10+1)%3*10+(shi);
             write_sfm(0,shi);
            }
            if(temp==7)
            {
             nian=(nian/10+1)*10+(nian);
             write_nyr(2,nian);
            }
            if(temp==8)
            {
             nian=(nian/10)*10+(nian+1);
             write_nyr(2,nian);
            }
            if(temp==9)
            {
             yue++;
             if(yue==13)
              yue=1;
             write_nyr(5,yue);
            }
            if(temp==10)
            {
             yue++;
             if(yue==13)
              yue=1;
             write_nyr(5,yue);
            }
            if(temp==11)
            {
             ri=(ri/10+1)%4*10+(ri);
             write_nyr(8,ri);
            }
            if(temp==12)
            {
             ri=(ri/10)*10+(ri+1);
             write_nyr(8,ri);
            }
            if(temp==13)
            {
             xinqi++;
             if(xinqi==8)
              xinqi=1;
             write_xinqi(13,xinqi);
            }
            write_com(table2[temp]);//光標定位在當前調整位置
           }
          }
          if(k3==0)//減調整
          {
           delay(5);
           if(k3==0)
           {
            while(!k3);
            if(temp==1)
            {
             miao=(miao/10)*10+(miao+9);//秒個位-1
             write_sfm(6,miao);//刷新秒顯示
            }
            if(temp==2)
            {
             miao=((miao/10+9))*10+(miao);//秒十位-1
             if(miao/10==9)
              miao=50+miao;
             write_sfm(6,miao);
            }
            if(temp==3)
            {
             fen=(fen/10)*10+(fen+9);
             write_sfm(3,fen);
            }
            if(temp==4)
            {
             fen=((fen/10+9))*10+(fen);
             if(fen/10==9)
              fen=50+fen;
             write_sfm(3,fen);
            }
            if(temp==5)
            {
             shi=(shi/10)*10+((shi+9));
             write_sfm(0,shi);
            }
            if(temp==6)
            {
             shi=((shi/10+9))%7*10+(shi);
             write_sfm(0,shi);
            }
            if(temp==7)
            {
             nian=(nian/10+9)*10+(nian);
             write_nyr(2,nian);
            }
            if(temp==8)
            {
             nian=(nian/10)*10+(nian+9);
             write_nyr(2,nian);
            }
            if(temp==9)
            {
             yue--;
             if(yue==0)
              yue=12;
             write_nyr(5,yue);
            }
            if(temp==10)
            {
             yue--;
             if(yue==0)
              yue=12;
             write_nyr(5,yue);
            }
            if(temp==11)
            {
             ri=((ri/10+9))%6*10+(ri);
             write_nyr(8,ri);
            }
            if(temp==12)
            {
             ri=(ri/10)*10+(ri+9);
             write_nyr(8,ri);
            }
            if(temp==13)
            {
             xinqi--;
             if(xinqi==0)
              xinqi=7;
             write_xinqi(13,xinqi);
            }
            write_com(table2[temp]);//光標定位在當前調整位置
           }
          }
         }
         if(k4==0)//確定鍵
         {
          delay(5);
          if(k4==0)
          {
           while(!k4);
           temp=0;
           write_com(0x0c);//關閉光標閃爍
           TR0=1;
          }
         }
        }
         
        void main()
        {
         init();
         while(1)
         {
          if(tt==20)
          {
           tt=0;
           miao++;
           if(miao==60)
           {
            miao=0;
            fen++;
            if(fen==60)
            {
             fen=0;
             shi++;
             if(shi==24)
             {
              shi=0;
              xinqi++;
              if(xinqi==8)
               xinqi=1;
              write_xinqi(13,xinqi);//刷新星期顯不
              ri++;
              if(yue==1)
              {
               if(ri==32)
               {
                ri=1;
                yue++;
               }
              }
              if(yue==2)
              {
               if(nian%4==0)//閏年(29天)
               {
                if(ri==30)
                {
                 ri=1;
                 yue++;
                }
               }
               else
               {
                if(ri==29)//平年28天
                {
                 ri=1;
                 yue++;
                }
               }
              }
         
              if(yue>2)
              {
               if(yue<=7)//三月到7月
               {
                if(yue%2==0)//小月30天
                {
                 if(ri==31)
                 {
                  ri=1;
                  yue++;
                 }
                }
                else//大月31天
                {
                 if(ri==32)
                 {
                  ri=1;
                  yue++;
                 }
                }
               }
               if(yue>7)//8到12月
               {
                if(yue%2==0)//大月31天
                {
                 if(ri==32)
                 {
                  ri=1;
                  yue++;
                 }
                }
                else//小月30天
                {
                 if(ri==31)
                 {
                  ri=1;
                  yue++;
                 }
                }
               }
              }
              write_nyr(8,ri);//刷新日顯示
              if(yue==13)
              {
               yue=1;
               nian++;
               if(nian==100)
                nian=0;
               write_nyr(2,nian);//刷新年顯示
              }
              write_nyr(5,yue);//刷新月顯示
             }
             write_sfm(0,shi);//刷新時顯示
            }
            write_sfm(3,fen);//刷新分顯示
           }
           write_sfm(6,miao);//刷新秒顯示
          }
          ksycan();
         }
        }
         
        void dingshi() interrupt 1
        {
         TH0=(65536-50000)/256;
         TL0=(65536-50000)%6;
         tt++; 
        }
         
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮