矩阵键盘 密码锁
- 格式:doc
- 大小:6.39 KB
- 文档页数:13
简易电子密码锁设计&我的设计思想联想到日前在安全技术防范领域,具有防盗报警功能的电子密码控制系统逐渐代替传统的机械式密码控制系统,并结合近期的学习过程和一些参考书籍,完成了简易的电子密码锁设计学习。
电子密码控制是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
电子密码控制不论性能还是安全性都已大大超过了机械类结,具有良好的应用前景。
一、设计目的与内容设计了一个简易电子密码锁,可按要求从矩阵键盘输入6位数密码如“080874”,输入过程中有按键音提示。
当密码输入正确并按下确认键(“OK”键)后,发光二极管被点亮。
二、工作原理与基本操作过程介绍采用80C51为核心的单片机控制。
利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。
(1)键盘的人工编码给每个按键指定一个按键值,报告设定按键S1~S9对应的按键值分别为“1~9”,S10为数字“0”,S11为“OK”,S12~S16对应的按键值分别为12~16。
(2)根据按键值,指定每个按键对应的输入数字和信息。
如下表为每个按键代表的数字和输入信息。
当键盘扫描程序扫描到S10键被按下时,将其代表的按键值“0”通知CPU,CPU根据事先的规定,就会知道输入的数字是“0”。
矩阵键盘中每个按键所代表的数字和输入信息(3)输入数字和密码对比。
先将设定的密码用一个数组保存,报告中用的密码“080874”和“OK”确认信息可以用如下数组保存:Unsigned char D[ ]={0,8,0,8,7,4,11};在主程序接收到数字和信息后,通过逐位对比的方法进行判断。
输入的数字经对比正确时,程序才会继续顺序执行,否则,程序拒绝继续执行。
(4)执行预期功能。
如果输入密码正确,执行预期功能,报告设计为点亮P3.0口引脚LED。
三、电路图设计(Proteus绘制)四、程序设计(C语言)矩阵式键盘实现的电子密码锁程序#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚sbit sound=P3^7; //将sound位定义为P3.7unsigned char keyval; //储存按键值/************************************************************** 函数功能:延时输出音频**************************************************************/ void delay(void){unsigned char i;for(i=0;i<200;i++);}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char D[ ]={0,8,0,8,7,4,11}; //设定密码EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0keyval=0xff; //按键值初始化while(keyval!=D[0]) //第一位密码输入不正确,等待;while(keyval!=D[1]) //第二位密码输入不正确,等待;while(keyval!=D[2]) //第三位密码输入不正确,等待;while(keyval!=D[3]) //第四位密码输入不正确,等待;while(keyval!=D[4]) //第五位密码输入不正确,等待;while(keyval!=D[5]) //第六位密码输入不正确,等待;while(keyval!=D[6]) //没有输入“OK”,等待;P3=0xfe; //P3.0引脚输出低电平,点亮LED}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第一组寄存器{unsigned char i;TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=1; //可判断是S1键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=2; //可判断是S2键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=3; //可判断是S3键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=5; //可判断是S5键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=6; //可判断是S6键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=7; //可判断是S7键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=9; //可判断是S9键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=0; //可判断是S10键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=11; //可判断是S11键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=12; //可判断是S12键被按下P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=13; //可判断是S13键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=14; //可判断是S14键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=15; //可判断是S15键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=16; //可判断是S16键被按下for(i=0;i<200;i++) //让P3.7引脚电平不断取反输出音频{sound=0;delay();sound=1;delay();}}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值}五、用Proteus软件进行仿真利用Keil软件进行编译通过后,生成hex文件。
电子密码锁一、工作原理本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O 线的数目,在按键比较多的时候,通常采用这样方法。
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N ×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
4×4矩阵键盘的工作原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
扫描原理把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。
由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。
利用51单片机设计一个用16个按键输入,6位数字输出显示的电子时钟。
如图1-1所示。
图1-1按键分布图具体要求和按键功能介绍如下:1. 上电后,6 位数码管显示“—”;2. 设置6 位密码,密码通过键盘输入,按“确定”键确认,如密码正确,将锁打开;3. 密码由用户自己设定,若密码正确即锁被打开,则指示灯被点亮;4. 若密码1 次输入错误,则报警;5. 按Set 键,修改密码;6. 按Cle 键可清除已输入的密码,重新进行输二、系统硬件组成本次设计的主要有键盘,数码管,STC89C52芯片,以及LED灯。
1.工程文件
2.程序文件
3.程序编译
4.RTL图
5.Testbench
6.仿真图整体仿真图
上图仿真过程为先输入1234开锁(默认密码1234),开锁后按下修改键进入修改模式,再输入2537,确认,将密码修改为2537,再关锁。
然后再输入1234,无法开锁,在输入2537,开锁。
矩阵键盘模块仿真
显示模块
上图仿真的是数码管显示模块,4个数码管显示输入的4位密码,每输入1位,密码左移一
次。
密码输入模块
上图为密码输入模块,按键0~9输入密码,每输入1位,密码左移一次。
密码锁控制模块
密码锁控制模块为状态机控制,state信号为当前状态指示,密码正确时led_open输出高电平。
Error_cnt信号为输入密码错误计数。
密码修改模块
在密码修改状态下,输入新的密码并按下确认键,修改密码。
上图为将密码1234修改为2537 报警模块
State为密码锁当前状态,当密码输入连续错误3次,报警,上图仿真输入错误只有1次,无报警。
基于FPGA 数字密码锁板子使用的是DE2顶层topmodule lock(reset,clk,row,col,mm0,mm1,mm2,mm3,led1,led2,led3,set_flog); input clk,reset;input [3:0]row;output wire [3:0] col;output wire [6:0] mm0,mm1,mm2,mm3;output reg led1, led2,led3;wire [3:0]key_value;reg [3:0] temp_key;reg [3:0] m0,m1,m2,m3;reg [3:0] m_0,m_1,m_2,m_3;reg [5:0] state;reg [2:0] wei;wire key_valid;reg [1:0]count_wrong;output reg set_flog;parameter valid =6'b000000,set =6'b000001,collection_mm =6'b000010,cmd =6'b000100,collection =6'b001000,wrong =6'b010000,correct =6'b100000,die_lock =6'b000011,lock =6'b000111;always @(posedge clk or negedge reset)beginif(!reset)beginstate<=6'b000000;wei<=0;led3<=0;set_flog<=0;led1<=0;led2<=0;m0<=15;m1<=15;m2<=15;m3<=15;endelse begincase(state)valid :if(key_valid)begintemp_key<=key_value;state<=collection;endelsestate<=valid;collection : beginif(key_value>=0&&key_value<=9)beginif(led1&&(!set_flog))//开启状态不能按数字键state<=valid;else if((!key_valid)&&(wei<5))beginled2<=0;state<=collection_mm;wei<=wei+1'b1;endelsestate<=collection;endelseif(!key_valid)state<=cmd;endcollection_mm: begincase(wei)1:m0<=temp_key;2:m1<=temp_key;3:m2<=temp_key;4:m3<=temp_key;endcasestate<=valid;endcmd : begincase(temp_key)15:if(!led1)beginm0<=15;m1<=15;m2<=15;m3<=15;//*clearstate<= valid;wei<=0;led2<=0;led1<=0;endelsestate<= valid;14:if(led1)state<= valid;else if(wei) //back deletebegincase(wei)1:m0<=15;2:m1<=15;3:m2<=15;4:m3<=15;endcasewei<=wei-1'b1;state<=valid;led2<=0;endelsestate<=valid;13: if(set_flog)//保存密码beginset_flog<=0;led1<=0;m_0<=m0;m_1<=m1;m_2<=m2;m_3<=m3;state<=lock;endelseif((m0==m_0)&&(m1==m_1)&&(m2==m_2)&&(m3==m_3))//comparebeginstate<=correct;m0<=15;m1<=15;m2<=15;m3<=15;endelse beginstate<=wrong;count_wrong<=count_wrong+1;end12: state<=lock;10: if(led1) //setbeginset_flog<=1;wei<=0;m0<=15;m1<=15;m2<=15;m3<=15;state<=valid;enddefault:state<=valid;endcaseendcorrect :begin //openled1<=1;state<=valid;count_wrong<=0;endwrong :beginled2<=1;state<=valid;led1<=0;if(count_wrong==3) //lock diebegincount_wrong<=0;state<=die_lock;endendlock :beginled1<=0;wei<=0;led2<=0;m0<=15;m1<=15;m2<=15;m3<=15;set_flog<=0;state<=valid;enddie_lock:led3<=1;endcaseendendwire [15:0] mm={m3,m2,m1,m0};key key_scan(reset,clk,row,col,key_value,key_valid);display dis_u1(clk,mm,mm3,mm2,mm1,mm0);endmodule键盘扫描模块module key(reset,clk,row,col,key_value,key_flag);input clk,reset;input [3:0] row;//hangoutput reg [3:0] col;//lieoutput reg [3:0] key_value;output reg key_flag;reg [3:0] row_reg;reg [3:0] col_reg;reg [19:0] count;reg [2:0] state;reg clk_500khz;always @(posedge clk or negedge reset)if(!reset) beginclk_500khz<=0;count<=0;endelseif(count>=5000) begin clk_500khz<=~clk_500khz;count<=0;end else count<=count + 1'b1;always @(posedge clk_500khz or negedge reset)beginif(!reset)begin col<=0;state<=0;row_reg<=0;col_reg<=0;end elsebegincase(state)0:begincol<=0;key_flag<=0;if(row[3:0]!=4'b1111)beginstate<=1;col[3:0]<=4'b1110;endelse state<=0;end1: if(row[3:0]!=4'b1111) state<=5;else begin state<=2;col<=4'b1101;end2: if(row[3:0]!=4'b1111) state<=5;else begin state<=3;col<=4'b1011;end3: if(row[3:0]!=4'b1111) state<=5;else begin state<=4;col<=4'b0111;end 4: if(row[3:0]!=4'b1111) state<=5;else state<=0;5: if(row[3:0]!=4'b1111)begincol_reg<=col;row_reg<=row;state<=5;key_flag<=1;endelsestate <=0;endcaseendendalways@(clk or col_reg or row_reg or key_value)beginif(!reset)key_value<=0;else if(key_flag==1'b1)begincase({col_reg,row_reg})8'b1110_1110:key_value<=1;8'b1110_1101:key_value<=2;8'b1110_1011:key_value<=3;8'b1110_0111:key_value<=10;//a8'b1101_1110:key_value<=4;8'b1101_1101:key_value<=5;8'b1101_1011:key_value<=6;8'b1101_0111:key_value<=11;//b8'b1011_1110:key_value<=7;8'b1011_1101:key_value<=8;8'b1011_1011:key_value<=9;8'b1011_0111:key_value<=12;//c8'b0111_1110:key_value<=15;//*8'b0111_1101:key_value<=0;8'b0111_1011:key_value<=14;//#8'b0111_0111:key_value<=13;//d endcaseendendendmodule显示模块module display(clk,mm,wei0,wei1,wei2,wei3); input [15:0]mm;input clk;output reg [6:0] wei0,wei1,wei2,wei3;always @(clk)begincase(mm[3:0])4'b0000:wei0<=7'b 1000000;4'b0001:wei0<=7'b 1111001;4'b0010:wei0<=7'b 0100100;4'b0011:wei0<=7'b 0110000;4'b0100:wei0<=7'b 0011001;4'b0101:wei0<=7'b 0010010;4'b0110:wei0<=7'b 0000010;4'b0111:wei0<=7'b 1111000;4'b1000:wei0<=7'b 0000000;4'b1001:wei0<=7'b 0011000;4'b1010:wei0<=7'b 0001000;4'b1011:wei0<=7'b 0000011;4'b1100:wei0<=7'b 1000110;4'b1101:wei0<=7'b 0100001;4'b1110:wei0<=7'b 0000110;4'b1111:wei0<=~7'b 1000000;//4'b1111:wei0<=7'b 0001110;endcasecase(mm[7:4])4'b0000:wei1<=7'b 1000000;4'b0001:wei1<=7'b 1111001;4'b0010:wei1<=7'b 0100100;4'b0011:wei1<=7'b 0110000;4'b0100:wei1<=7'b 0011001;4'b0101:wei1<=7'b 0010010;4'b0110:wei1<=7'b 0000010;4'b0111:wei1<=7'b 1111000;4'b1000:wei1<=7'b 0000000;4'b1001:wei1<=7'b 0011000;4'b1010:wei1<=7'b 0001000;4'b1011:wei1<=7'b 0000011;4'b1100:wei1<=7'b 1000110; 4'b1101:wei1<=7'b 0100001; 4'b1110:wei1<=7'b 0000110; 4'b1111:wei1<=~7'b 1000000; //4'b1111:wei1<=7'b 0001110; endcasecase(mm[11:8])4'b0000:wei2<=7'b 1000000; 4'b0001:wei2<=7'b 1111001; 4'b0010:wei2<=7'b 0100100; 4'b0011:wei2<=7'b 0110000; 4'b0100:wei2<=7'b 0011001; 4'b0101:wei2<=7'b 0010010; 4'b0110:wei2<=7'b 0000010; 4'b0111:wei2<=7'b 1111000; 4'b1000:wei2<=7'b 0000000; 4'b1001:wei2<=7'b 0011000; 4'b1010:wei2<=7'b 0001000; 4'b1011:wei2<=7'b 0000011; 4'b1100:wei2<=7'b 1000110; 4'b1101:wei2<=7'b 0100001; 4'b1110:wei2<=7'b 0000110; 4'b1111:wei2<=~7'b 1000000; //4'b1111:wei2<=7'b 0001110; endcasecase(mm[15:12])4'b0000:wei3<=7'b 1000000; 4'b0001:wei3<=7'b 1111001; 4'b0010:wei3<=7'b 0100100; 4'b0011:wei3<=7'b 0110000; 4'b0100:wei3<=7'b 0011001; 4'b0101:wei3<=7'b 0010010; 4'b0110:wei3<=7'b 0000010; 4'b0111:wei3<=7'b 1111000; 4'b1000:wei3<=7'b 0000000; 4'b1001:wei3<=7'b 0011000; 4'b1010:wei3<=7'b 0001000; 4'b1011:wei3<=7'b 0000011; 4'b1100:wei3<=7'b 1000110; 4'b1101:wei3<=7'b 0100001; 4'b1110:wei3<=7'b 0000110; 4'b1111:wei3<=~7'b 1000000; //4'b1111:wei3<=7'b 0001110; endcaseend endmodule。
1 设计课题任务、功能要求说明及方案介绍1.1设计课题任务与要求设计一个具有特定功能的密码锁。
该密码锁上电或按键复位后能自动显示系统提示符“0”,进入准备工作状态。
该密码锁具有系统原始密码也是万能密码为,用户可以在原始密码输入正确后,即开锁后才可以设定并存储用户密码,当用户设置密时,万能密码仍可以解锁,输入的新密码并按下设定时回到系统初始状态。
密码锁锁定时,密码输入应处于保密显示状态,显示“0”,密码输入正确时应显示密码输入正确提示信息8个“8.”,即数码管全亮,否则,显示密码输入错误提示信息:8个“-”并且蜂鸣器响一会,当输入错误3次时,蜂鸣器报警一直报警,显示错误信息8个“-”,并且锁死系统。
1.2设计课题总体方案及工作原理此密码锁主要由单片机芯片AT89S52、4X4矩阵键盘、8位数码管显示电路和复位电路构成,设计课题的系统框图如图 1.1 所示:图 1.1系统框图实现密码锁功能的软件程序存放在AT89S52的ROM中。
2 设计课题硬件系统的设计2.1 设计课题硬件系统各模块介绍本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、电源模块(1)单片机最小系统模块:AT89S52单片机芯片;复位电路;晶振电路。
本模块AT89S52系统控制核心,单片机系统复位由按键电平复位电路完成,通过按键S1来控制,单片机通过芯片引脚XTAL1、 XTAL2,外并接石英晶体振荡器和两只电容。
这样就为能为单片机提供频率为12MHz的晶振。
(2)4X4矩阵键盘模块:四条列线接P1.7-P1.4;四行线接P1.3-P1.0 (3)显示模块:本次设计显示为8位,采用两个四位一体数码管(共阳极)作为显示窗口,既可以节约成本又能简化电路。
数码管用8个PNP三极管驱动。
(4)电源模块:直接由PC的USB接口提供。
2.2 各功能模块详细介绍2.2.1 AT89S52介绍(1) 具有8KB可改写的Flash 内部程序存储器,可写/擦1000次;(2) 256字节内部RAM;(3) 32根可编程I/O口;(4) 3个16位定时器/计数器。
#include <reg51.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;a: 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;}{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: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;}{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;}。