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

STC单片机74HC595驱动8个数码管

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STC单片机74HC595驱动8个数码管# L) t% L% {7 n% i: {% f
9 L# U( G& ~4 k, |! b. c0 w1 X
9 m7 }  M$ Z  [; H/ x+ E

; Z. p' U( K% b; g! Y8 @74HC595驱动8个数码管源程序:2 ^3 v+ e6 l$ r5 u( @+ B1 u& x
/*---------------------------------------------------------------------*/
& J' u- q  E9 R& r7 H/* --- STC mcu International Limited ----------------------------------*/) P# k1 t, X7 _$ A( o/ d2 F0 q
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
& ~/ J5 F, z8 `. Q; M! J( J/* --- Mobile: (86)13922805190 ----------------------------------------*/
3 c3 Q% A/ m) Q! g/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
1 Q4 E4 ~1 Y, u% w/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
- O2 V. \, [7 l/* --- QQ:  800003751 -------------------------------------------------*/8 B: V5 G% U3 x! v) J2 S4 y- G4 a, i
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */' E+ c5 n" Q. Q. S4 w9 }8 c6 @* s
/*---------------------------------------------------------------------*/
7 v" F; t( b! n! `. h) Y4 K) w# ~0 D
; H/ s) D( f' L6 `3 K0 J9 X7 ?) R/*************        本程序功能说明        **************
" \+ `6 \+ l% w; Y用STC的MCU的IO方式控制74HC595驱动8位数码管。. K; y7 D, ~6 y% S
显示效果为: 数码时钟.
4 R% v1 V- D7 V, P! I) X* J* |6 c使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.
6 \% G: R' d0 p1 U+ J******************************************/
1 ^9 }4 U* @4 r$ h7 r' B& b#define         MAIN_Fosc                22118400L        //定义主时钟9 N1 V; b% Q) D7 K5 Q
#include        "STC15Fxxxx.H"3 g$ M. T% b6 Y6 k0 f5 K. Q
/****************************** 用户定义宏 ***********************************/( p: q3 R8 W. G
#define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒. V+ D( I6 J! R. A8 N0 C
/*****************************************************************************/' I( F3 p. [5 N. a6 c2 p$ A9 e4 G# d

0 }: K8 k2 `7 p7 f#define DIS_DOT                0x20# ^' Z) s* J7 H
#define DIS_BLACK        0x10! H+ [. X2 o% N- m( C
#define DIS_                0x11! V" B! j  a# i$ S% g
$ O0 }; u; n& H+ W) h
; S) l% g* o; H2 y
/*************        本地常量声明        **************/% `/ f3 f) z" ]8 S9 D  W
u8 code t_display[]={                                                //标准字库1 r" W5 A1 ]; ?- A! K9 L( o# b
//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
( z0 e$ i, ?  m8 E' m( ]( K        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
; s6 T$ r) v9 z2 ]; R3 U4 j: S* i) Z4 w//black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y# \! ]. Q( Y/ h1 ^
        0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,( e" z1 q& j4 y/ P
        0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
" U7 F8 U  s; e. _+ fu8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码
; }* m; `; M1 \7 Z. Y) A- _: t1 r0 s. m( [+ V) @, b
/*************        IO口定义        **************/
8 r. r8 [& A( o! a9 `6 a. B) psbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
/ X% O7 o" O/ hsbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock+ M8 _" Z, D0 x; G
sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock
) j( `, Q8 l* t/*************        本地变量声明        **************// w( q% R7 H$ S# `; P# K
u8         LED8[8];                //显示缓冲
* Q* y6 B6 c, y5 j; |' Y" h- ju8        display_index;        //显示位索引
8 `* `7 v: {! u5 a2 p1 T! cbit        B_1ms;                        //1ms标志4 J/ {( t8 ~7 j) `3 E. X
u8        hour,minute,second;. L9 o. O; @) _5 S1 p: d  R) G
u16        msecond;
: M1 D; ^6 _, _% k" p! ?$ f* m  Q/*************        本地函数声明        **************/5 J) X: t# I" c6 B& a9 \( ?/ B
7 e# s; Q2 a9 m' W
/****************  外部函数声明和外部变量声明 *****************/
5 t) }) @5 \  `% [* U: j0 w! i  c. Y: g3 Q! J) P  r
/********************** 显示时钟函数 ************************/
& {7 Z$ u2 s0 H# \! evoid        DisplayRTC(void)
$ r- Y: ?  e$ ^" o{9 ]" f0 T8 Y3 B) i( K  m! W
        if(hour >= 10)        LED8[0] = hour / 10;$ |: o) F0 o3 ?
        else                        LED8[0] = DIS_BLACK;
  y2 [8 E8 [. g. \, v        LED8[1] = hour % 10;
" d; [$ O% c; p$ j        LED8[2] = DIS_;! a" o1 k2 U  e4 V6 B$ q' c
        LED8[3] = minute / 10;
9 G- [* Y% q8 S& @7 [        LED8[4] = minute % 10;
* Z6 k) u$ m" ]2 S# G        LED8[5] = DIS_;
- d. Z+ A. p6 X# ^4 i        LED8[6] = second / 10;/ e/ W5 a' \- `2 U
        LED8[7] = second % 10;
3 g1 G* v$ V5 L7 F}
1 F8 N+ @& q9 K: g% [+ x/********************** RTC演示函数 ************************/3 A0 B: r+ j3 `/ h+ ]
void        RTC(void)
, P0 {0 x2 j* k* i# f/ h! Q{
' {. ^$ a( m# B6 K6 l$ n2 w( U& ?( ?        if(++second >= 60)
1 S1 e* g: p# s9 [        {- z, U# d7 C, x9 a* r! a
                second = 0;! @& l% O: j5 @) {! K: ]
                if(++minute >= 60)
$ z0 Q6 G7 R! d& \                {
- C* t0 ?  P+ N1 w! G1 E' J                        minute = 0;
8 o/ Z- n6 d. p) [. M/ p8 K( I                        if(++hour >= 24)        hour = 0;8 F3 ]6 z  W. j& o
                }
/ x5 v# Q% y4 \. M, I. b        }
8 k. i1 y, k# E/ W( Y( Z}
6 ?& A; [4 h3 D: `; F' h* q/ e8 A9 I% Y; C. C5 z
/********************** 主函数 ************************/
. d) v$ e3 Y. u, ovoid main(void)% L) \& W/ k8 ]0 _& l, B, J: y! U
{
6 |* m, ]( h. W; A+ U# U        u8        i,k;5 ]4 [. _' [0 s/ i1 Q5 H* U! e3 |
        # B( y. o3 L+ P. S, k/ x* T5 U2 J3 G
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口* P6 P4 a# U$ U% F+ f8 w6 \! w5 i
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
9 @$ d" ?" z: Z3 p0 |        P2M1 = 0;        P2M0 = 0;        //设置为准双向口3 t- ]0 V/ X& }5 s
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
* q, q- g- q) R& H- o3 n. ?" n% i! H& b        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
' j! F" ?# R8 o1 K, y, n7 e5 h        P5M1 = 0;        P5M0 = 0;        //设置为准双向口
) c! O4 Y8 W& }* _! C& O$ S5 H        P6M1 = 0;        P6M0 = 0;        //设置为准双向口& G& A' V% B( H# S0 {
        P7M1 = 0;        P7M0 = 0;        //设置为准双向口
7 c, b) t5 R: C1 {1 F8 e        AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload, ( n4 Y5 t9 s: H. c/ Y0 _, r& T2 _
        TH0 = (u8)(Timer0_Reload / 256);
8 Y# k5 r- d/ I  e: @, O% B4 s        TL0 = (u8)(Timer0_Reload % 256);8 U0 ]6 p% S3 U4 U2 B- ^, L
        ET0 = 1;        //Timer0 interrupt enable" T& A6 U: [. R) V. C
        TR0 = 1;        //Tiner0 run. u) a: G+ S! Z6 M1 v0 ]' S# |" H$ r, n9 ?8 x
        EA = 1;                //打开总中断
# g8 {6 W' |1 l9 N% E        
9 s7 x8 Z5 ]( ~! A        display_index = 0;
; g0 g8 N6 r0 t. s- ]        hour   = 11;        //初始化时间值
& C5 z  \6 A* ~7 [        minute = 59;& J  a. _; H3 [3 W. V
        second = 58;
6 j/ V" O, K7 w( f        RTC();
8 {2 o4 \( k3 W/ \( \' s        DisplayRTC();
. v! |& f$ {7 y' R# q        ! Z  b3 K/ {# m/ h, m% V& ?
//        for(i=0; i<8; i++)        LED8 = DIS_BLACK;        //上电消隐
! ~& w: [* S; s        for(i=0; i<8; i++)        LED8 = i;        //显示01234567
2 T  ~) [# k3 y        k = 0;; D' e0 ^' v: I  X& d: h
        while(1)
- T9 {! w7 H# w7 m) L1 e  r        {+ x3 n( E2 X* Q$ _1 D2 @) o! F
                if(B_1ms)        //1ms到
+ E+ z5 R3 ?  Y                {0 [& z" ^2 [2 E0 p8 e
                        B_1ms = 0;4 a/ F9 {. f& O# }+ [# k* W$ R
                        if(++msecond >= 1000)        //1秒到
/ I# b( j' o; ?  j  k                        {
7 f) V/ X6 }3 t, i! B% }                                msecond = 0;$ F' u9 b- }$ t) q: n* ?
                                RTC();
3 K1 z- z$ g6 A" }3 e. B                                DisplayRTC();
( u- D* v7 g7 s9 N; r                        }
9 v+ j' J+ }1 u4 p. l                }9 j7 M8 [9 I; M% b- Z* t2 U
        }0 I. S1 ?# H* Q1 ]
}
; l! D0 w- O' g. y; K/**********************************************/+ U# R0 J4 W9 W3 T
* l' P3 u$ H+ p2 b1 N. {
/**************** 向HC595发送一个字节函数 ******************/% I2 I4 z; v1 m) H9 g! l! w
void Send_595(u8 dat)9 b! F4 s' a5 J3 y& Q
{                6 v- n# N" Y3 P5 [
        u8        i;
& p5 s8 h4 m0 A' v        for(i=0; i<8; i++)
) g4 |' B2 {0 T& }: N7 N  _        {& c8 Z) N" ^4 J+ W' L( O% Y) O* @
                dat <<= 1;; J5 F5 M  _$ g3 A) c" w% m$ ?& O
                P_HC595_SER   = CY;
" Y$ ]; ~* H9 ^7 G: D: \                P_HC595_SRCLK = 1;
" U& r# d* b2 W, T                P_HC595_SRCLK = 0;' S5 e9 |4 Q. _2 Z. c
        }
: t/ V8 T, l2 K$ \# P; g7 j  W. e}
8 q, F) N- ^  m: o! m+ O6 ~/********************** 显示扫描函数 ************************/8 i7 e) _2 y7 `; g
void DisplayScan(void)8 M7 a6 o  k1 u
{        
- ~6 n2 D; c/ t+ y; q$ D        Send_595(~T_COM[display_index]);                                //输出位码5 v' d0 l) x, R2 E
        Send_595(t_display[LED8[display_index]]);        //输出段码4 ?0 U, r- u" M4 G' p
        P_HC595_RCLK = 1;
$ Y% J( s( V, l* y8 M, F8 A        P_HC595_RCLK = 0;                                                        //锁存输出数据$ v! o% c# ?8 Z) a
        if(++display_index >= 8)        display_index = 0;        //8位结束回09 @, w/ ?& o; n
}
2 p" l. q* Q' w! }
; W; }, F4 R( L7 W3 B/********************** Timer0 1ms中断函数 ************************/
5 ?/ G3 [" P, F# r. P% K1 Qvoid timer0 (void) interrupt TIMER0_VECTOR
( ]. |0 C: e# Y{( ~" f7 u8 u4 @6 d' k! {1 {( }
        DisplayScan();        //1ms扫描显示一位1 H+ v; b. E: s( @( Q# e5 q
        B_1ms = 1;                //1ms标志) K: h: ~5 Q7 `' D4 e( v7 S
}8 T$ |% V7 j8 n/ V% c+ h2 |5 j
! E& d2 S. j  ~  s
下载:
0 \4 L4 p5 E" F1 Q9 U0 G: D
游客,如果您要查看本帖隐藏内容请回复

9 S9 T3 Z2 Q+ H) U4 n0 _7 @3 ^
/ I+ m4 h' L7 K1 x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 06:44 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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