|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0-99的4位按键显示单片机程序 可控制加减与清零! x- R Z4 C! W8 d! m2 ?
1 ?; e( M- z/ q" X" z$ @/ Z
1 _- q* O: @, d做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。
' j m, y9 p" @: t% h同时附带2017蓝桥杯驱动.zip。
x. X0 U0 `! o/ d5 m# e! F4 Q5 l# M% Z, R4 F! Z
部分源码预览:: e1 k) ?5 l7 Y" G" S
#include<reg52.h>
$ y3 Z( a ?) ]/ l0 f1 g
( a8 p I8 e' @3 H' E#define uchar unsigned char* U* q/ s0 f4 n) ?7 p
#define uint unsigned int0 N6 s( c" a0 i; T+ I* J+ g; h
, h# g1 O$ G# T
bit write = 0; //一秒存储一次1 L2 Z j% ]8 E0 z- U; Q
sbit A138 = P2^5; //数码管动态显示
2 q7 Z# t ?7 {4 p* d# Fsbit B138 = P2^6;9 Y1 e, o4 q4 ]% h
sbit C138 = P2^7;
% r& ~4 N8 B6 ] Zsbit key1 = P3^0; //4位按键8 Q& I8 E, c6 \0 Z9 ?( V( u4 x: f
sbit key2 = P3^1;2 [; v B6 H, _. z1 o6 m
sbit key3 = P3^2;0 s4 \* B& S% w+ `
sbit key4 = P3^3;
- X3 V1 J0 i* @sbit I2C_SCL = P2^0; //II2c/ k& x+ ^5 X( @8 ^4 d) m
sbit I2C_SDA = P2^1;$ b# Q" O8 S0 ?& ]5 [% F
/ d0 k$ x/ C7 L. Z0 M4 Z( @1 |uchar duan[18] = //共阳极数码管. k2 U5 \4 ~$ x$ C/ ?
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
6 `$ b% _' k9 u6 b' N/ W+ u9 G 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
/ A6 B" G+ ~& Iuchar wei[8] = //位选
9 r5 V, \3 X1 o: q( K& p4 k{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; B! [$ W. ?/ ?, f* z. ^1 c
+ P4 ^; d6 \- A6 ^ gvoid display1(uchar w,uchar d);" f$ }3 X+ |! o# Y/ J( s3 Y
void display(uchar num);
, `; s7 `& k+ Gvoid delay(uint a);
7 l. a8 e- d& X& Z9 ], B# V# `6 i9 v- f3 a" q% |/ W7 {9 x
void timerconfigration(); //定时器初始化( A3 X. ^0 _& G* w6 U3 s4 `
5 Z0 R( q6 j; mvoid keyscan(); //按键扫描
4 Q/ I' A; u; C2 W! C
# a& @/ Q5 p$ dvoid I2C_Delay10us();
5 m% Q# U8 w. ]9 @7 w3 c! W: evoid I2C_Start();9 a$ c: ~5 A( I, W- Q% T' P% L
void I2C_Stop();
9 r' X6 o; N- u* h* Yuchar I2C_SendByte(uchar dat, uchar ack);" h+ }0 k+ V. |8 ^
uchar I2C_ReadByte(); H4 l0 I* O# B2 p5 h% x/ [# B
* |& b) L4 W! O
void At24c02Write(unsigned char ,unsigned char );$ C/ B6 ?" h1 M9 J. i: [
unsigned char At24c02Read(unsigned char );0 B$ r9 x# E& X; ^
: f# j% f! |1 ?6 Z' |; {# r
uchar count,sec;
. A. N5 H7 v! c- e- W& |* `! K! E: n5 t" j
void main()
6 b/ v# e g) }7 m{
' e5 A! P! ~* n+ i, c6 N% Z3 r' O sec = At24c02Read(2); //读存储内容4 G+ {1 |1 o' I' C1 X
if(sec>99)
! W' C# @5 s1 ] v6 k( x2 m) E sec = 0; 2 Q: U: S8 Y/ [+ Z
timerconfigration();
+ B7 B5 c% N9 n& f' ? while(1)
6 k/ s* A. K/ t" ~3 d& \" }, j {
& X A" p4 S7 e9 h/ F' e keyscan();
1 Y' ?, X% z2 P! g; J+ v display(sec);
6 `' R# U @, p% ` if(write==1)
0 d K+ S$ i0 f& o {& y" _0 T( @, `! I: l% h+ e
write = 0;) f0 J7 a9 n# s+ ~6 i
At24c02Write(2,sec); //存储: c* L: r, @; q2 q4 o) X
}
! w8 ?9 |: ?6 s0 h e/ y7 ]6 L }
* d1 ^' k- @7 g+ N4 F- d7 ?4 n9 R}
5 a: A; t4 o. b: w0 z7 S. U. @; }9 |. z k4 n
void delay(uint a) //a ms 去抖10MS足以
3 i. {' Q2 S: H' Q{
, @# F4 m) o+ A; @) D uchar b;8 c4 G) }. t D& O% H
for (;a>0;a--)9 c9 W( C3 ?, h/ K' q7 k0 D2 z
for (b=110;b>0;b--);
0 v5 m6 g) E$ N0 }4 v8 I4 { l4 S}: b. G7 S% V2 b) W4 z1 F1 X
* I; N5 P/ O5 u6 F: W( P
void display1(uchar w,uchar d)7 B. V, p h3 p7 T# s7 M
{
9 p6 @! t: G' p5 V3 V. U6 |( \ A138 = 0;
6 i8 |% c ~3 w. \# R& L B138 = 1;" o' z/ W( i7 y) x8 D q. k0 K
C138 = 1;
7 c! ?. Y! e. J" m+ Z6 d' Z: y, A9 L4 ^ D6 P% N: w. p
P0 = wei[w];
g: ~3 \% ^! j/ A% }1 T- O
( N+ c+ T2 o2 Z8 T A138 = 1;
9 g8 H4 |3 w x/ G
6 `" X2 q/ X# i# L0 Q; X$ d4 T# [ P0 = duan[d]; f1 s' F2 W* R
delay(5);
- B& }; W* P% ^ P0 = 0xff;* {& E/ j0 C9 ?5 ?/ K2 q3 e
}6 [& U& N7 M1 t+ ?
- i: q; h' `0 l5 o4 O* T0 ]' j
void display(uchar num)
$ ]5 J0 }& [8 G h9 z0 Y3 _{
& R2 ]7 P, q, K/ J! G! n display1(0,num/10);
5 Y ^5 A( g9 n& u$ T2 l display1(1,num%10);1 U" ?2 a+ z, p6 A* ], X
}6 K. U( H) L4 l: L* d- A, J
- {9 E, B( W* T" `" L6 j" b$ e
void keyscan(). ~2 K" R P0 r4 m' z7 f
{% f- f" A4 l; X7 c9 m& d6 p7 r
if(key1==0)
8 r2 _! z( ~+ C9 F. {0 R1 \' z; f. _ {. L* m# M+ L' l1 A/ J
delay(10);! @: q# Z. T8 p1 k' J
if(key1==0)3 M8 Z! ?7 v3 F0 [1 B* |, m
{
2 z1 u+ @# }& t" d* a sec++;0 m" ~6 y* q- ^. d; {8 D0 @
if(sec==99)" x( C: M, m! Z) y6 q. F& L
sec = 0;1 x/ {3 g0 Y% L, R M( Y
write = 1;# j, e" V, ]" l/ P
while(!key1);
+ T7 c; B: F) s1 ^. Z9 T) l" {6 D }
1 ^1 a9 q$ u3 b# i }: R% r4 f. Q6 G2 y# }
if(key2==0)" ~, R( B4 t( C- ~* p9 x) I
{" f% F$ ~" A' K8 j* A1 S
delay(10);" u- n( j" z! N/ n+ }2 `0 G" n2 Y: K. h
if(key2==0)
8 z2 R: O0 Z$ Z) t4 p/ ^3 @* u2 j3 g# s {# B ^$ h3 f! Q( e
if(sec==0)
: C/ F- _0 Z/ G7 W* H% n, T sec = 99;
- p- B0 M; s# j& b else
) z/ e; u2 `; y* }, m8 O+ ] sec--;! p$ D V" b: ?3 I. k3 o0 I J/ _: x
write = 1;/ C# G. D* K& \
while(!key2);+ ]3 G# ]+ L: T
}$ e4 J7 F: l Y+ N7 I8 b
}8 R+ q3 q9 p/ h( O+ t3 q
if(key3==0)
^$ [* m4 b- m! f; y- y {
9 L% p1 Y' M6 V: ~/ R delay(10);
1 e1 n5 G- M( e$ ^8 M if(key3==0)8 k$ u5 a8 |6 l7 U k% K
{
) V$ B: l+ ?1 n+ U s sec = 0;# S$ v8 Y% l8 A5 { h" A7 F* ~
write = 1;
7 c7 p* h+ G; [+ ~9 E+ J while(!key3);
: m2 r9 Z+ J, G' p' p2 A3 C1 J! F }
- u2 u/ ?. \/ @! a4 Y1 R; a }
6 U1 {; ^4 Q, ^: @4 S3 _! M, f if(key4==0): e' h t& x0 a. m8 J5 I8 M, b4 {
{! P N# b: r9 _3 P# S. ?* [
delay(10);
9 d8 Y6 r" e! r( r' G L2 e if(key4==0)
' }# F/ R& E6 v {
" }7 j/ F6 A, H9 F6 ] while(!key4);+ {9 \; a+ |$ H
TR0 = ~TR0;2 l" a) Y" }, h- d" V
}' F5 [ W* e0 c" i6 J0 q
}
$ H$ T! V# m" U$ Q3 v}, r9 b: J% a, [8 K& s
5 w; f$ Q/ {- c9 W1 R( J' mvoid timerconfigration() //定时器
8 m) W. w. {: v% w{
8 y! E9 j- J" u3 a* Q6 A7 i TMOD = 0x01;
' \- M. E, [5 s5 n( \ TH0 = (65535-46296)/256;
- u- N. \) ?9 A TL0 = (65535-46296)%256;
) h' L- B/ n# j4 i* V4 d9 {( J EA = 1;: q' m N$ P! S+ t8 M7 c
ET0 = 1;
3 y1 ?0 N+ d8 n// TR0 = 1;4 k# z9 y0 E% l- A* e
}2 m: w8 Q, x5 H" s. a+ E! E: w. D
% e/ V1 ^5 U( F. f, r6 G% n. Vvoid T0_time() interrupt 1
# H: w0 Y1 _; ^& o/ |6 ?{9 L) R! |! O2 [6 ?
TH0 = (65535-46296)/256;
. A" [+ X* \" I+ _2 }4 M* }7 E" O3 R TL0 = (65535-46296)%256;
9 e5 e5 B+ m* p; {- h8 b8 L count++;1 n6 w0 O- Q$ } l1 i" ] s
if(count==20)# h5 I% e2 S* q( Q( I% Y" i1 O
{8 V) {) J8 F+ z0 l% z( p5 ?. l
count = 0;
$ H5 S* S% Y* m/ e- A2 t/ i sec++;2 `3 k' W8 p3 K# x4 r7 ^
write = 1;, K" W% ?& \% W
if(sec==99)
) r) v- f6 a7 Q sec = 0;. v' ], I% @4 Z& ~; e: ~
}: n+ |( b* o6 N2 S/ |
}# b" d# `0 c; M3 @: U
% B4 I. A- K% a# j) A
void I2C_Delay10us()
2 @8 ]. T4 Q5 k{
@$ ~9 w& O; ?5 C, y" o uchar a, b;! b; G( u8 k+ N9 l1 u1 I. u' O
for(b=1; b>0; b--)6 G! H8 |/ D9 b' B- `; }
{6 d2 Y! c* q4 i1 _; A1 P* Z4 [
for(a=2; a>0; a--);
0 a* c" b' F5 p+ a }
9 H! T! M8 y5 q( Y9 d}) ~! ]" x% f+ e$ w* y
/*******************************************************************************& G, ?. U0 R* F+ |
* 函 数 名 : I2C_Start()
* Z* F* M& W! H2 f8 J, [: I0 @* 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
p- {, r8 Z$ v9 I6 T* 输 入 : 无7 X% b( z9 j2 f* P6 Z
* 输 出 : 无5 @& @( }# |9 |6 D- w8 U7 S
* 备 注 : 起始之后I2C_SDA和I2C_SCL都为01 @. \2 A2 j# G u
*******************************************************************************/
/ ~3 K8 m/ f7 D/ s$ c! g/ v( s6 ?5 v) [7 p7 N: C3 [
void I2C_Start()
: ~2 A, o3 F- h3 j2 l, k{
8 j* x0 ^" k- R; S$ A0 G I2C_SDA = 1;" I; G) m; w# b; z6 o
I2C_Delay10us();
}3 _! @/ w5 t! |: R: E- N I2C_SCL = 1;) E- D7 K% c& T. T" o
I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
+ Y/ r6 T, g* G I2C_SDA = 0;
7 v$ a3 }1 p! _1 z I2C_Delay10us();//保持时间是>4us: y& ?7 C1 p4 |+ U
I2C_SCL = 0;
\8 a" j. y8 J" c I2C_Delay10us();
- a0 V. ?5 m( X; C: r}) a; [' m& [9 m) o! \
/*******************************************************************************
* O7 e8 i; { s) G0 a+ ]+ Y; X( `* 函 数 名 : I2C_Stop()
) R7 u" I- n' f. e' F* 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
/ e6 e, @7 [1 Y/ R& w* 输 入 : 无
( U' T" X4 N4 q( X5 b* 输 出 : 无
8 Q4 f/ n# H t: W* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲6 C w% Y3 j1 s! |/ S, \# a
*******************************************************************************/
! Q- W) O; I! E R, Q7 {8 x0 L9 v: a; x
M2 q/ Z* X7 U5 a' I) k9 Ovoid I2C_Stop()
* O+ Q( p3 p8 c+ z{: N3 ?" J; q6 s$ I1 j9 r/ Y j' `
I2C_SDA = 0;1 y8 N0 s7 n% F9 O. n
I2C_Delay10us();# ]7 S' M* i3 _( \
I2C_SCL = 1;$ C! X: s: { o: M1 e9 p; [
I2C_Delay10us();//建立时间大于4.7us# N0 N5 `4 q. U
I2C_SDA = 1;
2 ^: n% `# _% d I2C_Delay10us();
$ }3 e n- I# d7 g6 T. p}
7 b" P1 ^5 F# T+ p# t2 Y2 G& c. O/*******************************************************************************
; ^0 l, O* i* r& v! J% @6 ^- F/ x. a$ E* 函 数 名 : I2cSendByte(uchar num)
. ~1 y" i% j7 o9 y* 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
4 K- |& @3 S1 ?* * 保持发送信号I2C_SDA保持稳定
- M2 n! d3 U0 S/ b8 q3 ]* 输 入 : num ,ack$ |) I% L! o0 i4 V0 p
* 输 出 : 0或1。发送成功返回1,发送失败返回04 h! v, _: L( B
* 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0! ?$ d" U5 ~7 W9 V
*******************************************************************************/
7 C5 e! n0 c" s; C2 H* k G& v h/ E% ?$ T. u
uchar I2C_SendByte(uchar dat, uchar ack)$ Y ~, u: L, ^0 c7 I
{4 V6 P/ U2 I3 V0 U+ f0 P
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。1 K6 S% n5 ~# G
& p, E) t2 Q! X for(a=0; a<8; a++)//要发送8位,从最高位开始7 W" n* r- ~# D' D
{
, C% q' d( J7 _ I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
0 X8 k Z0 U$ o% y: K dat = dat << 1;
+ L; o0 Q& g% |& B% y I2C_Delay10us();# H, h1 E5 `+ e/ z. l
I2C_SCL = 1;1 q0 D( A4 H# m4 A9 P3 |: z0 \$ v
I2C_Delay10us();//建立时间>4.7us
7 {- X/ g4 p1 h2 O I2C_SCL = 0;: j* `2 h+ d) I5 |
I2C_Delay10us();//时间大于4us
/ X: Y) P' P7 b1 b: v) v }
: J6 F$ l& Q, D; s; p, ^1 b1 P e; x+ T5 ?# g( T% U
I2C_SDA = 1;
1 n8 R/ j& b0 ? I2C_Delay10us();
! E, O3 A) h+ N' ~4 \" k/ M I2C_SCL = 1;7 p2 u. [! K7 L7 a( ]. ~0 p3 `
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低- X; d/ ~5 b' _5 J
{
/ J m+ Y9 s) B: G2 ^1 C2 D6 K3 Y b++;
+ `* r# }5 d$ g4 T9 x5 Y. s if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束 J/ o) u9 j, }
{) X# Y: u. m2 t# q
I2C_SCL = 0;
1 C" @4 l1 i; U8 j I2C_Delay10us();$ k( @; I8 `$ V8 D: R# U
return 0;
; v* J3 y7 V1 D+ j }' \& S. t1 t0 ^7 p/ B6 ] b
}7 ` {7 y; q& a
" q: |* g0 u) n8 r* R3 A
I2C_SCL = 0;
& e* P/ ]5 I+ [- A! [5 e/ U) L: { O I2C_Delay10us();6 `2 a) R* d" `. r; }" k9 F, {
return 1; 4 \- Z8 \* e: N% m4 C
}) I5 f+ a2 \6 I+ ]* C" z2 x: ], |
/*******************************************************************************
! `2 s& A& t2 X x9 q$ s* 函 数 名 : I2cReadByte()6 @$ }/ ~/ n! P; W' x
* 函数功能 : 使用I2c读取一个字节 y8 g% N# J# H; b$ X- U" `
* 输 入 : 无% @3 L6 b; ]6 k7 J: k( f/ ~9 q/ M
* 输 出 : dat0 e1 _7 H; x+ D- }) g
* 备 注 : 接收完一个字节I2C_SCL=0
2 [0 _0 \' ^7 a+ r; C1 p*******************************************************************************/ m9 h6 f# A) ]7 K# D% I
4 a0 E, H5 \3 i2 V2 quchar I2C_ReadByte()
6 y" P t; u5 E m5 ]5 X{
I. S: G; [1 k+ T uchar a = 0,dat = 0;" t5 G0 r: i4 w! O* t, k% ?! f
I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0* c3 b- H2 f0 H0 Y
I2C_Delay10us();. z1 [( s( f/ D! g4 \: A9 _% }% Q0 R
for(a=0; a<8; a++)//接收8个字节
& H0 o/ `% [$ ^8 K, _2 n {
- |7 D: ~- Z+ @, p- ~7 }! | I2C_SCL = 1;, S4 v6 O7 K3 t# q4 l/ J
I2C_Delay10us();5 V7 P. P M- m0 N
dat <<= 1;' z$ Y' H; P1 _
dat |= I2C_SDA;
X/ o# J- Z# l N G I2C_Delay10us();0 Y% T* k$ W& c& ?/ V
I2C_SCL = 0;7 W; x5 J) V4 a) ~* q) r5 Y
I2C_Delay10us();
; ^/ ^3 p" h- h" V3 ^/ I! l }
" {7 j# j! u4 d" F4 a. m return dat; ! ` m. ]; A8 B$ L a( T
}; N& F) g+ u6 F; \* x3 n+ K
o- `3 @" l p0 j5 s* J# f/*******************************************************************************/ X8 n7 X7 K6 S8 ]( I! w) R
* 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat)- m3 O7 l3 N& _% g U1 q
* 函数功能 : 往24c02的一个地址写入一个数据
1 \# G1 B; t8 R R) M. U% Z" F* 输 入 : 无7 T& A) I( H* i+ _
* 输 出 : 无, `0 I; ]0 r, B8 u. n
& S6 Q# Z8 _2 k* E. P8 ^# p1 m- R. g+ ]# E1 f
…………余下代码请下载附件…………0 A& n& B5 {2 k1 n( ?' R
+ y l# j) ` M( T下载:
: z/ b0 E7 i+ B% H n3 Q* D3 p( F' U$ ], ^+ y3 p
2 t. k4 \+ ^, p+ [. f' z |
|