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