指纹识别程序和原理图
指纹识别技术基本原理介绍(PPT36页)
年内都不会有两个相同的指纹 出现。指纹被称为“物证之 首”,安全可靠。
指纹识别的基本原理
• 目前的识别指纹算法主要从总体特征和局部特征这两个方面入手 分辨指纹。网赚导航/daohang
指纹的总体特征
总体特征是指那些用人眼直接就可以观察到的特征。
指纹识别技术基本原理介绍(PPT36页 )培训 课件培 训讲义 培训ppt教程管 理课件 教程ppt
指纹图像采集
指纹采集方式
➢ 电容式:通过皮肤和屏幕的接触, 识别指纹的纹路来记录和验证指纹 。
➢ 光学式:通过光反射成像来记录和 验证指纹。
指纹识别技术基本原理介绍(PPT36页 )培训 课件培 训讲义 培训ppt教程管 理课件 教程ppt
指纹识别技术的应用
指纹考勤系统
在很多企业中往往需要进行考勤,传统的考勤方式基本上有两种,一种是卡片形式的,另一种是 IC卡形式,但这两种考勤方式都无法杜绝代人打卡的现象,使考勤失去了意义。如果利用指纹来作 为个人身份的标识,以此来进行考勤,则可以很好地避免代人打卡这种现象.
指纹识别技术的应用
电脑领域
指纹的局部特征
➢三角点(Delta): 三角点位于从核心点开始的第一个分叉点或者断点、或者两 条纹路会聚处、孤立点、折转处,或者指向这些奇异点。三角点提供了指纹 纹路的计数和跟踪的开始之处。
➢纹数(Ridge Count): 纹数是指模式区内指纹纹路的数量。在计算指纹的 纹数时,一般先连接核心点和三角点,这条连线与指纹纹路相交的数量即可 认为是指纹的纹数。
指纹识别让人们无需输入繁琐的密码,只需手指的轻轻触碰 就能对个人信息进行解锁。
这项技术在近几年普及以来深受欢迎。
超声波识别指纹原理
超声波识别指纹原理
超声波识别指纹的原理是利用超声波在指纹皮肤表面和指纹纹路之间传播的特性进行识别。
超声波是一种频率高于人耳可听的声波,具有较小的能量损耗和穿透力强的特点。
该技术通过以下步骤实现指纹识别:
1. 发送超声波信号:首先,发射器会向指纹表面发送一束超声波信号。
这些超声波信号通过指纹皮肤而传播到指纹表面以下的细小纹理。
2. 检测反射信号:当超声波信号遇到指纹纹路或起伏时,会发生反射和散射。
接收器会收集到反射信号,这些信号包含了指纹纹路的信息。
3. 数字化处理:接收器将收集到的反射信号进行数字化处理,将其转化为数字形式的指纹图像。
4. 特征提取和比对:接下来,通过算法从数字化的指纹图像中提取出一些特征,例如细节、纹理和交叉点等。
然后,提取出的特征与存储在数据库中的已注册指纹特征进行比对。
5. 匹配验证:最后,通过将提取出的特征与数据库中存储的指纹特征进行匹配,判断是否存在匹配。
如果匹配成功,则验证指纹的身份。
超声波识别指纹的原理主要基于指纹的纹路和细节特征,因为
每个人的指纹纹路都是独一无二的,所以通过识别并比对指纹特征,可以实现高度精确的身份验证和辨识。
指纹识别技术的基本原理及过程
指纹识别技术的基本原理及过程指纹识别技术的基本原理及过程尽管指纹识别技术已经进入了民用领域,但是其工作原理其实还是比较复杂的。
与人工处理不同,生物识别技术公司不直接存储指纹的图像。
多年来,各生物识别技术公司及其研究机构研究了许多指纹识别算法(美国有关法律认为,指纹图像属于个人隐私,因此不能直接存储指纹图像)。
但各种识别算法最终都归结为在指纹图像上找到并比对指纹的特征。
这就是指纹识别技术的基本原理,即采集指纹图像并进行比对指纹特征。
指纹的特征从普遍意义上来讲,可以定义指纹的两类特征来进行指纹的验证:总体特征和局部特征。
总体特征是指那些用人眼直接就可以观察到的特征。
它包括:1、基本纹型常见的指纹图案有环型、弓型、螺旋型,其他的指纹图案都基于这三种基本图案,只是一个粗略的分类,仅仅依靠图案类型来分辨指纹是远远不够的,但通过分类可以更加便利于在大数据库中搜寻到指纹。
2、模式区(Pattern Area)模式区是包含了纹型特征的区域,即从模式区就能够分辨出指纹是属于那一种类型的。
3、核心点(Core Point)核心点位于指纹纹路的渐进中心,它用于读取指纹和比对指纹时的参考点。
4、三角点(Delta)三角点位于从核心点开始的第一个分叉点或者断点、或者两条纹路会聚处、孤立点、折转处,或者指向这些奇异点。
三角点提供了指纹纹路的计数和跟踪的开始之处。
5、式样线( Type Lines)式样线是在指纹包围模式区的纹路线开始平行的地方所出现的交叉纹路,式样线通常很短就中断了,但它的外侧线开始连续延伸。
6、纹数( Ridge Count)纹数是指模式区内指纹纹路的数量。
在计算指纹的纹。
指纹识别芯片的基本原理及应用PPT课件
27
Thank You!
2021
28
3)可分类性:指纹的纹型,中心点和三角点之间的脊线数,以及细节特 征间的关系,都可作为分类的依据。
2021
9
二. 指纹识别技术
指纹识别系统的构成
2021
10
二. 指纹识别技术
2.1 指纹的采集技术
• 光学 • 硅晶体传感器 • 超声波 • 其他类型
2021
11
指纹识别技术
光学识别 光学识别是较早的指纹识别技术; 而且受手指表面是否干净影响较大。 只能到达皮肤的表皮层,而不能到达真皮层; 基于光学发射装置发射的光线反射后获取数据;
1.指纹的特征提取:
指纹图像经过预处理之后,得到了清晰的细化二值图,我们就可以在 此基础上对其进行特征提取了。用位置、类型和方向这几个参数描述细节 特征,才能进行后续的存储或者与已有的细节特征进行匹配。
2. 指纹特征点的匹配: 指纹匹配问题转化为点匹配问题,同一个手指的两幅样本图像,由于
按压时手指位置、方向和力度的不同,可能造成指纹图像的平移、旋转和 非线性形变,因此基于校准的匹配算法理论简单而又有效。
2021
12
指纹识别技术
电容传感器识别
• 利用指纹的脊和谷相对半导体的距离不同而造成电容值的不同, 将其转化为电压记录下来就可以得到指纹的灰度图像。
• 电容传感器对手指的干净度要求较高; • 传感器表面使用硅材料,容易损坏。 • 现在应用最普遍的技术。
2021
13
指纹识别技术
超声波扫描识别 通过传感器发射微量的射频信号 利用皮肤与空气对于声波阻抗的差异,可以区分指纹脊与谷 穿透手指的表皮层获取里层的纹路以获取信息; 这种方法对手指的干净程度要求较低。
指纹识别ppt课件
将指纹识别技术应用于门禁系统,可以实现 进出人员的身份识别和权限控制,提高了门 禁系统的安全性和智能化水平。
指纹识别在考勤管理中的 应用
通过指纹识别技术,可以实现员工考勤的自 动化管理,有效避免了代打卡等作弊行为,
提高了考勤管理的准确性和公正性。
身份认证和权限控制
指纹识别在身份认证中的应用
基于电容、电感等半导体 技术,通过感应手指表面 电荷分布来捕捉指纹图像 。
超声波指纹采集器
利用超声波穿透性强、方 向性好等特点,捕捉手指 内部的指纹信息。
图像处理算法
预处理算法
包括去噪、增强、二值化等操作,用 于提高指纹图像的质量和可识别度。
特征提取算法
匹配算法
将提取出的特征点与数据库中的指纹 特征进行比对,找出相似的指纹信息 。
细节点匹配
通过比较两枚指纹图像中细节点 的类型和位置信息进行匹配,具
有较高的准确性和鲁棒性。
纹理匹配
利用指纹图像中脊线和谷线形成 的纹理特征进行匹配,对于质量 较差的指纹图像具有一定的优势
。
深度学习匹配
通过训练深度学习模型学习指纹 图像中的特征表示,并进行相似 度计算,具有自适应性强、性能
稳定等优点。
随着科技的不断进步和创新,指纹识别技术将不断升级和完善, 提高识别精度、速度和安全性。
应用领域拓展
指纹识别技术将广泛应用于金融、安防、智能家居、医疗等领域, 为人们提供更加便捷、安全的身份认证和访问控制服务。
产业链不断完善
随着指纹识别技术的不断发展和应用,相关产业链也将不断完善和 成熟,形成更加完整的产业生态体系。
细化
对二值化后的指纹图像进行细化操作,将指纹的纹路细化为单像素宽度,便于后续的指纹特征分析和处理。常用 的细化算法包括OPTA算法、Hilditch算法等。这些算法通过不断去除图像边缘的像素点,最终得到细化后的指纹 图像。
指纹识别的过程及原理
指纹识别的过程及原理一、概述指纹识别是一种常见的生物特征识别技术,通过分析人体指纹的形态特征和纹线特征,将其转化为数字化的信息,用于身份认证、门禁控制、犯罪侦查等领域。
本文将详细介绍指纹识别的过程和原理。
二、指纹识别的过程指纹识别的过程可以分为图像获取、特征提取和匹配三个步骤。
2.1 图像获取指纹图像的获取是指将人体手指放置在指纹采集设备上,通过光学或电容传感器等技术,将指纹的形态和纹线特征转化为数字图像。
指纹图像的质量对后续的特征提取和匹配过程有重要影响,因此,图像获取的过程需要保证指纹图像的清晰度和完整性。
2.2 特征提取特征提取是指从指纹图像中提取出能够表征指纹的关键特征。
常见的特征提取方法有两类:形态学特征和纹线特征。
2.2.1 形态学特征形态学特征是指指纹图像中的形态特征,如指纹的形状、面积和方向等。
这些特征可以通过计算指纹图像的几何特征来获取,如指纹的核心点、三角点和纹线的长度等。
2.2.2 纹线特征纹线特征是指指纹图像中纹线的形态特征,如纹线的走向、分叉和终止等。
常用的纹线特征提取方法包括细节方向频率、方向梯度直方图和Gabor滤波器等。
2.3 匹配匹配是指将待识别的指纹特征与已有的指纹特征进行比对,以确定是否有匹配的指纹。
匹配过程可以分为两个阶段:特征比对和相似度计算。
2.3.1 特征比对特征比对是指将待识别的指纹特征与数据库中的指纹特征进行对比,以找出最相似的指纹。
常见的特征比对方法有最近邻算法和支持向量机等。
2.3.2 相似度计算相似度计算是指根据比对结果,计算待识别指纹特征与数据库指纹特征之间的相似度。
常用的相似度计算方法有欧氏距离、曼哈顿距离和余弦相似度等。
三、指纹识别的原理指纹识别的原理基于指纹的唯一性和稳定性。
每个人的指纹纹线形成的方式是随机的,且不会随时间的推移而改变,因此,指纹可以作为一种可靠的生物特征用于身份识别。
3.1 指纹的唯一性指纹的唯一性是指每个人的指纹特征都是独一无二的。
指纹识别技术简介精品PPT课件
二是稳定性,指纹的图案永远不会改变,它不会随着人的 年龄而改变指纹,也不会和主体分离。
Company Logo
指纹识别原理-自动识别原理
自动指纹识别技术主要有两种:一种是基于指纹图像统计信息的方法, 一种是基于指纹本身所固有的特征点结构的方法。
Company Logo
生物特征的采集-静脉 手掌静脉识别
Company Logo
生物特征的采集-静脉 手指静脉识别
Company Logo
生物特征的采集-静脉 指纹&静脉复合识别
Company Logo
生物特征的采集-掌纹 掌纹识别采集
• 光学成像采集(反射) • 一般有光源 • 一般有定位装置(借鉴手形识别)
•碾压式(多用于油墨捺印)
Company Logo
生物特征的采集-指纹 指纹采集方式
• 固定式 • U.are.U 4000B光学指纹采集器(Digital Persona公 司, )
Company Logo
生物特征的采集-指纹 指纹采集方式
•滑动式 •滑动指纹采集模块(ATMEL,)
Company Logo
基于图像统计匹配方法主要是通过直接或间接地比较两幅原始指纹 图像的统计相识程度,从而达到判断两枚指纹是否是属于同一个人 的目的,例如:利用二维相关系数来直接识别指纹的方法,首先它 需要储存所有注册用户的一幅完整的指纹图像,在识别时,计算录 入指纹和已经注册的用户指纹图像两者之间的相关系数,然后将此 相关系数与一个闭值比较得出识别结果。
Company Logo
指纹识别原理-指纹的局部特征
指纹识别使用什么原理
指纹识别使用什么原理指纹识别使用什么原理指纹识别使用什么原理1第一步:指纹是手指末端正面皮肤上凸凹不平产生的纹路。
尽管指纹只是人体皮肤的小部分,但是,它蕴涵着大量的信息。
指纹特征可分为两类:总体特征和局部特征。
总体特征指那些用人眼直接就可以观察到的特征,包括基本纹路图案、模式区、核心点、三角点、式样线和纹线等。
基本纹路图案有环形、弓形、螺旋形。
局部特征即指纹上节点的特征,这些具有某种特征的节点称为特征点。
两枚指纹经常会具有相同的总体特征,但它们的局部特征——特征点,却不可能完全相同。
指纹上的特征点,即指纹纹路上的终结点、分叉点和转折点。
第二步:指纹识别技术通常使用指纹的总体特征如纹形、三角点等来进行分类,再用局部特征如位置和方向等来进行用户身份识别。
通常,首先从获取的指纹图像上找到“特征点”(minutiae),然后根据特征点的特性建立用户活体指纹的数字表示——指纹特征数据(一种单向的转换,可以从指纹图像转换成特征数据但不能从特征数据转换成为指纹图像)。
由于两枚不同的指纹不会产生相同的特征数据,所以通过对所采集到的指纹图像的特征数据和存放在数据库中的指纹特征数据进行模式匹配,计算出它们的相似程度,最终得到两个指纹的匹配结果,根据匹配结果来鉴别用户身份。
由于每个人的指纹不同,就是同一人的十指之间,指纹也有明显区别,因此指纹可用于身份鉴定。
第三步:指纹识别技术主要涉及四个功能:读取指纹图像、提取特征、保存数据和比对:首先,通过指纹读取设备读取人体指纹的图像,取到指纹图像之后,要对原始图像进行预处理。
其次,用指纹辨识软件建立指纹的数字表示特征数据,是一种单方向的转换,可以从指纹转换成特征数据但不能从特征数据转换成为指纹,而两枚不同的指纹不会产生相同的特征数据。
软件从指纹上找到被称为“节点”的数据点,也就是那些指纹纹路的分叉、终止或打圈处的坐标位置,这些点同时具有七种以上的唯一性特征。
第三,通常手指上平均具有70个节点,所以这种方法会产生大约500个数据。
指纹识别系统-实验报告-
实验报告《指纹识别系统》【实验名称】指纹识别系统【实验目的】 1.对指纹识别系统的图像预处理有一定的掌握;2.对后续操作只简单了解;3.通过功能模块实现指纹识别系统。
【实验内容】 1.系统需求分析;2.系统设计;3.系统实现。
【实验步骤】一、系统需求分析1、目的与背景在网络化时代的今天,我们每个人都拥有大量的认证密码,比如开机密码、邮箱密码、银行密码、论坛登录密码等;并配备了各种钥匙,如门钥匙,汽车钥匙,保险柜钥匙等。
这些都是传统的安全系统所采用的方式,随着社会发展,其安全性越来越弱。
而我们的生活随时都需要进行个人身份的确认和权限的认定,尤其是在信息社会,人们对于安全性的要求越来越高,同事希望认证的方式简单快速。
为了解决这一问题,人们把目光转向了生物识别技术,希望能借助人体的生理特征或行为来进行身份识别。
这样人们可以不用携带大串钥匙,不用费心去记各种密码。
另外,生物特征具有唯一性,不可复制性,例如指纹。
生物特征识别技术所研究的生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音(语音)、体形。
而人类在追寻文档、交易及物品的安全保护的有效性与方便性经历了三个阶段的发展。
第一阶段也就是最初始的方法,是采用大家早已熟悉的各种机械钥匙。
第二阶段是由机械钥匙发展到数字密钥如密码或条形码等。
第三阶段是利用人体所固有的生物特征(指纹识别)来辨识与验证身份。
生物识别(指纹识别)是当今数字化生活中最高级别的安全密钥系统。
对生物识别(指纹识别)技术来说,被广泛应用意味着它能在影响亿万人的日常生活的各个地方使用。
通过取代个人识别码和口令,生物识别(指纹识别)技术可以阻止非授权的"访问",可以防止盗用ATM、蜂窝电话、智能卡、桌面PC、工作站及其计算机网络;在通过电话、网络进行的金融交易时进行身份认证;在建筑物或工作场所生物识别技术(指纹识别)可以取代钥匙、证件、图章等。
生物识别(指纹识别)技术的飞速发展及其广泛应用将开创个人身份鉴别的新时代!指纹识别二.系统设计1.总体设计及系统架构本系统有两大功能:指纹登记和指纹比对。
手机指纹解锁这么普遍了,那么其工作原理是怎样的呢?
手机指纹解锁这么普遍了,那么其工作原理是怎样的呢?指纹识别模块的原理和分类指纹识别模块是通过特定的感应模组实现对于个体指纹特征的识别。
简单来说,每一个指纹手机都会拥有一个指纹识别模块,通过该模块将用户的指纹收集并转化成数据,存储在手机存储的特定区域,在使用的时候进行调用,而不同的指纹识别技术收集指纹的方式也有所不同。
根据收集指纹的方式不同,指纹识别模块目前主要分为光学式指纹模块、电容式指纹模块、射频式指纹模块。
光学式指纹技术原理(图片引自Phone Arena)光学式指纹模块是利用光线反射成像识别用户指纹,该类型指纹模块对使用环境的温度湿度都有一定的要求,并且在识别准确度上并不理想,再加上这种模块一般会占用更大的空间,使其难以在手机端有所作为。
电容式指纹技术原理(图片引自Phone Arena)电容式指纹模块是利用硅晶元与导电的皮下电解液形成电场,指纹的高低起伏会导致二者之间的压差出现不同的变化,借此可实现准确的指纹测定。
该方式适应能力强,对使用环境无特殊要求,同时,硅晶元以及相关的传感原件对空间的占用在手机设计的可接受范围内,因而使得该技术在手机端得到了比较好的推广。
目前的电容式指纹模块也分为划擦式与按压式两种,前者虽然占用体积较小,但在识别率以及便捷性方面有很大的劣势,这也直接导致厂商全都将目光锁定在了操作更加随意、识别率更高的按压式电容指纹模块。
电容纹识别模组主要由芯片、“蓝宝石”、金属环、软板、载板等组成,其中芯片也就是传感器部分,而“蓝宝石”负责作为保护层(有厂商选择其他材料做为保护层,成本相应会降低),金属环作为指纹识别的触发装置。
射频指纹技术原理(图片引自Phone Arena)射频指纹模块现阶段包含无线电波探测与超声波探测两种,原理与探测海底物质的的声纳类似,是靠特定频率的信号反射来探知指纹的具体形态的。
射频指纹模块技术是通过传感器本身发射出微量射频信号,穿透手指的表皮层去控测里层的纹路,来获得最佳的指纹图像。
指纹识别原理PPT课件
2021/3/9
授课:XXX
5
指纹的总体特征-三角点
三角点位于从核心点 开始的第一个分叉点 或者断点、或者两条 纹路会聚处、孤立点、 折转处,或者指向这 些奇异点。三角点提 供了指纹纹路的计数 跟踪的开始之处。
2021/3/9
授课:XXX
6
指纹的总体特征-纹数
指模式区内指纹纹路 的数量。在计算指纹 的纹数时,一般先在 连接核心点和三角点, 这条连线与指纹纹路 相交的数量即可认为 是指纹的纹数。
验证就是通过把一个现场采集到的指纹与一个己经登记 的指纹进行一对一的比对(one-to-one matching), 来确认身份的过程。作为验证的前提条件,他或她的 指纹必须在指纹库中已经注册。指纹以一定的压缩格 式存贮,并与其姓名或其标识(ID,PIN)联系起来。 随后在比对现场,先验证其标识,然后,利用系统的 指纹与现场采集的指纹比对来证明其标识是合法的。 验证其实是回答了这样一个问题:"他是他自称的这个 人吗?"这是应用系统中使用得较多的方法。
2021/3/9
授课:XXX
8
指纹的局部特征-特征点类型
可分为6类,最典型的是终结点和分叉点。
终结点(Ending) 一条纹路在此终结。
分叉点(Bifurcation) 一条纹路在此分开成为两条或更多的纹路。
分歧点(Ridge Divergence) 两条平行的纹路在此分开。
2021/3/9
授课:XXX
2021/3/9授课:X源自X22加密界面2021/3/9
授课:XXX
23
指纹密码
安全管理密码的工具。 密码长度、格式由用户指定。 密码长度可达256位,有效杜绝黑客对密码的
攻击。 只需输入指纹,无须记忆烦琐的密码。 适用于EMAIL、网上银行、网上证券、办公自
手机:指纹识别基本原理
⼿机:指纹识别基本原理
指纹识别技术作为⽣物识别技术之⼀,指纹识别技术是通过取像设备读取指纹图像,然后在⽤识别软件提取指纹特征数据,最后在进⾏匹配识别算法得到结果,以确认指纹所有⼈⾝份的⽣物特征识别技术。
指纹识别功能具体⼯作过程(图⽚引⾃新浪微博)
⽬前常⽤的指纹识别种类分别为光学式和电容式,前者通过镜⾯反射原理来采集指纹图像,并通过相应的数字信号处理器将图像转为数字信号,最后进⾏验资及结果输出。
该种类型主要应⽤在我们常⽤的考勤打卡机上。
光学式指纹识别技术原理⽰意图(图⽚引⾃新浪微博)
⽽我们⼿机中所采⽤的类型则是电容式指纹识别,其将压⼒感测、电容感测、热感测等传感器集成在⼀块芯⽚之中,当指纹按压在芯⽚表⾯时会根据指纹波峰与波⾕⽽产⽣电荷差或温差,形成指纹影响,在通过与指纹库匹配完成识别。
电容式指纹识别技术原理⽰意图(图⽚引⾃新浪微博)
三种隐藏式指纹识别技术⽅案(图⽚引⾃新浪微博)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define Dbus P0#define buffer1ID 0x01#define buffer2ID 0x02#define queren 0x88#define tuichu 0x84#define shanchu 0x82sbit B0=B^0;sbit B7=B^7;sbit jidianqi=P3^6;sbit RS=P2^2;sbit RW=P2^1;sbit E1=P2^0;sbit LEDK=P3^4; //控制背光sbit SCLK=P2^3;sbit IO=P2^5;sbit RST=P2^4;uchar code ta[8]={0x00,0x51,0x09,0x10,0x05,0x02,0x11,0xbe}; uchar data a[7]; // 秒分时日月星期年uchar dz[4]; //存键输入值uchar mima[7];uchar mimaID[6]={1,2,3,4,5,6};uchar data K;uchar data Key;uint PageID;uchar data querenma;uchar sum[2];int summaf,summas;uchar code nian[]={"年"};uchar code yue[]={"月"};uchar code ri[]={"日"};uchar code xinqi[]={"星期"};uchar code mao=0x3a;unsigned char code text1[]={" 请按指纹"};unsigned char code text2[]={" 请再次按指纹"};unsigned char code text3[]={" 指纹采集成功"};unsigned char code text4[]={"请按任意键继续"};unsigned char code text5[]={" 指纹采集失败"};unsigned char code text6[]={"输入删去的指纹号"};unsigned char code text7[]={" 删指纹号成功"};unsigned char code text8[]={"按键一:增加指纹"};unsigned char code text9[]={"按键二:删去指纹"};unsigned char code text10[]={" 请重新按指纹"};unsigned char code text11[]={"清空指纹库成功"};unsigned char code text12[]={" 没搜索到指纹"};unsigned char code text13[]={"请先按键再刷指纹"};unsigned char code text14[]={" 请重新操作"};unsigned char code text15[]={" 删去失败"};unsigned char code text16[]={" 接收包出错"};unsigned char code text17[]={" 编号为:"};unsigned char code text18[]={"指纹已找到请进"};unsigned char code text19[]={" 该指纹已存储"};unsigned char code text20[]={" 请输入密码"};unsigned char code text21[]={" 密码错误"};unsigned char code text22[]={"按键三:更新密码"}; // @@@ unsigned char code text23[]={"请再次输入密码"};unsigned char code text24[]={"两次输入的密码不"};unsigned char code text25[]={"一致,请重新操作"};unsigned char code text26[]={" 密码更新成功"};void delay(uint tt){ uchar i;while(tt--){for(i=0;i<125;i++);}}void initialize51(){SCON= 0x50; //串口方式1 //REN=1; 允许接收PCON=0x80; //SMOD=1TMOD= 0x20; //定时器1定时方式2TH1= 0xff; //11.0592MHz 模块默认波特率为57600bps TL1= 0xff;TR1= 1; //启动定时器}unsigned char Keycan(void) //按键扫描程序P1.0--P1.3为行线P1.4--P1.7为列线{unsigned char rcode, ccode;P1 = 0xF0; // 发全0行扫描码,列线输入if((P1&0xF0) != 0xF0) // 若有键按下{delay(1);// 延时去抖动if((P1&0xF0) != 0xF0){ rcode = 0xFE; // 逐行扫描初值while((rcode&0x10) != 0){P1 = rcode; // 输出行扫描码if((P1&0xF0) != 0xF0) // 本行有键按下{ccode = (P1&0xF0)|0x0F;//do{;}while((P1&0xF0) != 0xF0); //等待键释放return ((~rcode) + (~ccode)); // 返回键编码}elsercode = (rcode<<1)|0x01; // 行扫描码左移一位}}}return 0; // 无键按下,返回值为0}void KeyDeal(unsigned char Key){ //unsigned char n;if(Key!=0){switch(Key){case 0x11: K=1; break;case 0x21: K=2; break;case 0x41: K=3; break;case 0x81: break; //K=funguanliyuan;case 0x12: K=4; break;case 0x22: K=5; break;case 0x42: K=6; break;case 0x82: K=34;break; //K=funshanchu;case 0x14: K=7; break;case 0x24: K=8; break;case 0x44: K=9; break;case 0x84: break; //K=funtuichu;case 0x18: break; //K=shuazhiwencase 0x28: K=0; break;case 0x48: break;case 0x88: break; //K=funqueren;default: break;}}}//*************************************//12864//读12864忙void ReadBusy(void){unsigned char ch;cheak:Dbus=0xff;RS=0;RW=1;E1=1;ch=Dbus;E1=0;ch=ch|0x7f;if(ch!=0x7f)goto cheak;}//向LCD写命令void WriteCommand(uchar command){ReadBusy();RW=0;Dbus=command;E1=1;E1=0;}//向LCD写数据void WriteData(uchar Lcd_data){ReadBusy();RS=1;RW=0;Dbus=Lcd_data;E1=1;E1=0;}//清屏函数清DDRAMvoid Clrram (void){WriteCommand(0x01);}//LCD12864初始化程序void Lcd_int(){WriteCommand(0x30); //30---基本指令动作WriteCommand(0x0c); //开显示,关游标WriteCommand(0x01); //清屏,地址指针指向00HWriteCommand(0x02);}//LCD12864显示时间void playtime(){uchar i,n3,n4,y1,y2,r1,r2,s1,s2,f1,f2,m1,m2;WriteCommand(0x80); //指定第一行显示位置for(i=0;i<16;i++)WriteData(text13[i]); //显示LCD12864并行显示n3=a[6]>>4; n4=a[6]&0x0f;WriteCommand(0x90); //指定第二行显示位置WriteData(0x32);WriteData(0x30);WriteData(0x30+n3);WriteData(0x30+n4);for(i=0;i<2;i++) WriteData(nian[i]);y1=a[4]>>4; y2=a[4]&0x0f;WriteData(0x30+y1);WriteData(0x30+y2);for(i=0;i<2;i++) WriteData(yue[i]);r1=a[3]>>4; r2=a[3]&0x0f;WriteData(0x30+r1);WriteData(0x30+r2);for(i=0;i<2;i++)WriteData(ri[i]);WriteCommand(0x88); //指定第三行显示位置for(i=0;i<4;i++)WriteData(xinqi[i]);WriteData(a[5]+0x30);s1=a[2]>>4;s2=a[2]&0x0f; f1=a[1]>>4;f2=a[1]&0x0f; m1=a[0]>>4;m2=a[0]&0x0f;WriteCommand(0x98); //指定第四行显示位置WriteData(0x30+s1);WriteData(0x30+s2);WriteData(mao);WriteData(0x30+f1);WriteData(0 x30+f2);WriteData(mao);WriteData(0x30+m1);WriteData(0x30+m2);}//*************************************//12864//*********************************//ds1302控制uchar r1302() //读数据ds1302{ uchar i;for(i=0;i<8;i++){B>>=1;B7 = IO;SCLK=1;SCLK=0;}return B;}void w1302(uchar co) // 写ds1302 单字节{uchar i;B = co;for(i=0;i<8;i++){IO = B0; //原来是使用ACC寄存器,但不行,后改使用B寄存器后才正常运行SCLK=1;SCLK=0;B>>=1;}}void w(uchar a, uchar d) //寻址,写数{RST = 0;SCLK = 0;RST = 1;w1302(a);w1302(d);SCLK = 1;RST = 0;uchar r(uchar a) //寻址,读数{uchar r;RST = 0;SCLK = 0;RST = 1;w1302(a);r=r1302();SCLK = 1;RST = 0;return r;}void wclo(uchar *p) //写多字节ds1302 {uchar i;w(0x8e,0x00); //写允许RST=0;SCLK=0;RST=1;w1302(0xbe); //写多字节命令for(i=0;i<8;i++)w1302(*(p+i)); //写时钟数据w(0x00,0x50); // 启动定时器SCLK=1;RST=0;}void rclo(uchar *p) //读出多字节ds1302 {uchar i;RST=0;SCLK=0;RST=1;w1302(0xbf);for(i=0;i<7;i++)*(p+i) = r1302(); //读出时钟数据SCLK=1;RST=0;}//***************************************//void SFG_getimage() //录入指纹图像{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x05;SBUF=summaf;while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_genchar(uchar bufferID) //生成特征并存于charbuffer1/2 调用后单片机波特率变化@@@{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X04;while(TI==0);TI=0;SBUF=0X02;while(TI==0);TI=0;SBUF=bufferID;while(TI==0);TI=0;summaf=0x07+bufferID; sum[0]=summaf;sum[1]=summaf>>8; SBUF=sum[1];while(TI==0)TI=0;SBUF=sum[0];while(TI==0)TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF; while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_regmodel() //合并生成模板{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X05;while(TI==0);TI=0;SBUF=0X00;while(TI==0);summaf=0x09;SBUF=summaf; //校验和while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_storechar(uint pageID) //储存模板ID=1010也储存成功ID>=1011 querenma=0x18?@@@{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X06;while(TI==0);TI=0;SBUF=0X06;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;ID1=pageID;ID2=pageID>>8; SBUF=ID2;while(TI==0);TI=0;SBUF=ID1;while(TI==0);TI=0;summaf=0x0e+ID1+ID2; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_empty() //清空指纹库{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X0d;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x11;SBUF=summaf;while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_fastsearch(uchar bufferID) //搜索指纹返回指纹ID号sum、pagenum>255都会使程序卡@@@{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X08;while(TI==0);TI=0;SBUF=0X1b;while(TI==0);TI=0;SBUF=bufferID;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=180;while(TI==0);TI=0;summaf=9+0x1b+bufferID+180; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF; //接收到的ID号while(RI==0);RI=0;while(RI==0);RI=0;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void SFG_enroll() //自动注册模板返回存储ID =录图像+合并生成模板+储存模板{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X10;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x14;SBUF=summaf; //校验和while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void SFG_deletchar(uint pageID) //删除指纹校验和在2字节的页码处应分高低字节相加{uchar i,ID1,ID2;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X07;while(TI==0);TI=0;SBUF=0X0c;while(TI==0);TI=0;ID1=pageID;ID2=pageID>>8; SBUF=ID2;while(TI==0);TI=0;SBUF=ID1;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=1;while(TI==0);TI=0;summaf=0x15+ID1+ID2; sum[0]=summaf;sum[1]=summaf>>8;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_writereg(uchar N) //设置波特率{uchar i;SBUF=0xef;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X05;TI=0;SBUF=0X0e;while(TI==0);TI=0;SBUF=4;while(TI==0);TI=0;SBUF=N;while(TI==0);TI=0;summaf=0x1a;sum[0]=summaf;sum[1]=0;SBUF=sum[1];while(TI==0);TI=0;SBUF=sum[0];while(TI==0);TI=0;for(i=0;i<9;i++){while(RI==0);RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];}void SFG_identify() //自动验证指纹录图像+生成特征+搜索{uchar i,ID1,ID2;SBUF=0xef;TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0XFF;while(TI==0);TI=0;SBUF=0X01;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;SBUF=0X03;while(TI==0);TI=0;SBUF=0X11;while(TI==0);TI=0;SBUF=0X00;while(TI==0);TI=0;summaf=0x15;SBUF=summaf; //校验和while(TI==0);TI=0;for(i=0;i<9;i++){RI=0;}while(RI==0);RI=0;querenma=SBUF;while(RI==0);RI=0;ID1=SBUF;while(RI==0);RI=0;ID2=SBUF;while(RI==0);RI=0;while(RI==0);RI=0; //得分while(RI==0);RI=0;sum[1]=SBUF;while(RI==0);RI=0;sum[0]=SBUF;summas=(sum[1]<<8)+sum[0];//PageID=ID1;PageID=(ID1<<8)+ID2;}void shuazhiwen(){uchar i,IDs1,IDs2,IDs3;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text1[i]); //显示LCD12864并行显示请按指纹//SFG_getimage();//SFG_genchar(1);//SFG_fastsearch(1);SFG_identify();while(querenma==2)SFG_identify();if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text18[i]); //显示LCD12864并行显示指纹通过门已开IDs1=PageID/100;IDs2=PageID/10%10;IDs3=PageID%10;WriteCommand(0x88); //指定第三行显示位置for(i=0;i<10;i++)WriteData(text17[i]); //显示LCD12864并行显示编号为:WriteData(0x30+IDs1);WriteData(0x30+IDs2);WriteData(0x30+IDs3);jidianqi=0; //开门}else if(querenma==9){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text12[i]); //显示LCD12864并行显示没搜索到指纹}else{Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text16[i]); //显示LCD12864并行显示接收包出错}WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}void addfinger(){uchar i,IDa1,IDa2,IDa3;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text1[i]); //显示LCD12864并行显示请按指纹SFG_getimage();while(querenma!=0)SFG_getimage();SFG_genchar(buffer1ID);initialize51();SFG_fastsearch(buffer1ID);while(querenma==1)SFG_fastsearch(buffer1ID);if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text19[i]); //显示LCD12864并行显示该指纹已存储WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}else if(querenma==9){Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text2[i]); //显示LCD12864并行显示请再次按指纹SFG_enroll();while(querenma==2)SFG_enroll();Clrram();if(querenma==0){IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text3[i]); //显示LCD12864并行显示指纹采集成功WriteCommand(0x88); //指定第三行显示位置for(i=0;i<10;i++)WriteData(text17[i]); //显示LCD12864并行显示编号为:pgaeID WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);}else if(querenma!=0){WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text5[i]); //显示LCD12864并行显示指纹采集失败WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text14[i]); //显示LCD12864并行显示请重新采集}WriteCommand(0x98); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Clrram();}void deletfinger(){uchar i,j=0;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text6[i]); //显示LCD12864并行显示请输入删去的指纹号for(i=0;i<5;i++)dz[i]=0; //不输入时会默认为000 @@@Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30); //按键有抖动@@@if(Key==0)K=10;if((K>=0)&&(K<=9)){dz[j]=K;if(j<3){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x30+dz[j]);}++j;if(j==4)j=3; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}if(j>=2)PageID=dz[2]+dz[1]*10+dz[0]*100;if(j==1)PageID=dz[1]+dz[0]*10;if(j==0)PageID=dz[0];SFG_deletchar(PageID);if(querenma==0){Clrram();WriteCommand(0x90); //指定第二行显示位置显示删除成功for(i=0;i<16;i++)WriteData(text7[i]); //显示LCD12864并行显示}else{Clrram();WriteCommand(0x90); //指定第二行显示位置显示删除失败for(i=0;i<16;i++)WriteData(text15[i]); //显示LCD12864并行显示}WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);Clrram();}void gaimima(){uchar i,j,mima1[6],mima2[6];Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text20[i]); //显示LCD12864并行显示请输入密码for(i=0;i<6;i++)mima1[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima1[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang } //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();Clrram();j=0;WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text23[i]); //显示LCD12864并行显示请再次输入密码for(i=0;i<6;i++)mima2[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima2[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima 1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5])){for(i=0;i<6;i++)mimaID[i]=mima1[i];WriteCommand(0x80); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text26[i]); //显示LCD12864并行显示密码更新成功WriteCommand(0x88); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}else{WriteCommand(0x80); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text24[i]); //显示LCD12864并行显示两次输入的密码不WriteCommand(0x90); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text25[i]); //显示LCD12864并行显示一致,请重新操作WriteCommand(0x88); //指定第四行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Clrram();}void guanliyuan(){ uchar i,j;Clrram();WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text20[i]); //显示LCD12864并行显示请输入密码for(i=0;i<6;i++)mima[i]=0;Key=Keycan();while(Key!=queren){Key=Keycan();KeyDeal(Key);delay(30);if(Key==0)K=10;if((K>=0)&&(K<=9)){mima[j]=K;if(j<6){WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x0f);}++j;if(j==7)j=6; //@@#yinhuang} //显示LCD12864并行显示if(K==34) //按了删除键{if(j==0){WriteCommand(0x88); //指定第三行显示位置WriteData(0x20);}else{--j;WriteCommand(0x88+j); //指定第三行显示位置WriteData(0x20);}}}Clrram();if((mima[0]==mimaID[0])&&(mima[1]==mimaID[1])&&(mima[2]==mimaID[2])&&(mima[3]= =mimaID[3])&&(mima[4]==mimaID[4])&&(mima[5]==mimaID[5])){while(Keycan()!=tuichu){WriteCommand(0x90); //指定第二行显示位置按键1:增加指纹for(i=0;i<16;i++)WriteData(text8[i]); //显示LCD12864并行显示WriteCommand(0x88); //指定第三行显示位置按键2:删除指纹for(i=0;i<16;i++)WriteData(text9[i]); //显示LCD12864并行显示WriteCommand(0x98); //指定第三行显示位置按键3:改密码for(i=0;i<16;i++)WriteData(text22[i]); //显示LCD12864并行显示KeyDeal(Keycan());switch(K){case 1: addfinger();K=6; break;case 2: deletfinger(); break;case 3: gaimima(); break;default: break;}}else{WriteCommand(0x90); //指定第二行显示位置for(i=0;i<16;i++)WriteData(text21[i]); //显示LCD12864并行显示密码错误WriteCommand(0x88); //指定第三行显示位置for(i=0;i<16;i++)WriteData(text4[i]); //显示LCD12864并行显示请按任意键继续while(Keycan()==0);}Key=0;}void main(){initialize51();LEDK=0;Lcd_int();Clrram();wclo(ta);delay(100);//SFG_empty();///@@@@//SFG_deletchar(255);//SFG_storechar(1011);//SFG_fastsearch(1);// WriteCommand(0x90); //指定第二行显示位置// WriteData(0x30+((0xf0&querenma)>>4));WriteData(0x30+(0x0f&querenma));while(1){Key=Keycan();if(Key==0x18) //指纹刷机{Clrram();shuazhiwen();Clrram();}if(Key==0x81) //管理员操作{guanliyuan();Clrram();}rclo(a); playtime(); delay(100); jidianqi=1;}}。