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

简单的单片机矩阵键盘程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-12 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
#include <reg52.h>
4 b" o1 N6 B- \1 [, U7 Q" G' \0 B, e) s/ Y2 {8 E, H
sbit ADDR0 = P1^0;3 h- V' p/ |9 }/ u: y/ Q7 u
sbit ADDR1 = P1^1;
3 I% r' M+ ]3 K3 V4 D$ Ysbit ADDR2 = P1^2;4 E! M" @: K  a/ O! G
sbit ADDR3 = P1^3;
! p0 Z4 v3 H4 D6 O4 j' ?, Isbit ENLED = P1^4;5 j* F. w' u& g, M
sbit KEY1 = P2^4;/ I" V7 q. D% S4 c* F$ M& c
sbit KEY2 = P2^5;; v8 ]1 W. ^0 K$ ?$ e1 C. }5 P; Q
sbit KEY3 = P2^6;
7 ?# |+ j+ p  E4 E- W" N- qsbit KEY4 = P2^7;
2 z9 B5 a% J" ?% A4 i
/ O) [, B9 O8 t4 j+ z/ Munsigned char code LedChar[] = {  //数码管显示字符转换表, i2 ~+ }" \6 b+ T7 b: t) T9 y1 l# O# h& l
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,3 s3 v9 G3 g2 S) w" f) C# f6 k
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71+ ?5 f3 Y5 O6 I7 Z( @; }" i1 |
};) e  u5 [, k% n- O8 j
9 M; U3 Y+ I; t! Z+ `) X" R
void delay();9 w( |' D; ^5 S( ^0 `! H! s: e

) I* Q9 ^" E7 C) _void main()( h3 G" p) u% i( ?  h/ A
{
: ~* b9 r2 Y  p! L( n' @. h    bit keybuf = 1;  //按键值暂存,临时保存按键的扫描值" W" {8 P2 w! v4 `8 b7 U5 w7 O
    bit backup = 1;  //按键值备份,保存前一次的扫描值2 g  L9 ~/ w+ }! S1 l, g
    unsigned char cnt = 0;  //按键计数,记录按键按下的次数0 e& ]- W/ i  W
: Q" _5 E8 p3 t, D* T6 r, T0 @
    ADDR3 = 1;4 S) M/ X: J% ^/ Z, r
    ADDR2 = 0;
# }, s1 E9 b! [$ g+ G' n1 _; H9 f0 C    ADDR1 = 0;
* A$ W, P% l2 I1 q' G) ?    ADDR0 = 0;
" |1 a. |4 H& u1 [  K: }0 J/ D) v3 u) d    P2 = 0xf7;   //P2.3置0,即KeyOut1输出低电平
' H9 k- {6 \! e- U0 c& Y$ A6 u! |    P0 = LedChar[cnt];   //显示按键次数初值
4 W* Z' [0 F! B" f% g4 ~! T* |& ?- c
        while (1)
5 E' _- D  X' q6 X( Y8 w7 Z    {
$ L+ Q$ h' T) B: H        keybuf = KEY4;            //把当前扫描值暂存) d: G, A. q' z/ m* `# q# v1 P$ I1 ?
        if (keybuf != backup)     //当前值与前次值不相等说明此时按键有动作5 k' c% m. X2 V8 X
        {! z: U3 V* o0 p! c. N
           delay();              //延时大约10ms: J  |- w# b9 `' W$ o6 Y
            if (keybuf == KEY4)   //判断扫描值有没有发生改变,即按键抖动. m  ]# l3 a: [
            {, B9 ?3 [" M: K3 l. x
                if (backup == 0)  //如果前次值为0,则说明当前是弹起动作
  ^; t- M5 t$ {" b/ ^  N, R                {# h1 C' S) \5 w
                    cnt++;        //按键次数+1
( H) v+ t5 g0 E" d                    if (cnt >= 10)" o3 ], `& Q- _' {$ y9 _
                    {             //只用1个数码管显示,所以加到10就清零重新开始
1 I, _/ M/ |* v                        cnt = 0;5 }9 z8 O0 j1 g/ d, S5 r
                    }
$ N7 e& w8 Z0 h4 j                    P0 = LedChar[cnt];  //计数值显示到数码管上$ y/ {9 C7 h& C0 V6 a( N
                }
& r; `! `) t$ P' c# K6 q6 w, \% ^                backup = keybuf;  //更新备份为当前值,以备进行下次比较
3 U1 G9 S3 h$ N) A% L6 |            }
- X3 M3 B! y$ |6 Y% M& G/ G5 L# g  g3 j        }
5 K* K3 ]" F; I) m, w6 b    }# Q9 ^. [$ N7 Z" w# L- f
}
* A; J+ Y" ^! D7 m/* 软件延时函数,延时约10ms */' N! U: _' `' w
void delay()
1 k7 p- c5 Z5 ]/ c{
9 H3 T& T0 i' K: X    unsigned int i = 1000;, I2 {. Q5 k& u% u& ~' m
        
! |2 t2 |4 A/ D' h. c    while (i--);
5 D- B& \1 }) H5 [}
$ [1 \4 ~; o) m$ Z% t4 x

该用户从未签到

2#
发表于 2022-7-12 11:00 | 只看该作者
分析,学习一下

该用户从未签到

3#
发表于 2022-7-12 14:11 | 只看该作者
分析,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-4 20:57 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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