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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <reg52.h>" U0 Y0 y+ ~5 f. t- Q- _
6 s4 M# F; R( D2 `7 R% X6 E6 n+ @% E' H
sbit ADDR0 = P1^0;5 W; Y$ j) Q# F2 c' d
sbit ADDR1 = P1^1;
3 v6 p0 n0 ~0 i' asbit ADDR2 = P1^2;
$ z: e6 B3 Q0 [" i# @* M  \8 X6 M, ^sbit ADDR3 = P1^3;
( K. @2 e' Z/ ^* g- E' H  m7 wsbit ENLED = P1^4;+ Q+ R4 S  G6 T4 \' J+ \3 z
sbit KEY1 = P2^4;
* A2 h! [! |) A- o9 esbit KEY2 = P2^5;
5 ^' |. ]/ P7 U" S( T2 Y: csbit KEY3 = P2^6;, `: ?2 P  f. [. P  {
sbit KEY4 = P2^7;0 I  W* k4 I% N/ z
; y- a) B( T- e  B
unsigned char code LedChar[] = {  //数码管显示字符转换表
1 C7 I% p& _. T    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,) K- o. j: ~! K4 D; E; T) [
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71. ^6 H+ _: Z9 U3 `& H6 t2 w
};9 J2 @; O6 Q& I) M& N
8 e5 Y; O2 h( w6 m& Q
void delay();& U# a0 O3 Z4 i' m9 z
) y: p- @" ^  T4 y. M, j# L+ B
void main()
' ]& h1 H6 b0 t. j  e{% M. G: x5 A  }6 [
    bit keybuf = 1;  //按键值暂存,临时保存按键的扫描值+ W' ?0 D# ]( A; Q
    bit backup = 1;  //按键值备份,保存前一次的扫描值" R- \( k$ X! U
    unsigned char cnt = 0;  //按键计数,记录按键按下的次数
3 n% Q+ ?. K, H5 \) p) l  J2 Z' K' R9 N3 l9 b  `( \7 w6 b( v! b. `9 T
    ADDR3 = 1;
) K# l# m- J$ \* }    ADDR2 = 0;' s7 m. r" z# M+ _2 m/ i
    ADDR1 = 0;# |# S% l6 E' F* j! l
    ADDR0 = 0;# K% P  u# B6 b! [8 G& ]+ S
    P2 = 0xf7;   //P2.3置0,即KeyOut1输出低电平2 a% w3 g5 i- v) y( f  R  x
    P0 = LedChar[cnt];   //显示按键次数初值# X, P; l( D  Z' r: m
7 p$ A$ W/ _$ B$ ]% \" q% {! w
        while (1)  U1 z3 a  a1 |' D
    {- u7 s1 L' ^- M) l0 O
        keybuf = KEY4;            //把当前扫描值暂存
( X! Y6 V, Q' g& W( H' Q) s        if (keybuf != backup)     //当前值与前次值不相等说明此时按键有动作* b8 N: y, F  \& u3 Q
        {1 X* J% Z4 C$ M" h  [7 Q
           delay();              //延时大约10ms
7 [) a: P4 e  \( ^6 }3 V; o* h* `            if (keybuf == KEY4)   //判断扫描值有没有发生改变,即按键抖动
4 e$ l5 R6 c; c: m, I7 O3 ?            {5 G- Z/ _& m0 ^% j) o
                if (backup == 0)  //如果前次值为0,则说明当前是弹起动作3 z7 K  {, c2 D5 j" q
                {' h% Y5 u: h. x% r# a$ y
                    cnt++;        //按键次数+1. U. L0 T+ f& N+ v6 Q) p% l  g
                    if (cnt >= 10)
; g7 U7 s* C8 v6 i% b+ |5 T$ ^                    {             //只用1个数码管显示,所以加到10就清零重新开始! }1 V! H3 h3 b4 D- R5 I
                        cnt = 0;
$ o: p- v' g4 e/ J2 a% K+ }, O' l! |                    }+ u) L1 M% b' ]
                    P0 = LedChar[cnt];  //计数值显示到数码管上1 K  ]3 X' Q  h/ }1 L
                }
6 s+ |! B' q- a% G8 ]                backup = keybuf;  //更新备份为当前值,以备进行下次比较' n1 T" Y6 B# }+ F; B( s/ y: Q! o* R
            }
; ^( e: o/ p' G1 Q. d/ o        }) X3 C  G. x6 E% C: I
    }/ p7 g$ r4 k" k% }3 ]1 \
}& @. Y5 D7 [7 X7 e
/* 软件延时函数,延时约10ms */, m1 h; r6 P0 a9 }# W/ a+ Q
void delay(): P& g& h$ h6 X  {' i: ^( ?4 a8 a3 @
{; M( R, c/ e& q. v4 P
    unsigned int i = 1000;
% o% z3 _; X2 G8 T& [+ l8 d! N        
7 T% V# t- F+ m    while (i--);
8 \! N9 i5 G& e9 u* P}  H3 ]% M% ~& i5 b

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-19 14:25 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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