|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) F, @3 M( J* [$ Y3 C//基于pic16f676宝贵的IO,本程序使用2片74HC595- t- V- w8 C" j8 @! {+ G2 l
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
9 V) g; W; r: @# g% l# a Q//小弟初学,水平有限,大家多多指点,不吝赐教。
( p, v" N N4 f7 F, g4 c//QQ交流:2713446914 ~7 `9 P; {8 U) f6 x; h- M
#include<pic.h>//PIC16F676-SOP14! w: H+ r& e, |% @$ j
#define uint unsigned int
: M1 L; v7 z6 W0 X8 I* s#define uchar unsigned char8 x7 x$ x( Y4 L7 x/ f
#define SH_CP RC0//595端口0 O# E5 a9 W2 p7 j& f; p7 P
#define DS RC1
B* _; l5 k+ W! N. Z6 P#define ST_CP RC2
6 K0 f& {' j4 r3 w5 f- O3 M#define key0 RC3//按键端口
" ]+ h2 G1 z1 z6 C#define key1 RC4( H( y7 n/ O D+ T
#define key2 RC57 c6 z8 \# T2 w+ V' T9 d; r7 y
#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
& Q0 E% ^; J. K$ `const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码 " H& a' j# n+ X1 W( b* M
uchar sec=0;2 ]- y; h o9 `
uchar min=0,hour=0;
/ j0 `9 [9 z; h8 O2 iuchar count=0; : s- F1 c/ [0 @$ w) x# v
__CONFIG(0X0002);//外接16MHZ晶振
2 g% D* T' w9 o' W' tvoid delayms(uint z) //1ms延时函数
6 e, k* P1 O# _" f; y0 ?7 } {
# h% B5 z' Q9 q/ H$ j# z uint x,y;% b, c" s/ s' }% s: O' i
for(x=z;x>0;x--); U2 K/ k" m1 `# X a5 D6 G
for(y=100;y>0;y--);
, l0 t8 P$ B F+ B* P7 K" X5 i}* }5 ?5 V; ^; ~) @, Y4 y6 t; v
void delayus(uint z)
& J* W2 Y2 u/ V$ N{
9 K8 }# [8 X7 V uint x,y;
5 ~ K; C' W. D! z; ^ for(x=z;x>0;x--)
/ ]. C% i) J0 z3 q- q- d0 |( W for(y=10;y>0;y--); Z9 T7 D$ h' ^) T2 p) w
}
! {( e6 D# G/ q4 i, `' ?9 {void serial_input_595(uint dat)
/ J. P; x$ m8 @{
, R5 |6 \9 i) K* Y } for(uchar i=0;i<8;i++)
0 w/ t2 y, B& X, ]' c& ` {
2 }. G# |( \7 H+ F+ T if(dat&0x80) DS=1;else DS=0;0 y9 y7 g. e" L' H
dat<<=1;
5 z' n9 Q, ]4 R/ }8 S4 S- h; A SH_CP=0;delayus(3);: W" Y% i) s! `% D8 b0 u8 u3 C
SH_CP=1;delayus(3);5 C+ w4 u9 @! u- |. A$ x. k) ?
SH_CP=0;delayus(3);( {6 m5 d# v n/ w3 H
}- @* n9 C& Q; a$ t
}
5 b3 t1 p9 m/ evoid parallel_output_595()# T; \) R( D2 V' \/ v0 |$ P
{' G1 H& ~6 _5 T7 D5 H; m+ z9 u
ST_CP=0;delayus(2);
9 ^- M7 V1 r" P0 Y" K3 k! M2 @( O3 F ST_CP=1;delayus(2);: Z9 G3 o1 u8 H0 `# Q+ [0 D) ^
ST_CP=0;delayus(2);
8 I) O4 U( Q) D} & o' v+ `5 N) L
void distime()//显示时间6 ?8 ~8 ], H; J. p" T' M
{
4 H9 [: { Y" N0 h, W1 v; n9 o' } serial_input_595(0x01);& x' J6 V$ G* C. F+ h6 z
serial_input_595(table[hour/10]);
9 w! W- h' @( n* }. @/ p% N parallel_output_595();# B7 P5 S: s, n/ q8 E# y5 X5 R
delayms(1);
" M6 d& f: `# H% D0 a; B: Y ` serial_input_595(0x02);1 i0 S" i2 e) u* T
serial_input_595(table[hour%10]);
1 ~1 l$ V5 s$ u7 H- E- P3 a parallel_output_595();
" N) ^6 x6 r; x delayms(1);
7 a, ^! g7 P/ a$ l' W serial_input_595(0x04);+ a: x$ V/ e9 O! o% L
serial_input_595(table[10]);
: d# h+ j5 W4 i* z+ [ parallel_output_595();
& \+ r3 x% {8 g R* [ delayms(1);
4 E; ~( b$ I3 \. F serial_input_595(0x08); r' B# Q4 T4 R" ?; Y
serial_input_595(table[min/10]);: a4 g% i; {9 x! h# v
parallel_output_595();
7 E8 y; a, V( Z- {9 F delayms(1);3 n! u8 }; H; F0 ~0 B- n6 z
serial_input_595(0x10);
# q W) c& x$ _" t s serial_input_595(table[min%10]);& L0 H% F! x: i2 Y
parallel_output_595();
P( p! ^, Y, j9 @ _) w! T; Y delayms(1); & _7 x1 }, W- g
serial_input_595(0x20);
, a4 W" l. b8 ?* F% e: }8 O- @3 l+ h serial_input_595(table[10]);* }& g# ^( ~* f7 r6 g4 j$ f
parallel_output_595();
' {1 }( G! L* E) j8 ?9 J delayms(1); 9 ?2 i* d; f W
serial_input_595(0x40);
" H! x; Z* r: z; X( I2 n4 j serial_input_595(table[sec/10]);
" d3 _ W3 k d" d% D parallel_output_595();- U( f6 I( ~) A* W. E: L( j' ^
delayms(1);
* G7 n! S9 }6 f" Z( n1 f# N serial_input_595(0x80);; |1 W, M. s" z& O, a( l1 _ f
serial_input_595(table[sec%10]);1 s- J$ r7 W$ p V. P
parallel_output_595();% ~1 ~4 x0 W+ n9 f; _# Z! J3 U2 {
delayms(1);3 F2 {. h7 a$ a! }( m3 E# ^ g6 H
}
$ m, ?6 j) s6 s avoid keyscan()//简单按键处理,实现调时。
4 T1 r/ y0 f# D6 N8 a{' J$ \2 Z2 K" Y1 D/ f
if(key0==0)
- i/ B: Y2 d# r3 k {
+ @% O1 v% I: Z4 y4 q" u( K0 E z) p delayms(10);
7 }( @. r: D9 |$ `: B0 Q- c! I6 ? if(key0==0)* C" {, M4 Q, l0 t2 y V( T' z
{
6 S) S# V" T& |+ b( l% `) d8 p sec++;
4 W/ p) O, }( p8 a if(sec==60)
' h8 |( S/ i6 _! h4 G' u/ L" | sec=0;$ ?2 _: t0 x5 F- d, x
distime();# U+ @; R3 [3 B- K
9 R' t7 r. _: I5 [2 f1 P
}4 t" {' u) v3 ?/ z, z! b3 f2 ]! w g
while(key0==0);' o, X2 `3 T: i
}
, Y( H* E9 a: e2 y2 s$ Y ' x- b+ o* x) _% J0 `4 j" \9 }
if(key1==0)" d' E7 x6 c0 F' p
{
- {3 D+ E1 y% Z1 Q3 F delayms(10);) k5 J, L% k* o; J
if(key1==0)) ?, S4 O D: N# p+ F
{
8 _2 L+ a5 P$ G, ?+ q$ y min++;
" O4 b5 o ^+ m, r if(min==60)$ X9 B/ a* n8 X: o, n
min=0;
8 J6 c- O+ q4 x0 u- w9 g$ W. B# d5 Y. a distime();: m) \% ]$ G+ q. G1 s, z( i% m( |- K; X
}2 a) \- u2 y' b5 w; @
while(key1==0);+ g* X) D. ^/ K& h
}, p; c7 k& } l, t, v
if(key2==0)' n! r7 u' Q5 t X. c
{
/ X+ b9 o. A/ I; A6 ` delayms(10);
* E5 v+ c( s( Y! p' A( A6 ~& w6 [ if(key2==0)6 `9 x8 N; Y+ a1 U! v
{0 ?% b$ [1 D7 f6 }2 p, f& e' s
hour++;/ Q% k; ]" l; Q7 E/ q
if(hour==24). i u, R# d* M6 @$ k
hour=0;
0 i L" d& M: k0 c8 Q2 P distime();6 z: n# ?1 l6 S1 G- u+ p& b
}
. T0 k B# d% D$ | while(key2==0);' F- @8 e, r% x- Y2 h! _; _% t
}0 l( W! {' ^- c& ?+ k' ~
}3 S6 \1 U+ k# \: ~
void main()& A9 s1 U; F" @
{5 J- n c! C, y5 a
TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写( l W3 x1 w; a8 K
TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读
2 F7 Z* w5 \4 |* f4 ?9 H PORTC=0XFF;
! `2 ~5 a! L& D* i/ _& V4 P ANSEL=0X00;
" s6 b0 c* e6 R0 D! N& }8 Y- E T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms* P+ |, ^; q+ G% N
TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间2 {; m. T E! q$ _. Q
TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;, S7 H0 ]: W' K, D
//TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样4 [3 W, q5 P" e8 V. Y
// TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。
/ V+ w% ^8 K. J% j( d TMR1CS=0;
8 \2 Z( O/ }# l# C- I TMR1IF=0;1 A4 a* U0 o: U9 U
TMR1IE=1;5 Q0 G# \# L8 @$ N7 O' }4 Q
TMR1ON=1;) X2 ? T: U1 w' m) M4 Q& c6 e1 E
GIE=1; 6 k' i$ C! T& x7 L! \: ~3 R l
PEIE=1;2 g% j6 t; H* V+ S4 K8 L
while(1)7 P5 T' f0 A0 e) {0 H9 O: u
{4 }4 `. ~$ z5 e' V8 ~
distime();- C3 u& x) Y7 i9 `; t) q1 }
keyscan();
+ D8 s2 J- I7 \. [* t: u: O }; x* c& x: {, t- F- s
}& |& m& D$ m0 Q# T/ [. m
void interrupt TMR_CONTROLL()+ x; x* p) T' J; B
{
6 c& C9 N9 [% B# G6 nif(TMR1IF==1)
! ?5 ?% e% p* c+ U( s. \ {
0 [2 ]( p# N2 X3 D$ A //TMR0=6;
/ ]. \! J1 e u# z5 A. Z count++;
" x9 g$ n5 z: b5 [+ f* a if(count==100)//16M crystal
5 ?8 s4 a1 ]+ [. g2 H5 n8 {& n: L: a {
) j. j( x4 h d9 z$ s count=0;
8 h5 H/ r; g; Y- c4 {6 `3 B sec++; 0 i) w' Z0 G7 O
if(sec==60)
) Y( `1 `8 r; y) v& P S/ D {
6 E, y- [. n, B sec=0;5 b6 b- [4 E3 e* Q
min++;
8 Z7 U+ b3 O: k5 _0 n if(min==60)
& s$ D( B" D, T# A' y. J7 d {) @; [# z+ @3 i
min=0; h4 u8 e. F. H0 k) z
hour++;+ {) M. W" H. o2 u
if(hour==24)) ~4 e: b, T+ y* X3 s3 X& Z
{
/ C. Z: U& I# O hour=0;
# U( l: g# ]2 o ^! f& }' c
9 ~+ K* d: L% K* d- A" S: z" o }
2 S* b! W7 S: c1 Y1 W } ~9 p: _' b6 q4 P$ e1 `2 E6 P$ {
}
9 G2 h$ ]; x- L2 d% ]8 M' }3 J) U0 U* n
+ [2 @) m# z- I! f }
* s% f# k6 O( V0 `; N! n //TMR1H=(65536-5000)/256;+ h9 i5 S2 R5 i/ ]1 ?
// TMR1L=(65536-5000)%256;
) z. j/ G% R& A) {. b6 ?% T TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;; p' m$ g9 ?; i C
TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;) g; r. a" N. J% U Z
TMR1IF=0;
$ d# t6 {( S, q$ z# N1 x }
& P' b+ A: S: d' I! [ P) J/ s} |
|