找回密码
 注册
关于网站域名变更的通知
查看: 651|回复: 3
打印 上一主题 下一主题

51单片机学习:4*4矩阵键盘与可对时电子钟

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-16 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-31 04:26 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表