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