|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0-99的4位按键显示单片机程序 可控制加减与清零$ a4 \, a, O: o6 v' {
9 b* v& j+ o" e, C; T) f( J! x& {
% z3 j# V) c$ F; U0 U( b; b做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。( g# E# |& s2 B# y4 v' w! h9 I
同时附带2017蓝桥杯驱动.zip。0 [! V" {: o7 E' _! x) g
9 w2 Q: K1 b, S* j h$ Z
部分源码预览:8 X3 M' \5 P; C# {2 w- {
#include<reg52.h>
# H1 f2 K. T# y7 h4 a" r
8 S% O. j/ l8 E( @#define uchar unsigned char
( h; e) w/ ^$ D. t: o#define uint unsigned int! J. m6 t$ f8 I6 b' w
S `1 i* a" ~! L; i5 ?, w
bit write = 0; //一秒存储一次/ J: y+ i2 _& d N
sbit A138 = P2^5; //数码管动态显示5 b! q' g V0 i% i2 x) Z
sbit B138 = P2^6;
/ f# m# O6 x- w1 `# L# ^sbit C138 = P2^7; d. A7 V, o7 o* c) g) ` s
sbit key1 = P3^0; //4位按键- N4 D/ g1 K2 C4 J! b" H# v
sbit key2 = P3^1;! _" H7 C0 F5 Y! B: A
sbit key3 = P3^2;
) M! P R' q, \9 asbit key4 = P3^3;% }' |' p9 r- C e
sbit I2C_SCL = P2^0; //II2c
- u) y* Q5 P3 V& K a. dsbit I2C_SDA = P2^1; U3 _2 n: V* P# R1 Y5 j' s2 ~# R2 }
, F% V0 f* E1 h+ y, O
uchar duan[18] = //共阳极数码管
' j$ y5 a; J$ V; u{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,5 P$ l# ]8 R5 L4 Z9 f* ~6 O% r
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
& T9 _% f* H: v" J& A U$ Wuchar wei[8] = //位选
) \/ s2 q( N/ ^: r7 r{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};' n7 E) n; _2 O$ q8 K. f
6 v! Z/ Y& I2 M0 u
void display1(uchar w,uchar d);
% X0 x3 j( G7 F M' Q0 ivoid display(uchar num);* t4 k' P- d( k; Q% t$ R
void delay(uint a);1 H+ E7 J1 l2 ]7 f- y. P$ Q+ r2 M
6 l' E; p# u3 }* h6 ~1 W y" rvoid timerconfigration(); //定时器初始化. t/ ?# y8 t8 e4 b6 d g' T
3 v9 f6 F' z. V- D' W, kvoid keyscan(); //按键扫描
7 [7 J/ w# T0 e0 ?
3 P1 F# ^0 P+ ^' d7 {$ ~9 Gvoid I2C_Delay10us();
, o+ o. T0 z+ U, Z- \void I2C_Start();+ g) s& j8 t1 L r* _% b
void I2C_Stop();
; V: s. f' B- H6 b% Z) Wuchar I2C_SendByte(uchar dat, uchar ack);. K" D- |) W1 W- [5 [
uchar I2C_ReadByte();
( C( W7 D9 U: u
8 z2 i6 P" j/ F. G# W, pvoid At24c02Write(unsigned char ,unsigned char );
4 Z1 O) d0 a3 l) ounsigned char At24c02Read(unsigned char );
% L+ L! Z- F( k6 [& c
. e' @( v6 n+ F2 w! P6 k% suchar count,sec;
# n7 X; |6 u) |6 _) l. v* Q" F: @3 n" D# [5 z
void main()% k, R0 K& k% h- r) W; N" s3 r
{
7 m0 M/ t3 x! ^" Z& T8 | W% M sec = At24c02Read(2); //读存储内容! L' q" @; B$ v0 o2 Q. A
if(sec>99)- o6 V; M) Z H/ {1 z
sec = 0;
; N p0 w& l* T/ ?! {- G timerconfigration();
4 G" P5 W6 x+ w X, H while(1)
) O1 }# I' {& y* E* G* g/ @! C ] {
0 S2 z, l4 b* T, U; \3 T& B keyscan();+ D ]( W" w% H, o
display(sec);2 [- H9 ^) k* n; s
if(write==1)6 b' r. \2 ?/ p
{! G7 Y9 [) S! b* o! J I
write = 0;
' B8 O; h! |4 N; g+ _: F1 N- { At24c02Write(2,sec); //存储; i5 }- G( _& b
}( A2 |) T" C5 S6 a5 U: q
} " I2 u5 e, D, _8 y6 n2 T8 l _- a# d
}' |1 l# Y D4 Z( S
b5 d# F! { d- h3 y; Kvoid delay(uint a) //a ms 去抖10MS足以6 V; g# \3 r6 p; g/ L
{5 Q, @- _1 j! `
uchar b;
, K7 U8 E) Q* I1 e' K- b" c1 ?2 j for (;a>0;a--)/ Y6 B7 ]' F" C! |# R% B M3 {
for (b=110;b>0;b--);
2 r! E/ r* s6 r; {}* n3 }! _* `( ], z4 |
0 A1 r3 N: t8 B- G5 D8 ~4 Avoid display1(uchar w,uchar d)
% u6 i% c3 k# \$ N; Y8 z2 { x% \{# z8 z6 w7 p7 y4 S0 U
A138 = 0;9 Z% Q+ [5 e7 ?1 w& M/ s
B138 = 1;
: l4 p8 y. m' `4 h0 ] C138 = 1;1 h7 |7 S0 y) _1 X9 W; W, E
6 h7 Z5 E$ S+ I8 B P0 = wei[w];# K1 R) K; U2 X/ V0 T) i3 v! {
* U# O$ P( M9 F A138 = 1;
# S$ ?5 e" l& U
; Z$ m- D) Q O* V0 s! u P0 = duan[d];
$ X2 ^6 ^% u. B4 c$ T. A# o delay(5);
% Q3 A; ]+ H1 | P0 = 0xff;8 ~0 t6 c( w+ h( x+ y6 Y# ~4 x
}
2 ]7 r8 ]+ A. \/ I; L7 X5 c+ [. e1 Y8 W2 j# h( C$ E
void display(uchar num)7 T' n7 I6 m/ d
{0 o9 K; N5 V0 o" D2 s
display1(0,num/10);
! h) m5 E" `( x( t+ R display1(1,num%10); r0 K: L6 P" W" \3 A
}% K: R8 x# ]% ]
8 q$ {$ B! _9 r9 l, ?9 {void keyscan()
. T1 w1 M ^. {7 x7 O* I5 F1 C{
! f" }9 T0 C9 S+ O3 Q9 t# | if(key1==0)9 @- s4 n8 t, Y1 V/ ?! J
{: R ^3 M1 h2 K
delay(10);
2 W7 z% A$ |+ g% g7 p if(key1==0)
9 f* M! ^: E+ ]8 C' f* I/ U; ]3 ^ {7 [2 B& _; S4 U4 z
sec++;( M1 H! L. N; I) _( f y; I9 G
if(sec==99)* p$ E2 {# J( O% h) Q. r2 S3 d
sec = 0;* X1 ]: Z4 o: X* I- W
write = 1;
* y2 k1 a9 _6 M; m0 T' U while(!key1);
! k1 h$ @' C. G( c) G% H# j }
* o; ?3 F% V# t/ O* G$ u$ | }; _/ X4 M" Q9 r' z9 T9 {
if(key2==0)
' S0 Z* k' d. Y4 m- E {' \; ?3 [3 N9 {9 w0 s6 ]
delay(10);
) Z8 {$ U* z# P" F7 w. f* k) G if(key2==0). U8 J4 m9 G! ~. t' ~$ g4 _
{
& \- s, h7 a9 f' y$ A% c, ]( ` if(sec==0)
" K. w$ k$ `$ J$ |. s sec = 99;
( T2 J9 q3 S: K' D9 n1 { else+ {& e0 O% E: C/ x! P& n3 ^, M
sec--;, ? p+ o" v0 f0 a' L$ T$ Q
write = 1;! n# a+ @5 \$ U3 g$ g
while(!key2);) b$ v% C O% Y9 B2 d7 u
}; y% h- a+ e; \! w7 V# v9 X3 N
}) y C1 K; u: D6 B; y/ X" E
if(key3==0)
* Y) q% Y0 w. \ O {
8 Z: S0 y! t0 p$ s! D, L delay(10);
5 O4 g$ b/ L* ?/ s3 k. k if(key3==0)
" E" ]) }/ f; c% G% s4 I {
7 i* ?, t, W4 N1 S# [ sec = 0;
9 S) P# F' T L1 F4 M, u write = 1;
0 a0 b- H: x! Q- y6 Q7 k2 C- m while(!key3);
2 |# o$ u9 h: n5 `) L }
8 O! ]' l9 s/ Y2 } D+ f }/ Y, B1 }, I5 ]6 d- ]
if(key4==0)# w! f- n% z" \3 J k' w; h5 O* q7 T& ~
{ R0 P$ d# S, n: [ F
delay(10);& u" R7 L- f" o$ l9 Y$ s
if(key4==0)
! F# f) S) N* n6 I {
- n/ v4 z/ J/ |+ l* V while(!key4);
7 m5 C0 X Y6 Z* W6 h TR0 = ~TR0;
) C- z' Z4 J& j6 F+ k( A9 h/ Z }
6 R, Y. L+ J) S; _& Y$ M }
o1 j' I, K$ _) V0 R}- w% k+ G0 D! p* C) y( r
; F* P% i6 O8 v8 a, bvoid timerconfigration() //定时器
( H% T6 n6 C) K" n/ ^! X{
* ]. n. B9 x) T0 n TMOD = 0x01;
( J0 [) d% r4 c. m$ K8 I' V TH0 = (65535-46296)/256;
: Z& F* T. W/ [1 S0 a; B TL0 = (65535-46296)%256;
1 M& W+ t/ v- o+ |7 B1 d6 }6 X# c EA = 1;. A; L/ J3 I' t- K2 M, v* [
ET0 = 1;, P6 M: K4 |0 ?- b$ ~
// TR0 = 1;0 W/ c1 h. E6 m1 h2 ^2 [4 D
}/ ?) n9 R( @5 }7 R9 q' t( b( d& ~' s
& r7 L3 j1 d& v5 j$ Qvoid T0_time() interrupt 1
$ [& P/ z/ ]: u{$ |4 r u7 } n4 G3 K& @0 |
TH0 = (65535-46296)/256;- V7 r8 a) w- ]) K
TL0 = (65535-46296)%256;
6 V: c4 D( _8 [# |6 i$ [ count++;
- F) x3 s6 {1 O if(count==20)
) O. V. n& K# _% \3 H, G3 c {
2 X/ D: S' }" l; I. W0 d: ] count = 0;
q+ G9 i5 L0 `7 B" m/ | sec++;
7 ^$ f* \7 Q8 ?" Q write = 1;! x" O! L2 S) x5 j7 ^7 l% g
if(sec==99)
" i3 z; `" C* s sec = 0;
; ^9 F5 o B! |# n0 h }
4 k$ X+ j6 K _}
( I- |: h, @; }% d6 c
R- j/ Z6 A4 Svoid I2C_Delay10us()
% B. X1 L$ t" I- ?# v% \& f/ ^: g{/ b5 p- U5 s8 N+ d
uchar a, b;
! c; Y# y; }# ^/ h/ y( M for(b=1; b>0; b--)9 S9 n6 v1 B/ o% b. W
{
; o' S6 L G2 D2 q; [ for(a=2; a>0; a--);; h$ i# x9 T$ e
}
- v" _% z& M. ~4 a5 f3 M}
9 l( ^3 ~3 }# p9 `$ w/*******************************************************************************
# @6 k# `' m) M+ V' V" F* 函 数 名 : I2C_Start()
, ^. s# q5 i' V& U( g! J8 G* 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
, I4 X# [4 G. v4 h. k" C* 输 入 : 无7 l; s0 A% D9 \9 n, U7 V
* 输 出 : 无. s" G2 J: j3 o# }& F3 G* B5 ]
* 备 注 : 起始之后I2C_SDA和I2C_SCL都为03 Q$ [& [$ b5 }3 t& A! a0 _2 X) w
*******************************************************************************/
1 `. @. ^9 t8 p2 s/ q- W4 G* _8 |5 Q; l- J
void I2C_Start()4 R8 J) L' q) A
{; {0 K, K0 Z6 m
I2C_SDA = 1;0 T d% u6 m+ _) e$ v2 q' T
I2C_Delay10us();
* P* w5 n. S0 B+ w1 j6 r I2C_SCL = 1;
, f1 W H6 u: s6 J8 G8 @$ ` I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
1 C( E8 Z( s! b4 u I2C_SDA = 0;$ `3 t/ B; _4 T
I2C_Delay10us();//保持时间是>4us% j+ W3 |8 B( `8 ~
I2C_SCL = 0; ' |, T, G' {* b3 e# O h% n% B
I2C_Delay10us();
: g' U* i1 e- L5 [- Y: c! v" \$ X: @& m}1 ]( B' F+ B8 y/ Z
/*******************************************************************************( K% m; }6 T* }: ^
* 函 数 名 : I2C_Stop()
C) F9 v( n( n% M6 x( e* 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿. m# g1 \1 j& ~* o. o! t
* 输 入 : 无
+ Q' E( X: o6 u+ ?$ j: [+ ^6 k$ y* 输 出 : 无
0 q3 T- b4 ]4 S5 z* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲: Z/ a& Q$ e0 i6 b' s; _% M
*******************************************************************************/, p, ?0 N F e/ X; G) C5 o! N7 b
( a! j% s! G0 C& ?; E4 ~* v$ E0 dvoid I2C_Stop()7 ^ ?7 K, P) k- n2 I7 e( ~/ |& |2 a
{
, A1 _! K( l" [& q7 L. K8 n I2C_SDA = 0;
2 s$ u4 W; ~5 L# ?7 n I2C_Delay10us();
; D6 @( I& T1 k, b; ?7 v& d# Y I2C_SCL = 1;
3 k2 D& c) n+ B& a& Y+ f2 n+ O1 K I2C_Delay10us();//建立时间大于4.7us
$ U- M3 G( v2 F L4 w9 F I2C_SDA = 1;
6 y/ p( r: A& i" Q. @7 T I2C_Delay10us();
# b+ d0 d; T/ ^" |9 M}
% n1 [$ e {2 ?9 }) N- W/*******************************************************************************$ D$ r7 i+ g( N& }* e# m8 D. X8 J! j: p
* 函 数 名 : I2cSendByte(uchar num); s# O; g$ D2 y- s1 y4 ^
* 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
: g0 S N" T" [* * 保持发送信号I2C_SDA保持稳定
+ }( t8 q! S. ~! w1 p! O* 输 入 : num ,ack
2 _# r( z$ ]+ X4 T) K" y1 G4 l* 输 出 : 0或1。发送成功返回1,发送失败返回0
( U( N, g% f! h$ Q* 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0
5 [( M+ A& O D, M9 e( O*******************************************************************************/+ K) j" \: x: Z: z
0 X9 s, [( s* q! H% N9 x5 L" Wuchar I2C_SendByte(uchar dat, uchar ack)
" ^" {0 p# P2 E$ @& F{* e$ G4 L8 @) R0 B) W
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。" N) A$ v2 o+ q
8 T; Y T+ i0 \; s# N; X# [/ l$ o
for(a=0; a<8; a++)//要发送8位,从最高位开始: Y3 ]# T! c$ V( B2 l# j
{; H* V* h ~" L# \3 V- r
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
# n8 L- ^* i, n% z2 H dat = dat << 1;! E0 I2 t, L0 f5 Z
I2C_Delay10us();
* M3 p) _) s2 @3 M I2C_SCL = 1;7 L( a& G0 t9 k7 X. U
I2C_Delay10us();//建立时间>4.7us
- n# c$ X" f* g5 N4 i' W I2C_SCL = 0;; T" A. ]& |, }" u3 h
I2C_Delay10us();//时间大于4us
9 O4 N2 C2 L( C' h1 J }
: R1 ], ^- y' I& c2 H2 }5 U+ c, M9 Q! q( @1 d8 E
I2C_SDA = 1;
* Q: e9 F" z1 ?: W I2C_Delay10us();2 V$ X5 u* Z9 n$ F& P% A2 \
I2C_SCL = 1;+ m8 ^* V; |+ J9 E. ?4 O
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低3 D7 `2 h9 ^1 R# ?* g
{
, w) h/ c O0 P' g( f4 w J b++;1 P: U' r- G/ S5 t; _/ C' f
if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束" q) B0 X$ H" n3 n3 r
{
8 E0 J) V4 Q# v# Z, r I2C_SCL = 0;! W' M5 K% j) J; e4 h7 f1 @' [! ?
I2C_Delay10us();. U. A; P0 D4 e* K+ p- E" x
return 0;
8 `9 Z: C& V% v1 {1 C0 ? }4 G1 q I$ B* h# Y0 N6 Z r
}
2 y' `! q; t8 x6 I# _; L+ ^1 @# }; `$ C. h+ l7 Q; u
I2C_SCL = 0;# {+ Y0 F- G; i+ q5 }7 i
I2C_Delay10us();
4 |; D" s& H9 ^; \$ l return 1; # c. f) R$ l ?( F' J% h
}, `, _5 O9 W" P8 H9 S3 k6 x
/*******************************************************************************
/ ^/ G4 h" V5 _6 y3 V6 ?# h* 函 数 名 : I2cReadByte()% L, l' G x6 r8 t
* 函数功能 : 使用I2c读取一个字节
- w( M4 a" t; c5 u* I2 X4 D* 输 入 : 无: M7 O8 Z- L4 w9 n
* 输 出 : dat
6 r7 j3 c9 d2 [* 备 注 : 接收完一个字节I2C_SCL=0
+ {( l- K, H7 Q' @*******************************************************************************/
. ^: J( b1 `! m2 w, ~9 [( v
8 L* c g5 s1 s0 i' E7 ^) u* u1 _uchar I2C_ReadByte()9 o: T0 m1 s6 l* h6 y- M
{
% R/ t$ h0 k: G {9 G" ]* K* h+ m uchar a = 0,dat = 0;$ Y M' W0 `7 V
I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0$ o3 ]8 J: s; R. ~. Y& v Z3 `
I2C_Delay10us();" }; p5 [6 A0 p, O
for(a=0; a<8; a++)//接收8个字节$ z g$ v2 K, H5 P
{- S8 c+ Q% P& z7 W2 x% n! k
I2C_SCL = 1;
0 T% X7 G3 N' [( G% C I2C_Delay10us();) C+ `: W, j8 h5 {/ C
dat <<= 1;
% {. z7 T/ Q% A4 K dat |= I2C_SDA;6 l/ z; h; ^. W! P
I2C_Delay10us();
0 n# H5 R& v: _& C I2C_SCL = 0;! a9 G$ f# N. `$ q% _- s
I2C_Delay10us();
s3 ~4 Q2 x% Y* K9 ]! s }
& Z8 I" ?+ q" ~$ F1 X; i return dat;
. P$ P( L# y8 N, C}4 P6 s- b! R) U
6 g' T$ @! L( O6 G$ G/*******************************************************************************! l% p# X7 k" i8 b8 |3 d
* 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat)& A- J6 J" L6 p9 L5 o
* 函数功能 : 往24c02的一个地址写入一个数据. T* f0 b4 L2 t ?' r, _/ {
* 输 入 : 无, ]- R( ?0 ^ X* z
* 输 出 : 无
2 m( p' s; K: p. P# m
6 `8 I/ E& O1 p0 y9 }, g- ?4 `( |6 g; E7 G+ f* h
…………余下代码请下载附件…………
! n. p; }. `0 \. I# W, i, j7 ]' _0 W3 s3 X- ^. c
下载:" B# R4 a! S& L( q1 g* c1 h
1 x: d1 J% N" C+ B/ u- Q& [1 c- k H1 e; M! N& ]+ _
|
|