新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機的LCD1602液晶屏密碼鎖匯編程序

        51單片機的LCD1602液晶屏密碼鎖匯編程序

        作者: 時間:2016-11-28 來源:網絡 收藏
        ;說 明:首先顯示器提示輸入密碼,密碼在12.5S內輸入有效,
        ; 輸入次三次錯誤報警10S,輸入正確開門,7秒后返回初態
        ; 以上參數均可在主程序里設定,修改系統密碼在程序的結尾
        RS BIT P2.7
        RW BIT P2.6
        E BIT P2.5
        ENTER BIT 22H.0
        OPEN BIT P3.6
        SPEAK BIT P3.7
        PASSBUF EQU 40H
        KEYNUMBER EQU 41H ;存放識別后的按鍵號
        ORG 0000H
        AJMP MAIN
        ORG 0003H
        JMP KEY_INT
        ORG 000BH
        AJMP INTT0
        ORG 001BH
        AJMP INTT1
        ORG 0030H
        ;========== 主程序開始 ==============
        MAIN: MOV 30H,#07H ;輸入密碼為7位 最高只可設15位
        MOV 42H,#200 ;設定報警的時間,42H單元里的數*50MS
        MOV 43H,#250 ;設定開門時間 14的倍數(實際上液晶顯示器執行指令占用了時間,開門時間會比14*250MS大)
        ;44H號單元存放輸入錯誤的次數
        ;45H為定時器0中斷次數
        ;46H為定時器1中斷次數
        MOV 47H,#250 ;輸入密碼時間設定,50MS倍數
        MOV SP,#60H
        CLR OPEN
        CLR SPEAK ;初始化輸出設備
        CLR ENTER ;標志位初始化
        MOV TMOD,#11H ;定時器工作方式2
        MOV TH0,#3CH ;初值50MS
        MOV TL0,#0BH
        MOV TH1,#3CH
        MOV TL1,#0BH
        SETB EA
        SETB ET0
        SETB ET1
        MOV TCON,#00000000B ;電平觸發
        START: MOV R0,30H
        MOV R1,#31H
        SS1: MOV @R1,#00H
        INC R1
        DJNZ R0,SS1 ;將輸入密碼緩沖單元清零
        MOV P1,#0FH ;初始化按鍵口
        MOV R1,#31H ;從31號單元開始存放按建輸入的密碼
        CLR 20H ;報警標志清零
        CLR 21H ;密碼超時標志
        MOV 46H,#00H ;超時后對定時器中斷次數清零,便于下一輪重新計時
        INIT: ACALL SELLCD ;設定液晶工作方式
        ACALL LINE1 ;在第一行顯示
        MOV DPTR,#MES_P ;顯示請輸入密碼
        ACALL DISPLAY
        setb EX0 ;開中斷,允許鍵盤輸入
        KEYIN: JB 21H,ERR ;超時轉到錯誤程序
        JNB ENTER,KEYIN ;等待ENTER按下
        CLR ENTER
        clr EX0 ;密碼輸入完后鎖定鍵盤
        ;當使用邊沿觸發時用上面的指令為什么禁止不了中斷???
        ;========== 密碼判斷程序 ============
        COMP:
        MOV DPTR,#PASS
        MOV R4,30H ;密碼的長度
        MOV A,#0
        MOV R1,#31H
        LOOP: MOV R5,A
        MOVC A,@A+DPTR
        MOV PASSBUF,A ;取出系統設定的密碼
        MOV A,@R1 ;從31號單元開始取出輸入的密碼
        CJNE A,PASSBUF,ERR ;比較
        MOV A,R5
        INC A
        INC R1 ;取下一位
        DJNZ R4,LOOP
        ;正確
        MATCH: MOV A,#01H
        ACALL ENABLE ;清屏,光標復位
        ACALL LINE1 ;從第一行開始顯示
        MOV DPTR,#MES_C
        ACALL DISPLAY ;顯示"請進"
        ACALL LINE2
        MOV DPTR,#TAB_1
        ACALL DISPLAY
        SETB OPEN ;開門
        MOV 44H,#00H ;輸入錯誤次數清零
        MOV R6,43H
        ACALL DELAY
        CLR OPEN ;復位
        JMP START
        ;錯誤
        ERR: ACALL BACK
        MOV R6,#03H
        ACALL DELAY
        ACALL BACK ;輸錯提示音,鳴兩下
        MOV A,#01H
        ACALL ENABLE
        ACALL LINE1
        MOV DPTR,#MES_E
        ACALL DISPLAY ;顯示錯誤
        MOV R6,#40H
        ACALL DELAY
        INC 44H
        MOV A,44H
        CJNE A,#03H,EE0
        EE0: JC ERROUT ;輸錯不到三次返回
        MOV 44H,#00H ;清零
        ACALL WRANING ;報警
        ERROUT: JMP START
        ;=========== 按鍵中斷服務程序 ==========
        KEY_INT:push acc
        push psw
        clr ex0
        acall delay10ms ;延時消抖
        SETB TR1 ;啟動定時器
        ACALL SMKEY ;按鍵識別
        MOV A,KEYNUMBER ;返回按鍵號
        ACALL BACK ;按鍵發聲
        MOV R3,A
        CJNE R3,#0BH,K1 ;ENTER是否按下
        SETB ENTER
        clr tr1 ;按下確認后關畢定時器
        mov 46h,#00h ;對中斷次數清零
        AJMP KEY_RTN
        K1: ADD A,#30H ;將按鍵號轉換為ASCⅡ碼
        MOV @R1,A ;將輸入的密碼存入緩沖單元
        INC R1 ;修改地址
        ACALL WRDATA ;輸入一位顯示一個"*"
        KEY_RTN:pop psw
        pop acc
        setb ex0
        RETI
        ;=========== 按鍵識別程序 ==========
        SMKEY:
        MOV A,P1
        ANL A,#0FH
        WKEY: MOV B,A ;反轉法查詢
        MOV P1,#0F0H
        NOP
        MOV A,P1
        ANL A,#0F0H
        ORL A,B
        MOV P1,#0FH ;還原P1口初態
        CJNE A,#0EEH,WKEY1
        MOV KEYNUMBER,#00H
        AJMP RETURN
        WKEY1: CJNE A,#0EDH,WKEY2
        MOV KEYNUMBER,#01H
        AJMP RETURN
        WKEY2: CJNE A,#0EBH,WKEY3
        MOV KEYNUMBER,#02H
        AJMP RETURN
        WKEY3: CJNE A,#0E7H,WKEY4
        MOV KEYNUMBER,#03H
        AJMP RETURN
        WKEY4: CJNE A,#0DEH,WKEY5
        MOV KEYNUMBER,#04H
        AJMP RETURN
        WKEY5: CJNE A,#0DDH,WKEY6
        MOV KEYNUMBER,#05H
        AJMP RETURN
        WKEY6: CJNE A,#0DBH,WKEY7
        MOV KEYNUMBER,#06H
        AJMP RETURN
        WKEY7: CJNE A,#0D7H,WKEY8
        MOV KEYNUMBER,#07H
        AJMP RETURN
        WKEY8: CJNE A,#0BEH,WKEY9
        MOV KEYNUMBER,#08H
        AJMP RETURN
        WKEY9: CJNE A,#0BdH,WKEY10
        MOV KEYNUMBER,#09H
        AJMP RETURN
        WKEY10: CJNE A,#0BbH,WKEY11
        MOV KEYNUMBER,#0AH
        AJMP RETURN
        WKEY11: CJNE A,#0B7H,RETURN
        MOV KEYNUMBER,#0BH ;判斷哪個鍵按下,返回相應按鍵號碼
        RETURN: MOV P1,#0FH
        NOP
        NOP
        MOV A,P1
        CPL A
        ANL A,#0FH
        JNZ RETURN ;等待按鍵松開
        RET

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新乐市| 靖边县| 府谷县| 新巴尔虎右旗| 兰溪市| 汉沽区| 舞阳县| 乌拉特前旗| 防城港市| 中西区| 介休市| 大名县| 军事| 泾源县| 民乐县| 高雄县| 鲁甸县| 奉贤区| 河北区| 永川市| 文水县| 岐山县| 珲春市| 克拉玛依市| 小金县| 朝阳县| 桂阳县| 台中县| 盖州市| 荣成市| 财经| 襄汾县| 大庆市| 竹溪县| 广宁县| 平果县| 宜章县| 德化县| 中阳县| 水城县| 巫山县|