|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:4*4矩阵键盘与可对时电子钟- K* z7 w0 f* T2 r0 c% \
8 j4 P& Z# |7 w, }
8 Y7 Q9 i! C. R7 b3 f) O今天学习了下矩阵键盘,
8 M, @( v4 a) P! M( ~$ j4*4, 分别代表0~F这16个数字" s5 c( R$ P c# q, [
我们按了哪个键就显示到数码管上1 C9 i& R4 D6 \6 ^: R* @
2 L% f2 q+ {6 k% T( t' d( P
看完郭老师讲解原理后就自己动手写了,郁闷的是
8 y3 b6 R. N5 N8 U. G1 S$ |: ]在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!
4 ~) g3 K5 o k; n" j& u结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就$ f" c" o7 h' ]1 p- o! O
会复位成0xff,怎么赋值都没用,其实是没写冒号啊!/ p! g' @. u( s! Y$ \( M
: f1 Y0 a B- ~& [: s# g调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,$ x3 ~! Y }/ {- o/ W7 Q9 b
然后参考书上的代码才调试成功的,表示无语~~~9 K+ ~' r* d( B0 {: Q) Z
. i. Y4 X: R: b" cmark下
4 i: C% w% L$ A. t7 q N
: `! Q4 C1 @4 ^! e) ?
4 o/ g6 f8 `3 H& X7 D5 v* G5 o6 d #include <reg52.h> - J9 u q0 E6 R$ V& ^+ u) w0 e
#include "MY51.H"
1 Z3 D# Q* k$ o0 }! Q/ Y2 x4 P% z# l' M7 s
void showKey(uint8 num); //静态显示 4 {: I5 \" n1 F+ W
void keyScan();
: ?0 F: }+ N. N- C" S! U void main() c9 D1 ^0 k5 j5 A
{
- p/ f: `. _0 c$ T% P( V) H showKey(18); //初始显示的是6个负号
- o. Q c: W- Y# W& r, w9 c5 b while(1)
, v- F% {2 C# R0 V { //循环检测 * [* R: _( w( X e2 [% @
keyScan(); 2 t! w( o: @) J6 w0 [/ Q
} 8 F' h* H0 I) ?8 p% _/ Q
}
2 p( b _, @5 \! }( B# r4 r. `8 `0 X1 S( n! e* a; c' L* `# a1 I
void showKey(uint8 num)
( W- a, c1 x4 }1 S' E: C { & a3 k" a0 C+ G; c
P0=0xc0; //11000000 打开6个数码管 " n6 E4 h n8 M! d6 Q& Z
wela=open; / }8 t0 N6 i0 _; a @+ m
wela=lock; + M) I; e$ m7 @% l3 E" J: j0 Q
2 b8 D- {" N8 g/ D0 p P0=table[num]; + m1 T$ [8 ~. l7 c0 E
dula=1;
3 M7 W4 W9 o* p8 D dula=0; 9 F1 I3 m7 d- {
} / L* S& Q5 ^( X7 T, e7 y
void keyScan() , m9 G1 A' X+ U) G3 r3 ?
{ 5 P1 q4 E" S9 {; ], j7 _$ A
uint8 num=0; //定义显示的数字
% }: G* u6 a% A uint8 temp=0; //P3口回读信息
! }! ^1 T6 u4 u- {5 ? uint8 i=0; //定义矩阵键盘行号索引
1 T! f ~5 K; [: z for(i=0; i<4;i++) //共4行 $ i/ a2 i. w) F' R6 l& `2 u. ]
{ 9 d' D; b$ [- l( p- C3 U: W. e
P3=_crol_(0xfe,i); //扫描的行索引号,从第0行到第3行 6 d/ ~0 ^6 n$ z- l$ M4 R9 m
temp=P3; //读取P3口 3 V* |% p/ s0 N; o3 k
temp=temp&0xf0; //提取高4位 4 I+ s! S+ E2 o b- b
if(temp!=0xf0) //按键了
& N- ^9 X. I5 _8 _0 f y& s { 7 |3 P: P8 z* A5 f
delayms(5); //消抖 O, e7 d" |6 L
temp=P3;
/ ^1 F' S- V) I# }- v; ` temp=temp&0xf0;
/ I) |0 i+ b8 w& m& ^ if(temp!=0xf0) //真的按键了
- z3 }4 z& O" s. V7 U { * D. s; ?3 L9 o% q. Q1 ]
switch(temp) 0 N' [: b/ O" }+ S( D, E
{
- x2 d8 m% T" h( {. y% v case 0xe0: //1110 0000
/ j1 D+ P7 @7 Z" r { ( }* A1 [1 L& w- ^" w3 _) N; u$ j
num=0+4*i;
! |% W' I8 q# Y& a break;
. n7 Q5 B' i2 f" m0 e! |& X. Q7 a: n# @ }
7 b0 R& E, D0 Q8 }+ A% O case 0xd0: //1101 0000
# c! M- w/ S, l7 w% H8 x {
* |, u% |0 _$ G2 U( F num=1+4*i; ! J" o# i# T8 J+ N
break;
7 _ K/ d4 Q, J1 j }
2 J, c5 P' P' Y( G7 f* N case 0xb0: //1011 0000
$ t& `6 ^" s: Y( x2 L4 H/ G {
6 h6 k! V) N) n8 X num=2+4*i;
: b4 r: y( J- f7 G9 O6 B5 M break; ( Q" v0 f; `: K( F! j# J
}
; ^! M3 Q( \: v& z0 z case 0x70: //0111 0000
, C9 p9 W9 h) i7 \ {
" k0 x) Q" o/ n6 h num=3+4*i; & u3 z# S0 s, ^5 g& Q( z" X! d
break;
' |$ S7 p/ ]+ u6 x1 p } 6 a$ }+ |. V3 [& N' V6 \$ N
default:
% P1 X6 W+ A+ W { " ~. [! j: c5 k" e1 I/ A
num=18; //18号索引是负号
; h$ V9 u9 n. _' X5 F led7=0; // 按了不该按的指示灯 ! z, N9 B, E: _; Y& V
break; 3 Z, x( _4 B' `3 |7 E& w4 Q+ ^! n
} & i; x4 q) ^2 G! v- n! A7 O& [
5 D0 Z: }" @1 @- n( q; P: w( i } : {3 v: a5 z: v1 e
while(1) //松开按键检测 1 B" `9 J& N9 l* j6 z- _* v
{
# {3 }, ~* o3 q! a5 K% { temp=P3; //读取P3口 1 n0 _- P' ^0 [: b3 T; g
temp=temp&0xf0; //提取高4位
% S+ ^) m0 k9 j* Z8 T" z2 G if(temp==0xf0) //松开按键了 & G. C+ P. c1 u
{
+ B; N* b& S* P- Y- r3 i: a h8 M& C delayms(5); ) Y$ t7 z6 z4 @9 s
temp=P3; 5 A1 j9 e9 O- J# O$ q- {
temp=temp&0xf0;
" j/ K9 O& a' l if(temp==0xf0) //真的松开键盘了
' A* F) C9 c7 U p0 ~: j" Y$ _% E {
) P& Y) P. h( n break; ' `" E( Z' |1 P6 l
}
$ ]" p! v, A8 _& [ } 8 c& `" g5 o. o2 U, w; @2 [+ Z7 B
} - B8 O; k, Z& |4 @
showKey(num); //静态显示按键
# i( l' a7 I$ h2 I% t r R& @" g }
9 \& b% Z1 q, G1 B% [3 C; B& o } " o8 G6 n6 W7 g5 [: m( K# b8 B
} + Y! J- o3 G2 U% Z
} % n3 E ~) }3 o) g- E, E: p. R
void T0_Work() //T0定时器调用的工作函数
0 v2 \: x4 b8 q0 Y" L6 W+ e( R+ H { $ P% ]& ^( v* R/ E% e
9 R% |! [2 z) k: a) _' r } - g6 x/ W) R& Q$ R, T; F
" l* t# k6 ]9 R( g
% Z; r) p8 p5 O/ U: X
$ L8 ^) ?" O8 k* L: `" H7 X+ Z
& z$ U& a5 M. r2 z5 |0 ~
3 V6 X8 [4 Q4 I% h; [6 c |
|