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

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

[复制链接]

该用户从未签到

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

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/ h
游客,如果您要查看本帖隐藏内容请回复
0 n: V+ n' s. r
( I/ j1 {/ h4 @+ F, |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 04:51 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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