找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 5_3_310c360ad026a54.jpg

        5_3_310c360ad026a54.jpg

         

        單片機實現電子密碼鎖:








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

        #include "PWLock.h"

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

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

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

        /* 定時器0中斷服務子程序,2ms定時動態掃描顯示 */
        void time0_int(void) interrupt 1
        {
        /* 重置2ms定時 */
        TH0 = -2000/256;
        TL0 = -2000%256;

        if (showflag==1)
        display(); // 調用顯示函數
        }

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

        if (t1count<20)
        {
        t1count++;
        }
        else // 計時到1s
        {
        TR1 = 0; // 關閉計數器1
        t1count = 0;
        green = 1; // 綠燈不亮
        red = 1; // 紅燈不亮
        showflag = 1; // 打開數碼管顯示
        digbit = 0x01; // 從數碼管第1位開始動態顯示
        for (k=0;k<6;k++) // 顯示888888
        wordbuf[k] = 8;
        }
        }

        /* 根據共陰極字型編碼表獲取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);
        }

        /* 顯示函數 */
        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; // 關閉顯示
        P0 = getcode(wordbuf); // 送字型碼
        P2 = digbit; // 送字位碼

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

        /* 密碼比較函數 */
        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; // 關閉數碼管顯示

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

        /* 2ms 定時設置 */
        TH0 = -2000/256;
        TL0 = 2000%256;

        /* 50ms 定時設置 */
        TH1 = -50000/256;
        TL1 = -50000%256;

        /* 啟動計數器0,關閉計數器1 */
        TR0 = 1;
        ET0 = 1;
        TR1 = 0;
        ET1 = 1;
        EA = 1;

        count = 0; // 初始沒有輸入密碼,計數器設為0
        enterflag = 0; // 沒有按下確認鍵
        pwflag = 0; // 密碼標志先置為0
        green = 1; // 綠燈不亮
        red = 1; // 紅燈不亮

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

        digbit = 0x01; // 從第一位數碼管開始動態掃描

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

        showflag = 1; // 打開數碼管顯示

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

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


        書上看到的,覺得不錯就跟大家分享一下

        5_3_310c360ad026a54.jpg

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-5 11:11 , Processed in 0.039798 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        久久精品无码一区二区日韩AV | 久久久久国产精品麻豆AR影院 | 老司机亚洲精品影院无码| 日本高清www午夜在线网站| 亚洲国产一二三精品无码| 6一12呦女精品| 国产精品 日韩欧美| 亚洲精品无码永久在线观看 | 免费人成在线蜜桃视频| 久久棈精品久久久久久噜噜| 国产精品久久久久久影院| 国产天天综合永久精品日| 美女露出尿口让人摸| 91精品国产91久久综合| 精品国产午夜福利在线观看| 亚洲精品无码久久千人斩| 亚洲国产精品久久久久久| 青草热久免费精品视频| 欧美成人精品一级高清片| 亚洲精品在线视频| 国99精品无码一区二区三区| 久久99精品九九九久久婷婷| 久久精品国产亚洲AV麻豆网站| 色一乱一伦一图一区二区精品| 就去吻亚洲精品国产欧美| 国产精品免费看久久久| 精品日本一区二区三区在线观看| 人妻少妇精品系列| 国产精品偷伦视频观看免费| 国产午夜精品理论片久久| 无码人妻精品一区二区三区99仓本| 久久久精品人妻一区二区三区四| 久久久免费精品re6| 国产精品1024在线永久免费| 亚洲精品无码不卡在线播HE| 久久91精品国产91久久小草| 日本免费精品一区二区三区 | 99热门精品一区二区三区无码| 国产精品一区二区久久国产| 国内精品欧美久久精品| 国内精品免费网站牛牛|