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