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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STC单片机74HC595驱动8个数码管' N" B& t: ]1 B9 |% h$ r* y& c

; a' }7 {/ i, S. q4 x1 V- l) V3 a: {' s' `4 ?

: L/ n5 N0 b9 B- S74HC595驱动8个数码管源程序:
. }8 o% G6 K" g; U: \% @- ]7 h/*---------------------------------------------------------------------*/
+ h% b0 k+ `5 i/ J% L/* --- STC mcu International Limited ----------------------------------*/
# o$ ]2 B1 X. ?' {2 }. `/* --- STC 1T Series MCU Demo Programme -------------------------------*/
2 t; u, \4 ~0 ]8 ^3 a( B/* --- Mobile: (86)13922805190 ----------------------------------------*/9 @* Y- X  K; e. X- i' J& A* f  t' s
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/1 l$ B' ^7 _0 u" J- C, F
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/6 G; e5 z% K+ e0 @( M. ^3 ?/ Y; r, D
/* --- QQ:  800003751 -------------------------------------------------*/
6 C" P  _) O$ M. f* b/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
1 w5 u9 L  l2 u  r! l/*---------------------------------------------------------------------*/+ E) m7 D$ y: P. h: J3 e5 y6 c  W% y$ N

7 w6 R8 f; B4 l+ S3 Q/*************        本程序功能说明        **************
( Z: G( }' \/ `" u# f用STC的MCU的IO方式控制74HC595驱动8位数码管。# j; ~7 g( v4 {( e
显示效果为: 数码时钟.
8 l% i* v; z/ i% d  s* s使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.
5 M! H4 J* H. \. S' e" |( k8 y; p******************************************/
/ e. ^- O' k( J* b& V7 j#define         MAIN_Fosc                22118400L        //定义主时钟
: T# Z8 ~# r3 e/ o#include        "STC15Fxxxx.H"
& U4 S( @" m2 D, A/****************************** 用户定义宏 ***********************************/9 S$ W7 _; f) J
#define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒
5 H2 `. M2 r& G6 V- h  G9 D- p8 }/*****************************************************************************/
5 x* S/ _+ R& d7 b$ u0 g% Y: f# Q  b( g+ O6 s# J2 X) a! W
#define DIS_DOT                0x20
! |9 P- E, S7 Z* q2 s#define DIS_BLACK        0x10( e3 B& W/ H% |
#define DIS_                0x11
( U* N* W' z4 O
: E/ r, ]4 B' S9 H. a5 T4 q# `) {& O  E3 ?% w
/*************        本地常量声明        **************/* Q+ }. ]* y  C# @
u8 code t_display[]={                                                //标准字库
" U5 E4 H  l2 ?//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F9 w6 F. b3 c; }
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
0 p+ r" d! I; u7 ?. f//black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y7 P" w0 C; f2 _# M& b; V0 o
        0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,( f6 e% |0 t$ M6 v, ?( U
        0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
( G/ O8 N# u6 k$ y6 f# g% ju8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码
, t( h* Y  L9 A
5 U2 T; M7 m# M. z5 ?/*************        IO口定义        **************/
. y- G5 ]7 s2 s$ X/ T  z  ^sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input# Y2 b# ?/ ?4 ^
sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock; [9 L9 `( i8 a! X/ A
sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock
6 A8 x  W: [. T1 _! I4 P- B/*************        本地变量声明        **************/
% b2 z. L5 T. C( _u8         LED8[8];                //显示缓冲6 W7 v( I6 O; }9 u- p
u8        display_index;        //显示位索引- `0 w4 u$ A$ X/ W4 B5 L
bit        B_1ms;                        //1ms标志
) M! B! G% \% _$ [u8        hour,minute,second;5 O! P7 b2 H' _1 d  G4 K* H& w: |
u16        msecond;
# e% z# c$ ~4 e; b4 ~. ^! F/*************        本地函数声明        **************/0 ?$ x' Q: ?& K+ F# [! Q

3 n* a/ p% `" E) K$ T# {' ^/****************  外部函数声明和外部变量声明 *****************/
- H- g, i; E* b+ B" b* s$ t* _1 v* m: ?8 [
/********************** 显示时钟函数 ************************/& Q9 r7 P+ |: t5 B& {
void        DisplayRTC(void)9 q; z) k+ N) g( x
{  x  e% d2 S; ^
        if(hour >= 10)        LED8[0] = hour / 10;
- K' U. y& W; v  `8 Y! ~  Y" X        else                        LED8[0] = DIS_BLACK;
8 @. U9 T( X% Y: {) l9 r4 B2 R        LED8[1] = hour % 10;
% {% v! t; i: p5 m3 O+ @$ P/ z        LED8[2] = DIS_;4 c3 U, Q; C4 f; R! J1 ?
        LED8[3] = minute / 10;
) m. |6 E# q1 _( S* s1 X        LED8[4] = minute % 10;
; D: s# W4 |$ u  l& X8 h  o        LED8[5] = DIS_;
* A/ \7 @. l! m* b% x4 s        LED8[6] = second / 10;
9 H; S3 m7 I; W        LED8[7] = second % 10;5 [! B  M4 P0 ^5 h0 r1 Y, b$ I
}# L: ~, b" o0 |$ k8 H. i
/********************** RTC演示函数 ************************/
: L0 G, ?! z& y% evoid        RTC(void)
0 D: L/ s6 X' N& G7 c4 f) @{
* ?$ Y  u; m2 w  C$ E        if(++second >= 60)
9 |) d' L7 {; i+ n& ^        {+ v; j' D/ N9 E2 H
                second = 0;
3 t$ Z* l8 z0 ~( e# j+ d* c                if(++minute >= 60)( Q% _; K5 Y# i: s; z
                {, Y9 V& g& R0 w
                        minute = 0;
& F& I; _/ ?2 Z) O8 w4 H                        if(++hour >= 24)        hour = 0;# l( z4 y- H0 b; u/ J* Z* b
                }4 ?+ i! O) J# j1 V4 d' n" G5 m
        }
6 X0 G' l  R. f+ s( c; E: Z}
  \4 C. v8 B9 |) d: X- J; J% B. b* T' U
/********************** 主函数 ************************/# w* G  ^/ v6 a! w% J2 z) h
void main(void)
% m$ ?6 P/ X1 E+ O; Z{( Q0 _0 a# }4 h/ l8 E5 `
        u8        i,k;0 J: L( L# T' o$ J7 g- |/ L( f
        
; m; V0 z) s* ^9 h. Q! C% E        P0M1 = 0;        P0M0 = 0;        //设置为准双向口3 K) {% m$ U9 o0 q. A6 L
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口8 V) X) @( G- O, y7 q
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
5 B( s- R& _( g; g$ \- B9 C1 H0 }        P3M1 = 0;        P3M0 = 0;        //设置为准双向口1 x+ T: K2 k7 ^  D$ m% D4 ^
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
) U! H+ Y0 n5 w  ^) X        P5M1 = 0;        P5M0 = 0;        //设置为准双向口, E& p2 v9 n" i! q8 }5 j9 D) r, _
        P6M1 = 0;        P6M0 = 0;        //设置为准双向口
$ O  K  G1 f0 P% _" m& S* `        P7M1 = 0;        P7M0 = 0;        //设置为准双向口
! t9 a  i$ x+ {& b        AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
, ]4 i$ G* G( W5 a        TH0 = (u8)(Timer0_Reload / 256);
# W# c* Q* p" D4 v/ F        TL0 = (u8)(Timer0_Reload % 256);
" h" j" g0 @- v. ?( R        ET0 = 1;        //Timer0 interrupt enable
/ w' f  x! c1 ?4 [. w$ Y        TR0 = 1;        //Tiner0 run
& P* M9 `) r; X, _: v2 [7 P! b        EA = 1;                //打开总中断
& w% @! V2 Z/ b1 L- `        
0 [3 A/ L. w* y3 J$ K        display_index = 0;
  J5 n* ]2 C" h7 d        hour   = 11;        //初始化时间值1 Q  G6 O  Z  e9 D8 o; f# b
        minute = 59;* f, |: k& f4 V6 |, @. R
        second = 58;& l" `$ O# l* V8 ~! X3 \0 }
        RTC();
/ V7 @& H* J2 _( F+ d4 v        DisplayRTC();
: g+ |' l3 U  r        
( Q6 ]* g: a9 J+ U4 T//        for(i=0; i<8; i++)        LED8 = DIS_BLACK;        //上电消隐
' I- A! O* y! j. O& O        for(i=0; i<8; i++)        LED8 = i;        //显示01234567
$ N- g" w' d) ]. p        k = 0;
0 ^) C0 u$ D5 \! S0 x3 M' l        while(1)" g, ?5 y- d9 R
        {5 [$ ^) o* M" Z9 h1 j
                if(B_1ms)        //1ms到/ v& M. [4 N2 s
                {
5 g5 n. @* x% {  Q! p* t9 z                        B_1ms = 0;( z, @* p- \9 \
                        if(++msecond >= 1000)        //1秒到
/ N5 L9 f& i( ^  ^) [& O                        {4 U) q3 _6 m) {; v' Q  R
                                msecond = 0;
# e/ J7 i& h1 E: ?& m                                RTC();3 [- d8 H; `$ F+ @2 H
                                DisplayRTC();
  Z+ o3 F7 Z  m+ D  X  k                        }
5 [3 H' |4 M0 a4 x                }
: E2 w, Q' V" Q  Q' S& _        }
/ k, O3 F! w0 l0 E3 \) l% l}
- w7 K8 X4 a! h; H: f2 o/ E/**********************************************/) C7 ^9 `: ^) A1 G& x
) x& e( p* R( j
/**************** 向HC595发送一个字节函数 ******************/
. }1 H% F2 l* v, Y( Evoid Send_595(u8 dat)
' ]! m4 W6 n7 K. |{                5 k1 g+ g! N8 Y' H5 I
        u8        i;) Y) K/ l- g& o
        for(i=0; i<8; i++)1 R! Y9 k0 y3 |& ^0 z: z* w
        {4 z! N& N6 ~  o0 n! J
                dat <<= 1;
" C- m4 g9 p8 K$ p+ \                P_HC595_SER   = CY;- B$ c5 p9 o" l: ?
                P_HC595_SRCLK = 1;
5 Q" J3 e) f3 P& S4 H9 e( K9 |$ b                P_HC595_SRCLK = 0;
( M1 d9 t* ~' p0 W5 X% L        }4 M% e) g, g, G1 u) b
}; v1 ?+ I" b3 Q$ W# b2 c' ~
/********************** 显示扫描函数 ************************/
2 a7 ?; }( a5 y, Nvoid DisplayScan(void)
: ?0 T' l! J0 @# q{        " h: w4 c  i# k& [% d
        Send_595(~T_COM[display_index]);                                //输出位码
; a( U7 P7 P- e0 h& K        Send_595(t_display[LED8[display_index]]);        //输出段码
- ]( {+ z7 C* _9 h        P_HC595_RCLK = 1;
/ w- @: I) b" i$ u        P_HC595_RCLK = 0;                                                        //锁存输出数据8 c+ L  P2 U& Q
        if(++display_index >= 8)        display_index = 0;        //8位结束回0/ c5 s2 {8 u5 v8 K% d6 {* x6 g
}" k9 a  d) T* \+ p: s, N
! O  W1 {. H( }% \2 R
/********************** Timer0 1ms中断函数 ************************/8 y/ X' Z, H  w! d5 v) i
void timer0 (void) interrupt TIMER0_VECTOR
8 n/ j: q6 [% t: ^{
: d+ d; [  c" g) S5 |        DisplayScan();        //1ms扫描显示一位
$ {% D) R+ N/ ?, w        B_1ms = 1;                //1ms标志
: \% S% z; a3 \}
3 s3 V# [6 D( G# L6 X4 e* A& ^# e3 p9 a0 A
下载:# d, J7 z# f0 C# k
游客,如果您要查看本帖隐藏内容请回复

# j! E9 `. v4 L
: @7 I7 `" S" i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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