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

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

[复制链接]

该用户从未签到

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

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& ]+ _

该用户从未签到

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

该用户从未签到

3#
发表于 2020-3-19 15:17 | 只看该作者
值得学习一下
0 U* K. l! R; n/ N& }8 H

该用户从未签到

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
    ( K3 [" d! Q) a! u' K' |) l4 L7 q- E
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-11 08:45 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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