您好,欢迎访问三七文档
;********************************************;*********电子密码锁*********;********************************************;*********2005/12/24*********;********************************************;显示缓冲区;LED1EQU6FHBUFFEQU6EHTIMERS1EQU6DH;输入回车的次数TIMERS2EQU6CH;报警的次数TIMERSEQU6BH;输入数字的位数;LED6EQU6AH;密码缓冲区PS1EQU69HPS2EQU68HPS3EQU67HPS4EQU66HPS5EQU65HPS6EQU64H;AT24C02读取缓冲区AT1EQU63HAT2EQU62HAT3EQU61HAT4EQU60HAT5EQU5FHAT6EQU5EH;按键标志位F_1BIT20HF_2BIT21HF_3BIT22HF_4BIT23HBUF_FULLBIT24H;密码已经够六位的标志位,为1表示满CH_STATEBIT25H;系统更改的状态标志位,为1表示busyFLAG1BIT26H;功能键标志位,为1表示功能按键。F_F1BIT27HF_F2BIT28HPSW_FBIT29H;密码是否正确的标志位;口资源定义SPKBITP2.1JDQBITP2.3SDABITP2.4;定义串口数据端SCLBITP2.5;发光二极管灯L1BITP1.0L2BITP1.1L3BITP1.2;ORG0000HAJMPMAINORG000BH;AJMPTIMER0ORG001BH;AJMPTIMER1ORG0030HMAIN:MOVSP,#70HMOVTMOD,#11HMOVTH0,#3CHMOVTL0,#0B0HMOVTH1,#3CHMOVTL1,#0B0HCLRF_1;清除标志位CLRF_2CLRF_3CLRF_4CLRBUF_FULLCLRCH_STATECLRFLAG1CLRF_F1CLRF_F2CLRPSW_FMOVBUFF,#00H;调用LCALLINITPS;初始化环境LCALLINITATLCALLXSA;调用默认显示MOVTIMERS1,#00HNOPMOVPS1,#11H;初始化密码830620MOVPS2,#0AHMOVPS3,#02HMOVPS4,#13HMOVPS5,#0BHMOVPS6,#02HSTART:NOP;程序开始LCALLCH_KEY;检查键盘AJMPSTART;返回CH_KEY:LCALLKS;检查有没有按键按下JNZLK1AJMPCH_KEYLK1:LCALLT12MSACALLKSJNZLK2RETLK2:NOPLCALLSBIE;按键识别子程序MOVBUFF,A;送缓冲区以识别是数字键还是功能键?LCALLCH_KF;判断按键功能。JBFLAG1,KEY_FUN;标志为1,则为功能键;***********数字按键输入并且存放到缓冲区内等待比较***********KEY_DIG:NOP;设一标志,辨别输入是否满;SETBTR0INCTIMERS;输入数字的位数MOVA,TIMERSCLRCSUBBA,#01HJNZPS_2MOVPS1,BUFF;依照顺序存放密码AJMPNEXTPS_2:MOVA,TIMERSSUBBA,#02HCLRCJNZPS_3MOVPS2,BUFFAJMPNEXTPS_3:MOVA,TIMERSCLRCSUBBA,#03HJNZPS_4MOVPS3,BUFFAJMPNEXTPS_4:MOVA,TIMERSCLRCSUBBA,#04JNZPS_5MOVPS4,BUFFAJMPNEXTPS_5:MOVA,TIMERSCLRCSUBBA,#05JNZPS_6MOVPS5,BUFFAJMPNEXTPS_6:MOVA,TIMERSCLRCSUBBA,#06HJNZCH_KEYMOVPS6,BUFFNEXT:LCALLXSCMOVR7,TIMERS;比较输入的次数。CJNER7,#06H,FULLFULL:JCNEXT9SETBBUF_FULLMOVTIMERS,#06HCLRL3NOPCLRP2.1LCALLT100MSDSETBP2.1NOPAJMPCH_KEYNEXT9:CLRP2.1;密码输入一位,鸣叫一声。CLRL3LCALLT100MSD;延时100msSETBL3SETBP2.1AJMPCH_KEY;*****************功能按键比较并且跳转*************KEY_FUN:CLRFLAG1CLRCMOVA,BUFFSUBBA,#03H;按键CL跳转JNZEN_CAJMPCLEN_C:CLRCMOVA,BUFF;按键EN跳转SUBBA,#00HJNZF1_CAJMPENF1_C:CLRCMOVA,BUFFSUBBA,#1BHJNZF2_CAJMPFU1F2_C:CLRCMOVA,BUFFSUBBA,#1AHJNZF3_CAJMPFU2F3_C:CLRCMOVA,BUFFSUBBA,#19HJNZF4_CAJMPFU3F4_C:CLRCMOVA,BUFFSUBBA,#18HJZFU4EXIT8:NOPLJMPCH_KEY;***************开门子程序********************************CL:NOPSETBL3MOVBUFF,#00H;消密码缓冲MOVTIMERS,#00HLCALLINITPS;消除AT缓冲,加调电存储后一定要加上LCALLXSCLCALLBPLCALLBPLCALLT100MSDLCALLBPCLRFLAG1AJMPCH_KEYFU4:NOPLCALLBPLCALLT100MSDLCALLBPLCALLT100MSDLCALLBPLCALLT100MSDLCALLBPLCALLT100MSDLCALLBPCLRFLAG1AJMPCH_KEYFU3:NOPLCALLBPLCALLT100MSDLCALLBPLCALLKILLXS;关闭显示CLRFLAG1AJMPCH_KEYFU1:NOPLCALLXSCJBF_F1,NEXT_F1CLRL1LCALLBPSETBF_F1AJMPCH_KEYNEXT_F1:SETBL1LCALLBPCLRF_F1;LCALLCH_STATE;查看现在的状态以防误按;SETBTR1;报警限制暂时不开;INCF_F1CLRFLAG1AJMPCH_KEYFU2:NOPJBF_F2,NEXT_F2CLRL2LCALLBPSETBF_F2AJMPCH_KEYNEXT_F2:SETBL2LCALLBPCLRF_F2CLRFLAG1AJMPCH_KEY;***************按键的功能描述*************************EN:NOPJBBUF_FULL,GOONAJMPEXITGOON:CLRBUF_FULLJBF_F2,AT_WRON;F2按键标志,若为1,则调用修改密码子程序。LCALLAT_RADELCALLC_PSW;比较密码子程序JBPSW_F,OPEN;密码比较正确,则调用开锁子程序LCALLXSDINCTIMERS2MOVR7,TIMERS2;密码错误,调入输入密码输入次数,准备锁定键盘CJNER7,#03H,D0D0:JCNEXT1;错误次数小3次LCALLXSE;锁定5分钟LCALLWARN2SLCALLLOCK_1MNEXT1:LCALLWARN2S;报警2分钟LCALLXSAEXIT:LCALLINITPSMOVBUFF,#00HCLRFLAG1MOVTIMERS,#00HAJMPCH_KEY;跳出AT_WRON:LCALLAT_WRLCALLXSFLCALLBPLCALLT100MSDLCALLBPLCALLT500MSDLCALLKILLXSLCALLT500MSDLCALLXSFLCALLT500MSDLCALLKILLXSLCALLT500MSDLCALLXSFLCALLT500MSDNOPNOPLCALLXSAAJMPEXITOPEN:MOVA,TIMERS1CJNEA,#09H,CLT1CLT1:JCGOON1MOVTIMERS1,#00HGOON1:INCTIMERS1;输入回车的次数MOVTIMERS2,#00HSETBL3CLRPSW_FLCALLXSBCLRJDQ;开门LCALLBPLCALLBPLCALLBPLCALLBPLCALLSECLCALLSECLCALLSECLCALLSECLCALLSECLCALLSECLCALLSECLCALLSECSETBJDQLCALLXSANOPAJMPEXIT;**************各类子程序********************************;****注意清楚缓冲区时AT1...AT6不应在初始化中执行,以***;****防两缓冲区都为0,相同开锁***;********************************************************CLR_BUF:MOVR7,#06HMOVR0,#6FHLOOP1:MOVA,#00HMOV@R0,ADECR0DJNZR7,LOOP1RET;*************初始化显示缓冲区以及其他缓冲区**************INITPS:PUSHACCPUSHPSWMOVR7,#06HMOVR1,#PS1MOVA,#00HINIT_PS:MOV@R1,ADECR1DJNZR7,INIT_PSPOPPSWPOPACCNOPRETINITAT:PUSHACCPUSHPSWMOVR7,#06HMOVR1,#AT1MOVA,#00HINIT_AT:MOV@R1,ADECR1DJNZR7,INIT_ATMOVTIMERS,#00H;密码输入的次数清零。POPPSWPOPACCRET;*************按键识别子程序***************************SBIE:MOVR2,#0EFH;识别按键子程序,数据送A保存,课本P146页。MOVR4,#00HLK4:MOVA,R2MOVP0,ANOPMOVA,P0JBACC.0,LONEMOVA,#00HAJMPLKPLONE:JBACC.1,LTWOMOVA,#08HAJMPLKPLTWO:JBACC.2,LTHRMOVA,#10HAJMPLKPLTHR:JBACC.3,NEXTT;判断下一列MOVA,#18HLKP:ADDA,R4PUSHACCLK3:ACALLKSJNZLK3POPACCRETNEXTT:INCR4MOVA,R2JNBACC.7,KNDRLAMOVR2,AAJMPLK4KND:AJMPCH_KEYKS:MOVP0,#0FHNOPMOVA,P0CPLAANLA,#0FHNOPRETCH_KF:CLRCMOVA,BUFF;判断是数字按键还是功能按键,为1表示功能键CJNEA,#17H,KYKY:JCSET_CH;假若是数字按键则标志置为0SETBFLAG1;假若是功能按键则标志置为1AJMPCHKE_ENDSET_CH:CLRCMOVA,BUFFSUBBA,#00HJNZEN_CHSETBFLAG1AJMPCH_ENDEN_CH:MOVA,BUFFSUBBA,#03HJNZDIGSETBFLAG1AJMPCH_ENDDIG:CLRFLAG1CH_END:NOPCHKE_END:RETT12MS:MOVR7,#18HTM1:MOVR6,#0FFHTM66:DJNZR6,TM66DJNZR7,TM1RET;****************检验密码正误******************************C_PSW:PUSHPSWPUSHACCMOVR2,#06HMOVR0,#PS1MOVR1,#AT1C_P:CLRCMOVA,@R0SU
本文标题:单片机电子锁程序
链接地址:https://www.777doc.com/doc-5015491 .html