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

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

[复制链接]

该用户从未签到

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

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$ }

该用户从未签到

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

该用户从未签到

3#
发表于 2020-3-19 15:17 | 只看该作者
值得学习一下# O0 G- v# e+ y! a* 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
    $ Q8 ]; E7 \: X; C
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-9-23 03:05 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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