找回密码
 注册
关于网站域名变更的通知
查看: 678|回复: 6
打印 上一主题 下一主题

0-99的4位按键显示单片机程序 可控制加减与清零

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-1-17 17:36 | 只看该作者
看看楼主的代码

该用户从未签到

3#
发表于 2020-3-19 15:17 | 只看该作者
值得学习一下
; L/ c9 w+ V$ H  D0 F( d

该用户从未签到

4#
发表于 2020-3-31 15:06 | 只看该作者
值得学习一下
  • TA的每日心情
    开心
    2022-4-28 15:18
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    5#
    发表于 2020-5-27 19:52 | 只看该作者
    值得学习一下

    该用户从未签到

    7#
    发表于 2020-6-14 00:44 | 只看该作者
    ganxie fenxiang
    9 k6 F, W/ G; Q8 D8 ^& d" Z
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-27 05:24 , Processed in 0.125000 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表