|
全局变量KEY在Keyscan_duli();程序中获取的值被下一条语句KEY = Keyscan();覆盖掉了。改成这样看看:#include <reg52.h>
8 u+ s7 z* G4 n
& O V- K# X- O4 _/ D#define GPIO_KEY P1 //矩阵键盘的接口
% j1 r' S5 L+ n9 B0 C; ~#define GPIO_DIG P0: { K7 [8 w1 t0 r; ?; `
typedef unsigned char u8;
* ?. m( V0 r6 d5 P# s( Bu8 KEY;% M4 X+ F& {# c& y( |# b
sbit SM = P3^1; //输入密码按键5 [$ F# L8 W( i8 {% H
sbit GM = P3^0; //修改密码按键
Q- O9 G/ B9 q: r1 i: q) l* xsbit OK = P3^2; //确认键
/ @6 G# B- c% ksbit LSA = P2^2;/ G6 {2 j r3 [2 g# r
sbit LSB = P2^3;+ p9 R" g1 O6 M- T1 ]9 T6 U4 z
sbit LSC = P2^4;
5 j% f% N* ?8 ?, c9 `& G+ z" R# U0 r6 `# m k, N1 [: q- M& _
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
P9 x- w. ~9 J( Q; E# M# a 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
) S8 t3 R! A. M! L. ~, v9 q! s6 c' M
void delay_ms(unsigned int x)
, e7 T9 Q9 o$ B( M* M. g# b{
/ `1 x5 q, e/ }! b unsigned int i,j;2 _' O% }1 c# }* o
for(i = 0;i < x; i++)
9 A4 U% L& G# m- j7 j) x) q) { for(j = 0; j < 110; j++);- u7 M, {, x" W3 R4 k
}: }5 S' Z4 ?7 h! O7 h/ Q, d# s
/ B5 e, q5 w- _7 l& q5 c; _2 [1 G$ D
void Keyscan()4 x; {, X% g! a. W' D
{
, \5 p1 N0 F4 S0 ~# j" t% b @ char a = 0;
; c# k$ p" |0 T+ w# s. h; }2 S# C// u8 KEY;
$ C2 Q" C( G) T+ ~# C+ r GPIO_KEY = 0x0f;
% W) O/ w3 U. B if(GPIO_KEY != 0x0f) //判断按键是否有按下7 H' p0 Z' \: a9 z, m% s
{8 `+ C# P: t$ I' }2 K6 Z- c4 D
delay_ms(10); //延时去抖0 X# {+ t: c5 D& h- X
if(GPIO_KEY != 0x0f) //再次判断是否有按下
& N! H5 r% g" J+ S8 K0 H {
: b$ N# _+ i0 H+ r$ T S8 U //扫描列
& ?7 b" V) B! f( Y6 U GPIO_KEY = 0x0f;6 |% T# ^8 X9 G! v
switch(GPIO_KEY)8 j5 C3 i# g' X: z8 d* x3 h( x
{$ X. W b8 i/ X
case(0x07):KEY = 0;break;" O, X; m/ M* l
case(0x0b):KEY = 1;break;
2 ~, A, s- B: S) I case(0x0d):KEY = 2;break;& X( }8 X0 {9 ]0 f
case(0x0e):KEY = 3;break;
& Y& Q0 _9 L9 r z }
: T0 V3 I7 Q7 g! @2 {4 P //扫描行7 o3 O6 f' H( [
GPIO_KEY = 0xf0;
' ?% B w# |# y: q7 V% d- _, y( k switch(GPIO_KEY)
$ \+ P. X) K7 B0 n+ o! r$ i4 } {
0 t! }/ f# w) f0 U5 s3 L9 Y5 y case(0x70):KEY = KEY;break;* ~+ N* s/ Q: ]' F+ a
case(0xb0):KEY = KEY+4;break;
3 d6 g |: S+ n! Y+ a! O case(0xd0):KEY = KEY+8;break;& V% R; i U0 G- Q
case(0xe0):KEY = KEY+12;break;
" b$ \; t' M0 Q8 R* Z }
8 t# X* c, e( Z/ c! a while((a<50) && (GPIO_KEY != 0xf0)) //按键松开检查# C3 @) r1 M2 L c7 ?
{
j; q8 n+ R! }7 x3 A! d6 |/ G, q delay_ms(10);& { c0 a2 o1 w6 G# L
a++;
# b- D7 T9 ~- W% ^6 B' s" ` }
9 r' n9 e* b3 u x' o" a5 C// return KEY; ! V4 Z5 o" F6 u0 P+ |; p+ B, }2 F
}/ Q: U: M4 q$ ~
}
9 _- [1 a) [7 [}
0 b3 w" }3 g' e1 G$ o3 n9 Y- I6 I% M" X5 b
void Keyscan_duli()
. B2 r2 K6 I1 h{5 [( v# n& }( f, }5 X& U
if(GM == 0)- C1 |4 f8 i1 }8 ?, i, j
{
5 \0 R- p5 B4 L delay_ms(10);5 c8 O/ @; n/ M% K- F" a
if(GM == 0)
% O: \: ^, t' c2 x: n {# C" d B8 C0 I" e8 t0 ~
KEY = 0x0b;
9 S* |: |& l) b5 `1 |' D }! h7 G; x) k$ L% {5 W* D$ [1 c
while(!GM);+ n$ L- q+ X7 p1 U/ k8 S& `& I
}
# g5 U. q, w m& t# N5 H8 z else if(SM == 0)
6 ?' s' h9 x9 S: M {0 X: I; e4 z1 F- a, G
delay_ms(10);3 Y. `% @, I4 ~
if(SM == 0)
( p) Z; m; w& p% |+ r9 H {
+ a3 u* \# S/ O; W+ j# o KEY = 0x0a;% H% M: J% L# z; G, d2 w$ A
}
3 s" P4 b2 k" T- h6 \ while(!SM);
+ B( m+ T, S& c/ R7 W9 K' B% C( z& K" g }' `6 L4 J% a6 {; h5 i6 a
else if(OK == 0)$ T: H8 B. |7 ^. _9 i B3 c7 N9 w
{
: _7 [ ^$ q5 X1 } delay_ms(10); P4 n" x) ?2 M0 o4 V+ Q( Q
if(OK == 0)
6 P3 j. _- f, a) I. m) w5 G4 t, q6 z {1 r/ Q4 ~' W O y/ U& ?# r% `: x
KEY = 0x0c;. P+ v% H4 Y$ v. u. x! {
}; y9 n5 z0 n& X
while(!OK);! M0 q1 a" m0 S# i6 @- j
}$ u5 _$ u" U# v* @9 D, e$ G, l+ E9 B( m
}
! X8 ]* c: p. S. O2 g( v( y/ S/ f
4 a+ X7 \ B, w+ I5 T g
7 E, {7 t% P$ O; p" H. Ivoid main()
& H7 Z1 i& q* X6 V9 w1 i{" @% n M: p- a% M+ O
LSA = 0;9 O1 r8 g0 D5 Q; ~$ X [
LSB = 0;, D5 I2 H7 C' d# C
LSC = 0;4 K- M0 L# ~% m h2 D2 D6 |
while(1)+ I9 @7 p5 i, E4 v# k
{
) }+ b/ D+ V% F4 ^1 h9 G* h' Z* T Keyscan_duli();
6 W, `6 r" C1 @% M% V5 x9 v Keyscan(); 2 l+ p/ P1 @/ f5 i* w$ M/ V$ x
GPIO_DIG = smgduan[KEY];
: _1 j- z' J) Z }
: H2 e$ a( q. ?+ Z} |
|