|
全局变量KEY在Keyscan_duli();程序中获取的值被下一条语句KEY = Keyscan();覆盖掉了。改成这样看看:#include <reg52.h>( }1 V! c, R8 `. v1 X9 L% H! L5 Z
+ q4 J# M/ j5 n$ ~7 w#define GPIO_KEY P1 //矩阵键盘的接口
0 y2 D( R& X2 C+ S) h# n#define GPIO_DIG P0, e( A7 B4 F$ P, z- |
typedef unsigned char u8;5 |; d0 C+ E) |$ O( A) F0 c& g. v
u8 KEY;
% `1 J1 W5 I5 L4 o' u/ Q* Asbit SM = P3^1; //输入密码按键 R. h+ `3 v& f2 j( s/ r8 Q
sbit GM = P3^0; //修改密码按键$ y0 p) H( d! `, i- |. s. X
sbit OK = P3^2; //确认键1 a" a3 A' |5 D
sbit LSA = P2^2;
9 K* c, E" ]! y. Isbit LSB = P2^3;2 f5 J) b" F% K T" ^3 `) ~- X* ?8 X
sbit LSC = P2^4;
" h7 {. R+ _! V1 i6 I5 c1 h2 B5 i" N/ S/ e* S' Y2 i: f- X
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,: m, o+ C- ?7 j5 I7 e* I( R5 p$ I
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值1 X0 ^+ q7 g; h- c4 e- B
8 y- F* M7 b1 A& D! a: Q( ?void delay_ms(unsigned int x)
4 I2 N `+ I" F! D/ X) |* y& ^{3 z" U5 a; l9 D( R
unsigned int i,j;' f8 S4 H [/ U- B
for(i = 0;i < x; i++)+ K" \8 C: T6 P5 ^3 o, p6 V
for(j = 0; j < 110; j++);2 Q3 I2 v6 L+ k: x" I
}
9 A9 G6 U5 t( Q7 e; w8 T: ~, n* P5 b; G7 I
void Keyscan()
1 y( _, e: ]3 Q9 ]: F$ m6 I{
2 \5 C& A3 Y: R Y/ I% ~ char a = 0;
7 \" {9 |( H! `+ r// u8 KEY;
7 i1 K' x9 I% {0 O! O GPIO_KEY = 0x0f;. u4 B6 s W( ]% G
if(GPIO_KEY != 0x0f) //判断按键是否有按下7 J4 V/ J6 t- ^1 l ^8 Q
{( }" {1 l; c% x9 v% X; ~2 m
delay_ms(10); //延时去抖. t+ J% L3 s: r" @
if(GPIO_KEY != 0x0f) //再次判断是否有按下9 o3 j i% G" G- `
{
5 U) Z' D3 }& c' u+ m2 z' b; M$ p) n //扫描列 w- }9 e; e3 P; a% z
GPIO_KEY = 0x0f;. E. e; P3 X, d1 L# ?2 D5 d% d# e
switch(GPIO_KEY)8 @0 s/ F+ _1 a% T1 p1 x0 x
{
6 {( m. [1 `* |9 v9 Q7 Y- ?( w case(0x07):KEY = 0;break;+ Q4 [: {2 U% K# p( }
case(0x0b):KEY = 1;break;
3 d, {5 }* }5 v. d8 M6 z7 }' O case(0x0d):KEY = 2;break;+ T% H) y& R, A
case(0x0e):KEY = 3;break;
" X* B. u6 [6 k$ {( {- }6 D' P }
D- q1 Y) P2 N1 Z4 T //扫描行
* M0 C) @8 r X% n% b u GPIO_KEY = 0xf0;6 M& k* Z' Q' V3 l! b! e5 m/ a
switch(GPIO_KEY)
+ r1 N# A" v8 C3 f {
7 U: K U; ~! ~) x; m+ S$ p case(0x70):KEY = KEY;break;; d, F: |4 P% T4 T8 U, j
case(0xb0):KEY = KEY+4;break;
7 z5 {% C1 i# x: |" Z case(0xd0):KEY = KEY+8;break;/ m6 l4 Y! V- x
case(0xe0):KEY = KEY+12;break;
4 j# j' o6 F8 Y/ B2 N$ I; T& Q }
1 p* x( _- u! g1 a; |2 S8 G while((a<50) && (GPIO_KEY != 0xf0)) //按键松开检查
& N& k5 t6 d2 v4 k/ s7 c" d1 c {$ Y3 @4 S! P3 k% P+ h$ Q- I) Q
delay_ms(10);, U/ z: m: [; x9 s) ], F
a++;
1 M9 t# G1 T/ X! g% u# R }# z5 s% T% L+ x# f' x/ e
// return KEY; * t' T' f6 I% e7 e' y
}/ [$ }. |3 ^1 e. ~8 N+ x3 J, {/ W
}: n- h+ y1 _- |7 C& g8 }" \
}
$ u( R4 L, n% a, o+ N, I: Q" z; {4 y" X4 P# t" o5 f+ R
void Keyscan_duli()
8 F- ]: G2 M1 h0 i{
* O% A1 Q0 l* ?8 p0 K if(GM == 0)* u4 \3 X% r$ I T; k4 N, B
{
3 H5 S2 V$ J& X+ S7 H/ w) P" d$ a; Y% ? delay_ms(10);0 l4 e1 S5 x- e! E
if(GM == 0)
3 R. D7 v+ Y$ \ Q, M* F2 h e {
1 V/ J; |: ]* z/ u KEY = 0x0b;
7 l) a' \3 y9 V: a }% F" G# }, G4 R0 w
while(!GM);
0 f t1 d7 z& X9 V9 l- k. v: a }
0 v0 g0 n, M, R5 ^ else if(SM == 0)
6 W. I4 C2 k* r8 X8 |( j- m {
3 o+ ~% k- _+ u" c, j m+ k9 g: Z delay_ms(10);
: A4 J5 e* S/ A' A if(SM == 0)6 `0 a, ]$ ^, v) R
{
9 u% ^3 v/ ?/ L/ f' C KEY = 0x0a;$ `6 T* Z; D! g( V* C. F$ b& A
}9 ?* `1 B7 J0 r4 ^, @' w
while(!SM);
, P" b4 C4 H r5 J* R1 J' { }
! k0 `+ W! g8 p% _3 r$ R. j7 g: y else if(OK == 0)7 q, ^3 f0 V3 B- h
{# _, m$ t1 V+ b% A: N! _7 G
delay_ms(10);
V4 k% z7 \! A6 V/ M3 D$ X if(OK == 0)
; a. v$ a: ~0 ` {
9 a ]# y! j) {* F$ R1 Q, y2 D& Z; I' w KEY = 0x0c;
$ c9 U6 k A' x" w! W: g0 p }
. B9 C3 p' c) `& n while(!OK);
: O6 O/ E1 y) V; ~ v }
$ {1 h1 j( ?2 p0 a# Z2 ~}' |; m0 d, l _
; L0 y7 o0 g8 F
& \- ~5 G- V( X* N* t; g$ r& @" x1 M# `
2 J5 e$ E5 L1 [6 m* a6 G8 Vvoid main() j4 g" Y! c A
{2 [9 i; w3 F6 S- q, z
LSA = 0;, x4 ]' Z# e o2 t( X$ M9 L1 e' }' w
LSB = 0;, X5 c$ k8 ~/ |6 I3 ?5 b
LSC = 0;
' z( q% P0 e1 S5 ? while(1) M7 K0 w5 B# ~& B. w4 o
{
1 |7 G3 ^/ y f. _5 L- n Keyscan_duli();6 X; E: B" q/ r+ t1 d0 R$ k
Keyscan(); 9 F& d b) Q* y+ @! D, }
GPIO_DIG = smgduan[KEY];
2 m0 P: j: x" }* j1 g }
5 `" z! v9 ]4 c* ~2 S x} |
|