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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <reg52.h>* X/ b4 s. @3 n0 V' c
5 p) w2 A3 f$ n; m) e: x/ b
sbit ADDR0 = P1^0;
$ {% A6 ^- k- [* g- ]sbit ADDR1 = P1^1;- Z! ~( k+ }5 h  o
sbit ADDR2 = P1^2;* I. L; F$ @7 Q* w6 K" m& ?2 G
sbit ADDR3 = P1^3;
9 ~; ]9 y( U* j4 V: \1 z9 Xsbit ENLED = P1^4;! u6 n/ \  H3 s6 V
sbit KEY1 = P2^4;5 B' [2 _# [+ }8 ]3 y
sbit KEY2 = P2^5;& y+ I) X5 x" _6 R, b
sbit KEY3 = P2^6;
  s8 E) `' x7 T& a' x) G9 ksbit KEY4 = P2^7;0 @! N3 u. c7 `/ Z! d# \5 G

$ B6 U/ g* v' G" C! hunsigned char code LedChar[] = {  //数码管显示字符转换表
4 \  R# N. V. l! |0 }  B- q    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,( E8 U1 z: c  f$ _! {9 o
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71. W! x9 Y2 N: R2 N1 ?9 w) o9 n
};
* V2 a  G$ q9 o3 P$ T7 Y+ E# N! T' ^( q2 ^& C; Q
void delay();5 q6 Q3 V' x' |& T
* Z% C" H; N, G! s
void main()! x5 s7 g" W$ H. L9 ]: T
{
$ T# X- d% T# z  ^0 T# @& Z& D/ o    bit keybuf = 1;  //按键值暂存,临时保存按键的扫描值
" L) l5 f  W) @) M5 C* i; f    bit backup = 1;  //按键值备份,保存前一次的扫描值
  A. K  T, o. m2 t" Q# c6 O9 J. W2 O    unsigned char cnt = 0;  //按键计数,记录按键按下的次数
+ D7 F8 c; o* L& k, L. M4 y# S
: A, m3 |* G7 O% i% r' E    ADDR3 = 1;
* T+ U' E+ W8 S5 G    ADDR2 = 0;' Q, l/ Y" C5 P
    ADDR1 = 0;7 g+ u2 k0 n) u6 ?
    ADDR0 = 0;
1 e9 @, b2 M8 L4 n$ Q2 v    P2 = 0xf7;   //P2.3置0,即KeyOut1输出低电平
. G' Y  S  r6 t& Q  |4 {* I  L    P0 = LedChar[cnt];   //显示按键次数初值; L- v: F9 _" l$ m  z6 N

! J8 G! m2 ^# l1 ~" A% y        while (1)
( k9 H! P( \* S* ]4 d0 m    {
. d9 p( X1 V9 ?        keybuf = KEY4;            //把当前扫描值暂存0 E2 t, m2 r/ q/ e+ `( x$ I! ]
        if (keybuf != backup)     //当前值与前次值不相等说明此时按键有动作* o7 |0 ^" O. }. I4 a7 Z( l
        {
( {4 c3 i" ], O) b7 I4 Q( Z% G           delay();              //延时大约10ms1 ^8 Y5 }8 t5 L# x- H6 Y7 |! @
            if (keybuf == KEY4)   //判断扫描值有没有发生改变,即按键抖动2 F6 C! M$ t2 Y- j/ U0 m9 f! ?
            {9 N4 [( @8 c1 w3 q9 E0 d
                if (backup == 0)  //如果前次值为0,则说明当前是弹起动作; l5 c# |, K" t; o: S
                {
3 r, H9 n6 N4 H) \( c; r                    cnt++;        //按键次数+1, i  v& z2 Y+ o! t+ V3 B2 J
                    if (cnt >= 10)
4 j4 h( h4 n4 F. M; k; V% |+ B                    {             //只用1个数码管显示,所以加到10就清零重新开始
8 Y# `' K$ i2 A( j, c) R, A1 e                        cnt = 0;/ W0 y, m1 K: d6 U
                    }
& I2 E- x5 _4 h5 R/ b7 P                    P0 = LedChar[cnt];  //计数值显示到数码管上( U1 B5 D% X2 r
                }
. z5 ~5 C9 C% s- G# `                backup = keybuf;  //更新备份为当前值,以备进行下次比较- ]; h$ E- E, \( |" a" s8 f3 v
            }
: N! q% T) `7 L! m2 R5 [/ X        }
. p7 B: F6 _7 e3 F: q    }* S2 F& s  Z) g& U8 U$ D3 E# ^
}
  s8 a" [2 m+ e- e' d3 d4 C/* 软件延时函数,延时约10ms */8 y) v6 f: `7 w8 a0 j
void delay(): ]6 G$ J  }/ p# q" o) K
{
9 y. k* k9 P3 D' Z( A    unsigned int i = 1000;* m, q+ m* L9 E! W2 a
        3 b) A' y7 S6 }1 Z9 {
    while (i--);
' B0 `! }. e3 I* U4 R2 H- M}0 M. Z/ t7 i& K) s4 {* a

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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