找回密碼
         注冊(cè)會(huì)員
        搜索附件  

        5_3_169cff09f475f6c.jpg

         

        單片機(jī)實(shí)現(xiàn)電子密碼鎖:








        /*****************************************/
        /* Copyright (c) 2005, 通信工程學(xué)院 */
        /* All rights reserved. */
        /* 作 者:戴 佳 */
        /*****************************************/

        #include "PWLock.h"

        /* 鍵消抖延時(shí)函數(shù) */
        void delay(void)
        {
        uchar i;
        for (i=300;i>0;i--);
        }

        /* 鍵掃描函數(shù) */
        uchar keyscan(void)
        {
        uchar scancode,tmpcode;
        P1 = 0xf0; // 發(fā)全0行掃描碼
        if ((P1&0xf0)!=0xf0) // 若有鍵按下
        {
        delay(); // 延時(shí)去抖動(dòng)
        if ((P1&0xf0)!=0xf0) // 延時(shí)后再判斷一次,去除抖動(dòng)影響
        {
        scancode = 0xfe;
        while((scancode&0x10)!=0) // 逐行掃描
        {
        P1 = scancode; // 輸出行掃描碼
        if ((P1&0xf0)!=0xf0) // 本行有鍵按下
        {
        tmpcode = (P1&0xf0)|0x0f;

        /* 返回特征字節(jié)碼,為1的位即對(duì)應(yīng)于行和列 */
        return((~scancode)+(~tmpcode));
        }
        else scancode = (scancode<<1)|0x01; // 行掃描碼左移一位
        }
        }
        }
        return(0); // 無(wú)鍵按下,返回值為0
        }

        /* 定時(shí)器0中斷服務(wù)子程序,2ms定時(shí)動(dòng)態(tài)掃描顯示 */
        void time0_int(void) interrupt 1
        {
        /* 重置2ms定時(shí) */
        TH0 = -2000/256;
        TL0 = -2000%256;

        if (showflag==1)
        display(); // 調(diào)用顯示函數(shù)
        }

        /* 定時(shí)器1中斷服務(wù)子程序,50ms*/
        void time1_int(void) interrupt 3
        {
        uchar k;
        /* 重置50ms定時(shí) */
        TH1 = -50000/256;
        TL1 = -50000%256;

        if (t1count<20)
        {
        t1count++;
        }
        else // 計(jì)時(shí)到1s
        {
        TR1 = 0; // 關(guān)閉計(jì)數(shù)器1
        t1count = 0;
        green = 1; // 綠燈不亮
        red = 1; // 紅燈不亮
        showflag = 1; // 打開(kāi)數(shù)碼管顯示
        digbit = 0x01; // 從數(shù)碼管第1位開(kāi)始動(dòng)態(tài)顯示
        for (k=0;k<6;k++) // 顯示888888
        wordbuf[k] = 8;
        }
        }

        /* 根據(jù)共陰極字型編碼表獲取0~9,A~B字型代碼 */
        uchar getcode(uchar i)
        {
        uchar p;
        switch (i)
        {
        case 0: p=0x3f; break; /* 0 */
        case 1: p=0x06; break; /* 1 */
        case 2: p=0x5B; break; /* 2 */
        case 3: p=0x4F; break; /* 3 */
        case 4: p=0x66; break; /* 4 */
        case 5: p=0x6D; break; /* 5 */
        case 6: p=0x7D; break; /* 6 */
        case 7: p=0x07; break; /* 7 */
        case 8: p=0x7F; break; /* 8 */
        case 9: p=0x67; break; /* 9 */
        case 10: p=0x77; break; /* A */
        case 11: p=0x7C; break; /* B */
        case 12: p=0x39; break; /* C */
        case 13: p=0x5E; break; /* D */
        case 14: p=0x79; break; /* E */
        case 15: p=0x71; break; /* F */
        default: break;
        }
        return(p);
        }

        /* 顯示函數(shù) */
        void display(void)
        {
        uchar i;
        switch (digbit)
        {
        case 1: i=0; break;
        case 2: i=1; break;
        case 4: i=2; break;
        case 8: i=3; break;
        case 16: i=4; break;
        case 32: i=5; break;
        default: break;
        }

        P2 = 0x0; // 關(guān)閉顯示
        P0 = getcode(wordbuf); // 送字型碼
        P2 = digbit; // 送字位碼

        if (digbit<0x20) // 共6位
        digbit = digbit*2; // 左移一位
        else
        digbit = 0x01;
        }

        /* 密碼比較函數(shù) */
        bit pwcmp(void)
        {
        bit flag;
        uchar i;
        for (i=0;i<6;i++)
        {
        if (pw==pwbuf)
        flag = 1;
        else
        {
        flag = 0;
        i = 6;
        }
        }
        return(flag);
        }

        /* 主程序 */
        void main()
        {
        uchar j,key;

        P2 = 0x0; // 關(guān)閉數(shù)碼管顯示

        TMOD = 0x11; // T0,T1工作方式1

        /* 2ms 定時(shí)設(shè)置 */
        TH0 = -2000/256;
        TL0 = 2000%256;

        /* 50ms 定時(shí)設(shè)置 */
        TH1 = -50000/256;
        TL1 = -50000%256;

        /* 啟動(dòng)計(jì)數(shù)器0,關(guān)閉計(jì)數(shù)器1 */
        TR0 = 1;
        ET0 = 1;
        TR1 = 0;
        ET1 = 1;
        EA = 1;

        count = 0; // 初始沒(méi)有輸入密碼,計(jì)數(shù)器設(shè)為0
        enterflag = 0; // 沒(méi)有按下確認(rèn)鍵
        pwflag = 0; // 密碼標(biāo)志先置為0
        green = 1; // 綠燈不亮
        red = 1; // 紅燈不亮

        /* 假設(shè)內(nèi)定密碼為937602 */
        pw[0] = 9;
        pw[1] = 3;
        pw[2] = 7;
        pw[3] = 6;
        pw[4] = 0;
        pw[5] = 2;

        digbit = 0x01; // 從第一位數(shù)碼管開(kāi)始動(dòng)態(tài)掃描

        /* 剛加電時(shí),顯示888888 */
        for (j=0;j<6;j++)
        wordbuf[j] = 8;

        showflag = 1; // 打開(kāi)數(shù)碼管顯示

        while(1)
        {
        key = keyscan(); // 調(diào)用鍵盤掃描函數(shù)
        switch(key)
        {
        case 0x11: // 1行1列,數(shù)字0
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F”
        pwbuf[count] = 0;
        count++;
        }
        break;
        case 0x21: // 1行2列,數(shù)字1
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 1;
        count++;
        }
        break;
        case 0x41: // 1行3列,數(shù)字2
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 2;
        count++;
        }
        break;
        case 0x81: // 1行4列,數(shù)字3
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 3;
        count++;
        }
        break;
        case 0x12: // 2行1列,數(shù)字4
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 4;
        count++;
        }
        break;
        case 0x22: // 2行2列,數(shù)字5
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 5;
        count++;
        }
        break;
        case 0x42: // 2行3列,數(shù)字6
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 6;
        count++;
        }
        break;
        case 0x82: // 2行4列,數(shù)字7
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 7;
        count++;
        }
        break;
        case 0x14: // 3行1列,數(shù)字8
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 8;
        count++;
        }
        break;
        case 0x24: // 3行2列,數(shù)字9
        if (count<6)
        {
        wordbuf[count] = 0x0f; // 對(duì)應(yīng)密碼位上顯示“F"
        pwbuf[count] = 9;
        count++;
        }
        break;
        case 0x44: // 3行3列,確認(rèn)鍵
        enterflag = 1; // 確認(rèn)鍵按下
        if (count==6) // 只有輸入6個(gè)密碼后按確認(rèn)鍵才作密碼比較
        pwflag = pwcmp();
        else
        pwflag = 0; // 否則直接pmflag賦0
        break;
        case 0x84: // 3行4列,取消鍵
        count = 0; // 密碼計(jì)數(shù)清零
        for (j=0;j<6;j++)
        {
        wordbuf[j] = 8; // 數(shù)碼管顯示888888
        pwbuf[j] = 0x0f; // 用FFFFFF清除已經(jīng)輸入的密碼
        }
        break;
        default:break;
        }

        if (enterflag==1) // 如果按下確認(rèn)鍵
        {
        enterflag = 0; // 標(biāo)志位置回0
        count = 0; // 密碼位計(jì)數(shù)器清零
        for (j=0;j<6;j++)
        pwbuf[j] = 0x0f; // 用FFFFFF清除已經(jīng)輸入的密碼
        showflag = 0; // 關(guān)閉數(shù)碼管顯示
        TR1 = 1; // 計(jì)數(shù)器1開(kāi)始計(jì)數(shù)
        t1count = 0; // 定時(shí)器1由50ms累積到1s所用的計(jì)數(shù)器
        if (pwflag==1)
        green = 0; // 綠燈亮
        else
        red = 0; // 紅燈亮
        }
        }
        }


        書(shū)上看到的,覺(jué)得不錯(cuò)就跟大家分享一下

        5_3_169cff09f475f6c.jpg

        QQ|手機(jī)版|MCU資訊論壇 ( 京ICP備18035221號(hào)-2 )|網(wǎng)站地圖

        GMT+8, 2025-7-10 18:03 , Processed in 0.039333 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        日韩精品一区二区三区大桥未久| 国模私拍视频在线| 免费高清日本社区| 亚洲国产精品综合久久一线| 国产精品久久久久9999高清| 国产成人tv在线观看| 精品国产福利尤物免费| 99免费精品视频| 国产小u女在线未发育一| 欧美午夜精品久久久久免费视| 亚洲精品亚洲人成在线观看下载| 国内精品久久久久久久久| 亚洲精品国产V片在线观看| 色欲精品国产一区二区三区AV| 久久久亚洲精品蜜桃臀| 国产成人精品久久综合| 51视频国产精品一区二区| 午夜精品射精入后重之免费观看 | 国产成人精品在线观看| 蜜臀AV无码国产精品色午夜麻豆| 久久精品国产福利国产秒| 欧美大陆日韩一区二区三区| 久久精品午夜一区二区福利| 精品久久久久久久中文字幕| 久久99热狠狠色精品一区| 无码人妻精品一区二区三区东京热| 国产精品久久久久久吹潮| 久久夜色精品国产噜噜噜亚洲AV | 中文字幕在线亚洲精品| 国产精品视频久久久| 欧美激情视频精品一区二区| 欧美精品一区二区蜜臀亚洲| 国产成人精品久久亚洲| 伊人久久综合精品无码AV专区| 国产精品国产精品国产专区不卡 | 麻豆成人久久精品二区三区免费| 国产高清在线精品一区二区三区| 午夜精品久视频在线观看| 亚洲国产高清精品线久久| 国内精品免费在线观看| 美女视频黄的全免费网站|