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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <reg52.h>: h4 Q- L7 N% V0 _4 j9 ^* Y3 W

2 d0 P$ y8 t4 G. d& I0 _sbit ADDR0 = P1^0;2 k: ^; {4 @  I% i8 X) N* V
sbit ADDR1 = P1^1;
# O5 Z! O; A$ H' p( ?$ i/ Msbit ADDR2 = P1^2;( X5 Y6 {3 l6 O5 Z' V3 k
sbit ADDR3 = P1^3;/ }+ u# ~" ?4 |  l
sbit ENLED = P1^4;
. u, B5 c$ s( Bsbit KEY1 = P2^4;/ i7 t' G) h" g2 @- r( S* Q) F. R
sbit KEY2 = P2^5;# n7 k1 H8 I* R# _# n2 b
sbit KEY3 = P2^6;& \0 r( j2 ^! C; g6 `
sbit KEY4 = P2^7;
. Y: _$ ]1 e7 D  G. A3 u$ d3 X9 ^& ^$ x' X( Y
unsigned char code LedChar[] = {  //数码管显示字符转换表! @- X. W1 C3 t  P
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
2 B+ D8 Y$ T) }" E    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
% E  {1 R" x2 w2 N$ p3 {};. b1 D. r! g5 N7 l  e
% t0 h# k& z2 Q$ ?6 }
void delay();
& X+ R6 D; [) J2 N; K) P$ C5 c; c& e: J; c7 y) q
void main()- |2 V* Q) ^: |0 k
{
% g7 n3 A& ~" N( w" V2 q  x% }    bit keybuf = 1;  //按键值暂存,临时保存按键的扫描值
6 H! L# y2 k' e  h: K+ }$ h& P    bit backup = 1;  //按键值备份,保存前一次的扫描值
0 c4 c. V' w& o9 {) a9 P- [! Q    unsigned char cnt = 0;  //按键计数,记录按键按下的次数( }6 ^7 k5 o/ `. ]

  y) Q( c. X1 T/ |; a3 m    ADDR3 = 1;- m4 S% E7 p! O; i' q
    ADDR2 = 0;
, c8 W, T* ?" l$ B' g    ADDR1 = 0;! }4 {/ {  H: C
    ADDR0 = 0;: g% B6 n5 y$ }0 z9 p9 S) t: m
    P2 = 0xf7;   //P2.3置0,即KeyOut1输出低电平6 c4 X& f" J9 R" g4 j
    P0 = LedChar[cnt];   //显示按键次数初值" S; N7 ^# K' n6 ~: y
% G, K- W( U' y1 f0 O
        while (1)
6 [- }0 Y; k+ F  q5 o+ H    {# x7 W" l  c4 I/ b7 r' ~. P
        keybuf = KEY4;            //把当前扫描值暂存& M1 O9 e& M1 ~: z, \
        if (keybuf != backup)     //当前值与前次值不相等说明此时按键有动作6 G( U% T8 h& J2 m/ U
        {  b, j( m2 J+ s: z" Q- h
           delay();              //延时大约10ms7 T6 t! k! s. E: U/ C
            if (keybuf == KEY4)   //判断扫描值有没有发生改变,即按键抖动( e( V  ?( W. `. T, R
            {; o, r& `8 b! h3 [; v
                if (backup == 0)  //如果前次值为0,则说明当前是弹起动作
/ S* @! S5 {$ K                {
, l! d, p& ]0 L/ F3 I                    cnt++;        //按键次数+1
; f2 L& h' v+ s- o8 Q# W                    if (cnt >= 10)
; q; o, j: i5 [% P) w; w5 G9 o$ ~                    {             //只用1个数码管显示,所以加到10就清零重新开始
/ ?# I( }; h- P8 _$ Y- l- @! l0 u) P                        cnt = 0;0 }, N3 u, N$ z' z7 u" X! |
                    }, m1 S: c6 ~! y3 o$ C7 H/ c
                    P0 = LedChar[cnt];  //计数值显示到数码管上  {. D8 m1 F: v/ G0 w7 ^$ r% x. R0 N
                }
: J: ?, b8 q6 Y7 ~! K* \" s% u' ?$ P                backup = keybuf;  //更新备份为当前值,以备进行下次比较3 a7 p/ _1 J) O& x, q: x, O
            }4 ?1 v/ w) G- M& Y6 X
        }) X6 @  w; l9 v1 X/ `
    }6 z6 @( h9 Q* R* d. P! ^
}$ v$ H9 L  w! r2 M( E
/* 软件延时函数,延时约10ms */
; z3 s; O6 T6 b  ]; N5 u- Svoid delay()
; g0 G3 P4 e1 }4 g{- j0 J3 F8 v( @3 x. v0 }/ C3 ~
    unsigned int i = 1000;
- T1 m8 i  T9 v/ B1 y' E4 ?2 t7 I( q- B        8 e" x. @! j, `: H6 w9 _
    while (i--);
4 O1 s8 t  x6 i# R% _! n' f7 o}
7 T! i$ A' g! d! C* q! q. e6 A

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 18:29 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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