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

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

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-8 17:39 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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