|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0-99的4位按键显示单片机程序 可控制加减与清零
- L* s+ S; y) n) p& A' Q/ {# s; v% y( Y0 ?7 c
3 N$ R2 W/ W7 Z做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。
( t e! [4 y7 u. W7 D$ v( w; | }1 N同时附带2017蓝桥杯驱动.zip。1 _! ?- A3 Q' J( @$ g# Q& U C, ^
. q+ C$ r5 Q$ P! A& D3 t部分源码预览:
4 V: p0 o+ U2 ~" ?9 L) r$ i#include<reg52.h>/ b& c; P& ]" W, g' f: H P
5 t2 R" l* q3 L8 b! W( j
#define uchar unsigned char
) n. P4 D n0 M, E#define uint unsigned int* ~+ l4 ?7 G9 c, d) n- v3 r$ c
) P* k% R, j7 Y5 G/ M% I1 Jbit write = 0; //一秒存储一次# I4 _2 Q+ w* Y: j) O
sbit A138 = P2^5; //数码管动态显示* b1 n( M8 C# c+ H2 B @! _1 ~: T
sbit B138 = P2^6;' Q% S k2 @5 ~, H: F0 l6 ~
sbit C138 = P2^7;
$ z! T! K: B8 Q( Z8 X, H% isbit key1 = P3^0; //4位按键
3 l/ X4 m. e( I; I+ Zsbit key2 = P3^1;! G; V! \' N6 F& `
sbit key3 = P3^2;
9 f3 H2 V" r4 N; Y; C. P$ q" Bsbit key4 = P3^3;
" r9 i# }+ U( w5 u5 I$ C9 E1 ssbit I2C_SCL = P2^0; //II2c
- a7 B" T8 ~; J+ D9 Wsbit I2C_SDA = P2^1;+ C. ^' _9 U7 r8 {
* R1 m: }9 r5 f6 s) r, ^* Q3 z0 u" vuchar duan[18] = //共阳极数码管0 Z2 x9 F {6 D9 j
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,: {3 d6 n. Y& y3 ?3 d
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
' \* d" b# U2 ]# buchar wei[8] = //位选
' q, B4 g. G/ F* F{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};+ E3 H* L) Y3 ?) c1 y9 N7 R$ g
/ i0 S, ~, n. Z) q5 Y8 c: Nvoid display1(uchar w,uchar d);
v' H# W. i+ |: Hvoid display(uchar num);
6 O; j1 C0 a- evoid delay(uint a);
8 h6 h2 j0 `1 k) p
3 h" i8 u; e [" Uvoid timerconfigration(); //定时器初始化# I" s& [5 i' O7 q# \- e- O. J
5 p8 M8 ~ F: d# cvoid keyscan(); //按键扫描
3 V- E, |) H' N$ U$ v$ i: i4 M" f& _6 J
void I2C_Delay10us();+ ?2 M( z* y7 G% K* L$ u
void I2C_Start();
) Z* q8 U/ {; m. r3 r' }6 Nvoid I2C_Stop();
) b) [, X( ?! r8 s( j* H# Iuchar I2C_SendByte(uchar dat, uchar ack);( v2 m% R4 `2 Z7 i
uchar I2C_ReadByte();6 x/ |: V4 e% p/ X! p9 X5 D
9 p. i& r2 o+ C/ A
void At24c02Write(unsigned char ,unsigned char );1 o! n( j) T6 S+ u# G& w) U# `5 R* v
unsigned char At24c02Read(unsigned char );
/ d# ^& z. s0 {; m! r9 c+ h7 c( m/ V2 h3 S7 C" z
uchar count,sec;, ^3 l& a: j9 W+ G8 R8 T
. X1 K7 r* S$ A" |+ T0 Rvoid main()
6 i; O# `1 x) v) V{
, S" F4 Y c) k$ a& [) w7 Z: ~8 M sec = At24c02Read(2); //读存储内容 V1 {( i. j7 q4 t! s
if(sec>99)
+ E$ V' F1 ]6 w3 K5 k+ W sec = 0; 0 k% M) O& m* b" U7 D4 B! I8 f
timerconfigration(); . h& g& D3 b) F$ R" }% h
while(1)
. z& Y3 M2 {; T {
; ^3 Y# q0 ~, i/ s keyscan();
* y! J% ~5 w3 p# @" @( r- }4 X display(sec);! J: y: I/ f9 t8 y( h) [
if(write==1)& B3 J! Z: Q0 C9 r: F
{. [, G7 W$ t3 J) Y `1 q* i. w
write = 0;) e7 G% j! N& ^
At24c02Write(2,sec); //存储+ P8 } `. n4 x# r2 u4 f( N8 j
}6 m1 l- Q- j, l# k
}
3 l3 F3 ^; {) t3 I" s}* O7 ]6 Y4 v, w
) d8 Y8 Y! O# q0 P! {3 @* V" o5 Ovoid delay(uint a) //a ms 去抖10MS足以
2 F( m9 P4 m `+ |& z% ?{' k( D3 B/ [% ]; D# A% ^7 \: n) |, s7 `
uchar b; k" C* M) J8 b3 b j1 F5 H
for (;a>0;a--)' r. Q" i! i& D! V0 j
for (b=110;b>0;b--);
_0 z& l7 c% D* I" o6 k3 g}1 q$ j# O9 O+ ~3 q
2 L0 M8 G- q' }
void display1(uchar w,uchar d)
6 N& s7 i; C) L1 q" B{9 O& C$ \1 k% {2 w7 @ a
A138 = 0;
5 J" K; \( q! {" G; ?9 q! U B138 = 1;" s; s L3 H5 ?: i" Z
C138 = 1;
0 d! f& I/ t9 V- s2 r
# q* h- |+ j7 f& F, c4 [1 S P0 = wei[w];$ B& w. K/ N2 c3 |+ [
' y' g& Q1 v* E9 u+ C. o; c" K" e
A138 = 1;: B" j) J" {9 y; m
& z* c, c$ A3 o
P0 = duan[d];1 k* o$ G1 S" r) ]+ h+ X
delay(5);+ Y R5 t/ u. H. P2 B" |- R
P0 = 0xff;+ x6 h# d* k( `# V. ^1 @
}
! E: t" p7 A8 n. O: ^
$ r7 H7 q( d' {1 V# Q4 A% Ivoid display(uchar num) ~: M$ Q8 j1 `" r% w( ~4 K
{
7 D [ m3 e4 m' S+ s display1(0,num/10);! m$ v. U: k% d+ U2 C
display1(1,num%10);
4 [# S- p2 R: l! C$ p}7 P. }0 {* B: Y. K2 h8 v% [! g' m3 \+ S
. x0 ^* V0 P" T6 }void keyscan()
1 @. S! ?2 [; N4 G4 C% N& E& c! q{) b: h( o/ A4 y9 i+ B
if(key1==0)
% R$ ~' F7 D1 L {
4 g! k- N$ _7 L4 F delay(10);
' E) m& t$ E/ |( S# a if(key1==0). x. r+ K5 ?8 _
{3 j4 E$ p; g& `% W; L: r- H
sec++;
, D: p3 f# m$ g! m; v- W if(sec==99)- t( X$ |8 Z8 ?. \
sec = 0;
/ F- [9 f( x) e$ A* k9 S% d6 b write = 1;
) G+ l1 L' {( @+ _' e0 _( S while(!key1);
/ V* W3 ~3 E! p3 r1 W7 ~8 s3 i }3 p8 O" E, ]% A1 B2 t, S" b
}/ P7 s+ e7 ?( S/ c& v3 ~
if(key2==0)
: Z' O# F# b% h2 P M+ R$ k {1 _! G" U* Q- u8 w t7 R$ g
delay(10);
) J: d) S( n$ I( c8 @ if(key2==0), i& k8 a& L5 }. J- D0 n' F) t7 |) j
{" Y+ [# U$ M# H" c: @
if(sec==0)8 X r4 u* m) x/ H/ a
sec = 99;# [0 q1 J& O+ M; k$ m
else
5 I# u w3 v2 `( C& z0 [- F+ Y sec--;
9 ^, Y9 ?3 \9 v1 H# {. k write = 1;
" s/ h5 }; ]3 V d while(!key2);# Z- G7 @# Z& B, K' ?* T! D6 q5 b
}5 ~/ ~2 M# N+ U, ^ q( {7 F& R
}
. t7 B6 ?& e2 @ @5 m+ W if(key3==0)% @1 b! [0 i9 P& n2 ~
{- d. |- Y- P6 W% q
delay(10);* t4 n8 Z2 j3 ^$ K, _- K/ Q; o
if(key3==0)0 B8 k0 T4 W6 Y% ^" x( V3 U* N# [
{
8 q0 O3 Y- F; V' Q sec = 0;( n6 }6 L( t- q/ |
write = 1;+ G: K; {! c+ ?4 l* q- e
while(!key3);
1 P7 h* B; M" N6 ~# J } V: N4 A( N0 c; k0 U/ v7 \7 o
}
7 e* g( z0 _3 h( Z c) B1 s& v if(key4==0)
3 r& u# h( a' ^) q% p. a b+ f {
$ F: b4 a0 \4 y7 l0 M/ J* K delay(10);
" l8 Y/ n8 Q2 N3 B& T$ k! T if(key4==0)
2 V6 Q; X) X5 H5 w1 H8 i. G3 k {: M! C9 K0 Z3 K0 r+ \- Z% Z
while(!key4);- ` g% z6 R$ E, T
TR0 = ~TR0;
6 j3 o* W7 l; K9 c }
! X( m2 H3 U5 i4 Z }
. M' r) B/ m5 l% h* J' F- p- w}, {' U' ]0 v: ~, ?# d, w
' k( F1 M1 ^# E, _" o" }void timerconfigration() //定时器
; l9 C8 J7 F2 u2 t$ x/ \{% ? J7 G' k" ]7 C& \- m4 C! ^
TMOD = 0x01; |* @+ i( ^: y# H6 y* R/ V
TH0 = (65535-46296)/256;
6 J; x; F+ e+ y( x TL0 = (65535-46296)%256;
) V" p% Q5 x( q+ _1 V2 ] EA = 1;
) y" w8 B5 R) Y. a, p! t ET0 = 1;
, ~4 x4 c: U! B7 q// TR0 = 1;
7 k5 L, D; R7 x1 x0 {( a( l}$ \: Z3 ], O' B1 _8 }
: [5 Q Z& q0 o& e( J; r- Dvoid T0_time() interrupt 1
& N0 C/ G+ }5 y. C8 h, m{
! v" W* O! ?% b0 I U TH0 = (65535-46296)/256;
" e7 ^# ?9 ^0 Y1 e0 l' o TL0 = (65535-46296)%256;9 w. K* X8 i2 X4 g$ z3 T
count++;& {# I- p m$ E1 A
if(count==20)8 L5 O. }/ _, q6 Q
{
4 N5 `, Y3 d) Y) h+ f6 @' \7 \! v0 |) \ count = 0;
( M0 `! \& y) t4 u' ?( `& x sec++;
& n+ J) m% ~# K. Q write = 1;! N5 t- m; Q! ^$ e
if(sec==99)
) J* |: o# T4 x1 ~7 P sec = 0;
/ C) u5 ` f' X& e& W' e }0 w& j* U7 }- t
}
* D) ~5 G% }+ e- H5 n, U3 i6 _# h7 y5 s
void I2C_Delay10us()" R' {8 l: h8 |4 [% B" k0 {6 Q: c. G. s
{! S& B3 s( p" f( h# R4 U
uchar a, b;
3 a1 E3 \0 \, o; ?1 o1 S for(b=1; b>0; b--)8 A. }( t; N9 S0 ^9 @8 }
{
0 v' E% t. }0 v; F) Q; i* i for(a=2; a>0; a--);1 F( M% {. N. d2 n' Z
}
9 @2 k1 {3 r; A4 {}
" {0 W& M! j+ E3 n! N; W, ?/*******************************************************************************+ {4 C7 K/ x( J- P6 m0 ~. I
* 函 数 名 : I2C_Start()
8 \4 v: p, Y% d3 m' j* 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿" c% r1 y0 @; W$ T& \" Y% f& e5 A
* 输 入 : 无8 h; t% y, V0 x; H2 b
* 输 出 : 无3 {' y; n3 w6 H g; T
* 备 注 : 起始之后I2C_SDA和I2C_SCL都为0
* ^% `. M$ s8 E5 h! I* B*******************************************************************************/
2 H# @- c2 P: Q, L% B
$ ]' _5 i* |. q( Mvoid I2C_Start(), u% j5 E8 ]# M
{& m5 q4 p" {" L' k4 K: Z7 |
I2C_SDA = 1;
" }/ e: y% K- b, | I2C_Delay10us();
1 g- ^6 t( q8 f I2C_SCL = 1;7 b. W4 j7 c$ c y
I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us9 o; F8 z" w! e9 C( p: ~( r5 P
I2C_SDA = 0;
" i& {2 H; B& X+ F M I2C_Delay10us();//保持时间是>4us
" K, G+ H- b) `; f I2C_SCL = 0; ( M2 m7 O1 p ~7 g3 P& E% D5 T
I2C_Delay10us();
+ r, f& T% @; M, f6 T}
2 g3 v& I; b( ^% H+ Y9 y4 _! z( K3 j/*******************************************************************************
) i4 ?8 b+ i' K* 函 数 名 : I2C_Stop(): h8 N9 ]) c7 P4 p
* 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿/ b+ `) x3 v+ q
* 输 入 : 无
9 p7 u0 ]4 J' V7 m2 k" L& A; q* 输 出 : 无, D* t" `1 F# T7 L" i
* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
% E0 z3 p7 o& |' V# h6 r9 l*******************************************************************************/7 Y. M% X4 J, [* ?+ |
) Q4 v& y) S% Z/ d; Nvoid I2C_Stop()
$ u) h B# Y; }% o3 S4 L' c/ E{1 u5 S9 G, ]" O, W
I2C_SDA = 0;( w* l, U C5 g, D( I u# G$ z
I2C_Delay10us();
2 u. F2 z0 B& x& K, R# Z$ B I2C_SCL = 1;4 ]+ \% {* z u) t1 q/ `
I2C_Delay10us();//建立时间大于4.7us0 Q4 [( q2 b4 x5 Z2 C3 O, O
I2C_SDA = 1;& u4 ?7 I, i5 G2 L% B8 D; c
I2C_Delay10us();
* z. b5 j: g$ r2 ]1 O: P}8 s$ [5 b9 X" T
/*******************************************************************************
6 ~' I/ i+ k) l9 F1 D" v- J* 函 数 名 : I2cSendByte(uchar num)# M! g' H- F! M% B
* 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,. v0 T. M: x* D5 v; Q
* * 保持发送信号I2C_SDA保持稳定) H6 }( I# S( d7 c
* 输 入 : num ,ack
+ |5 _7 C+ l. g* 输 出 : 0或1。发送成功返回1,发送失败返回0
- d( I) A7 c* Z1 q& p* 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为03 z/ g- `7 n/ I# F7 \
*******************************************************************************/
2 m2 m; U8 ?+ X4 ~ w9 F, M5 F. {( h% v0 e& ]
uchar I2C_SendByte(uchar dat, uchar ack)! b$ o2 z! B2 K% u
{
: ^ ]( Q! `% m6 f uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。% }( u: t8 T) a: N7 y* y E0 l
5 Z: l& a7 N* l
for(a=0; a<8; a++)//要发送8位,从最高位开始( R* b# S1 N8 ]3 a3 R: q9 [2 D
{) X+ s) N9 n4 g) u/ p0 Q1 F
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号# B, \* `3 A& a' P# w4 F" X2 ?
dat = dat << 1;
i3 k+ D1 O$ g1 Y I2C_Delay10us();: a2 \( ~6 m* w9 N
I2C_SCL = 1;" M6 E4 V4 h4 s3 C
I2C_Delay10us();//建立时间>4.7us
5 q/ L: W/ Y0 J5 Z I2C_SCL = 0;
5 z' F: ~; c+ }$ F. G I2C_Delay10us();//时间大于4us
* N( j* v: D; G( R" h6 { }' ?5 \2 M$ {" Y# a! g1 |" f
, Y- b" ~1 {) w2 d6 _6 l I2C_SDA = 1;- V' m( p8 }8 a1 g; ^# i; V
I2C_Delay10us();
2 ~, H6 ?& V; J6 O4 [: l+ A) ? I2C_SCL = 1;8 c* |+ n' W; n6 Q
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低/ H: Q& T' u) @/ }" N7 `7 K
{
+ c3 a8 i% v" h) ^ b++;% i! m- M( V {$ F1 O* | B7 P# L6 X
if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束* D+ D6 d) p) m% |
{
- D. c* d( J8 t! i" K I2C_SCL = 0;
9 j J0 ~( C4 s; m3 s2 A I2C_Delay10us();' R( t2 z+ Z9 J8 e, e2 E1 D
return 0;, f3 q! Y- w1 h8 J
}
7 P0 X) p' N! f- |+ p }0 o* q& z- O" b& H7 p+ X' c0 @4 _
% g8 W7 Z3 G2 k' y
I2C_SCL = 0;7 a2 K; | f3 L6 m2 ]
I2C_Delay10us();
3 q4 c& I, }* F" J* o5 F9 N) v6 b c return 1;
0 y% @; _* V1 a! [}
) _ }: X9 B$ P" w D# k/*******************************************************************************( F! ]' P' F4 q7 ?
* 函 数 名 : I2cReadByte(); u( f }# ]5 \' |# c
* 函数功能 : 使用I2c读取一个字节
" n5 ?- T& E/ N1 w- h+ o* {* 输 入 : 无
& J6 `* E* B$ K2 S# k/ {5 r+ Q* 输 出 : dat
& ~( v! a2 |: s. M* 备 注 : 接收完一个字节I2C_SCL=0
& ]* T/ U9 R/ a+ H3 g*******************************************************************************/+ ]/ g8 e! Y" H9 r# a2 c
! u/ M( w, D8 B+ p- D2 suchar I2C_ReadByte()0 t7 `' O5 U" ^& R3 B* j2 T
{( X7 u1 J- j9 b+ T3 _3 Q- o
uchar a = 0,dat = 0;
7 u8 b$ e* D! g/ c" @) Y/ l% U I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0
$ [5 A# m0 b' o% e% _" y I2C_Delay10us();) w/ E( ]3 c7 o8 ?/ v+ S2 h
for(a=0; a<8; a++)//接收8个字节
( }6 \! {2 T1 n8 V+ F { v" D9 r' x! j8 q0 L
I2C_SCL = 1;
) d |& W1 c4 u' s+ } I2C_Delay10us();1 `9 N, e1 w# Y1 C
dat <<= 1;: {# W3 c: b) Y$ z. `: l
dat |= I2C_SDA;
! U5 ]4 g7 G* o, I. i$ d I2C_Delay10us();
& `6 {/ E8 T l' A I2C_SCL = 0;
: N; C& ~1 Q! e# L0 s% l( R1 b# e! L I2C_Delay10us();
$ i. ~5 O S4 O' s. b. N8 v: V$ ^ y }
4 J$ l6 q. ]; V9 ? r/ r6 n3 ] return dat; 6 u' {; b, v' N& v3 r/ `" Z" F
}
* x8 M$ ~" m7 A) t" e. L$ _+ m# ^1 ]
/*******************************************************************************
7 m, N1 t0 s. U: G* 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat)
6 N) Q* n7 h& E' }& h$ u* 函数功能 : 往24c02的一个地址写入一个数据
) V. y) ~* w5 h* 输 入 : 无& j% R! o+ j) O' g& v5 n
* 输 出 : 无% ^( q7 C& T9 y" {7 y8 K2 l4 r& k
4 Y6 f1 D* Z. Z3 T a
- q, V) u+ |0 E3 S( w& I
…………余下代码请下载附件…………
* I |( j7 ]: c6 D" k$ N! a' L$ L6 [! R) p0 H5 Z
下载:
! \: ^# v8 R4 [: ? E) P; H, X+ S, z$ e/ u% W
- c- M+ Q Y2 q& w$ } |
|