|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:4*4矩阵键盘与可对时电子钟
( l! g& Q/ h) \/ A" v3 h
3 d* V) ~; U: D9 q* U
5 A9 H0 x' S+ e% q9 [: r今天学习了下矩阵键盘,
. x+ W9 c& L% n, _5 B' `" n5 k8 K" |4*4, 分别代表0~F这16个数字 M2 T- n }2 q/ M
我们按了哪个键就显示到数码管上
9 v |) D+ s/ X h0 p) ?7 j* n' s7 Y4 u
# S+ B6 s% Q1 r1 o: S3 I9 K$ e看完郭老师讲解原理后就自己动手写了,郁闷的是* n* M' R9 d" D" r, b; U
在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!- r; e9 Y6 W5 F/ z: u+ M. F
结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就0 |; {9 e: g$ t0 m3 k
会复位成0xff,怎么赋值都没用,其实是没写冒号啊!
2 q5 z7 f1 }8 m/ V P
' i0 x* J# H" a调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,* A$ q0 k2 `9 n9 O6 m( i6 k; N
然后参考书上的代码才调试成功的,表示无语~~~
) m- g" \, q( }! @ l; ?$ @9 O, [* _6 U! D. L5 K9 m/ h2 O
mark下0 K% B: G! O6 k) {$ I' E
- D: c/ A' E) U! ^; t
7 o5 \, \% y, u3 L. Z1 U #include <reg52.h> & n! N% N& B8 J
#include "MY51.H" : u2 }% K1 t. C9 h& a |
& }: { ]& ^4 L, y, N4 d% B* f4 f void showKey(uint8 num); //静态显示
, ? Y2 k, `, _7 [7 ~6 G" v$ x2 m void keyScan(); : _( r/ Q: C% ~6 a; L
void main()
3 w Z5 g) i: ]2 P { $ A! W% m; j! S. U
showKey(18); //初始显示的是6个负号 ' I& ^% M9 D: R/ n: J' x
while(1) # z( Q2 ]3 Z3 f: u* t$ l8 s
{ //循环检测
0 `9 W8 f% h8 l) W& } keyScan();
4 Q8 P- I% |# c1 c" A }
/ f, |3 A) X, c5 s* d } , g0 u' I, j7 i p4 Z& @9 @$ t! n0 c
; u R7 V q4 L! O) X void showKey(uint8 num) - T- k1 }4 ? L# s8 i2 \
{ , m; _$ ~5 l, Y$ u: M
P0=0xc0; //11000000 打开6个数码管 ( @; m0 }& k4 q, C
wela=open; 0 ^7 c. y6 g: n
wela=lock;
3 l: O% J/ r. A/ I& C. X* }; @3 ?0 i" V- t0 o
P0=table[num]; & f. c) J3 |& g8 t3 v* i
dula=1; 7 @' D, N5 G6 ?, V1 _
dula=0;
0 L& G; I+ C7 S. S9 U* [( ] } * |" L6 |4 n% e/ P: U5 r
void keyScan()
- b& F a' g2 z, s# X2 h X% G {
2 A4 |! G! N0 l uint8 num=0; //定义显示的数字 7 z7 I# k+ a, e6 j+ e. k
uint8 temp=0; //P3口回读信息
" t' w* E; i/ j( I) T& t/ S+ S uint8 i=0; //定义矩阵键盘行号索引 0 f; d" c# j4 L+ a, `3 J
for(i=0; i<4;i++) //共4行 4 Y8 f1 W; q6 n
{ 8 ?/ K/ _* k6 R6 q+ B
P3=_crol_(0xfe,i); //扫描的行索引号,从第0行到第3行
2 X( P" F! U/ D2 q temp=P3; //读取P3口
& h5 \3 s& V& a temp=temp&0xf0; //提取高4位
: m0 e3 Y- `. ^. X( ` if(temp!=0xf0) //按键了 0 y5 a/ F# L" b2 J* Z
{ . H R7 {# k1 p# `4 Y
delayms(5); //消抖 9 v* @1 a4 C- O2 [
temp=P3;
7 s5 A0 q' Y( Y6 N temp=temp&0xf0; $ q. X6 H1 m/ C& R$ u
if(temp!=0xf0) //真的按键了
6 I& k2 \2 U- @9 Y- C, z {
( i& z, W" [/ u' ? switch(temp)
' B* k0 J4 `9 F/ D- ~+ O- M { 9 Q; C5 {7 I5 Z' A. p7 r3 r O
case 0xe0: //1110 0000
, [# ?) a- \& O) b( X { - m& k! X4 v% h- d8 _" U4 F" S
num=0+4*i; ; k- C& H; _) a( c; Z! ^
break;
6 `6 Z* F! p& @' ]( E M; v9 C } # H1 r% S5 c1 s3 k' W" z& f
case 0xd0: //1101 0000
9 {" [- ]7 A8 i) c f% n { " ~7 B, ?/ I# @! Y+ [
num=1+4*i;
3 D, Z2 _$ ]( w' B, i break; + r x4 H0 F$ X/ S9 H
}
: n2 ~7 V' x( @9 e1 {8 q case 0xb0: //1011 0000 6 \& X! K3 ]5 u* T5 E
{
( B. A0 @# p' H7 M7 J num=2+4*i;
; R5 z% `/ I6 {! O, p( ]7 r break; # D) [- a& h. v9 T* C7 ?
}
% K+ e6 Z5 ?! n' J. |2 E! M case 0x70: //0111 0000 4 P+ |* H- K# i+ j$ @, ~8 N4 r
{ 8 r) E; i( p, b1 `# l0 d, e! ]3 x
num=3+4*i; 1 A( ~4 F% k( J& j/ @. f& L. v
break;
7 W9 x5 y7 l3 k. p } / @8 Q; x3 u1 r8 b- V/ j6 \
default:
5 |8 J0 L# S4 l4 \& O3 B& I {
- H* i8 a- k3 x: F) a; I' b& @ num=18; //18号索引是负号
5 o6 i- P9 w2 n& S P" l led7=0; // 按了不该按的指示灯 " i$ S$ C4 \7 m$ e
break; 4 R1 }% k9 L3 `9 C8 H, p, B
}
' @9 W3 T4 X5 x3 p5 q
7 k* J4 }/ b; X5 |; S } : |1 N2 e" e8 k, ]7 t0 {6 l: ]
while(1) //松开按键检测
& T0 [ U- E4 G0 x U8 A$ r' P7 A { 6 C! c8 k' T, Z& q
temp=P3; //读取P3口
4 }& |& d! _, p" l. X+ u temp=temp&0xf0; //提取高4位 $ ^& z2 g; `7 c9 e7 b
if(temp==0xf0) //松开按键了
' v& I7 I. B* |2 p: [ { + i/ g( [% F, ]
delayms(5);
/ g, c4 q/ g3 Z% i7 f6 \8 W temp=P3;
& u" M# |+ f) z$ x0 s1 t& J8 | temp=temp&0xf0; ' I- M) b }$ z- k) f
if(temp==0xf0) //真的松开键盘了
' _2 W3 v7 t9 K0 `4 o9 k h { : \6 R4 K# Y* }* ]
break;
t+ g; u* t/ X2 C2 w9 E } 1 d% `! E2 B; I5 s
}
4 W! I* B2 G3 t6 g/ q: p } 8 F: r; b9 G% _5 j/ R1 n
showKey(num); //静态显示按键
& S6 A3 d( H {2 Q# t# a" Z. ]2 Q } ! t+ O5 O( U' x( k8 K5 `8 A
} 9 [3 d# |' z6 X# `& l
}
. \/ m- E: i, }7 j }
6 v/ f* K Q* |; C2 V void T0_Work() //T0定时器调用的工作函数
/ y4 T3 r- C; b' O) u1 O { 2 {) A2 d2 Z0 d
3 L3 D( W% J0 K; }+ V8 B }
) n" F( h- D$ z7 p/ P( T
7 r0 v2 o4 n% c9 Y3 I& O
1 b2 q% k1 v/ @, z: Z
% S3 R; N. M% u n/ h0 n: V+ n' s. r
( I/ j1 {/ h4 @+ F, |
|
|