|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机学习:4*4矩阵键盘与可对时电子钟
3 i0 c- I7 _# |# j/ j: F& i+ c6 z7 k; N
& J5 {! z+ U1 c0 ?$ e* q1 l; {" ]1 b7 S
今天学习了下矩阵键盘,
# E( @/ s. M$ c, T0 Z. v2 O! b4*4, 分别代表0~F这16个数字
0 z6 b8 C7 N3 `9 ]% x9 n我们按了哪个键就显示到数码管上2 D$ W9 c9 [. _5 I4 K' h/ P# e3 }
; y: v6 U: w" H/ P# d
看完郭老师讲解原理后就自己动手写了,郁闷的是8 n* a, Z. d3 S) P0 h
在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!0 j' a* p9 @3 n+ I
结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就
& m- |7 N0 C: t/ Q1 p会复位成0xff,怎么赋值都没用,其实是没写冒号啊!$ r W9 U' b* a( m! Q. ?
4 S5 p" Z+ o" u3 G$ Z2 o5 T) M调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,2 c1 H- @5 ?( @# m5 `
然后参考书上的代码才调试成功的,表示无语~~~
8 Y" f1 u$ d7 X, v7 q5 _ _8 X
$ t7 y6 f( N" K7 _! U3 T- t9 emark下
% K( V* {% `0 W& w9 m/ W& u# \% _4 B, Y7 g" C5 z, U
7 d; s/ Z; p4 U #include <reg52.h> " o+ f- j9 H7 V; m+ ^+ d" D* H0 ?
#include "MY51.H"
) F% B' a6 {1 p C; d3 d6 w; U
, D- x! C' W3 i+ X+ z+ }. x void showKey(uint8 num); //静态显示 , F$ B. g7 }' G4 D
void keyScan(); 8 Q) h# c: L F9 K5 k4 C- f
void main()
9 P! {; Z1 F2 c, b4 n% }, C1 a { / \' Y, J0 G; @: f% j. d. a
showKey(18); //初始显示的是6个负号
% W, P# e9 y5 W3 W while(1)
, |( A/ y6 P/ A& {0 [6 b/ F { //循环检测 9 W9 Q1 M1 ~6 e9 b1 a
keyScan(); 0 S0 V3 q( T* b% O3 D+ `
}
; y0 |6 y, L5 p- Z+ x8 d( F$ s2 }# Z }
3 V/ A" y; N7 L) N x
0 p: [* a0 F I8 ?" @ void showKey(uint8 num) # d2 }1 X+ b% Z1 E, P8 m* H6 F
{ 6 T( k( i/ n3 c3 _ @9 `: O
P0=0xc0; //11000000 打开6个数码管
$ t0 I( k! c& W' H: ^- s) G# t9 K wela=open; " {/ g, \# j b% V2 w$ ]; d% k# F
wela=lock; , x* `* f/ _) Z( C
% l6 X p% V: p8 l9 Y0 R( i! | P0=table[num];
9 r y, d) b0 a+ t9 E4 U: K dula=1; * y$ Q0 ^. b. O" t* [4 g
dula=0; , @, o: i! v* @7 g
} # F6 Z# A# Z6 B
void keyScan()
. q- I/ J& P9 R5 n* S: K { $ x# W! j3 s+ B3 S4 I a6 n4 r
uint8 num=0; //定义显示的数字
" ~1 Q+ {/ {9 s& k. p0 ^. F; | uint8 temp=0; //P3口回读信息 & j* i- K! b3 r0 O
uint8 i=0; //定义矩阵键盘行号索引 & j6 f* W; V+ n% U W# }
for(i=0; i<4;i++) //共4行
& Q* j& z% N% e! L {
; s: ]8 U4 M/ F) X' h& u2 c5 l) C P3=_crol_(0xfe,i); //扫描的行索引号,从第0行到第3行
' l" Q( k' g5 d5 o/ p temp=P3; //读取P3口 4 M2 Q$ x5 N+ I+ N( Q& \0 B
temp=temp&0xf0; //提取高4位
2 x# H4 B {1 `( E if(temp!=0xf0) //按键了
5 w& `; i5 ]6 ]' C' Y; P8 C$ } { : H; D1 Z+ Y% F [' `" J" @
delayms(5); //消抖
% t. X- I+ f) P temp=P3; - a. w# F! s9 o
temp=temp&0xf0; $ N# ]& X) f2 `3 ~, ~ z
if(temp!=0xf0) //真的按键了 6 z9 [$ S7 f3 Q7 ]. I9 _
{ 3 N R) F e3 t
switch(temp)
8 A( G- A9 u, O! u, z! M# m { ; [ I6 [- S9 R( Z, s& _# A( o
case 0xe0: //1110 0000 $ y Z4 ]) F7 z. W1 C
{ + J4 L. i9 m8 h
num=0+4*i;
! p" u4 t3 W& p$ I( V break;
' I8 G3 {& R3 h+ w; \, P1 ?9 q* n9 L }
# `8 G* I% q3 b1 G; A case 0xd0: //1101 0000 . F/ Q: g2 p3 k: M( P% p
{
, O n: J$ ^0 f% m: G" h4 t& X) X num=1+4*i;
# d1 ^* D' H" w# O* S8 @ break; U( f& A% ~. Q6 H6 h5 E
}
2 L' S& i1 y; U' W5 [, a6 D# z case 0xb0: //1011 0000 5 a' V' F/ y3 Y+ q3 I) V; l
{ " W6 b/ v( W! J ~+ a7 K. X) D
num=2+4*i;
( A- E8 X4 i5 J J; O$ `) @ break;
: y& i5 g* Y( ^ }
/ S& ?# d1 O3 ?1 E2 ]7 D case 0x70: //0111 0000
( Y7 t' T5 |$ V2 Z( ?5 o {
, i3 ^/ f, z* ^, t* L num=3+4*i;
: @, i2 X$ ~$ U- N1 t2 j7 e break; $ q8 R* }! t Z c* s3 O
}
& y" C! `8 m# O default:
, u' o) ^6 c8 x: U0 e# D {
9 h: W5 o8 g- F+ I1 h; x num=18; //18号索引是负号 / z. N- |/ C9 f" B
led7=0; // 按了不该按的指示灯 " |4 u- f; {2 O) c' q" z
break;
7 e n7 L: K" ?# y$ O } + \% U; a# m: L$ _2 [0 E; S, s
' \6 X2 o5 }4 [9 c. G4 ^
} ' E( [! u/ [: z7 f' V! p
while(1) //松开按键检测
1 j( Y8 R& v7 c3 Z7 r1 z4 s {
7 F3 r+ J" E. H/ c* b1 k G temp=P3; //读取P3口
3 k6 y, P M1 A( V( H/ ~& s temp=temp&0xf0; //提取高4位 . h3 R% ]1 f& _
if(temp==0xf0) //松开按键了
$ I, w4 [, Z( _9 ?5 j5 ]( N { % u9 E) [! P& w7 E `7 o! u: E2 V
delayms(5);
4 d" F9 j7 [/ @/ s temp=P3;
2 H6 {& U! |% \- b9 v4 f temp=temp&0xf0; ' E6 B$ l+ U% |, X
if(temp==0xf0) //真的松开键盘了
3 @- p0 @! {0 H) ~( m+ `7 O; H# y, w: P {
; y! V' G+ ]+ x: S break; " X; \+ ~, m3 Y1 j7 d5 B6 D
} % |1 G- G: J* m% j
}
% o) R% j7 D% @# p% a } 7 Z* ^2 s, s1 H- z& p
showKey(num); //静态显示按键 . t6 h3 D2 |2 {! o
}
! T3 F9 Q4 t# U1 B1 ?$ u } 6 l% ~0 N+ A; v1 F" {# E8 d
}
2 @/ ~$ R- z: z4 U k }
+ C9 i8 g. |4 U% p$ D void T0_Work() //T0定时器调用的工作函数
0 T# e/ x8 ~- {# a) y) o" R! S$ c { 4 m7 q) u" M8 e& m) W7 l
0 l2 O8 `% H+ f# e: W }
. _- e8 X7 \ N5 D& v
* d) v0 G- d/ G" ?" z/ m
$ x, y3 b% W& L" g9 o% c- W: L
" j4 n. J( ^. H: n- w: O- Z& N, w( \3 n; g
|
|