4×4键盘及8位数码管显示构成的电子密码锁33要点
- 格式:doc
- 大小:84.50 KB
- 文档页数:13
目录第1章设计任务及功能要求................. 错误!未定义书签。
1.1设计课程任务................................. 错误!未定义书签。
1.2 功能要求说明................................ 错误!未定义书签。
第2章实验方案及原理..................... 错误!未定义书签。
2.1 实验目的..................................... 错误!未定义书签。
2.2 实验设备..................................... 错误!未定义书签。
2.3 实验要求..................................... 错误!未定义书签。
2.4 实验原理..................................... 错误!未定义书签。
2.5 硬件连接图................................... 错误!未定义书签。
第3章程序流程图 ........................ 错误!未定义书签。
3.1 主程序流程图................................. 错误!未定义书签。
3.2 键值的程序流程图............................. 错误!未定义书签。
第4章实验心得与体会..................... 错误!未定义书签。
参考文献................................. 错误!未定义书签。
附录..................................... 错误!未定义书签。
第1章设计任务及功能要求1.1设计课程任务4×4 键盘在 8×8LED点阵上的应用1.2 功能要求说明给4×4键盘的每个键定义一个功能,其中把定义为0~9的键盘称为数字键,把定义成DEL的键称为删除键,把定义成ENT的键成为确认键,其他键称为保留键。
电子密码锁设计要求
单片机课程设计项目系列:
基于单片机控制的电子密码锁
一.设计要求
(一)基本功能
1.状态显示功能:
锁定状态时系统用3位数码管显示OFF,用3位数码管显示成功开锁次数;成功开锁时用3位数码管显示888,用3位数码管显示成功开锁次数。
2.密码设定功能:
通过一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),同时系统掉电后能自动记忆和存储密码在系统中。
3.报警和加锁功能:
密码的输入时间超过12秒或者连续3次输入失败,声音报警同时锁定系统,不让再次输入密码。
此时只有使用管理员密码方能对系统解锁。
(二)扩展功能
可增加遥控控制功能
二.计划完成时间三周
1.第一周完成软件和硬件的整体设计,同时按要求上交设计报告一份。
2.第二周完成软件的具体设计和硬件的制作。
3.第三周完成软件和硬件的联合调试。
单片机原理与应用课程设计题目符号说明:★越多表示题目难度越大*表示扩展要求任务@表示创新设计加分任务★--------------一般难度★★-----------中等难度★★★--------较高难度一、题目汇总:1.彩灯控制器的设计★2.电子时钟的设计★3.现代交通灯的设计★★4.多路抢答器的设计★★5.波形发生器的设计★★6.点阵广告牌的设计★★★7.篮球记分器的设计★★8.数字式温度计的设计★★9.步进电机的控制★★10.电子音乐盒的设计★★11.电风扇模拟控制系统设计★12.洗衣机人机界面的设计★★13.秒表系统的设计★14.多机串行通信的设计★★★15.电子密码锁的设计★★★16.4位数加法计算器的设计★★★17.定时闹钟的设计★★18.人行道电子指示屏的设计★★二、选题说明:3名同学组成一个设计小组,每个小组选择1个题目,同一班级内选同一题目的不能超过3个设计小组,选相同题目的小组在设计内容、方法上要有所区别,严禁抄袭。
小组内部队员进行分工合作,共同致力于设计任务的完成,任务后括号内的数字表示分值,要求每名同学在设计完成后都能明白硬件原理及程序的含义。
三、设计要求:题目中没有特别提示的,要求自行焊接单片机最小系统板和外围接口电路,不能使用现成的开发板和模块。
题目一:彩灯控制器的设计★设计任务:1. 用16盏以上的LED小灯,实现至少4种彩灯灯光效果(不含全部点亮,全部熄灭;(30)2. 可以用输入按钮在几种灯光效果间切换;(20)3. 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果。
(10)4* 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换。
(10)5* 使用定时中断延时(10)6@ 实现其他除1~5中提到的功能(创新部分)(20)设计提示:1.LED可以采用共阳极或共阴极接法直接接在并行口,也可以用8255扩展更多的小灯。
2.多种效果可以放在不同的子程序空间中,主程序通过散转来访问不同的子程序段。
1.用4×4组成0-9数字键及确认键。
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
(此句在下面程序中需要再按下ENTER键方有效)2.电路原理图图4.33.13.系统板上硬件连线(1).把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。
(2).把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
(3).把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。
(4).把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。
(5).把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPK IN 端子上。
(6).把“音频放大模块”区域中的SPK OUT接到喇叭上。
4.程序设计内容(1).4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。
(2).8位数码显示,初始化时,显示“P ”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。
在输入密码过程中,显示器只显示“8.”。
当数字输入超过6个时,给出报警信息。
在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。
(3).4×4行列式键盘的按键功能分布图如图4.33.2所示:图4.33.25.C语言源程序#include <AT89X52.H>unsigned char ps[]={1,2,3,4,5}; //设定的密码unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x73,0xff}; unsigned char dispbuf[8]={18,16,16,16,16,16,16,16}; unsigned char dispcount;unsigned char flashcount;unsigned char temp;unsigned char key;unsigned char keycount;unsigned char pslen=5;unsigned char getps[6];bit keyoverflag;bit errorflag;bit rightflag;unsigned int second3;unsigned int aa,bb;unsigned int cc;bit okflag;bit alarmflag;bit hibitflag;unsigned char oka,okb;void main(void){unsigned char i,j;TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;ET0=1;EA=1;while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=10;i>0;i--)for(j=248;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;key=9;break;case 0x07:key=10;break;}temp=P3;P1_1=~P1_1;//后面也有,貌似无用if((key>=0) && (key<10)){if(keycount<6){getps[keycount]=key;dispbuf[keycount+2]=19; //前两位已经用于显示“P ”}keycount++;if(keycount==6){keycount=6;}else if(keycount>6){keycount=6;keyoverflag=1; //key overflow 输入密码长度超过}}else if(key==12) //delete key{if(keycount>0){keycount--;getps[keycount]=0; //最近1次数入的数值清0dispbuf[keycount+2]=16;}else{keyoverflag=1; //未输入密码,按到功能键,报错!嘀一声。
本科毕业设计(论文)题目基于单片机的电子密码锁设计院(系部)河北大学专业名称电子信息工程年级班级学生姓名指导教师2011年月日摘要本课题设计了一种基于单片机的数字电子密码锁,这种数字电子密码锁以单片机作为数据处理主控芯片。
电子密码锁的设计主要由四部分组成:4×4矩阵键盘接口电路、以AT89S52芯片为核心的密码锁的数据处理及控制电路、掉电情况下依然能保存密码的EEPROM存储器芯片,输出七段显示电路。
另外系统还有LED提示灯,报警蜂鸣器,单片机复位电路等。
电子密码锁设计的关键问题是实现密码的输入、清除、开锁、更改等功能。
同时该密码锁具有设计方法合理,简单易行,成本低,安全实用等特点,符合住宅,办公室等场所的用锁要求,具有推广价值。
关键词单片机密码锁 4*4矩阵键盘 EEPROM存储芯片实用经济AbstractThis project designed a digital electronic lock which used a MCU as data process and control chip. The main functions digital electronic lock are as follows:The design of the electronic password lock is mainly made up of four parts: 4×4 matrix keyboard interface circuit, data processing and control circuit, eeprom memory chip that is used to keep password when the lock loses power and display circuit. In addition the system also consists of LED lights, alarm buzzers, single-chip reset circuit and so on..The key question of the electronic lock designing is the realization of functions, such as the input password, clear password, unlock, change password and other functions.And the designed cipher lock is characterized by its reasonable designing methods, simple operation, low cost and property of safety and practicality.Besides,it works well as a residence lock and has great potential for commercial development.Key words: SCM Cipher lock 4*4matrix keyboard EEPROM Practical economy目录1 绪论 (1)1.1国内外研究综述 (1)1.2选题的目的和意义 (2)1.3本论文的任务 (3)2电子密码锁总体设计 (4)2.1系统总体设计 (4)2.2单片机 (5)2.3密码存储芯片选择 (10)2.4键盘输入方案比较 (12)2.5显示方案比较 (13)3电子密码锁的硬件设计 (1)3.1系统结构框图 (1)3.2主控部分 (2)3.3显示部分 (3)3.4键盘输入部分 (4)3.5密码存储部分 (5)3.6电源部分 (5)3.7其它功能部分 (8)3.8 电子密码锁的电路原理图 (10)4电子密码锁的软件组成 (12)4.1系统软件设计流程 (12)4.2 Keil uVision2软件介绍 (13)4.3各主要部分的功能实现程序设计 (14)4.3.1初始化程序设计 (14)4.3.2按键处理程序设计 (17)4.3.3密码更改程序设计 (21)5系统仿真 (24)5.1系统仿真过程 (24)5.2仿真调试中遇到的问题及解决办法 (25)总结 (1)致谢 (2)参考文献 (3)附录 (4)1 绪论1.1国内外研究综述在电子锁出现以前人们广泛的使用机械锁,但是随着时间的推移机械锁已不能满足人们的要求,于是电子锁应用而生。
4×4矩阵键盘的工作原理与编程ME300B单片机学习开发系统应用之三---4×4矩阵键盘的工作原理与编程作者:山西太原贵国庆本文介绍如何在ME300B型51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。
一、硬件工作原理的简单介绍该实验使用ME300B上的8位数码管显示电路和4×4矩阵键盘电路。
现将这二部分的电路工作原理进行简单的介绍:1、4×4矩阵键盘的工作原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
图1为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。
地显示。
图3 数码管电路数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。
在ME300B单片机开发系统中使用数码管来显示信息时,要将JP2的2、3端短接。
见图3二、演示程序的编程方法1、4×4矩阵键盘的编程方法:1.1、先读取键盘的状态,得到按键的特征编码。
先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。
再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。
将两次读取结果组合起来就可以得到当前按键的特征编码。
使用上述方法我们得到16个键的特征编码。
举例说明如何得到按键的特征编码:假设“1”键被按下,找其按键的特征编码。
目录目录 (1)中文摘要 (2)第一章概述 (5)第二章系统总体方案设计 (6)第三章硬件电路设计 (10)3.1键盘电路设计 (10)3.2 LED显示电路 (12)3.3 开锁警电路 (15)第四章软件设计 (17)4.1 软件设计思路 (17)4.2各子程序设计 (17)第五章系统调试 (22)第六章心得体会 (23)第七章参考文献 (24)附录 (25)源程序清单 (25)中文摘要摘要:在日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣,随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁得使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐替代传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的只能密码锁,它除了具有电子密码锁的功能外,还引进了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。
但是,这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。
而且指纹识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。
加上其成本较高,一定程度上限制了这类产品的普及和推广。
鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
基于以上思路,本次设计使用ATMEL公司的AT89C51实现—基于单片机的电子密码锁的设计,其主要具有如下功能:密码通过键盘输入,若密码正确,则将锁打开。
电子技术课程设计报告电子密码锁_图文【完整版】(文档可以直接使用,也可根据实际需要修订后使用,可编辑放心下载)电子技术课程设计报告设计课题:电子密码锁电子密码锁一、引言随着人们生活水平的提高,人们对自己的生活有了越来越高的要求,贵重物品也越来越多,而传统的机械平安锁由于其构造的简单,被撬被盗事件在我们身边经常发生,使我们的财产以及人身平安存在很大的平安隐患,这致使我们寻求更好的平安措施。
电子锁由于其保密性高,使用灵活性好,平安系数高,受到了广阔用户的喜爱。
而且密码锁的形式多样,有声控密码锁,电子密码锁等,社会上大多使用电子按键密码锁。
本文的电子密码锁利用数字逻辑电路,实现对门的电子控制,并且有各种附加电路保证电路能够平安工作,具有较高的平安系数。
要求电子器件设计制作密码锁的控制电路,使之在规定的时间内输入正确的密码时,输出信号以开启密码锁,否那么报警电路报警。
本设计用红、绿LED指示关锁、开锁状态和报警状态。
二、设计任务1、密码锁控制器中存储一个4位代码,当锁按钮开关设置8位〔其中只有4位有效〕的输入代码等于存储代码时启动开锁控制电路,并且用绿灯亮表示开锁状态。
2、从第一个按钮触动后的15秒内假设未能将锁翻开,那么报警电路发报警信号,同时用绿灯灭表示关锁状态。
3、要求性能可靠、操作简便。
4、密码锁控制器中存储的4位密码可以修改。
5、分析部件见工作原理,绘制电路图,进行仿真制作实物并撰写设计报告。
三、设计方案方案一:用开关控制可控硅整端口的电压变化即导通,按依次按下四个开关,其功能相当于给可控硅一个高电平触发,四个可控硅整流器依次导通,整条回路导通,发光二极管亮,而发光二极管亮即表示输入的密码为正确密码,电路到达密码锁开锁功能。
设计8位按键只有4位是正确的,如果按下4位伪码的其中一位即按下的其中一个或几个,控制报警电路可控硅导通。
此时开锁局部悬空,报警报警方案二;采用STC89C52单片机为芯片主体,采用AT24C08为掉电存储器的芯片,用单片机的P1口作为接4 ×4 键盘按键的检测按键,P0口实现数码管的按键显示,以及错误信息,单片可以进行位操作,P2口组成报警电路,密码修改电路和AT24C08的掉电保护等其他相关功能。
33.4×4键盘及8位数码管显示构成的电子密码锁1.实验任务用4×4组成0-9数字键及确认键。
用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
2.电路原理图图4.33.13. 系统板上硬件连线(1).把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH 端子上。
(2).把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。
(3).把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。
(4).把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。
(5).把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPK IN 端子上。
(6).把“音频放大模块”区域中的SPK OUT 接到喇叭上。
4. 程序设计内容 (1).4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。
(2). 8位数码显示,初始化时,显示“P ”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。
在输入密码过程中,显示器只显示“8.”。
当数字输入超过6个时,给出报警信息。
在密码输入过程中,若输入错误,可以利用“DEL ”键删除刚才输入的错误的数字。
(3). 4×4行列式键盘的按键功能分布图如图4.33.2所示:图4.33.25. C 语言源程序#include <A T89X52.H>unsigned char ps[]={1,2,3,4,5};unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x73,0xff}; unsigned char dispbuf[8]={18,16,16,16,16,16,16,16};unsigned char dispcount;unsigned char flashcount;unsigned char temp;unsigned char key;unsigned char keycount;unsigned char pslen=5;unsigned char getps[6];bit keyoverflag;bit errorflag;bit rightflag;unsigned int second3;unsigned int aa,bb;unsigned int cc;bit okflag;bit alarmflag;bit hibitflag;unsigned char oka,okb;void main(void){unsigned char i,j;TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;TR0=1;ET0=1;EA=1;while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=10;i>0;i--)for(j=248;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;}temp=P3;P1_1=~P1_1;if((key>=0) && (key<10)){if(keycount<6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}else if(keycount>6){keycount=6;keyoverflag=1;//key overflow}}else if(key==12)//delete key{if(keycount>0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}else if(key==15)//enter key{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;i<keycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;goto a;}}errorflag=0;rightflag=1;i=keycount;}}temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}keyoverflag=0;//?????????}}P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=10;i>0;i--)for(j=248;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;}temp=P3;P1_1=~P1_1;if((key>=0) && (key<10)){if(keycount<6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}else if(keycount>6){keycount=6;keyoverflag=1;//key overflow}}else if(key==12)//delete key{if(keycount>0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}else if(key==15)//enter key{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;i<keycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;goto a4;}}errorflag=0;rightflag=1;a4: i=keycount;}}temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}keyoverflag=0;//?????????}}P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=10;i>0;i--)for(j=248;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;}temp=P3;P1_1=~P1_1;if((key>=0) && (key<10)){if(keycount<6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}else if(keycount>6){keycount=6;keyoverflag=1;//key overflow}}else if(key==12)//delete key{if(keycount>0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}else if(key==15)//enter key{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;i<keycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;goto a3;}}errorflag=0;rightflag=1;a3: i=keycount;}}temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}keyoverflag=0;//?????????}}P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=10;i>0;i--)for(j=248;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}temp=P3;P1_1=~P1_1;if((key>=0) && (key<10)){if(keycount<6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}else if(keycount>6){keycount=6;keyoverflag=1;//key overflow}}else if(key==12)//delete key{if(keycount>0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}else if(key==15)//enter key{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;i<keycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;goto a2;}}errorflag=0;rightflag=1;a2: i=keycount;}}temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}keyoverflag=0;//?????????}}}}void t0(void) interrupt 1 using 0{TH0=(65536-500)/256;TL0=(65536-500)%256;flashcount++;if(flashcount==8){flashcount=0;P0=dispcode[dispbuf[dispcount]];P2=dispbit[dispcount];dispcount++;if(dispcount==8){dispcount=0;}}if((errorflag==1) && (rightflag==0)){bb++;if(bb==800){bb=0;alarmflag=~alarmflag;}if(alarmflag==1)//sound alarm signal{P1_7=~P1_7;}aa++;if(aa==800)//light alarm signal{aa=0;P1_0=~P1_0;}second3++;if(second3==6400){second3=0;errorflag=0;rightflag=0;alarmflag=0;bb=0;aa=0;}}else if((errorflag==0) && (rightflag==1)){P1_0=0;cc++;if(cc<1000){okflag=1;}else if(cc<2000){okflag=0;}else{errorflag=0;rightflag=0;P1_7=1;cc=0;oka=0;okb=0;okflag=0;P1_0=1;}if(okflag==1){oka++;if(oka==2){oka=0;P1_7=~P1_7;}}else{okb++;if(okb==3){okb=0;P1_7=~P1_7;}}}if(keyoverflag==1){P1_7=~P1_7;}}。