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