|  | 
 
| 
基于51单片机的红外遥控指纹电子密码锁程序( a: [: n  ~0 h" R8 \8 r
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  
 2 A% @/ y, G) @) J3 \. b
 : c/ w: }4 y* `& w3 T$ ~. s" y( C#include <reg52.h>
 B3 `# R( A  R3 B* Y#include <intrins.h>
 9 d3 l" {" r" z4 X2 a# |; d#include"24C0x.h"* g2 Q. |. ]  V- A" a; K0 U
 #include"LCD12864.h". u# C" a$ j, I
 #define uchar unsigned char: f, |5 l" q  T1 c3 Z7 \
 #define uint unsigned int
 : G0 Z! a6 a. r+ }9 N( A
 w8 n# @0 |% D% y( X* g2 v#define buffer1ID  0x01
 O- Z4 N: K3 M% j4 @( _#define buffer2ID  0x023 Q( N' B' R/ h/ L1 D
 #define queren  0x88
 2 C- s3 @- G% @. A; K5 H2 |" w" F. e#define tuichu  0x86
 + z  z" n# W0 N#define shanchu 0x84& l+ i5 J" I& A! v" x  o
 
 n" i6 U9 Z+ f#define User 1                                     : L2 g6 ^6 F4 |* d& ^% g
 
 $ @. l. o, C$ e6 xvoid fan();
 ; T0 H8 N3 Q9 X) s9 \0 U& m
 a" z+ ?$ B/ @sbit B0=B^0;
 $ q) c- L. ]! M- F9 Msbit B7=B^7;
 % ]2 c) I; _/ Q4 U7 y8 Asbit k2=P3^7;) [  q  P2 |1 V+ M" w  |
 sbit jidianqi=P3^6;0 w  [, I( ^5 _
 sbit Feng=P2^0;
 : @! X5 R7 [1 j/ a/ m, m( O# m3 f! n, J. Y5 s$ q0 W+ m+ R
 extern unsigned char times[];
 % A  p& D+ P! }7 Iuchar  Member=1,sec;4 n& {4 f5 o4 p1 q
 uchar  ErrorCount;& X" M! T5 f* r* i/ J, U
 //////////////////////////红外相关//////////////////////////
 # k% L4 U8 B5 a( y7 z, ?//时间计算& ^% W$ N7 {. v5 P/ s) ]# e# N2 e! `
 #define Imax 14000    //此处为晶振为11.0592时的取值, % l8 o* G+ R* t" b
 #define Imin 8000    //如用其它频率的晶振时,
 # o9 I1 u: D3 d) I8 g: c5 R: R#define Inum1 1450    //要改变相应的取值。
 : X( F- j' a% K4 ]: J; k#define Inum2 7000
 . X; j# a! m1 c; m; I0 a/ C#define Inum3 3000
 4 \9 L. R$ M4 s# l5 u& U6 i//解码变量9 x$ V+ b/ |+ {
 unsigned char Im[4]={0x00,0x00,0x00,0x00};
 & {4 W5 d( q- s$ y  L9 J4 C
 ) @0 `! o8 C3 P3 [//全局变量9 z7 Q4 {& d, b3 t
 uchar f;) c# n! u6 y& \# J/ c$ g! q6 w& ?
 unsigned long m,Tc;
 ! t% b) Z9 G) l) R7 ^0 dunsigned char IrOK;
 , V; v! _7 l8 o- v, E7 n: F! C//////////////////////////红外相关//////////////////////////
 V! `  _& ~5 U2 u* x9 `uchar  code buffer[User][6]=
 : }2 C. k( e) N6 g6 t{/ X3 R6 X7 x4 K& h
 {"000000"}
 * K' G( J9 a/ {7 \: y- h2 W8 g# G};
 1 Z$ Q: a) b+ Z8 H, ]" Q* H
 0 Y; |/ r* O1 ~. G
 0 k+ n1 g: h( S" a. E, _uchar dz[4];) y' F4 X! |% ^9 W
 uchar time[4];
 7 V* c& P$ X9 E4 n; P# Puchar mima[6];; B( z# ]2 U. F3 q3 T) U1 l8 t7 E  Z
 uchar mimag[6];3 O& L! d4 I7 `$ J7 j" _2 S
 uchar mimaID[6]={1,2,3,4,5,6};. p! Y# H( N$ W  k1 d5 I1 k7 X
 - r" T: D  f. _8 s
 
 . a$ Y" S/ n3 E, j5 i5 xuchar Address1=20,tempx=20; ! V7 @7 b2 L0 Q- @( u
 uchar Address2=20;
 ; I7 [7 [8 e) i. @
 0 v* N4 q6 j1 |7 }1 ?" U2 Duchar data K;
 ; P# ]+ A* ^" kuchar data Key;' W* `" _6 p( j% D' Y/ g
 1 l  ?5 S" c/ F8 `
 uint PageID;( a& s' ^2 n: ^( k8 j0 E  H0 t
 uchar data querenma=11;
 , |1 G% o6 q1 v0 z  M# O2 guchar sum[2];
 5 K6 Z' u' A% l, u" m# wint summaf,summas;
 ; V6 r* c4 }  o7 s
 $ e5 E# b/ }6 u& huchar  xdata UserPassword[7]={0};//密码( E3 R, r, o8 t1 h* }0 R1 R' T
 uchar  xdata DSY_BUFFER[16] ={0};//缓存
 , O1 X) r5 [; c) r/ G3 s+ r6 c5 \: N% o, B9 [3 E- {" I
 
 6 s+ J8 Z. n( S: p3 d6 A8 Ovoid Red_Init(void);1 h1 c( B4 ^2 }% q
 #include "zhiwen.h"
 - a. V9 h1 s+ o9 P//检测脉冲宽度/ y7 H& K  |0 a6 J
 unsigned char check(void);# I) R: G& `5 G( A$ x7 Z" `
 0 ^' ]1 |4 X. P! A8 A* k
 unsigned char redchange(unsigned char rednum);
 * i; ?5 s3 f8 H- C8 J4 L4 t& |+ B- m7 c8 x
 
 $ U) |$ R# D+ N6 K' [void delayms(unsigned int z)
 : A, v% d) A9 x& |{
 ! M; F. b; D6 e, @& A        unsigned int x,y;9 U  a+ o) Z2 U2 ?/ p4 Y
 for(x=z;x>0;x--)( q* I9 G3 |* s4 v" C/ {7 P
 for(y=110;y>0;y--);# f# d* |2 X1 u8 e
 }' v! m( W& r% f/ }. f, f. b+ ~
 
 % }* X8 ]. A6 L/ S  V: `; T/********************************************************************. P% X0 S0 t8 L4 H% `
 * 名称 : Chack(uchar User_Number)  E; y  w) z7 D/ @* F9 {
 * 功能 : 单一用户密码检测6 i! B- e& A7 t9 Q  a% s# x- \
 * 输入 : User_Number6 g7 R1 |4 B! f! y0 N
 * 输出 : 密码正确与错误,错误返回0,正确返回1$ L- F: O% _9 V- \
 ********************************************************************/% a& w9 Q  h9 ?
 uchar Chack(uchar User_Number)+ e% j6 Y' n. p8 u3 k, N; [  O
 {! i+ X% V# H# B5 x2 N: e
 uchar flag, i,temp[6],Address;2 }2 v  J0 l/ X* y" F1 r  @
 Address=User_Number*10;
 & O% _% Q, l" |( D: \        for(i=0;i<6;i++)
 ( d4 [- @4 [7 s. P: U  P        {
 % P- q7 E( o, d0 b- S  t                temp=x24c02_read(Address);
 8 h" i8 O  ~; k1 G8 m: m                delayms(10);" h. \' b1 a7 E
 Address++;, L9 b& [# V1 z$ _& K$ g
 }8 D) }9 J2 I1 d7 Z3 m6 B
 for(i=0;i<6;i++)
 % j- X. `9 Q5 x' t        {
 3 z7 D( {' ]$ ]' z6 T                if(temp==UserPassword)
 " J2 K4 _4 j$ v) M- c$ \                        flag=1;* {6 @0 k/ B  U( J; ?
 else
 0 p- U  p5 n/ a# I, \- a                        flag=0;
 ; N! B4 l( P3 X0 m" e        }
 ! q4 Y% D% a# u) M, T                return flag;
 , o  |, d8 Z3 ~9 e( T: g6 j6 A}
 2 h- N$ t* I1 a/ l$ o
 ( b& G  }  T6 U7 m( a) L: E1 r2 F. H/********************************************************************) B: t2 o3 V- P
 * 名称 : PassWord_Chack()
 # _+ N) L4 K" g% K* 功能 : 所有用户密码检测
 P8 T, w; M9 m  @; F; P0 r* 输入 : 无
 ^4 p9 W3 ~$ q3 H5 K) z* 输出 : 密码正确与错误,错误返回0,正确返回1
 # [; F5 K1 f0 f) v1 h********************************************************************/' J5 Q. F: D. s$ t: m( [
 uchar PassWord_Chack()' z2 F. Y( t1 {1 A5 k; F2 n( i
 {
 # Z1 ?& X) r  B3 ^. v- |6 r9 L        uchar i=0;: @2 \; l2 t  u: k1 ]+ S. D$ @9 b  e
 while(i<User)" |  [' E1 a5 ]8 R
 {
 + f% \# c5 V4 s4 ?) |                if(Chack(i)==1)9 a9 O# e+ y' h6 U% N( W% W
 {' c; L$ P9 j; ^. _5 @3 p: v4 C" M( {
 Member=i+1;
 + h' }& |5 P5 t1 ?                        return 1;0 J' ^# c& ^0 x% d( A3 k
 }
 : ?# l5 y- h* p; ^: k- Q3 Z                i++;        / d- J+ P7 @5 }, u2 x% ]
 }
 % |5 _! D' x. K' N, j" v        return 0;
 * e+ X( M  y' p. D}
 & O2 W1 r8 g2 U9 m% b/ c8 z. b
 , F$ c! ^- p: L! m6 S( pvoid delay(uchar tt)
 8 n& ~7 Y; O) ]5 y{  uchar i;2 V7 a9 ~8 E, t/ W0 U- l
 while(tt--)' u! [1 w* V" i. i2 F: c, `; U# r
 {7 D7 C5 o2 k5 |
 for(i=0;i<125;i++);9 a0 f7 r3 H  v1 D% D* `
 }1 Y+ [0 A. }. V% x
 }
 % K( j- j  q2 i3 v4 b/********************************************************************- [" b4 J3 c( n' ~( a
 * 名称 : UART_Init()5 Z/ ^( d' x1 u$ H
 * 功能 : 单片机串口初始化
 . F7 \1 B2 l+ N* 单片机:晶振11.0592MHz 波特率为9600bps
 0 }- b- s0 H. S* 指纹模块:波特率为9600bps,
 / |( F: k0 `# W, S5 ~5 p********************************************************************/        3 e/ _' R. o1 I8 Z' i
 void UART_Init()& `( l, M& j# e- V
 {  M1 M( h1 K& f/ C+ U. D
 SCON= 0x50;               //串口方式1        //REN=1; 允许接收
 + m) {4 A! _0 u: J8 v        PCON=0x00;                //SMOD=03 W- f) @' f3 \
 IT1=1;# A# ?$ i7 C. G& m7 g8 D
 EX1=1;
 6 n" V( ^, J6 q% N& i# I        TH0=0;" D& x9 [2 x& N! ?
 TL0=0;
 ; G7 Q# y" [/ b( ^9 u3 u        TR0=0;
 $ F: \+ e; n  T( h' v7 D* V* M+ Q  u        TMOD= 0x21;               //定时器1定时方式2/ r8 z3 U7 m6 a
 TH1= 0xFD;                //11.0592MHz  模块默认波特率为9600bps6 I1 i9 p8 i: I
 TL1= 0xFD;
 ) u+ V, U7 Q6 y4 M        TR1= 1;                   //启动定时器 * @1 E) D4 Y3 B4 ~5 v% y
 EA=1;       4 Q& Q2 p) u$ O6 Y  _% l
 }) P; t/ Y- y4 J2 T1 g5 h2 e0 b
 
 1 Y3 _+ r7 X$ \+ [unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线
 3 C9 t* O+ f- u2 @) X4 X! V1 t" C9 D{
 ) K/ q- C' F; }  unsigned char rcode, ccode;* {2 P: }# l* C  z" M+ V7 e
 P1 = 0x0f;      // 发全0行扫描码,列线输入
 ) I# ~( ~- w* `$ P- z; Y  if((P1&0x0f) != 0x0f) // 若有键按下
 3 [; E6 r! U. ]  {# @- |" ~1 q  }  l$ K5 K# _
 delay(1);// 延时去抖动
 % H3 J" _$ B. \7 F, O    if((P1&0x0f) != 0x0f)
 , b8 a# e2 C2 A7 f    {  rcode = 0xFE;         // 逐行扫描初值
 9 r9 h" J3 N# b" [' a    while((rcode&0x10) != 0)2 q! G4 ^& [' t4 L1 b
 {
 ! B; f- Q+ g& _' D. ?       P1 = rcode;         // 输出行扫描码7 L' @! L) r( \  m
 if((P1&0x0f) != 0x0f) // 本行有键按下
 4 U: w" Q+ c6 h- e9 w! O0 t& ?      {4 Y6 C& e) i' I! A! D
 ccode = (P1&0x0f)|0x0f;. t( w  Y3 ?+ A  _: u8 ^- U8 I0 E, t
 //do{;}+ _5 k( q1 v& @7 j8 z
 while((P1&0x0f) != 0x0f); //等待键释放0 L' @) o- w1 a5 Q( _4 _
 Feng=0;
 # o1 q7 w7 q7 ?0 J/ M        delay(100);
 , c9 K! O" Q6 V% k2 b2 H! ~        Feng=1;
 : H3 i0 Y" g* `7 H       return ((~rcode) + (~ccode)); // 返回键编码
 : `3 @& k& J7 T. D      }
 $ X/ Z3 z  g; a8 }$ a* \9 R    else
 ' j9 ?6 v* k. E# m    rcode = (rcode<<1)|0x01; // 行扫描码左移一位
 , o7 R" G! l- |0 J  C8 ^    }
 ; W; v3 o9 I" z: v/ j7 Y; H% M1 r    }* G+ j; T' e! i) T5 Y
 }
 ) j0 K4 o$ J: R5 a# k4 G  if(IrOK==1)( ]9 u9 X* N1 ^' v  ~
 {& Z# M: Q0 X+ r8 F
 IrOK=0;% g% Y, Q$ J' E( u
 Feng=0;
 3 @' ]' B1 e$ ^, z( Q/ x   delay(100);
 8 v, d, {" l) T$ ~% a   Feng=1;
 R8 N) v8 l) @5 e   switch (Im[2])3 b5 S* |/ J3 T4 P8 X
 {% J( O+ o9 b+ N* ], i
 case 0x16: return 0x28;break;                  //03 R" Z) M" y+ Z! a+ H" V
 case 0x0c: return 0x11;break;                         //1
 5 Y6 m% u& e! V( e7 `8 p        case 0x18: return 0x71;break;                                //25 S; b$ V4 L3 Q2 A
 case 0x5e: return 0x41;break;                                  //3
 [; L. u1 S, R        case 0x08: return 0x12;break;                                        //4% K4 q+ w6 {1 r, S7 Q/ o
 case 0x1c: return 0x22;break;                           //56 @1 ^  b2 Z3 P7 I7 U# Q
 case 0x5a: return 0x42;break;                                //6
 6 P- D& d+ k; g/ E" X        case 0x42: return 0x14;break;                                  //7* e' t3 _4 a4 G
 case 0x52: return 0x24;break;                                  //8# w! O, C' T7 R5 z& p- A3 h
 case 0x4a: return 0x44;break;                                        //9  z6 f( N% B* H, b7 A: G
 case 0x47: return 0x81;break;                                         //a7 |0 `9 D7 \: X% `% g& z
 case 0x43: return 0x82;break;                                          //b
 , O& K' i! R& A- K& n        case 0x0d: return 0x74;break;                                           //c# ^0 ]+ Y' i, Y# c' Q# e
 case 0x15: return 0x88;break;                                                //d7 J$ L3 A* n0 X, x8 }
 case 0x19: return 0x48;break;& i/ v9 e6 S4 G9 q  W& X/ C- g2 x
 }
 0 E1 |% I8 N! i3 \. i7 u  }
 - U$ f7 P0 F: F& z9 k  return 0; // 无键按下,返回值为0
 / S5 q; U2 |+ I3 A}
 2 G( l, ?  D$ ~
 / S* V0 W3 J, V' B' evoid KeyDeal(unsigned char Key); p) W! J2 e) Y$ M4 a" o/ V
 {  //unsigned char n;
 . q( f4 C, J$ L, T3 V' N   if(Key!=0)
 ; }# `$ e9 u0 P% F+ w. } {* z3 X, J; c  @( E/ N
 
 & w7 C9 S5 E& Q' Z( x; Q- L6 {# H                   switch(Key)4 ^( v9 `7 ]0 c7 A$ V) ?# A
 {
 2 X/ w' y, Z2 G' O2 B9 M( @                   case 0x11: K=1; break;         # g2 k$ {, B/ y# z& `$ P
 case 0x21: K=2; break;
 # I! v- j. p- d' Q                   case 0x71: K=3; break;  4 u9 R. ?! T: x+ k# c
 case 0x81:  break;
 6 D( |8 v& L& R4 w+ \                   case 0x12: K=4; break;0 k& x$ G9 s2 g! v& ?
 case 0x22: K=5; break;
 ' L* ^, X, k% ~2 t( [                   case 0x42: K=6; break;
 6 g0 [5 k5 [* \# I                   case 0x82: K=34;break;
 % x6 A5 C) `+ }) c! z                   case 0x14: K=7; break;
 ! p5 W0 p# P6 v: J* Y* g                   case 0x24: K=8; break;
 + s) q. b5 f- [2 b! [                   case 0x44: K=9; break;
 ) z% W: x- h$ g4 g                   case 0x74:  break;
 . C. \( L' x0 I  d, X" Z                   case 0x18:  break;
 4 g% o8 r/ |8 I. v+ @  x                   case 0x28: K=0; break;, f9 p' D4 {3 B! p6 u' A
 case 0x48:  K=11; break;
 ' T1 F% b$ e  ?+ [3 Z( d: O                   case 0x88:  break;
 " S5 b$ o6 y! d6 X" T3 V                   default: break;
 4 I' a) o, {& X+ P0 ^& o; f$ x2 X                   }5 |; x/ u% r! c! a
 }) R# P; w- l' S2 E! w, J
 }
 ! X- a2 a' k, {9 ?/ w4 Z0 e) t
 , t$ J* L$ e0 i- ^9 B2 f
 $ ^" A5 p3 a$ q  e6 bvoid shuazhiwen()
 0 @, T- T$ B. f' i6 W{1 c) n% v( g& y) w4 X2 u/ X
 uchar IDs1,IDs2,IDs3;         9 G9 N+ G6 K) e3 N/ \* s) Q
 LcmClearTXT();
 $ c7 c; Z2 \; C" G        PutStr(1,1,"请按手指开锁");
 / s6 T; p1 h. c8 \) m1 m# n        SFG_identify();) A4 L2 I* |: E3 {+ j0 j3 j
 while(querenma==2)
 : @. J6 F) a, _8 U$ n        SFG_identify(); 3 l: T& I$ q# }/ t  O6 n8 r
 if(querenma==0)( K; K. y7 Q! o  e# J7 e; ?2 ~) O
 {9 b; S( B4 h7 b- L
 LcmClearTXT();  _" f4 T) q: Q) e8 i
 PutStr(1,2,"门已打开"); , x' S2 }4 _8 @  J4 C) e$ G
 IDs1=PageID/100;
 & f  e! @: q* }+ q5 h                IDs2=PageID/10%10;4 ]+ t. P% c8 h8 S- r
 IDs3=PageID%10;
 * z7 C* E2 O) |                PutStr(2,1,"编号为:");1 d: T0 [) X4 J3 |& L. _
 WriteCommand(0x8D);                //指定第三行显示位置6 v1 I7 _" q" L! R" B
 WriteData(0x30+IDs1);: N* t$ H6 E$ ?+ _4 l4 s
 WriteData(0x30+IDs2);1 a% _7 x. y* C( }  Z0 F
 WriteData(0x30+IDs3);
 ) _2 O; I1 H  w/ g. f0 r0 F9 r                ErrorCount=0;
 ; K# N/ T  R+ Z                Feng=1;* Y% G9 V7 g5 I1 w  g) B* R, _% g
 jidianqi=0;; x$ R  \% `& {) d- [- Q
 delay(2500);
 2 p. {' D; \5 W" d# U6 C+ l: g9 X& Z: B                jidianqi=1;
 4 h3 ~, K% E$ x/ o
 . h; Z4 ]8 r/ N        }
 3 ^7 O& y3 k. t$ t           else if(querenma==9), }3 |# ?* P" \
 {8 r0 e! \, o" H( \8 _4 U2 P
 LcmClearTXT();
 & s0 R2 [4 ]. w! y$ n                        PutStr(1,1,"没搜索到指纹");2 g) _- P" M3 Q5 X& B
 PutStr(2,1,"请重新按手指");
 % I. a1 O6 m; |( w% O                        ErrorCount=3;
 - @) f- P, B' D# W; }/ h. ?- O                        Feng=0;. R9 }& H; z! P3 A1 ^3 U
 }9 g1 j' G( P3 M6 z0 f( G9 T( x
 else
 & ~# |. [# ^8 B' J8 ?3 R                {4 c/ G, V& y9 l) a! Y; W* h$ o  ~/ E
 LcmClearTXT();
 ; i5 G( V' T! f9 o5 P                        PutStr(1,1,"接收包出错");
 % F7 ?8 d$ T1 B% I0 Q                }
 # Y2 X& `5 \$ n5 x                delay(2000);. a3 t( F' ]4 j7 V  m  F* t: U
 //         while(Keycan()==0);. V( Q8 l2 n9 [' }( c
 }# L% s$ O3 l8 X- i* {8 @
 void addfinger()* d+ q# V$ ~. \# R  s8 M
 {3 Q" E, X0 i" x# P
 uchar IDa1,IDa2,IDa3;" }8 z! H" P' L0 f6 Y! M
 LcmClearTXT();- E. Q7 x8 v6 U" k  K
 PutStr(1,2,"请按手指");    / [2 [0 n; ^' x3 ?
 SFG_getimage();
 9 I7 o  x8 t2 O% c& e1 `: J        while(querenma!=0)
 ( f2 i$ W8 O: ]8 B& A        SFG_getimage();
 , P, \" n% ~3 u! f        SFG_genchar(buffer1ID);
 3 M- [3 E  {* H. W3 w1 E        UART_Init();7 _; l+ @& e) W
 SFG_fastsearch(buffer1ID);! t' L9 N6 q' d+ k
 while(querenma==1), a( i3 x: F- s# @6 h
 SFG_fastsearch(buffer1ID);
 9 n( }4 {: h& R" e; D5 J4 I9 u5 b+ i% m
 if(querenma==0)7 N) L# F; G: x: z; N0 w+ |
 {5 o" |2 n% g2 z9 Q
 LcmClearTXT();
 + |1 P% a( \8 K9 s                PutStr(1,1,"该指纹已存储");, o8 l- ]0 p3 Z& t
 PutStr(3,0,"  按任意键继续");
 * W# Y+ y6 C3 J2 v. q            while(Keycan()==0);8 D3 _; K, E7 U. c7 y6 Y, O
 }
 $ e* x1 v! \' }6 W9 I        else if(querenma==9)
 & N! U  I, c6 H+ g1 |* j4 i                {
 / m1 J8 s, y/ f) `/ Q* B                        LcmClearTXT();* t% Y; N) f4 P; P0 y
 PutStr(1,1,"请再次按手指");
 ; G7 b8 @% q, \                        SFG_enroll();' n  V2 P' v- k+ L. ~( s: x$ v5 Z
 while(querenma==2)
 + H3 f' P8 W, I8 s                        SFG_enroll();+ q/ d& j; K- n  F
 LcmClearTXT();1 s% z2 ~' T( n9 u' @0 u
 if(querenma==0)% [0 a! ?5 u1 F
 { + s* e) F) b0 M
 IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;1 |: K% Y, z6 N: [& H
 PutStr(1,1,"指纹采集成功");
 0 k9 \0 `, f) U2 s  Q" D                                PutStr(2,1,"编号为:");% U4 j$ h2 `' r, O3 u6 |
 WriteCommand(0x8D); 8 R7 @! _# f0 _# p: m4 L
 WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);
 " q8 U! d( N. p4 a% D                          }
 ! e) K1 w1 h! [. v# V% X; G2 J                  else  if(querenma!=0)
 7 W4 F8 [/ i" B# s/ U# d% `7 r                          {. P6 d9 B$ a  [, W8 y
 9 E" X: B! B) x/ I
 PutStr(1,1,"指纹采集失败");3 G" X& w5 p3 e8 m; _) j7 H" E8 w" [
 PutStr(2,1,"请重新操作");( U! E: R* Q" C
 }9 E* x! N; W6 t$ j& v; p
 PutStr(3,0,"  按任意键继续"); 7 u7 B) q0 t' i$ n. m
 while(Keycan()==0);: v  F- i" m0 d8 V- l
 }+ r8 @  x+ _; I: X5 l1 L4 F
 LcmClearTXT();
 % z0 O$ a$ u8 N                         PutStr(0,0,"按键1 : 增加指纹"); ! k% O& }: C3 `; `4 }
 PutStr(1,0,"按键2 : 删去指纹");8 L# |; U  I. R: I5 U+ |. k
 PutStr(2,0,"按键3 : 手动开锁");; i' G: D; \9 {/ P. n1 @2 Z+ v- S
 PutStr(3,0,"按键4 : 修改密码");1 b+ ^( t  z' E) n; |
 }' K5 v/ {' p; a' G2 b
 void deletfinger()
 ) k2 U6 U) i0 ~, Y! E8 x{, n7 t; y8 V7 g/ i. o  R8 W
 uchar i,j=0;
 + j! z! q1 B3 Q. r+ S; C- }        LcmClearTXT();
 4 O8 U) p" S/ O5 i) s$ g$ U, Q! p        PutStr(1,0,"输入删去的指纹号");
 0 _; j9 E+ X2 {: }        for(i=0;i<5;i++)dz=0;        % C2 X/ {$ J& H) R  t7 l6 g
 Key=Keycan();/ E: j& m4 j! n4 O3 a& u
 while(Key!=queren)
 , ]' x; D$ f$ U  v           {
 / P. ^" Q2 f5 p# ^5 _! J             Key=Keycan();
 9 D2 [$ v7 Q# A, B             KeyDeal(Key);
 " {/ B& D4 ]1 }             delay(30);                                                              //按键有抖动@@@2 m' F5 ~5 i9 \& Z3 x# t
 if(Key==0)K=10;2 B9 ~2 h) W! w
 if((K>=0)&&(K<=9))2 l- r. p. c" ~
 {
 ( ~: t- G3 w/ u* y2 z) `* R              dz[j]=K;$ l3 f* A" e8 i' ~/ i, V+ h
 if(j<3)
 7 Y$ `) u6 d8 P/ L# Q; J; A                  {        " |1 X5 i1 Q- |* H' ~& J
 WriteCommand(0x88+j);                //指定第三行显示位置
 % b; Y# R2 Z: ?" T4 u9 ?. P7 p4 K3 {                                WriteData(0x30+dz[j]);
 V$ b1 I/ V0 c& T                  }
 : {: k( \0 ]2 t7 {              ++j;8 e9 o& n3 ~1 [9 f1 N
 if(j==4)
 * m( P0 [8 J9 j8 G              j=3;                                                                                                   //@@#yinhuang
 2 K  M7 K" l# g5 a+ y3 b8 J  {             }   //显示LCD12864并行显示
 9 S: x) H/ @  @, ~2 D* U  |                 if(K==34)                //按了删除键
 + A: C9 w* n4 K% ~* Z( y$ L                  {
 - Q  r7 l* _; |: l/ u# }                    if(j==0)3 L9 O  m# _- M$ V' a0 i
 {
 9 n' o6 D0 W5 b& _# ]8 G+ c4 e                                WriteCommand(0x88);                //指定第三行显示位置
 8 p; Y  Z+ Z# v3 `* E; f                                WriteData(0x20);9 U, ^( l1 D7 F2 f
 }
 $ n) ~2 J( L' A                        else' ~  `0 ~2 U0 `
 {
 2 j5 H' C* ^# T1 ], K+ {                                --j;
 ) F8 W" \, }$ [, v' v" S                                WriteCommand(0x88+j);            //指定第三行显示位置
 8 g3 s& z" E" b                                WriteData(0x20);7 q+ {7 |7 n; s0 }# I
 }
 ! o3 P5 ?& c/ l( @8 k" O+ ~! H( n9 D                }; H, V) e: W) [3 w# x5 n1 x
 }
 5 ~1 e) i. [; \2 h% ~+ g        if(j>=2)
 - u3 z9 w2 K5 m4 Z- l& H) b        PageID=dz[2]+dz[1]*10+dz[0]*100;# |3 a! G% L% a% I# S  m
 if(j==1)
 . {& t  C. W! p7 D        PageID=dz[1]+dz[0]*10;( ?# W/ R( C$ a) O, T
 if(j==0)6 u, n0 b" W9 y) f& ^
 PageID=dz[0];
 / A( R0 K/ p' E3 w; Y        SFG_deletchar(PageID);7 ]% r6 o' Y) X/ @; }' X& A# q
 if(querenma==0)
 7 q9 n% `1 B$ L2 M) \6 N        {1 U- g9 b1 ~4 X: s3 F0 T+ \8 C; F" D
 LcmClearTXT();; Y- f) ]( z9 h, h) k2 ]
 PutStr(1,1,"删去指纹号成功!"); 7 @# t  @3 t! [& i
 }* G3 O& H2 z2 E9 A9 x
 else
 # b/ r* w4 b- @6 |2 W; T        {
 + m7 C$ q9 E2 S  h4 X) O" b1 ^                LcmClearTXT();
 : [, p3 F' y. D                PutStr(1,2,"删去指纹号失败!");
 ( r: M* N/ j& f& |( S* k        }+ h, x6 j9 C! {( [
 PutStr(2,0,"  按任意键继续"); 1 ^# [4 D  I  c
 while(Keycan()==0);
 ! H: N! O; b/ m7 r, |# Y+ N. |        LcmClearTXT();$ }/ c8 |- ~/ }  ~' A$ W9 B
 PutStr(0,0,"按键1 : 增加指纹");
 3 U. a# t. q+ m/ E% K                PutStr(1,0,"按键2 : 删去指纹");
 % j" Y/ x- a; |% T1 Q8 e                PutStr(2,0,"按键3 : 手动开锁");- o  P8 Z; d& u  V  u) d
 PutStr(3,0,"按键4 : 修改密码");( F9 v2 R- i0 ?/ K, \" L
 }6 @5 x  D, S) n0 U* Q9 e
 # c5 G/ E5 v" ?( m3 G
 void gaimima()
 " z4 J3 ], a/ T{
 z. d' w9 W5 K+ m0 B/ q+ f2 B$ G        uchar i,j=0,mima1[6],mima2[6];
 ) e' r7 ~) P% e5 j/ i" x! D7 P        uchar k,temp;& W) e: n$ I2 J- N' g0 q5 ]
 LcmClearTXT();4 J2 D1 K0 o: v" S, }$ R. u" Z3 o. Y
 PutStr(1,1,"请输入新密码");$ E" p# }6 Q" ?$ g
 for(i=0;i<6;i++)mima1=0;
 7 c) g% K( i* L& X( f6 I* A0 Q           Key=Keycan();
 ! k# v% T& l* J6 H      while(Key!=queren); N' t6 E+ R9 v; |+ c& e4 ]1 q. N
 {
 + K0 P0 o/ E: }- H  ?! u( Y- ]             Key=Keycan();! O. A* F* r- a! x) B, Y
 KeyDeal(Key);
 : A# [, Y# Z# s# |  Z! a             delay(30);
 ! w, r1 H8 A7 o; D             if(Key==0)K=10;5 ~) S+ s. o! l  e% s) t* n
 if((K>=0)&&(K<=9))& P  B9 z7 U2 p: K; d8 \1 r' ^6 k
 {
 6 Y. s, ]( I7 W9 l; q- @* v              mima1[j]=K;3 V; R- @4 d- f# H1 Q* Z0 _1 c
 if(j<6)" u" L  s/ \; |: l
 {        0 O* I* R/ v& a7 r0 f
 WriteCommand(0x89+j);                //指定第三行显示位置
 ; n' Q6 j+ [3 {  q0 g. I                                WriteData(0x0f);
 , |# B6 j" m; D3 a                  }
 2 ^6 N2 s3 N' s8 K5 ]" s- ]              ++j;( f+ |5 U" j) D7 p: Q% J4 A
 if(j==7)) f7 T7 A+ D. u! q& t% i& f
 j=6;                                                                                                   //@@#yinhuang$ L& J1 m4 V% H1 f3 F
 }   //显示LCD12864并行显示
 ( v7 ^- y/ }% \* ]% L  u                 if(K==34)                //按了删除键+ g9 d; V$ K3 G) r
 {
 & h6 j& R7 n. @$ ?2 L/ W$ H                    if(j==0)1 a  I$ C: y$ O" Q3 B+ p3 A& \
 {. c  h" W. s9 l, k1 H3 _; D# j
 WriteCommand(0x89);                //指定第三行显示位置/ `# F/ W7 M& a( e0 z
 WriteData(0x20);' \& R3 g6 a  G- P& e% J8 N# Z
 }8 ~/ |! J7 v4 ]/ r# I# T1 w
 else
 6 Y7 V9 K( {! F7 j! Y/ y8 V, \6 U$ \                        {
 , \7 w- H: V& I5 S) E- \                                --j;
 . m$ e& l) D! [* Q; C                                WriteCommand(0x89+j);            //指定第三行显示位置
 ! i9 g+ I9 C! S( {+ [                                WriteData(0x20);
 + k6 \+ v9 Y" D! K) L/ c$ H' R# f: t                        }
 , `6 }2 u( N5 |, S/ P# z3 K                }; G, D4 b0 x' z
 }
 3 f' w4 ]5 n5 ~) U! L1 }. t' C2 K        LcmClearTXT();# `1 Q( F. O+ ~' @, k+ R
 LcmClearTXT();
 ! g6 `' C2 _$ B) S        j=0;
 # K/ F# z4 b/ `2 W        PutStr(1,0,"请再次输入新密码");
 & ~8 X, D) t+ K& o        for(i=0;i<6;i++)mima2=0;
 9 b! n( r# o5 s) \0 c0 T, j8 X1 n           Key=Keycan();
 4 o. M: U1 G; Y/ t4 r" H      while(Key!=queren)) [. z+ {( L4 m5 T
 {2 e- t9 u7 Y% ]% L; @$ g5 l
 Key=Keycan();
 7 E8 D5 t& e- }( j; e             KeyDeal(Key);
 9 ^: x/ p% N' W+ M             delay(30);
 ( D$ @, [/ p& c7 Y5 P             if(Key==0)K=10;
 - A1 C; {1 J/ U- g: X9 ?0 V             if((K>=0)&&(K<=9))
 ! n9 q( |3 h3 h" _5 \/ |+ q             {% y' @! h- p: s* ~, G6 F
 mima2[j]=K;* M% V2 l3 s+ S6 B4 s* q7 C
 if(j<6)6 L  ~+ I8 R3 K! R: }- `, W
 {                3 f3 q' ]3 B* R" q% v
 WriteCommand(0x89+j);                //指定第三行显示位置
 3 B) W6 w" o+ Y- |                                WriteData(0x0f);          g7 T5 c# I) E: c
 }: U# K* n9 H& X# J+ D
 ++j;
 ( a- S6 Y. l6 N  S% |                  if(j==7)
 / {: |. f" S* e8 N9 N              j=6;                                                                                                   //@@#yinhuang. o% H0 q5 P: T
 }   //显示LCD12864并行显示
 `3 K6 e; w6 a0 ?                 if(K==34)                //按了删除键
 : h% v  @$ v" [: O. `# t7 \3 b. u                  {6 N- K. Z0 r  V, K
 if(j==0)
 + P4 a4 X% h4 l" ?2 o, H: O* Y! }                        {
 0 W) W1 ~; ]& o/ G0 K+ }" Y2 t9 G' u                                WriteCommand(0x89);                //指定第三行显示位置! d5 j. F1 ^; X
 WriteData(0x20);# f  u# S4 W* v# a& J
 }
 4 \8 D+ a# X3 `8 U: T# `                        else
 . A$ T+ N, \2 S                        {5 v8 X* y$ W8 ]9 {0 d6 a
 --j;; {" g* }' v$ W
 WriteCommand(0x89+j);            //指定第三行显示位置$ t+ A( S; B$ b
 WriteData(0x20);
 , ~, a6 E3 m9 c0 p                        }
 * s- e6 Y( b/ E4 d5 a                }- `  N, b, f$ ]$ K" Q7 {% ^" }
 }
 1 o" Z0 f9 ^: g& f4 H0 L. V        LcmClearTXT();
 g+ U. r1 f" b) O. W- @1 o        if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5])): M1 y5 }& Z& {+ q  _2 n
 {
 ( W! f' C8 k' f% i; }                for(i=0;i<6;i++)
 " ?* u1 g( ~' p# Q                mimaID=mima1;5 Z9 n% X+ }! X; v/ C5 J1 Z
 /////////////////////////////////////////////////////  A/ x; h; Z! v* {2 f: q
 for(i=0;i<6;i++)           //密码限制在6位以内
 * j6 P+ Q% L' Z7 d                {
 ; b2 T* q# t, j" D7 ~. M                        UserPassword=mima1+0x30;
 2 P8 t/ ?$ I) ^6 b0 \% Q/ D                }
 1 g. z% T* \( b- m  ?/ w                temp=(Member-1)*10;
 / T7 e! d+ S8 _! G# s) ]7 @  b                delayms(5);  \. G. d" T# @2 q9 ~+ k
 for(k=0;k<6;k++)
 ) p) u4 x" i$ k) a9 h                {0 u1 v  S& J1 v1 J: ~6 t0 e, H
 x24c02_write(temp,UserPassword[k]);
 # k+ s# {8 P- a+ X0 B                        delayms(10);
 0 n4 Q, _( r% \# o: J1 I                        temp++;
 5 w+ Q2 H/ ]% J5 D2 c! |- w# E                }  3 \# u' X( O( Y  d! a- c* h
 //////////////////////////////////////////////////////
 ! p# R, x  t/ F& _9 y                PutStr(0,1,"密码修改成功");
 , ^' b) X' d8 {5 R0 N                PutStr(3,0,"  按任意键继续");
 + S8 X( i2 K, D8 Z8 b7 C, f; Q' j                ErrorCount=0;
 4 {! i% Q% j6 k5 G4 N* Y! A( |                while(Keycan()==0);! ]; @& u( l7 s6 p& t' B3 s
 }
 - ~4 F0 z$ r9 j+ y! D: V3 l        else% H- V% V9 q; @5 W  H
 {, Z9 m/ [3 Q  }  Z
 PutStr(0,0,"  密码修改失败  ");0 G: l1 L: z: H( C+ Q$ l& M! D
 PutStr(1,0,"两次输入的密码不"); ! [- ?2 Z: l# p4 |% r' x, x
 PutStr(2,0,"一致,请重新操作");       * `, `  G2 _# W3 }) \# q2 u* g! s" {
 PutStr(3,0,"  按任意键继续"); 1 F% {5 @: M6 J+ P6 F
 while(Keycan()==0);
 * ]! y, z  ~. p5 [        }7 c$ k# K8 i% Z9 F5 z$ k
 LcmClearTXT();, J: S' X  M3 H7 U9 D
 PutStr(0,0,"按键1 : 增加指纹");
 0 {1 Y( D' S; |' q                PutStr(1,0,"按键2 : 删去指纹");9 ^# i, N6 N% B. n. `' E& _" n
 PutStr(2,0,"按键3 : 手动开锁");
 * {4 b* b! t5 c                PutStr(3,0,"按键4 : 修改密码");
 * j6 {% C% @+ Z; k4 ]& u1 A}
 * v. b3 g- k# N5 v1 P3 w( t7 _' W+ e% E, m
 
 ; Y$ _. }( a! @' y( ~0 C, u' hvoid zhu()
 " h0 k9 r! Z9 E" x) a) h{           4 R0 b$ O/ Y" r3 {) r
 LcmClearTXT();
 3 Z1 p+ \( Y+ W6 y  N( J6 t2 Z        PutStr(1,2,"门已打开");. S) k5 u  O2 g% k2 K7 L0 f# X
 jidianqi=0;
 " Y: T5 R/ W- N0 T. T4 I. V        delay(2500); 8 R- {9 j5 Q% R5 l. R- a
 jidianqi=1;' y+ z* U' }  }3 g1 K2 b
 PutStr(3,0,"  按任意键继续");2 R) O3 z) T( X& ^6 j5 F5 Q
 while(Keycan()==0);' n* T6 U$ E. R9 L6 L% f; p
 PutStr(0,0,"按键1 : 增加指纹");
 * v3 _; W4 `3 I& [. F- r$ O4 u/ j                PutStr(1,0,"按键2 : 删去指纹");
 * o, k" w4 p+ Q! Q+ l/ ~! g! t                PutStr(2,0,"按键3 : 手动开锁");
 U* d, s9 B! @1 @2 M                PutStr(3,0,"按键4 : 修改密码");
 6 |6 ~+ u# k7 n: `+ {( N}
 7 U+ d! Z& l5 k* O
 0 g1 O4 }2 J' B4 ^, |) j  F. x# z* V) e' F; }; p
 void guanliyuan()& {9 G& @1 i% N6 q6 T2 C0 ?
 {    $ f) l- S# |& a' u1 w) c, ^1 t
 uchar i,j=0,x=1;9 h3 j2 o- ?& d6 z' b, O
 uchar Right_flag;
 7 [! \4 M2 T9 x. n& {" E      LcmClearTXT();" L  R7 J. z) i6 e
 PutStr(1,1,"请输入密码:");
 - r) v$ |2 c0 I& W/ W6 @           for(i=0;i<6;i++)mima=0;                                                                        8 N: s( |' B) r
 Key=Keycan();4 d0 P# H/ y9 l( A
 while(Key!=queren)5 A# U% \) d. g( ?8 f4 f5 n
 {
 3 A/ c" c, ]7 {5 W) N             Key=Keycan();
 2 m- S# ?# N7 s. e, L% R$ K0 ?             KeyDeal(Key);, K( M1 i/ R4 p' n. e2 H8 K
 delay(30);                                                              ) X( K. h( x3 X
 if(Key==0)K=10;, t3 Y9 p# S7 N3 @$ P) Z
 if((K>=0)&&(K<=9))
 + D8 z- a9 g  J/ t             {
 . l+ ~! t: J+ e* @- p  A              mima[j]=K;8 \- Y7 g! \  [9 `  F
 3 y& `9 g3 y) E* E5 ]- ?' D+ {
 if(j<6)! j9 `) T  A) J
 {        0 S7 W: x  c- Q2 W, L6 A
 WriteCommand(0x89+j);                //指定第三行显示位置0 I: y6 }. e0 ~- N
 WriteData(0x0f);        * J: G7 K# e1 j: Y  v
 + p& Y; q. O5 z- e) a& l
 }# Q1 K) E4 Z! N# O, i8 U) T1 `! H
 ++j;
 0 a; H* I. {+ P; g! O$ o                  if(j==7); M9 t* D3 [6 t" ~; |" a. O
 j=6;
 $ e& W' p2 g3 _& |4 z' t             }   //显示LCD12864并行显示 " @; r& d" @" O1 P; G) ~' z
 if(K==34)                //按了删除键+ s1 I4 f( n* n# w8 \  C
 {+ Y  O9 {1 s4 n& E0 M& l' n
 if(j==0)8 `, [1 Y2 c) I# ], F' p
 {
 : Q6 `& U$ l5 ?; n- i                      WriteCommand(0x89);                //指定第三行显示位置: i, x+ h% B( w" d
 WriteData(0x20);
 8 Y* _" ]: X1 M  U/ W                        }- G- i6 L+ R% n2 ^1 F1 j
 else) S3 d6 Z+ j: E" x( I
 {
 1 z, B& {  ^' k, {4 x                          --j;
 / |, e9 \' b9 b* b* J8 M  j                      WriteCommand(0x89+j);            //指定第三行显示位置- ]( ?. w! ?/ q8 J" ]- d# I
 WriteData(0x20);
 1 c" |) f1 S* O$ [9 D5 |' `                        }
 2 l- Z. U, h9 c7 E3 c, c( q0 _                  }% I* h  p. C7 [2 w! D7 |* H1 l
 }
 3 U* C& a. K$ ~/ W' [    LcmClearTXT();
 8 e# x  z& s. w) @# M
 % x) [& T* j7 }- l
 ' g9 x1 `5 Q3 d          for(i=0;i<6;i++)7 r. }5 o! d! k+ g1 a; J- r
 {1 s  N$ l) R6 Q3 m8 ]
 UserPassword=mima+0x30;, [$ E+ W' a3 \) G9 t' H& D0 A
 
 $ \: d' x2 L1 F* U& T  [          } / k# q. |  i6 p+ f
 if(j==6)
 ; I0 _: o1 V% U7 [          {9 _& x, g3 D+ w
 if(mima[0]==1&&mima[1]==3&&mima[2]==1&&mima[3]==4&&mima[4]==2&&mima[5]==0)2 U8 w: w* I2 u: D. P; @
 Right_flag=1;
 : R3 F" u( X& F1 i                else
 - S' D5 `0 v: O" x2 j( ]5 `                Right_flag=0;
 : w1 T4 Q+ Z6 `& X8 b3 U                      }' S5 Q* u+ u( V1 c, g
 if (Right_flag==1)0 Y6 k4 t& ?8 T
 {
 2 Q9 L' f( D) U2 g/ E9 K: Y$ x                     Right_flag=0;) Y. s  |3 l1 q) q/ l) H
 6 w3 N' \/ ~; E: r6 k/ X; v! U; z
 for(i=0;i<6;i++)mima=0;
 , H0 R1 `: f# `7 Z4 Y3 u* t  h                PutStr(0,0,"按键1 : 增加指纹"); : E, U. ], R  I3 I  `
 PutStr(1,0,"按键2 : 删去指纹");
 6 A; q: Z! G; J1 h! x                PutStr(2,0,"按键3 : 手动开锁");
 - H7 l; Q( ?! ]5 G+ {# k# }                PutStr(3,0,"按键4 : 修改密码");5 ~3 j. B, u! G$ y8 o* @1 b
 while(i!=tuichu)' a' W) m& @7 {$ L; J5 @+ d: _( a
 {
 1 O9 f& D  \" W  i5 v) J1 c- Z                 i=Keycan();
 & K( ^- G3 Q$ _9 Z( ]
 . @* m: [! Z' n                KeyDeal(i);  ) E7 t  u: x& u8 s% I
 switch(K)
 3 R- \: L& k0 N, u6 X: L            {
 5 E, u- v' m: {             case 1:    addfinger();K=6; break;5 [, R9 a( K7 O! y- T4 ]
 case 2:    deletfinger();    break;' o) v+ N6 H  K4 ~3 F* b  C
 case 3:         zhu();        K=8;  break;
 . F/ ~! K8 r1 Z8 m' u                 case 4:    gaimima();        break;
 * ?* s9 H7 k& k6 \" T' J             default: break;/ V# h5 V# [/ K3 [% s8 N- ?3 q3 r
 }
 4 I8 i$ |2 O4 R. T( p* h; e3 j( d      }
 8 c. _3 \" M/ H6 N     }5 r% a$ u/ R2 H9 S4 W
 else1 n) r5 A9 a+ N  Z+ K' S% ^: v
 {' {& J- ^1 ^8 z2 m' }- k" p
 8 @; e- T! M0 s3 c0 d' _/ n
 PutStr(1,2,"密码错误");7 K& a5 c2 L( h7 i9 r
 PutStr(2,0,"  请重新操作!"); ' E% f/ r5 w7 p! Q* r) d
 PutStr(3,0,"  按任意键继续"); / \! p% ]! D- ?  B/ y
 while(Keycan()==0);
 " u0 P- L/ E; t# @* M* Y# D4 }                PutStr(0,0,"按键1 : 增加指纹"); 7 _6 Y) V, ^" C9 h! A2 t
 PutStr(1,0,"按键2 : 删去指纹");$ I& L3 c& J9 B* _: n  X
 PutStr(2,0,"按键3 : 手动开锁");
 / l1 P1 _, V0 U: b& L                PutStr(3,0,"按键4 : 修改密码");; s" @9 f. E- L' _/ F
 }5 o) Q" Y# ?. }  J4 n
 Key=0;
 0 B9 B" R& E0 \9 A" `
 0 p) a0 ^3 M9 J6 `1 a0 O}/ S7 Y3 G, U6 c6 `
 void mimakaisuo(): ?' N+ J: q5 n/ z% L) H
 {) k1 w2 }3 j, F0 t' I! t; z0 s, K
 uchar i,j=0,x=1;- \/ }  p. [/ _: @0 C
 uchar Right_flag;5 E% a6 C; q" |( C
 LcmClearTXT();
 " j; U/ q/ l7 B& [4 _7 c          PutStr(1,0,"请输入密码开锁:");
 ! t& ]+ n& a5 m8 h1 a7 s           for(i=0;i<6;i++)mima=0;                                                                        . V7 J* Y, ~4 [, j3 p! R) T
 Key=Keycan();
 6 e% G) x. I9 D; Y" N( C$ F5 C' z      while(Key!=queren)0 }% R" x/ x1 l
 {3 \+ }) w8 ]1 J) t' l$ S
 Key=Keycan();
 % t. u; h; S/ H. v& ]7 ]7 [2 x4 e             KeyDeal(Key);
 1 x) x( Z" I8 b9 z! ~9 K# ?             delay(30);
 - I( b  ?6 D$ U6 E             if(Key==0)K=10;0 w7 _5 r( A- H$ M7 t. i! T, t3 o
 if((K>=0)&&(K<=9))
 / q; _. D% K& L- \, z- [; ?9 \             {
 ' b+ k0 _! V$ \# o; n7 `: C4 u              mima[j]=K;0 X& v( K# c) u! h4 Q4 T* S
 5 C# V3 v  d* v. x0 w" o& `( W
 if(j<6)
 . I, d2 i. a2 a1 T  p2 [                  {
 : j- t( R0 ~" ^' F0 e                   WriteCommand(0x89+j);                //指定第三行显示位置4 |* P. n3 N- @% a1 r8 u
 WriteData(0x0f);        + R1 d$ T3 Y6 e" K2 I
 
 ) U5 h* y- s& d9 ?$ n+ e: A8 D8 g- p7 B                  }0 s# c) f( e9 q# V$ d. g
 ++j;0 Q- {, U* Z- q% S: c% _4 N+ ?
 if(j==7)2 [2 R" _# G" l' k1 g
 j=6;
 / v( S. ?" `& M( m- r$ X' ~             }   //显示LCD12864并行显示
 9 O3 G7 z* v) Y+ Y                 if(K==34)                //按了删除键6 Q" x7 c7 r( u/ ~* g
 {; H, l" u+ J4 U+ h5 O' k0 X
 if(j==0)
 : q. i! v! N; r+ F3 R4 B  [# M                        {
 4 N! @$ }8 `4 O. c                      WriteCommand(0x89);                //指定第三行显示位置
 3 |# n! u  u1 t                  WriteData(0x20);2 e: T: c7 T5 q: t+ d6 C2 V" k
 }; d( Q$ p6 n, [- Z
 else8 z4 @% U& s! ]
 {
 2 d/ M) A5 C5 L( s$ f% b  E7 @                          --j;4 n9 r9 y- {; z1 p3 B- |. h
 WriteCommand(0x89+j);            //指定第三行显示位置7 c( n1 a/ n' F2 V
 WriteData(0x20);2 {3 q! x0 l  z4 L! z" D5 c
 }
 & N+ ?% n% `  @, \2 t1 \, Z                  }
 4 v6 Y# L4 Y* r1 N5 u& K           }
 , y3 R0 N8 B8 c% n    LcmClearTXT();& A1 W4 S8 n( B
 0 Q; W7 |! s) ]+ F+ Y" ]6 ?  F
 
 7 I- A4 F- }- L" c' d$ c" l          for(i=0;i<6;i++)
 G" ?; B7 t0 y  V- T# }         {. {9 b/ R, p: m- R
 UserPassword=mima+0x30;
 6 m6 e6 c- \; ~3 e4 ?2 I1 ]% O- S/ N+ h( \0 j
 }
 / r+ i& u+ j! ^  H9 Y1 L$ b9 ]" e6 v! |         if(j==6){Right_flag=PassWord_Chack(); }
 ( M5 H1 o/ m7 {: L$ T7 P          if (Right_flag==1&&ErrorCount<3)
 9 ]" p8 Q: ~1 j0 y3 ]; F. ?         {
 8 K8 V* w6 |, ~: v+ }+ K              Right_flag=0;" b/ Z1 b  A9 {0 _: J. ^
 zhu();ErrorCount=0;  9 s# _5 @6 `1 y# G4 n* k; a; v* K' ?
 Feng=1;, D9 b* V' Z* d) U2 w* o- T  S2 a/ ^: x
 for(i=0;i<6;i++)mima=0;
 # B- P& \& v3 A; U- q     }8 C" o! T+ I0 _$ h# O" O- L7 G
 else" K! s. \3 t' [9 Y! w6 m
 {7 D% |& o! ^- D& P
 if(ErrorCount<3)
 * i: S# ~) i8 w9 q- g                ErrorCount++;
 1 w$ Z- Q# n4 p* a+ `! J                 if(ErrorCount==3)! h$ j4 D0 i- i& D5 s. B1 t$ O
 Feng=0;
 + l! x6 r. _, {$ e: O: B: y. M( T7 S
 PutStr(1,2,"密码错误");; N7 f; }' y9 I/ N. c3 B
 PutStr(2,0,"  还有  次机会"); % w3 x3 i" ?6 Z0 z5 x% v/ z
 PutStr(3,0,"  按任意键继续");1 X7 o, J; d% }5 k
 WriteCommand(0x8a);$ I. ^6 a* R1 [7 x# I% h
 WriteData(' ');% Q; W4 k0 o# v' ?- _! K8 L4 X
 WriteData(3-ErrorCount+0x30);
 ! c% X# H2 ]) e2 \4 j+ w5 G+ ?) w% U+ R$ v( e8 y" i* c
 delay(1000);! U1 y- u: r& p3 r! k+ v# u
 ! _  a) R1 I6 ]8 |: J* ]
 }
 v% g+ H/ p# Y" S( D, ~# B, a  Key=0;
 . Z3 _) S7 h5 L1 p  LcmClearTXT();' n. U" S# q0 K/ E6 A0 R$ O
 }
 + Y# A) H! ]% o7 r5 Xvoid fan()
 6 R1 X+ u) j1 j6 h4 z7 o" [{
 . p3 r' i; _, F* `' V2 l//        PutStr(1,2,"请先按键");+ N: U0 N1 G. ?/ c9 y, H
 //        PutStr(2,2,"再刷指纹");
 5 q: Q2 Q  v0 Z$ o- U0 f# N  if(Key!=0x81)                        //管理员操作
 ; q1 H& D5 S; c; m  {8 N& Q5 ^1 {& `4 P
 PutStr(0,2,"欢迎使用");
 3 ?0 l) K* H: f3 y! u( \& h        PutStr(1,0,"指纹密码门禁系统");
 + Q9 U* v2 w1 j" c$ H8 c* x6 G        PutStr(2,0,"密码开锁请按 C键");
 5 l* x) Z& J# z        PutStr(3,1,"请按手指开锁");
 / O1 i& d1 f) n4 z* p: y   }
 . [! G/ B8 X& L1 l) C: j0 T: R  Key=Keycan();" R6 a, H9 c, T; F
 if(k2==1)                //指纹刷机) _% i4 `+ K) s* y' ]
 {4 u& ]7 b1 ^' h- Y; ~7 K
 LcmClearTXT();, S; L. O5 R  G  \+ ?
 shuazhiwen();
 . x) e5 h% Z' v/ f         LcmClearTXT();
 ( i8 B! v5 H: b- _  }4 y# I- e8 T/ c( c- s+ w! M
 if(Key==0x81)                        //管理员操作' i3 Y8 h  B3 w  R) Y* f  _
 {
 7 c3 n, K- q5 Y& ?: A        LcmClearTXT();5 ?& D) H8 H3 Q$ ]
 guanliyuan();7 g" @1 W. }+ o! i4 M9 e( f
 LcmClearTXT();
 ~# X+ z- O$ e+ a/ T  }3 a. Z* G8 }! ?7 z
 if(Key==0x84&&ErrorCount<3)                        //密码开锁
 ! ~: N1 S/ f% M. ~1 J  {
 0 O; e# d6 C- \# j$ k        LcmClearTXT();
 - i  b( O3 y& p* h6 B        mimakaisuo();& B  A: y4 G4 e! g3 r) ]
 LcmClearTXT();9 J6 c4 F: w( I9 _5 _
 }
 8 |" _6 |7 ^: v  H4 i; Q5 u0 z
 / M5 L. M0 B! s( w" r}
 & |; n( m4 S; v% o$ \6 b3 X) @; g; f  N# e
 void main()
 0 j# C- k! ]8 y. \$ u4 V{
 8 ^+ G- G8 T( `; Y1 o4 r# m8 T0 R% C7 m5 X/ w
 //PSB=0;: x& }  E! E9 m' e- \+ S
 UART_Init();           //串口初始化                  ; F2 U2 O- u5 I& Q; B
 x24c02_init();     //24C02初始化5 w4 a! W9 B8 _& ?! I5 l
 LcmInit();               //LCD12864初始化                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            , W0 `/ F% `$ w$ l
 LcmClearTXT();           //LCD12864清屏
 8 \) N; W0 A4 H8 k9 }" X        while(1) 7 n6 S. Q! K) W& |
 {
 0 v, u) I' N4 d                        fan();, Z) Q7 K5 Y" A6 I
 delay(100);                    z/ k; z& {3 z7 ?8 J
 }
 - }, J7 X- m3 q1 ~/ u5 B/ w7 m$ {}$ R" z$ C) P  D; z
 
 # |1 G# @2 [1 u) _3 T+ j  n//外部中断解码程序_外部中断1
 " a- M: `1 G. E( }9 ~void intersvr1(void) interrupt 2 ; g( q. a( V; J2 k( V- m( ~3 i
 {
 / @/ Y1 L5 _: H* D7 [ TR0=1;: U5 D0 @( }( p$ _0 h
 Tc=TL0*256+TH0;//提取中断时间间隔时长
 ' a4 ~$ s# A8 [7 C$ y! o8 f7 l TH0=0; : J& T: j% y8 f% @% o
 TL0=0;         //定时中断重新置零
 " ~! a2 z: _- p: l
 . Y5 J" C% f5 c' a& H9 B$ C if((Tc>Imin)&&(Tc<Imax))
 0 j& ?. ~; `! ?7 K2 Y { 5 _7 i! |7 a% z1 p7 }  q1 K
 m=0;  i9 O% _) H) O$ i2 B
 f=1;
 - |8 _( A+ A. o) d        return;
 # a- u2 o- q9 N% A2 B9 y% Y }       //找到启始码
 # o) z. W4 U( f+ V, J& ? if(f==1)
 / B" R; e' C) ^7 P4 c% ` {
 ; |0 I: f6 T1 V$ z        if(Tc>Inum1&&Tc<Inum3)
 , L8 O: w% D. C" Z; e* \3 P    {4 ]! Q9 {/ b% \8 y2 E4 z! C
 Im[m/8]=Im[m/8]>>1|0x80; m++;
 g. ~; z5 m1 Y9 v1 J2 m    }
 ) v; B! R9 y* s& j8 G. r    if(Tc>Inum2&&Tc<Inum1) - H6 b$ |& Z1 q8 U/ \) {
 {2 w. j) P" t* d
 Im[m/8]=Im[m/8]>>1; m++; //取码0 c( v; b8 t( ^$ c) I
 }
 , N! R& Q2 F$ X; _           if(m==32)
 # V) _7 X3 i9 p/ z  `. z/ r    {
 + T+ N. V9 x; s  h! l0 @$ }      m=0;  $ k5 d' R* Q" \* y
 f=0;2 n  B, E4 i  h: ~5 ?1 U
 if(Im[2]==~Im[3])
 6 o5 z2 l" d) F% C( w5 a2 m      {
 7 L9 z8 S; b# D/ r: B3 C           IrOK=1;) U- F, a' p0 v0 L: z
 TR0=0; / \: d9 O1 Z: m* ?1 @! E
 }# A+ Q4 F9 T6 ?' L) A- S
 else IrOK=0;   //取码完成后判断读码是否正确
 4 f" I2 |/ ~& ?; p, j- @: Y( r7 M7 \6 H  K1 m# \2 z4 M" V' o
 / S( ^& {- E' w* l8 M+ e
 …………限于本文篇幅 余下代码请从论坛下载附件…………8 B. ?) X% l  ?7 x$ b
 . F* j. C- p, n& \7 \& P
 . @- C* u, J' B( j
 
 | 
 |