新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 33. 4×4鍵盤及8位數碼管顯示構成的電子密碼鎖

        33. 4×4鍵盤及8位數碼管顯示構成的電子密碼鎖

        作者: 時間:2016-11-18 來源:網絡 收藏
        1.實驗任務
        用4×4組成0-9數字鍵及確認鍵。
        用8位數碼管組成顯示電路提示信息,當輸入密碼時,只顯示“8.”,當密碼位數輸入完畢按下確認鍵時,對輸入的密碼與設定的密碼進行比較,若密碼正確,則門開,此處用LED發光二極管亮一秒鐘做為提示,同時發出“叮咚”聲;若密碼不正確,禁止按鍵輸入3秒,同時發出“嘀、嘀”報警聲;若在3秒之內仍有按鍵按下,則禁止按鍵輸入3秒被重新禁止。
        2.電路原理

        圖4.33.1
        3.系統板上硬件連線
        (1).把“單片機系統”區域中的P0.0-P0.7用8芯排線連接到“動態數碼顯示”區域中的ABCDEFGH端子上。
        (2).把“單片機系統“區域中的P2.0-P2.7用8芯排線連接到“動態數碼顯示”區域中的S1S2S3S4S5S6S7S8端子上。
        (3).把“單片機系統”區域中的P3.0-P3.7用8芯排線連接到“4×4行列式鍵盤”區域中的R1R2R3R4C1C2C3C4端子上。
        (4).把“單片機系統”區域中的P1.0用導線連接到“八路發光二極管模塊”區域中的L2端子上。
        (5).把“單片機系統”區域中的P1.7用導線連接到“音頻放大模塊”區域中的SPKIN端子上。
        (6).把“音頻放大模塊”區域中的SPKOUT接到喇叭上。
        4.程序設計內容
        (1).4×4行列式鍵盤識別技術:有關這方面內容前面已經討論過,這里不再重復。
        (2).8位數碼顯示,初始化時,顯示“P”,接著輸入最大6位數的密碼,當密碼輸入完后,按下確認鍵,進行密碼比較,然后給出相應的信息。在輸入密碼過程中,顯示器只顯示“8.”。當數字輸入超過6個時,給出報警信息。在密碼輸入過程中,若輸入錯誤,可以利用“DEL”鍵刪除剛才輸入的錯誤的數字。
        (3).4×4行列式鍵盤的按鍵功能分布圖如圖4.33.2所示:
        7

        8

        9


        4

        5

        6


        1

        2

        3

        Del
        0



        Enter








        圖4.33.2

        5.C語言源程序
        #include
        unsignedcharps[]={1,2,3,4,5};
        unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,
        0xef,0xdf,0xbf,0x7f};
        unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f,
        0x77,0x7c,0x39,0x5e,0x79,0x71,
        0x00,0x40,0x73,0xff};
        unsignedchardispbuf[8]={18,16,16,16,16,16,16,16};
        unsignedchardispcount;
        unsignedcharflashcount;
        unsignedchartemp;
        unsignedcharkey;
        unsignedcharkeycount;
        unsignedcharpslen=5;
        unsignedchargetps[6];
        bitkeyoverflag;
        biterrorflag;
        bitrightflag;
        unsignedintsecond3;
        unsignedintaa,bb;
        unsignedintcc;
        bitokflag;
        bitalarmflag;
        bithibitflag;
        unsignedcharoka,okb;
        voidmain(void)
        {
        unsignedchari,j;
        TMOD=0x01;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        TR0=1;
        ET0=1;
        EA=1;
        while(1)
        {
        P3=0xff;
        P3_4=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=7;
        break;
        case0x0d:
        key=8;
        break;
        case0x0b:
        key=9;
        break;
        case0x07:
        key=10;
        break;
        }
        temp=P3;
        P1_1=~P1_1;
        if((key>=0)&&(key<10))
        {
        if(keycount<6)
        {
        getps[keycount]=key;
        dispbuf[keycount+2]=19;
        }
        keycount++;
        if(keycount==6)
        {
        keycount=6;

        }
        elseif(keycount>6)
        {
        keycount=6;
        keyoverflag=1;//keyoverflow
        }
        }
        elseif(key==12)//deletekey
        {
        if(keycount>0)
        {
        keycount--;
        getps[keycount]=0;
        dispbuf[keycount+2]=16;
        }
        else
        {
        keyoverflag=1;
        }
        }
        elseif(key==15)//enterkey
        {
        if(keycount!=pslen)
        {
        errorflag=1;
        rightflag=0;
        second3=0;
        }
        else
        {
        for(i=0;i{
        if(getps!=ps)
        {
        i=keycount;
        errorflag=1;
        rightflag=0;
        second3=0;
        gotoa;
        }
        }
        errorflag=0;
        rightflag=1;
        a:i=keycount;
        }
        }
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        keyoverflag=0;//?????????
        }
        }
        P3=0xff;
        P3_5=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=4;
        break;
        case0x0d:
        key=5;
        break;
        case0x0b:
        key=6;
        break;
        case0x07:
        key=11;
        break;
        }
        temp=P3;
        P1_1=~P1_1;
        if((key>=0)&&(key<10))
        {
        if(keycount<6)
        {
        getps[keycount]=key;
        dispbuf[keycount+2]=19;
        }
        keycount++;
        if(keycount==6)
        {
        keycount=6;
        }
        elseif(keycount>6)
        {
        keycount=6;
        keyoverflag=1;//keyoverflow
        }
        }
        elseif(key==12)//deletekey
        {
        if(keycount>0)
        {
        keycount--;
        getps[keycount]=0;
        dispbuf[keycount+2]=16;
        }
        else
        {
        keyoverflag=1;
        }
        }
        elseif(key==15)//enterkey
        {
        if(keycount!=pslen)
        {
        errorflag=1;
        rightflag=0;
        second3=0;
        }
        else
        {
        for(i=0;i{
        if(getps!=ps)
        {
        i=keycount;
        errorflag=1;
        rightflag=0;
        second3=0;
        gotoa4;
        }
        }
        errorflag=0;
        rightflag=1;
        a4:i=keycount;
        }
        }
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        keyoverflag=0;//?????????
        }
        }

        P3=0xff;
        P3_6=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=1;
        break;
        case0x0d:
        key=2;
        break;
        case0x0b:
        key=3;
        break;
        case0x07:
        key=12;
        break;
        }
        temp=P3;
        P1_1=~P1_1;
        if((key>=0)&&(key<10))
        {
        if(keycount<6)
        {
        getps[keycount]=key;
        dispbuf[keycount+2]=19;
        }
        keycount++;
        if(keycount==6)
        {
        keycount=6;
        }
        elseif(keycount>6)
        {
        keycount=6;
        keyoverflag=1;//keyoverflow
        }
        }
        elseif(key==12)//deletekey
        {
        if(keycount>0)
        {
        keycount--;
        getps[keycount]=0;
        dispbuf[keycount+2]=16;
        }
        else
        {
        keyoverflag=1;
        }
        }
        elseif(key==15)//enterkey
        {
        if(keycount!=pslen)
        {
        errorflag=1;
        rightflag=0;
        second3=0;
        }
        else
        {
        for(i=0;i{
        if(getps!=ps)
        {
        i=keycount;
        errorflag=1;
        rightflag=0;
        second3=0;
        gotoa3;
        }
        }
        errorflag=0;
        rightflag=1;
        a3:i=keycount;
        }
        }
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        keyoverflag=0;//?????????
        }
        }
        P3=0xff;
        P3_7=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=10;i>0;i--)
        for(j=248;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=0;
        break;
        case0x0d:
        key=13;
        break;
        case0x0b:
        key=14;
        break;
        case0x07:
        key=15;
        break;
        }
        temp=P3;
        P1_1=~P1_1;
        if((key>=0)&&(key<10))
        {
        if(keycount<6)
        {
        getps[keycount]=key;
        dispbuf[keycount+2]=19;
        }
        keycount++;
        if(keycount==6)
        {
        keycount=6;
        }
        elseif(keycount>6)
        {
        keycount=6;
        keyoverflag=1;//keyoverflow
        }
        }
        elseif(key==12)//deletekey
        {
        if(keycount>0)
        {
        keycount--;
        getps[keycount]=0;
        dispbuf[keycount+2]=16;
        }
        else
        {
        keyoverflag=1;
        }
        }
        elseif(key==15)//enterkey
        {
        if(keycount!=pslen)
        {
        errorflag=1;
        rightflag=0;
        second3=0;
        }
        else
        {
        for(i=0;i{
        if(getps!=ps)
        {
        i=keycount;
        errorflag=1;
        rightflag=0;
        second3=0;
        gotoa2;
        }
        }
        errorflag=0;
        rightflag=1;
        a2:i=keycount;
        }
        }
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        keyoverflag=0;//?????????
        }
        }

        }
        }
        voidt0(void)interrupt1using0
        {
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        flashcount++;
        if(flashcount==8)
        {
        flashcount=0;
        P0=dispcode[dispbuf[dispcount]];
        P2=dispbit[dispcount];
        dispcount++;
        if(dispcount==8)
        {
        dispcount=0;
        }
        }
        if((errorflag==1)&&(rightflag==0))
        {
        bb++;
        if(bb==800)
        {
        bb=0;
        alarmflag=~alarmflag;
        }
        if(alarmflag==1)//soundalarmsignal
        {
        P1_7=~P1_7;
        }
        aa++;
        if(aa==800)//lightalarmsignal
        {
        aa=0;
        P1_0=~P1_0;
        }
        second3++;
        if(second3==6400)
        {
        second3=0;
        errorflag=0;
        rightflag=0;
        alarmflag=0;
        bb=0;
        aa=0;
        }
        }
        elseif((errorflag==0)&&(rightflag==1))
        {
        P1_0=0;
        cc++;
        if(cc<1000)
        {
        okflag=1;
        }
        elseif(cc<2000)
        {
        okflag=0;
        }
        else
        {
        errorflag=0;
        rightflag=0;
        P1_7=1;
        cc=0;
        oka=0;
        okb=0;
        okflag=0;
        P1_0=1;
        }
        if(okflag==1)
        {
        oka++;
        if(oka==2)
        {
        oka=0;
        P1_7=~P1_7;
        }
        }
        else
        {
        okb++;
        if(okb==3)
        {
        okb=0;
        P1_7=~P1_7;
        }
        }
        }
        if(keyoverflag==1)
        {
        P1_7=~P1_7;
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 体育| 长子县| 桓仁| 吕梁市| 宕昌县| 阜宁县| 会宁县| 绥江县| 祁连县| 紫云| 凉城县| 山阴县| 柞水县| 景泰县| 南丹县| 卢氏县| 南昌市| 饶阳县| 通渭县| 邹城市| 兴安盟| 余庆县| 登封市| 佛学| 渝北区| 盐山县| 罗山县| 通道| 乾安县| 平昌县| 保德县| 连江县| 红安县| 米易县| 师宗县| 眉山市| 毕节市| 高台县| 楚雄市| 琼结县| 田林县|