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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
0-99的4位按键显示单片机程序 可控制加减与清零! x- R  Z4 C! W8 d! m2 ?
1 ?; e( M- z/ q" X" z$ @/ Z

1 _- q* O: @, d做的一个0-99的4位按键显示,可分别控制其加减,与清零。同时利用定时器,让其自动跑。同时附带IIc,关机自动存储,已跑的数据。内含数码管显示代码,定时器代码,IIc代码。
' j  m, y9 p" @: t% h同时附带2017蓝桥杯驱动.zip。
  x. X0 U0 `! o/ d5 m# e! F4 Q5 l# M% Z, R4 F! Z
部分源码预览:
: e1 k) ?5 l7 Y" G" S
#include<reg52.h>
$ y3 Z( a  ?) ]/ l0 f1 g
( a8 p  I8 e' @3 H' E#define uchar unsigned char* U* q/ s0 f4 n) ?7 p
#define uint unsigned int0 N6 s( c" a0 i; T+ I* J+ g; h
, h# g1 O$ G# T
bit write = 0;        //一秒存储一次1 L2 Z  j% ]8 E0 z- U; Q
sbit A138 = P2^5;          //数码管动态显示
2 q7 Z# t  ?7 {4 p* d# Fsbit B138 = P2^6;9 Y1 e, o4 q4 ]% h
sbit C138 = P2^7;
% r& ~4 N8 B6 ]  Zsbit key1 = P3^0;          //4位按键8 Q& I8 E, c6 \0 Z9 ?( V( u4 x: f
sbit key2 = P3^1;2 [; v  B6 H, _. z1 o6 m
sbit key3 = P3^2;0 s4 \* B& S% w+ `
sbit key4 = P3^3;
- X3 V1 J0 i* @sbit I2C_SCL = P2^0;  //II2c/ k& x+ ^5 X( @8 ^4 d) m
sbit I2C_SDA = P2^1;$ b# Q" O8 S0 ?& ]5 [% F

/ d0 k$ x/ C7 L. Z0 M4 Z( @1 |uchar duan[18] =                                                                          //共阳极数码管. k2 U5 \4 ~$ x$ C/ ?
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
6 `$ b% _' k9 u6 b' N/ W+ u9 G 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
/ A6 B" G+ ~& Iuchar wei[8] =                                                                                  //位选
9 r5 V, \3 X1 o: q( K& p4 k{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  B! [$ W. ?/ ?, f* z. ^1 c

+ P4 ^; d6 \- A6 ^  gvoid display1(uchar w,uchar d);" f$ }3 X+ |! o# Y/ J( s3 Y
void display(uchar num);
, `; s7 `& k+ Gvoid delay(uint a);
7 l. a8 e- d& X& Z9 ], B# V# `6 i9 v- f3 a" q% |/ W7 {9 x
void timerconfigration();         //定时器初始化( A3 X. ^0 _& G* w6 U3 s4 `

5 Z0 R( q6 j; mvoid keyscan();                                 //按键扫描
4 Q/ I' A; u; C2 W! C
# a& @/ Q5 p$ dvoid I2C_Delay10us();
5 m% Q# U8 w. ]9 @7 w3 c! W: evoid I2C_Start();9 a$ c: ~5 A( I, W- Q% T' P% L
void I2C_Stop();
9 r' X6 o; N- u* h* Yuchar I2C_SendByte(uchar dat, uchar ack);" h+ }0 k+ V. |8 ^
uchar I2C_ReadByte();  H4 l0 I* O# B2 p5 h% x/ [# B
* |& b) L4 W! O
void At24c02Write(unsigned char ,unsigned char );$ C/ B6 ?" h1 M9 J. i: [
unsigned char At24c02Read(unsigned char );0 B$ r9 x# E& X; ^
: f# j% f! |1 ?6 Z' |; {# r
uchar count,sec;
. A. N5 H7 v! c- e- W& |* `! K! E: n5 t" j
void main()
6 b/ v# e  g) }7 m{
' e5 A! P! ~* n+ i, c6 N% Z3 r' O        sec = At24c02Read(2);                   //读存储内容4 G+ {1 |1 o' I' C1 X
        if(sec>99)
! W' C# @5 s1 ]  v6 k( x2 m) E                sec = 0; 2 Q: U: S8 Y/ [+ Z
        timerconfigration();        
+ B7 B5 c% N9 n& f' ?        while(1)
6 k/ s* A. K/ t" ~3 d& \" }, j        {
& X  A" p4 S7 e9 h/ F' e                keyscan();
1 Y' ?, X% z2 P! g; J+ v                display(sec);
6 `' R# U  @, p% `                if(write==1)
0 d  K+ S$ i0 f& o                {& y" _0 T( @, `! I: l% h+ e
                        write = 0;) f0 J7 a9 n# s+ ~6 i
                        At24c02Write(2,sec);   //存储: c* L: r, @; q2 q4 o) X
                }
! w8 ?9 |: ?6 s0 h  e/ y7 ]6 L        }               
* d1 ^' k- @7 g+ N4 F- d7 ?4 n9 R}
5 a: A; t4 o. b: w0 z7 S. U. @; }9 |. z  k4 n
void delay(uint a)                                   //a ms 去抖10MS足以
3 i. {' Q2 S: H' Q{
, @# F4 m) o+ A; @) D        uchar b;8 c4 G) }. t  D& O% H
        for (;a>0;a--)9 c9 W( C3 ?, h/ K' q7 k0 D2 z
                for (b=110;b>0;b--);        
0 v5 m6 g) E$ N0 }4 v8 I4 {  l4 S}: b. G7 S% V2 b) W4 z1 F1 X
* I; N5 P/ O5 u6 F: W( P
void display1(uchar w,uchar d)7 B. V, p  h3 p7 T# s7 M
{
9 p6 @! t: G' p5 V3 V. U6 |( \        A138 = 0;
6 i8 |% c  ~3 w. \# R& L        B138 = 1;" o' z/ W( i7 y) x8 D  q. k0 K
        C138 = 1;
7 c! ?. Y! e. J" m+ Z6 d' Z: y, A9 L4 ^  D6 P% N: w. p
        P0 = wei[w];
  g: ~3 \% ^! j/ A% }1 T- O
( N+ c+ T2 o2 Z8 T        A138 = 1;
9 g8 H4 |3 w  x/ G
6 `" X2 q/ X# i# L0 Q; X$ d4 T# [        P0 = duan[d];  f1 s' F2 W* R
        delay(5);
- B& }; W* P% ^        P0 = 0xff;* {& E/ j0 C9 ?5 ?/ K2 q3 e
}6 [& U& N7 M1 t+ ?
- i: q; h' `0 l5 o4 O* T0 ]' j
void display(uchar num)
$ ]5 J0 }& [8 G  h9 z0 Y3 _{
& R2 ]7 P, q, K/ J! G! n        display1(0,num/10);
5 Y  ^5 A( g9 n& u$ T2 l        display1(1,num%10);1 U" ?2 a+ z, p6 A* ], X
}6 K. U( H) L4 l: L* d- A, J
- {9 E, B( W* T" `" L6 j" b$ e
void keyscan(). ~2 K" R  P0 r4 m' z7 f
{% f- f" A4 l; X7 c9 m& d6 p7 r
        if(key1==0)
8 r2 _! z( ~+ C9 F. {0 R1 \' z; f. _        {. L* m# M+ L' l1 A/ J
                delay(10);! @: q# Z. T8 p1 k' J
                if(key1==0)3 M8 Z! ?7 v3 F0 [1 B* |, m
                {
2 z1 u+ @# }& t" d* a                        sec++;0 m" ~6 y* q- ^. d; {8 D0 @
                        if(sec==99)" x( C: M, m! Z) y6 q. F& L
                                sec = 0;1 x/ {3 g0 Y% L, R  M( Y
                        write = 1;# j, e" V, ]" l/ P
                        while(!key1);                                 
+ T7 c; B: F) s1 ^. Z9 T) l" {6 D                }
1 ^1 a9 q$ u3 b# i        }: R% r4 f. Q6 G2 y# }
        if(key2==0)" ~, R( B4 t( C- ~* p9 x) I
        {" f% F$ ~" A' K8 j* A1 S
                delay(10);" u- n( j" z! N/ n+ }2 `0 G" n2 Y: K. h
                if(key2==0)
8 z2 R: O0 Z$ Z) t4 p/ ^3 @* u2 j3 g# s                {# B  ^$ h3 f! Q( e
                        if(sec==0)
: C/ F- _0 Z/ G7 W* H% n, T                                sec = 99;
- p- B0 M; s# j& b                        else
) z/ e; u2 `; y* }, m8 O+ ]                                sec--;! p$ D  V" b: ?3 I. k3 o0 I  J/ _: x
                        write = 1;/ C# G. D* K& \
                        while(!key2);+ ]3 G# ]+ L: T
                }$ e4 J7 F: l  Y+ N7 I8 b
        }8 R+ q3 q9 p/ h( O+ t3 q
        if(key3==0)
  ^$ [* m4 b- m! f; y- y        {
9 L% p1 Y' M6 V: ~/ R                delay(10);
1 e1 n5 G- M( e$ ^8 M                if(key3==0)8 k$ u5 a8 |6 l7 U  k% K
                {
) V$ B: l+ ?1 n+ U  s                        sec = 0;# S$ v8 Y% l8 A5 {  h" A7 F* ~
                        write = 1;
7 c7 p* h+ G; [+ ~9 E+ J                        while(!key3);
: m2 r9 Z+ J, G' p' p2 A3 C1 J! F                }
- u2 u/ ?. \/ @! a4 Y1 R; a        }
6 U1 {; ^4 Q, ^: @4 S3 _! M, f        if(key4==0): e' h  t& x0 a. m8 J5 I8 M, b4 {
        {! P  N# b: r9 _3 P# S. ?* [
                delay(10);
9 d8 Y6 r" e! r( r' G  L2 e                if(key4==0)
' }# F/ R& E6 v                {
" }7 j/ F6 A, H9 F6 ]                        while(!key4);+ {9 \; a+ |$ H
                        TR0 = ~TR0;2 l" a) Y" }, h- d" V
                }' F5 [  W* e0 c" i6 J0 q
        }
$ H$ T! V# m" U$ Q3 v}, r9 b: J% a, [8 K& s

5 w; f$ Q/ {- c9 W1 R( J' mvoid timerconfigration()                                 //定时器
8 m) W. w. {: v% w{
8 y! E9 j- J" u3 a* Q6 A7 i        TMOD = 0x01;
' \- M. E, [5 s5 n( \        TH0 = (65535-46296)/256;
- u- N. \) ?9 A        TL0 = (65535-46296)%256;
) h' L- B/ n# j4 i* V4 d9 {( J        EA  = 1;: q' m  N$ P! S+ t8 M7 c
        ET0 = 1;
3 y1 ?0 N+ d8 n//        TR0 = 1;4 k# z9 y0 E% l- A* e
}2 m: w8 Q, x5 H" s. a+ E! E: w. D

% e/ V1 ^5 U( F. f, r6 G% n. Vvoid T0_time() interrupt 1
# H: w0 Y1 _; ^& o/ |6 ?{9 L) R! |! O2 [6 ?
        TH0 = (65535-46296)/256;
. A" [+ X* \" I+ _2 }4 M* }7 E" O3 R        TL0 = (65535-46296)%256;
9 e5 e5 B+ m* p; {- h8 b8 L        count++;1 n6 w0 O- Q$ }  l1 i" ]  s
        if(count==20)# h5 I% e2 S* q( Q( I% Y" i1 O
        {8 V) {) J8 F+ z0 l% z( p5 ?. l
                count = 0;
$ H5 S* S% Y* m/ e- A2 t/ i                sec++;2 `3 k' W8 p3 K# x4 r7 ^
                write = 1;, K" W% ?& \% W
                if(sec==99)
) r) v- f6 a7 Q                        sec = 0;. v' ], I% @4 Z& ~; e: ~
        }: n+ |( b* o6 N2 S/ |
}# b" d# `0 c; M3 @: U
% B4 I. A- K% a# j) A
void I2C_Delay10us()
2 @8 ]. T4 Q5 k{
  @$ ~9 w& O; ?5 C, y" o        uchar a, b;! b; G( u8 k+ N9 l1 u1 I. u' O
        for(b=1; b>0; b--)6 G! H8 |/ D9 b' B- `; }
        {6 d2 Y! c* q4 i1 _; A1 P* Z4 [
                for(a=2; a>0; a--);
0 a* c" b' F5 p+ a        }
9 H! T! M8 y5 q( Y9 d}) ~! ]" x% f+ e$ w* y
/*******************************************************************************& G, ?. U0 R* F+ |
* 函 数 名         : I2C_Start()
* Z* F* M& W! H2 f8 J, [: I0 @* 函数功能                   : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
  p- {, r8 Z$ v9 I6 T* 输    入         : 无7 X% b( z9 j2 f* P6 Z
* 输    出         : 无5 @& @( }# |9 |6 D- w8 U7 S
* 备    注         : 起始之后I2C_SDA和I2C_SCL都为01 @. \2 A2 j# G  u
*******************************************************************************/
/ ~3 K8 m/ f7 D/ s$ c! g/ v( s6 ?5 v) [7 p7 N: C3 [
void I2C_Start()
: ~2 A, o3 F- h3 j2 l, k{
8 j* x0 ^" k- R; S$ A0 G        I2C_SDA = 1;" I; G) m; w# b; z6 o
        I2C_Delay10us();
  }3 _! @/ w5 t! |: R: E- N        I2C_SCL = 1;) E- D7 K% c& T. T" o
        I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
+ Y/ r6 T, g* G        I2C_SDA = 0;
7 v$ a3 }1 p! _1 z        I2C_Delay10us();//保持时间是>4us: y& ?7 C1 p4 |+ U
        I2C_SCL = 0;                        
  \8 a" j. y8 J" c        I2C_Delay10us();               
- a0 V. ?5 m( X; C: r}) a; [' m& [9 m) o! \
/*******************************************************************************
* O7 e8 i; {  s) G0 a+ ]+ Y; X( `* 函 数 名           : I2C_Stop()
) R7 u" I- n' f. e' F* 函数功能                 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
/ e6 e, @7 [1 Y/ R& w* 输    入           : 无
( U' T" X4 N4 q( X5 b* 输    出                  : 无
8 Q4 f/ n# H  t: W* 备    注           : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲6 C  w% Y3 j1 s! |/ S, \# a
*******************************************************************************/
! Q- W) O; I! E  R, Q7 {8 x0 L9 v: a; x
  M2 q/ Z* X7 U5 a' I) k9 Ovoid I2C_Stop()
* O+ Q( p3 p8 c+ z{: N3 ?" J; q6 s$ I1 j9 r/ Y  j' `
        I2C_SDA = 0;1 y8 N0 s7 n% F9 O. n
        I2C_Delay10us();# ]7 S' M* i3 _( \
        I2C_SCL = 1;$ C! X: s: {  o: M1 e9 p; [
        I2C_Delay10us();//建立时间大于4.7us# N0 N5 `4 q. U
        I2C_SDA = 1;
2 ^: n% `# _% d        I2C_Delay10us();               
$ }3 e  n- I# d7 g6 T. p}
7 b" P1 ^5 F# T+ p# t2 Y2 G& c. O/*******************************************************************************
; ^0 l, O* i* r& v! J% @6 ^- F/ x. a$ E* 函 数 名           : I2cSendByte(uchar num)
. ~1 y" i% j7 o9 y* 函数功能                  : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
4 K- |& @3 S1 ?*                    * 保持发送信号I2C_SDA保持稳定
- M2 n! d3 U0 S/ b8 q3 ]* 输    入           : num ,ack$ |) I% L! o0 i4 V0 p
* 输    出                  : 0或1。发送成功返回1,发送失败返回04 h! v, _: L( B
* 备    注           : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0! ?$ d" U5 ~7 W9 V
*******************************************************************************/
7 C5 e! n0 c" s; C2 H* k  G& v  h/ E% ?$ T. u
uchar I2C_SendByte(uchar dat, uchar ack)$ Y  ~, u: L, ^0 c7 I
{4 V6 P/ U2 I3 V0 U+ f0 P
        uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。1 K6 S% n5 ~# G

& p, E) t2 Q! X        for(a=0; a<8; a++)//要发送8位,从最高位开始7 W" n* r- ~# D' D
        {
, C% q' d( J7 _                I2C_SDA = dat >> 7;         //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
0 X8 k  Z0 U$ o% y: K                dat = dat << 1;
+ L; o0 Q& g% |& B% y                I2C_Delay10us();# H, h1 E5 `+ e/ z. l
                I2C_SCL = 1;1 q0 D( A4 H# m4 A9 P3 |: z0 \$ v
                I2C_Delay10us();//建立时间>4.7us
7 {- X/ g4 p1 h2 O                I2C_SCL = 0;: j* `2 h+ d) I5 |
                I2C_Delay10us();//时间大于4us               
/ X: Y) P' P7 b1 b: v) v        }
: J6 F$ l& Q, D; s; p, ^1 b1 P  e; x+ T5 ?# g( T% U
        I2C_SDA = 1;
1 n8 R/ j& b0 ?        I2C_Delay10us();
! E, O3 A) h+ N' ~4 \" k/ M        I2C_SCL = 1;7 p2 u. [! K7 L7 a( ]. ~0 p3 `
        while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低- X; d/ ~5 b' _5 J
        {
/ J  m+ Y9 s) B: G2 ^1 C2 D6 K3 Y                b++;
+ `* r# }5 d$ g4 T9 x5 Y. s                if(b > 200)         //如果超过200us没有应答发送失败,或者为非应答,表示接收结束  J/ o) u9 j, }
                {) X# Y: u. m2 t# q
                        I2C_SCL = 0;
1 C" @4 l1 i; U8 j                        I2C_Delay10us();$ k( @; I8 `$ V8 D: R# U
                        return 0;
; v* J3 y7 V1 D+ j                }' \& S. t1 t0 ^7 p/ B6 ]  b
        }7 `  {7 y; q& a
" q: |* g0 u) n8 r* R3 A
        I2C_SCL = 0;
& e* P/ ]5 I+ [- A! [5 e/ U) L: {  O        I2C_Delay10us();6 `2 a) R* d" `. r; }" k9 F, {
         return 1;                4 \- Z8 \* e: N% m4 C
}) I5 f+ a2 \6 I+ ]* C" z2 x: ], |
/*******************************************************************************
! `2 s& A& t2 X  x9 q$ s* 函 数 名           : I2cReadByte()6 @$ }/ ~/ n! P; W' x
* 函数功能                     : 使用I2c读取一个字节  y8 g% N# J# H; b$ X- U" `
* 输    入           : 无% @3 L6 b; ]6 k7 J: k( f/ ~9 q/ M
* 输    出                  : dat0 e1 _7 H; x+ D- }) g
* 备    注           : 接收完一个字节I2C_SCL=0
2 [0 _0 \' ^7 a+ r; C1 p*******************************************************************************/  m9 h6 f# A) ]7 K# D% I

4 a0 E, H5 \3 i2 V2 quchar I2C_ReadByte()
6 y" P  t; u5 E  m5 ]5 X{
  I. S: G; [1 k+ T        uchar a = 0,dat = 0;" t5 G0 r: i4 w! O* t, k% ?! f
        I2C_SDA = 1;                        //起始和发送一个字节之后I2C_SCL都是0* c3 b- H2 f0 H0 Y
        I2C_Delay10us();. z1 [( s( f/ D! g4 \: A9 _% }% Q0 R
        for(a=0; a<8; a++)//接收8个字节
& H0 o/ `% [$ ^8 K, _2 n        {
- |7 D: ~- Z+ @, p- ~7 }! |                I2C_SCL = 1;, S4 v6 O7 K3 t# q4 l/ J
                I2C_Delay10us();5 V7 P. P  M- m0 N
                dat <<= 1;' z$ Y' H; P1 _
                dat |= I2C_SDA;
  X/ o# J- Z# l  N  G                I2C_Delay10us();0 Y% T* k$ W& c& ?/ V
                I2C_SCL = 0;7 W; x5 J) V4 a) ~* q) r5 Y
                I2C_Delay10us();
; ^/ ^3 p" h- h" V3 ^/ I! l        }
" {7 j# j! u4 d" F4 a. m        return dat;                ! `  m. ]; A8 B$ L  a( T
}; N& F) g+ u6 F; \* x3 n+ K

  o- `3 @" l  p0 j5 s* J# f/*******************************************************************************/ X8 n7 X7 K6 S8 ]( I! w) R
* 函 数 名         : void At24c02Write(unsigned char addr,unsigned char dat)- m3 O7 l3 N& _% g  U1 q
* 函数功能                   : 往24c02的一个地址写入一个数据
1 \# G1 B; t8 R  R) M. U% Z" F* 输    入         : 无7 T& A) I( H* i+ _
* 输    出         : 无, `0 I; ]0 r, B8 u. n

& S6 Q# Z8 _2 k* E. P8 ^# p1 m- R. g+ ]# E1 f
…………余下代码请下载附件…………0 A& n& B5 {2 k1 n( ?' R

+ y  l# j) `  M( T下载:
: z/ b0 E7 i+ B% H  n
游客,如果您要查看本帖隐藏内容请回复
3 Q* D3 p( F' U$ ], ^+ y3 p

2 t. k4 \+ ^, p+ [. f' z

该用户从未签到

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

该用户从未签到

3#
发表于 2020-3-19 15:17 | 只看该作者
值得学习一下4 w5 Z0 P, B" j* ?- Q

该用户从未签到

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$ j. c* i% a' @, I
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-22 08:31 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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