|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0-99的4位按键显示单片机程序 可控制加减与清零
7 Z7 f; l$ ^; d
; H6 [9 M0 x; i( C0 a( H! f; R( W" T) ], ]3 m
做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。
/ @9 G: a: t: J! m' v/ `4 x同时附带2017蓝桥杯驱动.zip。
/ I; a% u8 z0 z$ j% r! o
3 |. ]5 G* H0 ]5 a: k, U, Y部分源码预览:
" ~ J: J) e; {9 V! P% T" ?( \#include<reg52.h>
, z$ x5 a! Z6 s# f8 C& N* L* I0 t! j% Y6 c) i3 h* R4 @
#define uchar unsigned char
+ S: U) m& d3 q0 U v* K- ?: x#define uint unsigned int( m1 Y% V, N7 E3 }" d/ z
+ F n/ F. l# M9 o; bbit write = 0; //一秒存储一次1 G7 T4 m- P# h3 e( Z! ?
sbit A138 = P2^5; //数码管动态显示
% t( @* e( [$ A) E' z) usbit B138 = P2^6;
# t& [4 }/ a3 p) W) [. q" |sbit C138 = P2^7;
9 `: q+ ^5 ?* jsbit key1 = P3^0; //4位按键; r9 \ d+ \0 j P" ?) c- _
sbit key2 = P3^1;' M: K: Q. u& s4 v3 D* W
sbit key3 = P3^2;& g8 b. O* i9 y& ^. m; U, N/ D
sbit key4 = P3^3;
" ]% A! _9 Z# D! X' }sbit I2C_SCL = P2^0; //II2c
; f& t3 K& E; }) X3 m; c8 jsbit I2C_SDA = P2^1;
8 ] S9 ~- L; `9 Y% u7 [2 S% k' R
uchar duan[18] = //共阳极数码管
/ O/ a# E9 A; t6 B( c O{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
5 J ~4 F6 [4 e% z 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};, j" c' @0 n5 U, h# w
uchar wei[8] = //位选( U3 E: G( H) }/ F
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};1 E! G$ C. S& x" a
; Z! g. h; M7 r/ w0 t' xvoid display1(uchar w,uchar d);$ w* O& y* _/ H8 l) R: b
void display(uchar num);3 L6 l ]. F0 p9 h
void delay(uint a);' ~' S1 W6 P: E' H6 g. Y3 w8 H
. y, D9 @# |1 L: K% R; C5 U7 m- \
void timerconfigration(); //定时器初始化
, K/ n' [5 Y* t: K* ]% L4 w5 o0 S9 B$ f5 B1 d
void keyscan(); //按键扫描* d' n0 Z6 r) c' Q" |
# ?& J: M8 Z( gvoid I2C_Delay10us();
4 g. _6 `/ e* L1 x, D; P& X$ xvoid I2C_Start();( ^% Z# s8 O+ ^! h. U& ~
void I2C_Stop();
# k5 _. P1 r9 H$ j- g$ Puchar I2C_SendByte(uchar dat, uchar ack);9 c) A' a. \2 G8 K: @( J. J
uchar I2C_ReadByte();
4 u& m( |" b/ o
" b/ a( l' o5 |8 [void At24c02Write(unsigned char ,unsigned char );
( F0 l7 q5 R& G" \1 nunsigned char At24c02Read(unsigned char );
' A' A2 R( l' ^$ i
7 D6 J# u7 C6 Quchar count,sec;/ K: p; o w; e2 L
$ R! p. V4 J D6 q! U& \+ p/ @
void main()4 Z, Q/ \( C% ]1 d
{
3 Z$ t" s: }; _) Y sec = At24c02Read(2); //读存储内容
* ] \3 A7 K# @7 y8 P if(sec>99)
9 j8 K; E' X) l0 d+ L5 U sec = 0; # f3 c3 z* F, C: w4 _4 z
timerconfigration(); 1 w# d: A8 J0 A3 D& T4 C+ {4 L& W) U
while(1)) e1 s* W$ r9 q. d) J1 f
{
m) @9 V& @+ w! F6 P: z/ V keyscan();9 Q* B9 W5 `7 Z" O6 j( S
display(sec);1 ~7 X7 v! d: W& D0 j+ |" A
if(write==1). I0 r3 e+ Z; n9 m
{
6 l5 V- R% p5 ` write = 0;
; b& y) u6 s+ x At24c02Write(2,sec); //存储
) x/ Q- K, r. y- G }
6 W2 n( S# B: M% L }
5 a s3 ~) u, z}' r- R% _: L; |8 b2 H
* b0 }: W. Q; Y
void delay(uint a) //a ms 去抖10MS足以. A l4 |! J/ S4 i; t- Y
{5 A( |- @% G* U/ ?
uchar b;
- M, l& k, E2 w+ V K+ N0 y for (;a>0;a--)
9 T, {$ ~/ F" s2 }( x* _. E for (b=110;b>0;b--); % k, T& k6 k6 i: g6 ^% H$ x
}
5 w7 K2 k2 h# h' ]8 s' Q9 J; D/ ^- l+ e* S
void display1(uchar w,uchar d) z8 ?, P- }0 w( F! j$ E3 h$ b
{2 d& O, X9 _$ K0 U
A138 = 0;
* U: A) `8 i" f% C0 n B138 = 1;
3 S, l) Y/ B; Q& S C138 = 1;( @& r# K+ h/ {
1 w7 l [& V+ K2 h1 B: C P0 = wei[w];
8 T: K& [3 V. R4 M* i/ \/ s
; R7 F! y, F& X4 S0 Z. D. w* a A138 = 1;" C# `4 T1 n" h; a& S1 L
( [- q3 O1 K9 Q! M" h0 T6 g8 z
P0 = duan[d];
, j: H4 C7 U+ F+ l2 N2 k delay(5);
! K* W% q1 w/ i2 x6 a* x P0 = 0xff;5 W) R5 ?+ o" s& `8 s7 b1 w, P2 H% l' S
}! V G+ ]! l3 ~6 U" e
0 B$ B/ L) p# i: f
void display(uchar num)) `* C* h$ A3 g- k9 c% T" K' A8 J8 [
{
% B. e* N! U$ X: L: U$ ~# k display1(0,num/10);$ q/ B; m# ]3 i0 y+ k* V1 z; r
display1(1,num%10);
$ p4 R5 J/ Z# N$ Q8 \}
/ p! I9 b$ D1 Q, _* Z) o8 f3 O
9 r) V" ?( E+ \' f: }- |$ D, yvoid keyscan()
! P4 d" {8 j8 `: G6 @( A0 l{
* W P) t6 X& Z, ]0 k if(key1==0)
' S! B! F) B9 T# n# u0 R' n* K! ` {8 n% T* z G# p" q% D4 B( M* K
delay(10);6 p q. i! t5 K m$ F# v/ |/ {
if(key1==0)
9 j8 h* f6 z5 u$ G$ L7 @3 d7 \ {$ U5 H' L6 j- q X) N
sec++;
/ a' ?! R/ c. _$ y if(sec==99)
+ _9 D8 {( G8 e B# `# f sec = 0;/ a! B' R, z. s4 q0 ~8 w8 L; W) ]
write = 1;
3 V! ~# `: I8 |; S# F" A while(!key1); ; ]' z, G3 W: x; \5 [% R0 S6 e4 n
}
# V" e; @' w, g S f2 k }
' a& r% T) L$ e if(key2==0)/ [. }* D! [, Y& y
{/ t% z. Y- V+ B6 G9 D2 @5 ? U: z5 t
delay(10);
3 @" v( m$ d3 q+ L) |1 l if(key2==0)
9 X; W0 K; R9 N2 w0 U- Y7 c0 r { u$ D- I X3 n7 R
if(sec==0)
* \) r; B3 E G! ~+ X( T$ k) K sec = 99;- |3 I0 ^/ }5 a- j: H: j
else$ X) w+ K( B5 o" I1 T) ~) s/ L, n
sec--;
' ~8 i: G0 I5 H write = 1;
0 x, R7 C T) t9 E. Q8 @ while(!key2);
1 Y* Y' i. M( @3 q( ^. c }
/ e, T+ j5 w! V0 p" s }
U# G. ^: @$ n+ @! L4 N- k if(key3==0)
, o2 z9 M5 A$ j } {
+ L- w9 ]! F! p( F" C) N delay(10);
3 E3 f4 l. B; a5 p+ `, G/ y if(key3==0)1 V( D8 E! F1 }: Y2 q8 q$ e5 P. ~& H
{. M! F" f1 B& L# x% ?8 T1 C
sec = 0;2 T7 v0 l# K3 J! u4 d
write = 1;
- T* Z( r! h! o) B9 ]/ m while(!key3);/ v/ g# S3 C4 i/ w4 h- j( `
}
4 _0 \5 v% Z/ F! u# n) ? }, w L0 I. ^8 r
if(key4==0)2 T% q4 l6 l3 T6 I2 r/ H
{! k2 L: l9 d `% u* }( y
delay(10);
' w$ P- v/ o& z5 T7 v if(key4==0)5 l. A3 `+ U1 P5 Z( I4 M$ @) {' T
{& v$ `4 g. g& d1 ~, R9 h; N2 F! k; w
while(!key4);, t }2 q! x ]8 U# a. Q
TR0 = ~TR0;
% d/ \5 [6 G9 f7 { }# P# p0 k1 x4 r% @ u
}9 W9 l% A6 q2 P6 a* {4 S
}2 N9 n! n/ A- s- c, @4 x
0 m6 u K# n, t$ p! ^; xvoid timerconfigration() //定时器! v [, P+ R) T! T4 n5 I
{' m8 u1 C+ ` b3 l$ W
TMOD = 0x01;
$ q6 L' o8 K( q& G- ~7 k, T TH0 = (65535-46296)/256;
1 `4 `* N# ?- a' `# D TL0 = (65535-46296)%256;
+ u3 j9 Z* W" g5 u0 n7 K EA = 1;- o0 b& s. h! b4 P; _! b6 @0 G! v
ET0 = 1;
' ?( O3 x" h8 s' P. Y// TR0 = 1;
' J* R0 Z0 e0 v7 V- D}
+ G; |( f0 P- i0 x) G/ {, D7 P% P. x
# g( s' X! ^9 F/ G% u: E# Bvoid T0_time() interrupt 1; _1 o0 e4 C5 p
{" q2 O+ C! }) n( Y9 H' k0 q
TH0 = (65535-46296)/256;7 R& h/ m( i3 _
TL0 = (65535-46296)%256;
% m$ f/ _* p) o count++;; ?2 ?" ~4 u' D. S
if(count==20)
# N2 s* C! J$ y$ H& r {/ E- W5 r* K, w6 Y
count = 0;
' u) }) P( i6 v sec++;
8 `1 z& F7 n# S9 h W3 r write = 1;
' H& x& m2 ^" A% j5 s if(sec==99)' y& e4 x3 e( h
sec = 0;; A) N* ~+ M3 ?3 I% w
}
% h+ A7 R5 Y! t0 R6 \5 s}
1 P! a4 h* k% f9 d( S2 g M; ?
void I2C_Delay10us()
& R9 B3 |4 Y9 k3 g( P{+ ]9 _4 A9 P: N7 W( F( {5 f Z0 c& `5 U
uchar a, b;1 z, d/ J, P1 @) B k s
for(b=1; b>0; b--)6 L+ ?4 r: r! B- m( c
{. f2 o( ^7 C" Y
for(a=2; a>0; a--);
# ~# G1 F# Z- |; S: S }
2 R: X7 J' C4 f! P}
/ K) t5 {) O3 e/*******************************************************************************
2 m+ X5 i) L' F, l; {7 [' u* 函 数 名 : I2C_Start()
1 o6 q$ H) M( P; W* 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
X! ^3 z3 q. L$ E6 E* 输 入 : 无
0 Y+ D: w/ [+ e I* 输 出 : 无8 S& C) C& N s4 D" p z
* 备 注 : 起始之后I2C_SDA和I2C_SCL都为0* H+ C' S# j `! N+ N: I+ U3 Q8 {
*******************************************************************************/* n# b/ m( ?! B2 ^ t, D- X$ |6 ~
3 _$ P" `) d5 N; l5 C
void I2C_Start()
. e$ Q3 o( c5 Q" z{
# X$ p' T; X: ^- i/ ]6 k/ C' Z7 a I2C_SDA = 1;
; S- {! P3 x. W; a$ V$ z I2C_Delay10us();! b- v- q& s: G% [5 g
I2C_SCL = 1;
+ A2 c$ ~4 |1 c) a% f I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us% y3 E3 V+ \+ C' }5 {$ k
I2C_SDA = 0;2 e# G) X, V$ ^4 Q7 \# C
I2C_Delay10us();//保持时间是>4us
( [7 e* O* `6 B8 n I2C_SCL = 0; 1 `8 r2 ~/ l3 b- z2 f/ P$ w
I2C_Delay10us(); 7 Y$ g2 m& R9 X! C4 u& w) d/ d; o
}
6 o5 h' `# U$ I- H/*******************************************************************************+ q8 z0 f/ b+ ?; ?
* 函 数 名 : I2C_Stop()
2 p7 s/ J- d- W5 Q8 c* 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿* t" L% k1 {# p: X8 [! _
* 输 入 : 无
" G; G! U6 H& S( H# W7 Z4 h9 F+ e* 输 出 : 无2 H2 n, n4 e: _) E/ B" n2 x
* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
( Q. A% D' I8 ^, E8 ~ E*******************************************************************************/
0 y* j. f" ?) H9 L8 _
% H. E _2 `2 s0 z4 H& S+ Kvoid I2C_Stop()
( i- F7 }- ?! y% C; z{8 ~; V" g4 b9 v% i0 X
I2C_SDA = 0;
: q% S# h) C& b# H: c. D4 ]' L/ W I2C_Delay10us();7 _4 j3 _7 }7 ^; `; b
I2C_SCL = 1;+ S) ?, n5 R4 m( }# Q( k6 \
I2C_Delay10us();//建立时间大于4.7us
3 z) I- s R3 l. L: S I2C_SDA = 1;7 F# g! u1 T/ I; B c% C4 d9 e- R
I2C_Delay10us(); # K% X$ _8 e+ _' J, u
}4 `/ k2 k; e* _# X
/*******************************************************************************9 p0 N: y7 l0 s8 I4 U
* 函 数 名 : I2cSendByte(uchar num)4 O% l! r) P! s% p* v
* 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
: _* m: z0 ] c2 ^* * 保持发送信号I2C_SDA保持稳定
+ _0 J' y# d3 x. B, k* 输 入 : num ,ack
X) X6 a4 x5 @. ^7 C3 h* 输 出 : 0或1。发送成功返回1,发送失败返回0
/ k6 @8 B0 T1 l* z! q) ~: J% R1 k* 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0: {' g& o \# ?# {& ~ O
*******************************************************************************/% y! A7 y4 ] r$ G$ i
: W' I6 b* }8 h! V6 W, E
uchar I2C_SendByte(uchar dat, uchar ack)
6 D' y! v) L+ ^2 ?4 r4 f5 n0 @5 Y{6 p: u4 Q/ Z( D' P
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
8 d; {7 _; l; k$ D# X" J* g# f! _0 Y! j. y7 l" k
for(a=0; a<8; a++)//要发送8位,从最高位开始
3 _# \ _! P+ y0 c9 | {
5 E5 h7 X9 ?! W' G/ t8 H ~$ h7 X7 } I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
) V: |: {" Y" C% r$ b% S; E dat = dat << 1;
# a- i, p7 O" W% C6 p7 y! ` I2C_Delay10us();
* K' p! r% s6 m7 q# R I2C_SCL = 1;
M/ x" n( B# M! G I2C_Delay10us();//建立时间>4.7us, n: M" `# h2 R# _- R6 ?: Z5 c
I2C_SCL = 0;
, _* B# i4 z9 l! u6 x% }# p& ^ I2C_Delay10us();//时间大于4us / o' I0 y$ \% P2 s, X4 ~8 c0 O- `
}6 O0 l. K$ c; V/ Q6 H, g6 C
" S! A! \1 w$ ]- H9 M% l
I2C_SDA = 1;
% `; Q. W9 V2 K; q) z I2C_Delay10us();
7 B) \1 d% r7 K5 q! f; V' a I2C_SCL = 1;, A- O+ F0 I3 {6 P5 Y H
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低: P9 ^/ M$ _3 \/ D
{& A$ Y: P* Q$ M# z( v T
b++;
( _8 ^7 N% X* M, u) D if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
. {* v7 @ Y1 k& Y+ Y$ e {
7 }/ W5 K( A! U I2C_SCL = 0;
( H# `! Z$ a" D d' Y4 Y/ u I2C_Delay10us();
8 N2 \( A5 I" [. l! v3 L/ B+ e return 0;- d& I B0 ^- V- d
}
' R/ F& l4 ~5 Z6 a! a; E7 F3 G8 E0 |9 H }
& }3 S# K2 W* W
6 n1 E0 S% l+ r* I& n2 i; z I2C_SCL = 0; ^1 I6 ~9 H# s4 K
I2C_Delay10us();+ w6 Y" y& y# N0 u1 f( E) o# ]
return 1; 1 J; Q5 q$ l1 W9 V$ i3 w
}* c% q1 w; ] b
/*******************************************************************************- `) X! E* J$ o6 E! ~2 F1 T6 d
* 函 数 名 : I2cReadByte()
- m$ V9 a2 e! U @* 函数功能 : 使用I2c读取一个字节
4 F( {: @& k( ~# P8 C: A' E* 输 入 : 无
% `; ?( J; K" k/ ]* 输 出 : dat
& ~ f0 \' i. g7 r- K6 {* 备 注 : 接收完一个字节I2C_SCL=02 g) d1 |+ t( n; q# ?8 P* Y
*******************************************************************************/3 f/ ? R0 Y2 j7 Y" c
& Q0 D1 G) D' E6 D- p$ Tuchar I2C_ReadByte()
) P9 V1 L0 f9 w+ l& j{! d4 y7 I3 `7 c7 {% q$ }( e
uchar a = 0,dat = 0;
& d- u& x2 x. H7 {0 x I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0
! ~9 t# b/ \/ u I2C_Delay10us();
G" M& \+ t z# O! k for(a=0; a<8; a++)//接收8个字节
. a* M2 L1 ]6 _* r ? {* k& I8 f4 a- } z
I2C_SCL = 1;( K7 Z: E$ w# S# ~5 P4 \5 V
I2C_Delay10us();6 ~0 L! w4 r- Z
dat <<= 1;
0 L' g n+ S6 J" [; z9 e2 \3 b dat |= I2C_SDA;6 e& k5 D; v/ C' F* H
I2C_Delay10us();
6 K% n$ H5 j5 i# c! } I2C_SCL = 0;
" s+ P- }) N9 n$ p I2C_Delay10us();1 _# K% V. {; {; t# g8 E: s
}
P5 }) e! P+ v. H! N d* S return dat;
# ^- H5 c3 u& o/ D# R, w}5 w" s& B; }, X& a; r0 K4 ?' W
. f* D6 F7 }. M/ \/*******************************************************************************
# z( b1 T1 U8 }3 v* 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat)
8 r% A# E4 n# m9 w% d- ^* _* 函数功能 : 往24c02的一个地址写入一个数据! p. G, d' X9 A, e+ {2 b+ W% Q6 s5 i
* 输 入 : 无
* Z% p4 s. o& s. h7 Z) w0 W* 输 出 : 无1 F. b$ W# I( R; e8 t' s d" |
* o9 n9 N- c+ J8 J1 a- N
' O) r0 o; |" X7 q: M: e& D% ?…………余下代码请下载附件…………) o+ z0 F' M& ~. T5 ?
( G) K6 t" q: i4 U& @+ Z; H下载:6 j$ W( O" f k6 b
! |# p9 Y9 F& B2 F
* ?! O& w$ ~9 h7 r |
|