基于单片机的电子密码锁实验报告_第1页
基于单片机的电子密码锁实验报告_第2页
基于单片机的电子密码锁实验报告_第3页
基于单片机的电子密码锁实验报告_第4页
基于单片机的电子密码锁实验报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.PAGE.201X年小学期单片机设计实验报告题目:基于16F877的电子密码锁班级:班内序号:实验组号:学生__指导期中检查教师评语指导教师签字:年月日基于16F877的电子密码锁实验摘要在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作、记住密码即可开锁等优点。 目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。本系统由16F877单片机系统〔主要是16F877单片机最小系统、4×4矩阵键盘、LCD1602显示和报警系统等组成,具有设置、修改四位用户密码、输入提示音、密码错误报警等功能〔本设计由单片机控制LCD显示,密码正确显示passwordok!密码错误显示wrong,pleasereset!用户reset后进行重新输入。由单片机控制矩阵键盘含有0-9数字键和A-F功能键。按F键,则进行密码重置功能。本系统成本低廉,功能实用。〔宋体五号AbstractIndailylifeandwork,thedepartmentofhousingandsecurity,unitdocuments,financialstatementsandsomepersonalinformationtosavemoreinordertolockthewaystosolve.Ifusethetraditionalmechanicalkeytoopenthelock,peopleoftenneedtocarrymultiplekeys,useveryconvenient,andthekeymissingaftersecurityiscompromised.Withanti-theftalarmfunctionsuchaselectroniccombinationlockinsteadofpasswordquantityislittle,security,poormechanicalcombinationlockisinevitabletrend.Withthecontinuousdevelopmentofscienceandtechnology,peopleindailylifethedemandishigherandhighersafetyinsurancedevice.Tomeettherequirementsofpeopleontheuseofthelock,increaseitssafety,usethepasswordinsteadofthekeycombinationlockarisesatthehistoricmoment.Combinationlockwithhighsafety,lowcost,lowpowerconsumption,easyoperation,rememberpasswordlock,etc.Currentlyuseelectroniccombinationlockismostlybasedonsinglechipmicrocomputertechnology,singlechipmicrocomputerasthemaindevice,theencoderanddecoderforsoftware.Thissystemconsistsof16f877microcontrollersystem<mainlyminimum16f877microcontrollersystem>,4*4matrixkeyboard,LCD1602displayandalarmsystem,etc,andhassetupfour,modifyuserpassword,password,inputprompterroralarmfunctions<thisdesignbythesinglechipmicrocomputercontrolLCDdisplay,thepasswordcorrectlydisplaythepasswordok!Wrongpasswordshowswrong,bothpleasereset!Theusertoenteragainafterreset.Bysingle-chipmicrocomputercontrolmatrixkeyboardcontains0-9numberkeysandA-Ffunctionkeys.PresstheFkey,thencarriesonthepasswordresetfunction>.Thissystemislowcost,functionandpractical.WMfunctiontocontrolitsturn.Andthisissocallednavigatingaptitudinally.关键字单片机——microcontroller芯片——CMOSchip 16F877一、PIC16F877系列单片机简介PIC16F87X<含873P874P876P877>是美国微芯<Microchip>公司推出的高性能单片机,除具有单片机的通用资源外,该系列单片机还采用哈佛总线结构、二级指令流水线取指方式、精简指令集<RISC>和内部具有E2PROM数据存储器及FLASH结构的程序存储器、仅35条单字节单周期指令、在系统串行编程技术和在线调试技术。因此采用该系列单片机的产品具有低成本、低功耗、高速度、高可靠性、体积小、性价比高等特点。其芯片引脚图如图1所示。另外,它内部的E2PROM数据存储器不仅具有掉电保护数据的功能,更重要的是它的读写操作均是由单片机内部时序控制,即外部电路无法对其进行访问,因而具有极高的数据保密性,这使得PIC16F87X在加密性产品如智能IC卡、密码锁、电子防盗系统等方面有很广泛的应用。二.实验论证与比较1.总体系统组成键盘电路单片键盘电路单片机16F877电源电路LCD显示电路复位电路LCD显示电路复位电路开/关锁电路晶振电路开/关锁电路晶振电路显示电路报警电路显示电路报警电路电路主要分8个模块,即电源电路、复位电路、晶振电路、报警电路、键盘电路、LCD显示电路、开/关锁电路、声音电路。由单片机主要控制、实现密码锁功能。1电源电路模块从电源插座进来的是9V直流电,经一片三端稳压器,将其转换为5V的稳定电压。电源滤波的重要性,一个电路板的滤波特性如果不好,严重时将会影响整个电路板不能正常工作。所以要注意一个大电容和一个小电容并联滤波,电源线要粗,走线要合理,模拟电路最好大面积接地。其主要作用是为电路提供工作电压,保证电路正常工作。1.2复位电路模块主要用于对电路进行手工复位。Osc15vGND空Osc15vGND空晶振主要就是为单片机工作提供一定的工作频率。1.4报警电路模块主要是用于密码输入错误时,鸣声提醒用户密码输入错误。1.5键盘电路模块键盘采用4*4矩阵键盘,行线连接到RD端口,列线连接到RB接口。16个键分别为0~9的数字键及A~F的功能键,F键则表示密码重置。键盘主要用于输入密码或进行功能、状态切换。1.6LCD显示电路模块当通电时LCD显示password,当密码输入正确显示ok,不正确则显示wrong,pleasereset。1.7开/关锁电路模块当密码输入正确时,单片机输出高电平,则继电器打开,表示锁开。1.8显示电路模块1kohm1kohm主要用于密码输入时,显示已输入。当密码输入正确则灯一直亮,输入错误则一直闪烁,提醒用户。三系统总体设计3.1系统框图灯提示灯提示其他Nreset报警Y开始初始化模式选择识别按键密码输入灯提示灯提示其他Nreset报警Y开始初始化模式选择识别按键密码输入手动清除密码比较开门旧密码输入新密码输入存入缓存区再次输入密码重新输入设置完返开始NFN0-E00Y3.2电路总图四.硬件连接五.调试过程 程序开始就进入main,执行初始设置后,进行LCD屏幕初始化。单片机就开始执行键盘扫描是否有输入阶段,根据采集到的键盘信息,做出分析,进行密码重置或者输入密码比较。调试过程中我遇到了很多问题,也就是在这些问题中,逐渐学会了MPLAB的使用和用汇编语言编程。在此,列举几个调试过程中比较典型的问题。5.1对屏幕初始化不能完成在小学期的出始阶段,我和搭档秦永宁决定在最开始阶段,我俩都进行程序编程,对汇编语言进行学习。我们分模块编写,我进行屏幕初始化程序编写,搭档秦永宁写键盘扫描程序。在后面阶段,永宁主软件,我主硬件。 刚开始学单片机以及汇编语言的时候,翻看过的内容,也只是记得一点点皮毛,没有真正的理解。特别是看手册时看不懂,学校发的两本书上并没有初始化的程序。所以请教同学,同学告诉我,手册上有初始化的过程,需要认真看看。所以我就认真的看了一个早上,终于把手册上的内容看懂了。所以就开始编程,在编程的过程中调试buildall时,有出现了一些error,通过改正,buildall终于成功,初始化程序完成。〔五号宋体初始化程序如下:;***************初始化程序***********************CHUSHIHUAMOVLWD'16';MOVWFCOUNT;初始化count为16DELAY16MS;延时16msCALLDELAY1MS;DECFSZCOUNT,1;〔1/2count送count并判断结果是否为0?;是0,跳出循环,否循环回去GOTODELAY16MS;MOVLWB'00111000';将38h送到wMOVWFPORTD;将38h送到portdMOVLWB'00000010';将02h送到wMOVWFPORTE;将02h送到porte,写数据BCFPORTE,1;将porte的第一个位置清0MOVLWD'5';将5送到wMOVWFCOUNT;将count赋值为5DELAY5MS;延时1msCALLDELAY1MS;DECFSZCOUNT,1;GOTODELAY5MS;MOVLWB'00111000';将38h送到wMOVWFPORTD;将38h送到potdMOVLWB'00000010';将02h送到wMOVWFPORTE;将02h送到porte,写数据BCFPORTE,1;将porte的第一个位置清0MOVLWD'3';MOVWFCOUNT;DELAY120US;延时120umCALLDELAY40US;DECFSZCOUNT,1;GOTODELAY120US;MOVLWB'00111000';MOVWFPORTD;MOVLWB'00000010';MOVWFPORTE;BCFPORTE,1;;*****************************************************************CALLDELAY40US;MOVLWB'00111000';MOVWFPORTD;MOVLWB'00000010';MOVWFPORTE;BCFPORTE,1;CALLDELAY40US;MOVLWB'00001000';将08h送到w,关显示MOVWFPORTD;将o8h送到portdMOVLWB'00000010';将02h送到wMOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清0CALLDELAY40US;MOVLWB'00000001';将01h送到w,清屏MOVWFPORTD;将o1h送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清0CALLDELAY1MS;MOVLWD'16';MOVWFCOUNT;将count设置为16DELAY640US;延时640usCALLDELAY40US;DECFSZCOUNT,1;GOTODELAY640US;MOVLWB'00000110';将06h送到w,设置输入方式MOVWFPORTD;MOVLWB'00000010';MOVWFPORTE;BCFPORTE,1;CALLDELAY40US;MOVLWB'00001101';将0DH送到w,*****MOVWFPORTD;将0DH送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清05.2用EEPROM编写密码重置时,重置的密码不能写入EEPROM 在我们的实验进行到一定阶段,我去搭面包板,搭完后,我们将已经编好的LCD显示程序下载到单片机当中,加上电源,LCD显示正确。所以我就趁着时间看书,当看到《PIC单片机实用教程——提高篇》第一章时,所以我就想尝试着利用EEPROM编写密码重置问题。在编写的过程中,为了调试方便,我就借用老师的实验箱进行下载调试。而调试了好几天,并没有出现进展。所以就开始画程序流程图,画完后对程序进行修改。当进行单步调试时,发现进行到查表程序时,程序下一步走得并不正确。请教老师后,把查表程序写在了程序最前面,就解决了问题。可是用EEPROM写入密码还是不正确。由于时间问题,我就去焊接电路板了。到最后验收时,老师让我继续编写用EEPROM编写密码重置功能,当最后我想放弃,老师一直在鼓励我,在不懈努力下以及老师的帮助下终于成功了。 这看似是一个小问题,但它却告诉我,在学习单片机的过程中一点点微小的过失可能就会导致自己的程序看不到结果,不能忽略学习过程中的一点一滴疑问。也只有这样才能真正学会、学到和学好知识。*************************EEPROM烧写程序*******************************WRITEBSFSTATUS,RP0BSFSTATUS,RP1BTFSCEECON1,WRGOTO$-1BCFSTATUS,RP0MOVFADDKEY,0MOVWFEEADRMOVFKEY,0MOVWFEEDATABSFSTATUS,RP0BCFEECON1,EEPGDBSFEECON1,WRENMOVLW55HMOVWFEECON2MOVLW0AAHMOVWFEECON2BSFEECON1,WRBCFEECON1,WRENINCFADDKEY,1RETURN**********************EEPROM读程序*********************************READBCFSTATUS,RP0BSFSTATUS,RP1MOVFADDR,0MOVWFEEADRBSFSTATUS,RP0BCFEECON1,EEPGDBSFEECON1,RDBCFSTATUS,RP0MOVFEEDATA,0MOVWFWORD_1RETURN5.3焊接电路时,电路焊接错误在最开始时,焊接电路,由于是第一次焊接电路,对电路焊接不太认真以及没有做好准备,所以焊接好的电路并不出现正确的结果。对电路进行检查时,发现电路焊接时电路焊接错误,用焊吸吸掉锡后,对电路进行改正,可是却依然不出现正确结果。所以用万用表对电路进行检查,发现两个结点之间电压不应该相同,而测量结果却一样,改后却依然一样。所以决定重新焊接一块板子,当第二块板子焊接完后,出现了正确结果。 这个小波折告诉我,知识的积累和掌握不能仅仅依靠课本,还要结合实践进一步理解,这样才能加深印象,融会贯通,也只有这样才能真正学以致用。 这个小挫折告诉我只有联系实际,在实践中才能真正找出自己的错误,理论联系实际才能真正学到知识。六.实验心得体会对于整个实验的心得体会,上面已经提到很多了,不过,还是有好深刻的感觉和触动。 其一,在小学期以前我没有对单片机没有任何概念。在刚刚接触到单片机时,我可以说是一窍不通,甚至对于单片机究竟是什么也不能很精确地表达出来。经过网上查询以及了解,定下几个想做的目标,经过一个个筛选,最后确定我们做一个密码锁。说实在话,我当时心里也没有太大的信心和勇气,不过这些都得去学,所以就一头扎进学习的过程。 其二,3星期单片机的学习让我增强了自信心。学习单片机的过程中,我也不是没有怀疑过自己的能力,而是我在学习的过程中,从对单片机的一无所知,对繁琐的汇编语言的畏惧,到一步一步进行单步调试,再到能够发现问题并经过思考来解决问题,我感觉到自己在进步,也感受到只要每天努力一点点,希望就会再接近一点点,离成功的距离也就会再接近一点点,也就是这些一点点的努力和距离告诉我要继续坚持,告诉我要相信自己,因为只有相信自己,不断努力,才能战胜自己的弱势,得到自己想要的结果。 其三,我非常感谢向辅导我的几位老师致谢,您们辛苦了!在学习的过程中,我发现了学习中的乐趣。 谢谢您们在我想放弃的时候还一直给我指导,给我鼓励。七.参考文献:PIC单片机实用教程——基础篇〔五号宋体李学海北京航空航天大学出版社使用说明:的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。PIC单片机实用教程——提高篇李学海北京航空航天大学出版社使用说明:继承了前面基础篇的风格,例子也具有实战意义,主要讲RA、TMR2的使用和CCP模块的PWM脉宽调制功能。附录:程序汇编代码:LISTP=16F877,R=DEC;定义器件,默认为十进制#include<p16f877.inc>TMR0EQU01H;定义定时器/计数器0寄存地址PCLEQU02H;定义程序指针寄存器STATUSEQU3H;定义状态寄存器地址OPTION_REGEQU81H;定义选项寄存地址INTCONEQU0BH;定义中断控制寄存地址PORTBEQU6H;定义端口B的数据寄存器地址PORTCEQU7H;定义端口C的数据寄存器地址PORTDEQU8H;定义端口D的数据寄存器地址PORTEEQU9H;定义端口E的数据寄存器地址TRISCEQU87H;定义端口C的方向寄存器TRISAEQU85H;定义端口A的方向寄存器TRISBEQU86H;定义端口B的方向寄存器TRISDEQU88H;定义端口D的方向寄存器TRISEEQU89H;定义端口E的方向寄存器COUNTEQU20H;定义一个计数器变量寄存地址TMR0BEQUD'252';定义TMR0寄存地址初始值256-4=252>RP0EQU5H;定义状态寄存器中的页选位RP0T0IFEQU2;定义TMR0溢出标志位的位地址FEQU1;定义目标寄存器指示标号COUNT1EQU21H;定义计数器状态变量COUNT2EQU23H;COUNT3EQU24H;COUNT4EQU25H;COUNT5EQU27H;COUNT6EQU28H;VALEQU30H;定义键盘的状态变量WORD_1EQU22H;初始密码WORD_2EQU26HWORD_3EQU2AHWORD_4EQU2BHKEY_1EQU47H;用户输入密码KEY_2EQU48HKEY_3EQU49HKEY_4EQU4AHNEQU52H;定义外循环变量MMEQU53H;内循环变量NTEMPEQU29HWEQU0;定义传送目标寄存器为W的指示位FEQU1;定义传送目标寄存器为RAM的指示位T0IFEQU2;定义TMR0中断标志位的地址位T0IEEQU5;定义TMR0中断矢能位的地址位INTEEQU4;定义外部中断矢能位的地址位INTFEQU1;定义外部中断标志位的地址位RBIFEQU0;定义RB口变化中断标志位的位地址OPTION_REGEQU81H;定义选项寄存器地址OPTION_TEMPEQU0A6H;在bank1定义选项寄存器的备份寄存器地址SOUNDDELAY1EQU31H;声音频率变化计数器,从1.8~3.55KHZFRE_COUNTEQU32H;同一频率的重复次数保存地址FRE_REPEATEQU33HSOUND_TEMPEQU34HTEMP1EQU35H;暂存寄存器S_LOOPEQU37H;93-47=46S_MAXEQU73H;最低频率1.8K93*3=280US*2S_S_MINEQU36H;最高频率3.55K47*3=140*2S_S_REPEATEQU4H;同一频率重复次数;**************************************************;**************************************************ORG000H;MAINNOPBSFSTATUS,RP0;文件寄存到BANK1MOVLW00H;将端口C的方向控制字先送到WMOVWFTRISC;然后再转送到端口C的方向寄存器MOVLW0FFH;将端口B的方向控制字先送到WMOVWFTRISB;然后再转送到端口B的方向寄存器MOVLW0FFH;将端口A的方向控制字先送到WMOVWFTRISA;然后再转送到端口A的方向寄存器CLRFTRISD;CLRFTRISE;MOVLW02H;31HMOVWFOPTION_REG;设置分频比"1:8"BCFSTATUS,RP0;恢复到文件寄存器BANK0CLRFPORTC;端口寄存器清0MOVLW31H;定义初始密码MOVWFWORD_1;1MOVLW32HMOVWFWORD_2;2MOVLW33HMOVWFWORD_3;3MOVLW34HMOVWFWORD_4;4;************************************************CHUHUAMOVLWD'16';MOVWFCOUNT;初始化count为16DELAY16MS;延时16msCALLDELAY1MS;DECFSZCOUNT,1;〔1/2count送count并判断结果是否为0?;是0,跳出循环,否循环回去GOTODELAY16MS;MOVLWB'00111000';将38h送到wMOVWFPORTD;将38h送到portdMOVLWB'00000010';将02h送到wMOVWFPORTE;将02h送到porte,写数据BCFPORTE,1;将porte的第一个位置清0MOVLWD'5';将5送到wMOVWFCOUNT;将count赋值为5DELAY5MS;延时1msCALLDELAY1MS;DECFSZCOUNT,1;GOTODELAY5MS;MOVLWB'00111000';将38h送到wMOVWFPORTD;将38h送到potdMOVLWB'00000010';将02h送到wMOVWFPORTE;将02h送到porte,写数据BCFPORTE,1;将porte的第一个位置清0MOVLWD'3';MOVWFCOUNT;DELAY120US;延时120umCALLDELAY40US;DECFSZCOUNT,1;GOTODELAY120US;MOVLWB'00111000';MOVWFPORTD;MOVLWB'00000010';MOVWFPORTE;BCFPORTE,1;;*****************************************************************CALLDELAY40US;MOVLWB'00111000';MOVWFPORTD;MOVLWB'00000010';MOVWFPORTE;BCFPORTE,1;CALLDELAY40US;MOVLWB'00001000';将08h送到w,关显示MOVWFPORTD;将o8h送到portdMOVLWB'00000010';将02h送到wMOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清0CALLDELAY40US;MOVLWB'00000001';将01h送到w,清屏MOVWFPORTD;将o1h送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清0CALLDELAY1MS;MOVLWD'16';MOVWFCOUNT;将count设置为16DELAY640US;延时640usCALLDELAY40US;DECFSZCOUNT,1;GOTODELAY640US;MOVLWB'00000110';将06h送到w,设置输入方式MOVWFPORTD;MOVLWB'00000010';MOVWFPORTE;BCFPORTE,1;CALLDELAY40US;MOVLWB'00001101';将0DH送到w,*****MOVWFPORTD;将0DH送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清0CALLDELAY40US;CALLPASSWORD;;************************************CALLKEYDOWNXORLW46HBTFSCSTATUS,2GOTOSETSMOVFTEMP,0MOVWFKEY_1GOTONUM2;****************************************************SETSCALLDELAY40US;MOVLWB'00000001';将0DH送到w,*****MOVWFPORTD;将0DH送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1MOVLWB'00000100'MOVWFPORTCCALLDELAY100MSMOVLWB'00000000'MOVWFPORTCCALLKEYDOWNMOVWFWORD_1CALLKEYDOWNMOVWFWORD_2CALLKEYDOWNMOVWFWORD_3CALLKEYDOWNMOVWFWORD_4CALLDELAY1MSCALLDELAY40US;MOVLWB'00000001';将0DH送到w,*****MOVWFPORTD;将0DH送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1CALLDELAY1MSCALLPASSWORDGOTONUM1;GOTOSTOP;************************************NUM1CALLKEYDOWNMOVWFKEY_1NUM2CALLKEYDOWNMOVWFKEY_2NUM3CALLKEYDOWNMOVWFKEY_3NUM4CALLKEYDOWNMOVWFKEY_4;;****************密码比较*********************************************COMP1MOVFKEY_1,0XORWFWORD_1,0;第一位密码比较BTFSSSTATUS,2;相同,则比较第二位GOTOWARN;COMP2MOVFKEY_2,0XORWFWORD_2,0;第一位密码比较BTFSSSTATUS,2;相同,则比较第二位GOTOWARN;COMP3MOVFKEY_3,0XORWFWORD_3,0;第一位密码比较BTFSSSTATUS,2;相同,则比较第二位GOTOWARN;COMP4MOVFKEY_4,0XORWFWORD_4,0;第一位密码比较BTFSCSTATUS,2;相同,则比较第二位GOTOALLOWED;不同,则警告;**************警告*********************************WARN;显示wrong,again;第三个灯闪烁几下MOVLWB'00001111';MOVWFPORTCCALLDELAY100MS;闪烁间隔0.3sCALLDELAY100MSMOVLWB'00000000';第八个灯亮MOVWFPORTCCALLDELAY100MSMOVLWB'00001111';MOVWFPORTCCALLDELAY100MS;闪烁间隔0.3sCALLDELAY100MSMOVLWB'00000000';第八个灯亮MOVWFPORTCMOVLWB'00001111';MOVWFPORTCCALLDELAY100MS;闪烁间隔0.3sCALLDELAY100MSMOVLWB'00000000';第八个灯亮MOVWFPORTCGOTORESET;***************亮灯<开锁>*************************************ALLOWEDMOVLWB'00001100';第八个灯亮MOVWFPORTC;JIDIANQIMOVLWB'10000000'MOVWFPORTB;OKMOVLWB'11000000';将01h送到w,清屏MOVWFPORTD;将o1h送到portdMOVLWB'00000010';MOVWFPORTE;将00H送到porteBCFPORTE,1;CALLDELAY1MSMOVLWB'01001000';MOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01001111';OMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01001011';KMOVWFPORTDCALLENABLECALLDELAY1MSGOTOSTOP;********************************************************************KEYDOWNCLRFPORTD;将PORTD清零MOVFPORTB,0;ANDLW0FH;将0fh与w寄存器内容相与,结果存入wXORLW0FHBTFSCSTATUS,2GOTOKEYDOWNBCFSTATUS,0COMFPORTDCALLTRANSLATEMOVFTEMP,0RETURN;*****************查表***************************CONVERT;查表程序ADDWFPCL,1;偏移量与pc相加TABLENOP;显示码,下同RETLW46H;FRETLW45H;ERETLW44H;DRETLW43H;CRETLW42H;BRETLW41H;ARETLW30H;0RETLW39H;9RETLW38H;8RETLW37H;7RETLW36H;6RETLW35H;5RETLW34H;4RETLW33H;3RETLW32H;2RETLW31H;1RETLW0FFH;黑方块;*****************第二次检测按键********************************TRANSLATERRFPORTD,1;对键盘进行列扫描,确定键值,高四位和第四位相加得valueMOVFPORTB,0ANDLW0FHXORLW0FHBTFSCSTATUS,2GOTOTRANSLATEMOVFPORTD,0ANDLW0F0HXORLW0F0HMOVWFVALMOVFPORTB,0ANDLW0FHXORLW0FHADDWFVAL,1CALLKEYUPCALLDELAY1MSRETURN;****************延时*****************************DELAY1MSMOVLWD'100';延迟1ms程序MOVWFCOUNT1;LOOP1MSNOPNOPNOPNOPNOPNOPNOPDECFSZCOUNT1,1;GOTOLOOP1MS;RETURN;********************************************DELAY40USMOVLWD'5';延迟40us程序MOVWFCOUNT2;LOOP40USNOPNOPNOPNOPNOPDECFSZCOUNT2,1;GOTOLOOP40US;NOPNOPRETURN;***************************************************KEYUPCLRFPORTD;检测是否按键已经松开,根据value及键盘的行列确定按下的键盘的键值MOVFPORTB,0ANDLW0FHXORLW0FHBTFSSSTATUS,2GOTOKEYUPCALLDELAY1MSMOVFPORTB,0ANDLW0FHXORLW0FHBTFSSSTATUS,2GOTOKEYUPCLRWBTFSCVAL,0ADDLW1BTFSCVAL,1ADDLW2BTFSCVAL,2ADDLW3BTFSCVAL,3ADDLW4BTFSCVAL,4ADDLW0BTFSCVAL,5ADDLW4BTFSCVAL,6ADDLW8BTFSCVAL,7ADDLWD'12'CALLCONVERTMOVWFTEMPGOTOXANSHIMOVLWB'10000000';第八个灯亮MOVWFPORTCRETURN;******************输入密码时显示******************************XANSHIMOVLWB'000000001'MOVWFPORTC;第一个灯亮CALLDELAY100MSMOVLWB'00000000';MOVWFPORTCMOVLWB'00101010'MOVWFPORTD;显示*MOVLWB'00000011';将03h存入wMOVWFPORTE;将03h存入porteBCFPORTE,1;将porte第一个位置清0CALLDELAY40US;CALLTONE500CALLTONE630RETURN;*************************************************PASSWORD;输出password:;BSFPORTE,1MOVLWB'01010000';PMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000001';AMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010011';SMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010011';SMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010111';WMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01001111';OMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010010';RMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000100';DMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'00111010';:MOVWFPORTDCALLENABLECALLDELAY1MSCALLDELAY1MSRETURN;***********PLEASERESET************************RESETCALLDELAY40US;MOVLWB'00000001';将0DH送到w,*****MOVWFPORTD;将0DH送到portdMOVLWB'00000010';MOVWFPORTE;将02h送到porteBCFPORTE,1;将porte的第一个位置清0MOVLWB'00100000';MOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010000';PMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01001100';LMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000101';EMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000001';AMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010011';SMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000101';EMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'00100000';MOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010010';RMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000101';EMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010011';SMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01000101';EMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'01010100';TMOVWFPORTDCALLENABLECALLDELAY1MSMOVLWB'00100001';!MOVWFPORTDCALLENABLECALLDELAY1MSCALLSPEAKERGOTOSTOP;**********************************************ENABLEMOVLWB'00000011';将03h存入wMOVWFPORTE;将03h存入porteNOPNOPNOPBCFPORTE,0CALLDELAY1MSRETURN;***********************************************DELAY100MSMOVLWD'133';外循环变量初始值经W转送MMOVWFMLOOP1MOVLWD'251';内循环变量初始值经W转送NMOVWFNLOOP2DECFSZN,1;N-1=0?是!跳出内层循环GOTOLOOP2;否!循环回去DECFSZM,1;M-1=0?是!跳出循环GOTOLOOP1;否!循环回去RETURN;返回调用程序;***************发声1s<1s=10x<50ms+50ms>>***********TONE1SMOVLW.10;循环次数计数器赋予初值MOVWFCOUNT1;T1LOPCALLTONE630;CALLDELAY1MSCALLTONE630;DECFSZCOUNT1,F;循环次数递减,为0,跳一步GOTOT1LOP;不为0,跳回RETURN;;*****低音调**************TONE500MOVLW.50;MOVWFCOUNT2;50=500hzx0.05sx2T5LOPBCFINTCON,T0IF;清除TMR0溢出中断标志位MOVLW.190;256-125=131MOVWFTMR0;启动定时器T5HEREBTFSSINTCON,T0IF;定时器溢出否GOTOT5HERE;否,循环检测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论