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