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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <reg52.h>
% L- k! {  C& Y4 x" d4 `1 O$ K$ U! e( K. G7 h
sbit ADDR0 = P1^0;9 x: h: y# G# k
sbit ADDR1 = P1^1;
  L5 Y' m6 e5 j1 f: osbit ADDR2 = P1^2;& C8 K* O6 q1 u+ |; h# m. P
sbit ADDR3 = P1^3;
: }9 e  y8 ~2 h5 j+ @sbit ENLED = P1^4;+ u  S4 [- p0 t; m
sbit KEY1 = P2^4;# [4 O9 ^4 j$ Y3 D8 P* X2 }
sbit KEY2 = P2^5;
$ F* x& y2 q3 Y2 t' Gsbit KEY3 = P2^6;
7 |4 C( H: G+ T! H1 @5 t) Wsbit KEY4 = P2^7;, ]0 b6 s1 `. {4 D9 X% o2 u
- i: U9 {6 R5 w- O. n& ~
unsigned char code LedChar[] = {  //数码管显示字符转换表
7 m$ q  X7 j: H    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
& y8 r" ?$ S1 m. {    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
2 V# e: l/ x* ]# C( T1 B};2 ^4 B4 N( u% i' b3 H

) j! L! [1 N6 w& c* |void delay();
: D. t2 B& s( s* F" r' v9 _9 h
! E8 _, ]$ u4 ]* Wvoid main(). z9 ~8 w1 y% ?0 Y6 K) V
{9 I/ L; r. u; {& w* J; h9 f# C# C: K. s
    bit keybuf = 1;  //按键值暂存,临时保存按键的扫描值
6 `9 p' p# f; K: K, N3 P5 M* b& Y    bit backup = 1;  //按键值备份,保存前一次的扫描值
( H4 X3 A# s* j    unsigned char cnt = 0;  //按键计数,记录按键按下的次数
6 C& ?6 ^3 L% m4 D; \5 s& j" S7 m, d1 \
    ADDR3 = 1;
6 i3 |/ U; j  W! h$ ?    ADDR2 = 0;8 j  F  \3 }# M% y  y
    ADDR1 = 0;2 L& S/ p7 M; M& U8 l
    ADDR0 = 0;
- z$ f( ]# k  c/ Y    P2 = 0xf7;   //P2.3置0,即KeyOut1输出低电平4 Z; a! f# I, ^# s4 p1 k: q
    P0 = LedChar[cnt];   //显示按键次数初值4 r) P6 U/ v9 N; o

1 |8 v7 C7 d% ~' v        while (1)
6 X% f! y- o6 u$ d6 e    {
" M$ K$ {1 r! [: p        keybuf = KEY4;            //把当前扫描值暂存: q" D$ W$ j3 V5 [
        if (keybuf != backup)     //当前值与前次值不相等说明此时按键有动作# q2 J3 L4 G+ j
        {
7 N- ~9 s& t3 l5 E0 P, i           delay();              //延时大约10ms( t4 b, p$ @7 l- P
            if (keybuf == KEY4)   //判断扫描值有没有发生改变,即按键抖动: `6 `1 ?: Q8 U% w( n9 C
            {# g* x9 M0 f) R& T$ f8 I9 G
                if (backup == 0)  //如果前次值为0,则说明当前是弹起动作! R7 _# t( n3 g7 t# b& {$ g
                {
0 w; w. Y6 |- Z7 K- I4 {( r7 ^                    cnt++;        //按键次数+1( n8 S$ \% F& E9 g  N
                    if (cnt >= 10)2 ]# X8 v* I: O: u- p% G
                    {             //只用1个数码管显示,所以加到10就清零重新开始
0 H+ Q, {- k; V* L8 T1 i1 A0 W                        cnt = 0;: D3 s0 `+ t" X5 ^
                    }+ q$ G9 ^$ C9 r8 ^0 `
                    P0 = LedChar[cnt];  //计数值显示到数码管上- R( W  p2 ?5 l% v; y& s
                }
: J! [$ ?% j0 |1 Z9 C                backup = keybuf;  //更新备份为当前值,以备进行下次比较( r7 I' A0 a3 E% N
            }2 z. x0 I7 z9 ~' E# n1 K, \
        }
* X* a! M5 L( u, n, P0 d2 |& [4 s    }/ ]( S: M3 v5 e7 B+ J
}
+ \$ k. t5 x7 e" S# g/* 软件延时函数,延时约10ms */3 f6 U8 {/ p# ~1 u* q! {
void delay()1 l& n  L4 ]1 t8 _# V
{
7 V: _! Q) H( `/ J6 V    unsigned int i = 1000;3 D" i% |4 y6 o6 h  h' @
        
3 z' I  ]; S+ `) b! X0 R    while (i--);
/ d7 ]' l) R0 F, d2 [4 b5 [}, j$ G  r3 O4 P, g! I

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-20 09:19 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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