|
全局变量KEY在Keyscan_duli();程序中获取的值被下一条语句KEY = Keyscan();覆盖掉了。改成这样看看:#include <reg52.h>2 G* q7 L3 u" O9 H) Q
2 h: ]* x/ }8 K- k' Z
#define GPIO_KEY P1 //矩阵键盘的接口* h5 V6 J! ^( J
#define GPIO_DIG P0
$ T' A4 W1 a% J& H3 u! K0 F; z+ O. ~typedef unsigned char u8;
/ ~. Q1 d6 F+ x/ \9 _, j+ o; [2 j5 Cu8 KEY;
/ o7 _1 u8 M7 b. R+ R) ~# q, `sbit SM = P3^1; //输入密码按键
6 Z& e g, r7 Y- Ksbit GM = P3^0; //修改密码按键
7 L7 g7 O- `( e+ Z6 Bsbit OK = P3^2; //确认键
/ N T9 T/ u- x) A7 wsbit LSA = P2^2;
1 B) F7 |. K+ Usbit LSB = P2^3;
; a+ H( X8 g5 s5 |$ v( |1 ~sbit LSC = P2^4;/ G$ j4 L, ]1 z9 g3 H
, J- w$ w8 J' j+ Y. E" d/ Ru8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
3 V# B9 Z m0 q) y 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值: h$ Y* c: C1 L
2 D7 \9 Q) R" A5 q# e( \: s
void delay_ms(unsigned int x)
- k4 t7 l- a) |9 R+ j2 m{
- t0 d6 ]5 s6 s! l0 J, R2 V unsigned int i,j;
5 F$ d; ^/ e& P' U: s( c6 o5 a" N for(i = 0;i < x; i++)+ G7 r$ {# x; W; }6 k) @0 l9 ]! ^" H
for(j = 0; j < 110; j++);1 \! b/ J) d0 C) v! x6 V$ _
}
! P6 ?8 `0 o$ h& F" N8 |5 J$ n% w( A) d" |! J4 c( ], K
void Keyscan()3 a( a+ ^0 ~' X6 j' j. a
{
[3 X8 M% l- |6 J3 h5 ]0 p char a = 0; Q/ [7 q9 Z& s# c
// u8 KEY;
4 |( a5 O5 Z$ V1 ?* d6 G% [' l: H0 L GPIO_KEY = 0x0f;8 T1 d9 j! y) ~7 r0 V
if(GPIO_KEY != 0x0f) //判断按键是否有按下& C( @$ [ F, K ~3 _- ^7 P
{ J _* { X: D3 e4 E* \
delay_ms(10); //延时去抖
6 R" E& a1 u, c if(GPIO_KEY != 0x0f) //再次判断是否有按下
1 m1 ~$ Y% `* |! y7 K9 A" [) L {
9 @# I. Z9 f9 R9 w8 T //扫描列+ e& B+ e' M4 m: ]+ h; ]! k
GPIO_KEY = 0x0f;9 G: p! h5 t& g7 m q) b
switch(GPIO_KEY) R& Z. U8 k4 F6 l8 u
{
# y9 i n2 A! Z' w case(0x07):KEY = 0;break;* e/ \6 c& m( f4 t% } D
case(0x0b):KEY = 1;break;( T" o+ G6 F0 v6 b: X7 `
case(0x0d):KEY = 2;break;% p7 P6 ~5 Q1 f! U
case(0x0e):KEY = 3;break;
9 Y% d; g8 D, r# R } 1 Z: z, _3 }" J9 [( f4 F
//扫描行
8 A! Y/ s A; d, f( v% j; [3 U8 T GPIO_KEY = 0xf0;
( Z L0 R1 X6 S' a+ Z switch(GPIO_KEY)8 d) O, I1 i. q
{
2 a) y, T) b* N. Y6 d* z case(0x70):KEY = KEY;break;
& U8 E' F$ J$ ` case(0xb0):KEY = KEY+4;break;
% \/ L, t2 e& P% W' z( O case(0xd0):KEY = KEY+8;break;) I, q7 k$ i7 `. v3 ]: f( q* |
case(0xe0):KEY = KEY+12;break;7 X5 Q6 t- [1 h$ u) k% h# \
}
! _7 j6 `& y7 s while((a<50) && (GPIO_KEY != 0xf0)) //按键松开检查
3 R0 A n1 I8 ~7 c0 w {$ v$ s- h6 X/ }, k; Q
delay_ms(10);* ^8 a& I5 u, g, I! G4 }/ @
a++;7 D6 B4 ~7 h- a( A" |; l [
}
0 ?$ D5 f- T6 Y, s( p& ]* ?4 a1 m! c; R// return KEY; 5 L; g% N9 B' W+ w1 j9 T
}- ^' a( N% o+ d& `2 W* k+ u: {
}
! o* l: Q$ M! r}
- d3 N5 G( d/ U( H
) X2 D4 l n* Z, N, c; C" c* qvoid Keyscan_duli()# K3 W0 \# i& I8 S- m
{1 v$ F# T5 x9 F s+ ~
if(GM == 0)
/ l* I+ g8 e+ m# } T3 k( K6 o {+ T1 ]- |# ^, q/ s. H
delay_ms(10);; T: z% k- ]8 b( Z# k5 K- ^
if(GM == 0)
0 r+ A, E5 e3 h/ l2 V. W+ H! } {
% A: x' Q% W% w6 @ ?( ?7 E) }- C KEY = 0x0b;
& O7 g* g3 v' [4 o5 W }# k0 }" e& m9 Y* L2 P
while(!GM);
3 d3 p8 E2 W4 s6 }; Y1 k6 @ v }
) p, e0 z% I* j: ]* k! q7 J else if(SM == 0)8 r- ?, A$ F" V" f
{) u. u, a* v! D5 E! l
delay_ms(10);
$ l \$ A, N1 Q) K% y. C if(SM == 0)% C1 y1 ?7 H( i5 M6 w
{1 ^. ~+ j" K: w
KEY = 0x0a;; `' \* k6 d( m1 p o. }4 Q9 \# F/ ]
}
( D! M& |, {0 _5 r( k" ^6 F& P# X while(!SM);; x3 J' X1 S! i8 {
}
5 K1 \7 w% c* S else if(OK == 0)
" l5 {+ O3 T, |. j0 v, a {
# O3 `) Z- b9 z# z5 @2 V' }6 Q- O8 E! p delay_ms(10);
; T4 O( {7 d: \6 E if(OK == 0). F2 c4 w8 }& c0 ?1 z, E2 }
{; ]: F6 E% H6 s z
KEY = 0x0c;
7 ^* |# a0 b7 a- V0 t6 ` }
: ?" p8 `! a/ z6 q4 n, Q3 Z8 F while(!OK);
. h# Z0 u4 J8 b2 j) z4 C }$ a \( }' L0 E! Q1 b. q
}
2 x8 t% T; G6 m; W9 |% D F: w! ?# o9 V! a- V; K
4 z0 q7 p8 S+ [( i2 L
& _# D7 b% E+ W9 a$ \$ x! |
void main()
# I- O' t( y% x7 }. B6 c{! Q3 j& y2 j4 A7 p3 \
LSA = 0;# {/ |2 a8 k6 B4 ^6 d- W0 u
LSB = 0;, x# \! k8 z+ ^, b
LSC = 0;+ S! Z% `" ~" |: [% T" U
while(1)8 q7 ~# a/ x5 y0 t
{
9 n( v- x u# S/ ` Keyscan_duli();
4 {5 E/ U7 M# O* G: N Keyscan();
* k/ r3 y5 O& }$ ?0 P GPIO_DIG = smgduan[KEY]; , w; ^: L$ j# F* C1 Z/ |+ X( c( @4 L9 T
}" l6 Q8 P5 I! A! y
} |
|