|
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 |
|