• 歡迎光臨東莞市飛江電子科技有限公司官網!
    全國咨詢熱線

    13926563901

    18925580829

    飛江淘寶店鋪

    首頁>技術資料>51單片機

    51單片機初學密碼鎖代碼

    發布時間:2018-04-04   瀏覽量:

    #include
    #include
    #define uint unsigned int
    #define uchar unsigned char

    uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
    uchar new1,new2,new3,new4,new5,new6;  //每次MCU采集到的密碼輸入
    uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數碼管顯示的變量
    uchar wei,key,temp;

    bit allow,genggai,ok,wanbi,retry,close;         //各個狀態位

    sbit dula=P2^6;
    sbit wela=P2^7;
    sbit beep=P2^3;
    sbit sda=P2^0;                          //IO口定義
    sbit scl=P2^1;

    unsigned char code table[]=
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
    0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

    /*****************IIC芯片24C02存儲器驅動程序************************************/

    void nop()
    {
            _nop_();
            _nop_();
    }
    /////////24C02讀寫驅動程序////////////////////
    void delay1(unsigned int m)
    {        unsigned int n;
              for(n=0;n
    }

    void init()  //24c02初始化子程序
    {
            scl=1;
            nop();
            sda=1;
            nop();
    }

    void start()        //啟動I2C總線
    {
            sda=1;
            nop();
            scl=1;
            nop();
            sda=0;
            nop();
            scl=0;
            nop();
    }

    void stop()         //停止I2C總線
    {
            sda=0;
            nop();
            scl=1;
            nop();
            sda=1;
            nop();
    }

    void writebyte(unsigned char j)  //寫一個字節
    {
            unsigned char i,temp;
               temp=j;
               for (i=0;i<8;i++)
       {
               temp=temp<<1;
               scl=0;
               nop();
               sda=CY;                //temp左移時,移出的值放入了CY中
               nop();
               scl=1;                //待sda線上的數據穩定后,將scl拉高
               nop();
       }
       scl=0;
       nop();
       sda=1;
       nop();
    }

    unsigned char readbyte()   //讀一個字節
    {
       unsigned char i,j,k=0;
       scl=0; nop(); sda=1;
       for (i=0;i<8;i++)
       {  
                    nop(); scl=1; nop();
                  if(sda==1)
                    j=1;
                  else
                    j=0;
                  k=(k<<1)|j;
                      scl=0;
            }
               nop();
            return(k);
    }

    void clock()         //I2C總線時鐘
    {
       unsigned char i=0;
       scl=1;
       nop();
       while((sda==1)&&(i<255))
                 i++;
       scl=0;
       nop();
    }

    ////////從24c02的地址address中讀取一個字節數據/////
    unsigned char read24c02(unsigned char address)
    {
       unsigned char i;
       start();
       writebyte(0xa0);
       clock();
       writebyte(address);
       clock();
       start();
       writebyte(0xa1);
       clock();
       i=readbyte();
       stop();
       delay1(100);
       return(i);
    }

    //////向24c02的address地址中寫入一字節數據info/////
    void write24c02(unsigned char address,unsigned char info)
    {
       start();
       writebyte(0xa0);
       clock();
       writebyte(address);
       clock();
       writebyte(info);
       clock();
       stop();
       delay1(5000); //這個延時一定要足夠長,否則會出錯。因為24c02在從sda上取得數據后,還需要一定時間的燒錄過程。
    }
    /****************************密碼鎖程序模塊********************************************************/

    void delay(unsigned char i)
    {
            uchar j,k;
      for(j=i;j>0;j--)
        for(k=125;k>0;k--);
    }

    void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
    {
       dula=0;
       P0=table[a];
       dula=1;
       dula=0;

       wela=0;
       P0=0xfe;
       wela=1;
       wela=0;
       delay(5);

       P0=table[b];
       dula=1;
       dula=0;

       P0=0xfd;
       wela=1;
       wela=0;
       delay(5);

       P0=table[c];
       dula=1;
       dula=0;

       P0=0xfb;
       wela=1;
       wela=0;
       delay(5);

       P0=table[d];
       dula=1;
       dula=0;

       P0=0xf7;
       wela=1;
       wela=0;
       delay(5);

       P0=table[e];
       dula=1;
       dula=0;

       P0=0xef;
       wela=1;
       wela=0;
       delay(5);

       P0=table[f];
       dula=1;
       dula=0;

       P0=0xdf;
       wela=1;
       wela=0;
       delay(5);
    }


    void keyscan()
    {
      {       
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {       
            temp=P3;
            switch(temp)
            {
              case 0xee:
                   key=0;
                               wei++;
                   break;

              case 0xde:
                   key=1;
                               wei++;
                   break;

              case 0xbe:
                   key=2;
                               wei++;
                   break;

              case 0x7e:
                   key=3;
                               wei++;
                   break;
             }
             while(temp!=0xf0)
            {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
             }
             beep=1;
          }
        }
        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
            temp=P3;
            switch(temp)
            {
              case 0xed:
                   key=4;
                               wei++;
                   break;

              case 0xdd:
                   key=5;
                               wei++;
                   break;

              case 0xbd:
                   key=6;
                               wei++;
                   break;

              case 0x7d:
                   key=7;
                               wei++;
                   break;
             }
             while(temp!=0xf0)
             {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
             }
             beep=1;
          }
          }
        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
            temp=P3;
            switch(temp)
            {
              case 0xeb:
                   key=8;
                               wei++;
                   break;

              case 0xdb:
                   key=9;
                               wei++;
                   break;
                              
              case 0xbb:
                   genggai=1;
                               wei=0;
                   break;

              case 0x7b:
                                 if(allow)
                   ok=1;
                   break;
             }
            while(temp!=0xf0)
             {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
             }
             beep=1;
          }
          }
              P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
          delay(10);
          if(temp!=0xf0)
          {
            temp=P3;
            switch(temp)
            {
              case 0xe7:
                                 retry=1;
                   break;

              case 0xd7:
                                 close=1;
                   break;
             }
            while(temp!=0xf0)
             {
               temp=P3;
               temp=temp&0xf0;
               beep=0;
             }
             beep=1;
          }
          }
    }
    }

    void shumima()                //對按鍵采集來的數據進行分配
    {
            if(!wanbi)
            {
            switch(wei)
            {
                    case 1:new1=key;
                                if(!allow)        a=17;
                               else a=key;        break;
                    case 2:new2=key;
                                    if(a==17) b=17;
                                    else b=key;        break;
                    case 3:new3=key;
                                    if(a==17) c=17;
                                    else c=key;        break;
                    case 4:new4=key;
                                    if(a==17) d=17;
                                    else d=key;        break;
                    case 5:new5=key;
                                    if(a==17) e=17;
                                    else e=key;        break;
                    case 6:new6=key;
                                    if(a==17) f=17;
                                    else f=key;
                                    wanbi=1;        break;

    黑人粗大无码AV人妻一区