|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 V; S! M- ^) N/ L' Y
//基于pic16f676宝贵的IO,本程序使用2片74HC595
# `2 G5 m( a) [" }2 o% `+ r//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
9 U9 J5 [4 O R% V! r1 v//小弟初学,水平有限,大家多多指点,不吝赐教。, p* b& z& {1 |; g" E, ]6 _- {
//QQ交流:2713446914 \2 z: U1 O& [2 n9 N" }1 q8 v
#include<pic.h>//PIC16F676-SOP14
; n6 T; S' n& y: r' m; B#define uint unsigned int' Q2 w- v- U2 ]: @
#define uchar unsigned char
( s$ ]: C q. k! s% f; Z* ^#define SH_CP RC0//595端口
" P7 ~4 {; i. L# v$ |#define DS RC18 `$ r2 k( \. j6 z4 j o5 n
#define ST_CP RC2* i; |# I+ o* n- U3 A
#define key0 RC3//按键端口9 _( E4 L5 a6 K9 _2 B2 F2 T" d
#define key1 RC4( Y9 g5 w: X. v' y0 a5 d+ h' W# B
#define key2 RC5& b3 b7 |8 v5 \8 @8 D
#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
" Q1 J! y! ~$ Lconst uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码
. d" ?0 i# q/ l* ?% \( X" R6 ~uchar sec=0;+ p, U8 J% X( c6 {7 H& F4 [' ^/ g) F
uchar min=0,hour=0;
0 [& m, W0 a7 G8 R/ Guchar count=0; 3 v& K/ Y. X$ I/ }
__CONFIG(0X0002);//外接16MHZ晶振
i* C! q6 c1 K2 ?- g. C2 Nvoid delayms(uint z) //1ms延时函数2 F; u3 e- f; k# m. i' O8 c9 H) Q+ F
{
! i/ }* Z8 X2 a, I/ e! x uint x,y;
! U# ?2 G5 \: U# J for(x=z;x>0;x--) j7 W3 F; j0 Y4 U' E/ G/ W2 C
for(y=100;y>0;y--); E9 f8 I& ~- g% Z& e1 S
}1 \5 m, B+ T( R3 f7 W* X5 a7 a
void delayus(uint z)
9 \. ^2 |1 h* W4 q% {{! x. j) B6 g7 t8 u9 C- v$ f7 ]' p
uint x,y;
. n/ Q) A+ F' ? for(x=z;x>0;x--)
3 P9 o; |+ e g for(y=10;y>0;y--);# Q9 b: M# \2 C, [7 r9 n9 N/ O
}
4 X9 f2 Y- ]# B. Evoid serial_input_595(uint dat)
5 y7 R1 M9 _+ N6 S9 d{8 d0 `1 y+ ]$ S
for(uchar i=0;i<8;i++)
! c4 Y3 l, J7 f {6 S2 k$ J# d- G# }8 ?" D
if(dat&0x80) DS=1;else DS=0;
* z! k+ @/ H& ^, j: P dat<<=1;
( B8 U1 c+ I C4 _ SH_CP=0;delayus(3);. E+ R' x+ H: u
SH_CP=1;delayus(3);7 l/ c( t X# y
SH_CP=0;delayus(3);4 A0 M+ P( s# A2 a
}5 _8 L: B1 b9 n3 N7 F, W" Y* \
}
% m! J& v" f) r- ~void parallel_output_595()
3 v3 |. H( x. B* L' R! d{
3 p9 {4 t) q" l8 r; d7 I; V ST_CP=0;delayus(2);5 U6 y- `8 m5 P# a! K
ST_CP=1;delayus(2);0 u7 o: b Y4 t( E1 u/ M: R
ST_CP=0;delayus(2);2 \5 J) S# c) E8 [8 ~ [
} " @( a; V! p2 c( A
void distime()//显示时间
( T' D2 l q1 {7 Q- M: Q- H{
8 |! q- n. h. k0 V% G serial_input_595(0x01);
8 l# B8 B" U5 l5 Z7 J serial_input_595(table[hour/10]);
1 v; D+ y3 l- p# H; z& p9 w( ?2 ] parallel_output_595();
3 J, X# i' T& q+ C# K delayms(1);. a; H- R( U: ]2 w
serial_input_595(0x02);
) P2 B% x! _/ j4 d" ~+ } serial_input_595(table[hour%10]);
( o) H! a6 T: p parallel_output_595();" t- @1 c) ]! t& U1 ^6 E7 d# U
delayms(1);
* @; P6 V- U2 x0 ~5 E serial_input_595(0x04);4 R3 x, S9 `3 v1 E' C
serial_input_595(table[10]);4 r5 |& L7 L& I5 r' b6 m6 Q! H
parallel_output_595();
1 X( r4 z0 [1 \9 n delayms(1);0 E% C; j9 v# D' z3 v' j! a
serial_input_595(0x08);8 v4 W+ R) z, n' n) F
serial_input_595(table[min/10]);# F3 r' X- Z k
parallel_output_595();
" Q2 Q" E; t* Z+ _0 I, O- Y, e delayms(1);4 C1 G" z' I( Y
serial_input_595(0x10);/ v2 q8 R( T9 K: l( @1 Y
serial_input_595(table[min%10]);
8 a- c4 D9 b/ d3 U f$ q parallel_output_595();
# q! H$ e$ L3 g4 E. ` k' `- L5 o delayms(1); 6 K* W1 t! D% j% r; m* Z D4 X
serial_input_595(0x20);8 U! }, H V/ B1 Q6 U. f
serial_input_595(table[10]);# {/ k. q+ f' z2 g `7 i
parallel_output_595();6 M8 V) @1 ^5 v) L
delayms(1); 9 u, o& ~3 R/ [
serial_input_595(0x40);$ M5 O" D9 z* [( |+ ]
serial_input_595(table[sec/10]);
7 K5 L2 n& X1 {, c parallel_output_595();0 [8 y* L% H- `% [& h" t, l* t
delayms(1);% U r' B" d4 z# n/ `: ]
serial_input_595(0x80);. s: P/ A9 q/ M4 B; K7 C
serial_input_595(table[sec%10]);1 d( Y {, @" S0 S6 w
parallel_output_595();* k6 ^$ y4 Z. C) Y- p: v7 F
delayms(1);
2 d; D1 w, |( J7 K( h. [, Y}
, l# |3 H2 [/ [/ ~& z( [void keyscan()//简单按键处理,实现调时。( w6 A+ p. s) g* G* q: N
{
+ `$ H2 ~4 [1 x% | if(key0==0)
# r, Q% \0 K4 G }2 h+ V {
) f( _# ?, i* y7 n+ Z& B delayms(10);6 \* @# c6 D- c. v" `7 j4 m
if(key0==0)" ~7 `, f& t, q. t: M8 r
{1 F! r; ]$ P/ O$ s. V' U
sec++;
3 q) l# d+ V1 v# R% v( q if(sec==60)
4 `0 l0 H7 E+ o/ V. B sec=0;5 h, U- a" {& y: r
distime();
2 q2 g, h2 a- ~0 G9 ~( `2 K3 O2 B7 |) Y( ~2 V
}
! u Z8 Q5 ^0 r* I- O, \3 [ while(key0==0); [# G. r. f# j& W- ?" c/ P
}
* ^6 u" j) X1 i* w( b* \, J+ R
w. w% C. L3 s3 K% C+ r( c$ l if(key1==0)/ O( u; E" i2 x! I$ y) o* P
{ [+ N: Z4 U* |: n$ a6 L8 T
delayms(10);
* C: ^+ a7 P5 b7 k. U if(key1==0)
$ I: n! Y @0 W+ Y# v {
3 o0 Z | C0 g- p) A6 h4 v min++;
- T- D; b5 P9 x5 `; M. [# S. r if(min==60)
0 a8 _7 ^1 D; m min=0;1 E' w1 b# V0 S$ U0 [# g6 g: K
distime(); D' {; F( W2 v0 ^/ I0 v* Q: m7 |2 a
}- P" f6 a- K" u. _# \
while(key1==0);
{$ V8 R! X9 B; M% S }
9 F! {7 g4 }1 |; \ if(key2==0)
( z8 e$ m8 z- q/ A9 Z, Q( J {
: b6 {8 q* i( m% ~4 R' L% C delayms(10);
& E: z# J8 U6 b- e if(key2==0)
t8 R( ~- s! ~" f* C7 D7 r, K {- h& H \& l& X* a1 i
hour++;8 e# G! {; s! `, r
if(hour==24)8 d! c& K8 i/ v4 p) K
hour=0;8 V" G1 j% Q& y B) }# X6 l) x. ?2 J
distime();6 c- G" M8 e. [6 }/ k/ S D! n
}
& y8 s7 `% ^0 p& w while(key2==0);3 `3 m- m8 N5 ~! ^' P
}7 g$ l- v1 v8 C$ J, x, G7 C
}
e6 }& U) W# H, Q- ^" evoid main()
; R) Y8 }9 _ }! ]- M" e{
- o3 C; @4 V( A4 c) ]% ^* @0 W TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写7 J$ c) h* A3 s X3 S4 o" ?
TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读5 o; H) {6 h- c9 r! n) l
PORTC=0XFF;
8 s' X0 \4 V& {) V% v2 Y/ E. D ANSEL=0X00;3 T, ?5 K& X9 ]- u6 Z
T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms) \" E- ^. y0 i* T* O
TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间
) q( r% P* `6 `( C TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;4 l' `! J+ }0 H) V! O
//TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样$ f" G9 G4 v3 ?4 M
// TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。3 h! n3 S! g% q' i% k9 {
TMR1CS=0;3 u. \+ a. A! @, y7 p3 G( b; w9 F" K/ y6 t
TMR1IF=0;
: m" V; E+ K; S! o TMR1IE=1;
; R# I, j$ ]8 e8 t* @4 f: ` TMR1ON=1;! d: |7 s/ F5 a6 W7 @1 O$ B3 a
GIE=1; $ ?* n: y$ K* Z/ ~4 o$ N
PEIE=1;! A) K/ G' t$ w7 f4 p
while(1)6 a, `# p z5 X
{
/ S f a: K# K! {8 G/ r distime();0 h5 L# j# f& c+ I
keyscan();
/ T/ @3 v2 j; H }
! q2 ~* c: X2 Q* A}+ z2 r/ [4 t: P% H/ T1 p* }" A
void interrupt TMR_CONTROLL()
5 y. k; q/ {' H1 r( R: x{
+ e) u5 _ {9 A. O! V# D, P R# Zif(TMR1IF==1)
# d' q; V0 c" c {
/ K) j9 W% W9 s/ z6 ?: l2 ~# l //TMR0=6;
! ?/ Y5 e/ d2 O count++; $ C, H" z7 v5 L' E+ C0 `" \* `
if(count==100)//16M crystal7 P% h2 u5 d" v. h( e* i
{: A# q, `+ N+ I/ m, ?+ L
count=0;
9 C! E3 I0 \# m( I; t sec++;
( |: y! A4 C2 C8 m' [, R0 ^ if(sec==60)
% q8 g5 u: ~+ ? {; R5 u" q* b4 U6 F" a
sec=0;( `( I, G! H! o2 o
min++;! {( @0 w5 j- ^+ `- o
if(min==60)9 o% G7 E$ Q1 ?/ R, X4 Q: G. G+ W
{" J! O9 C3 d# u4 X8 F$ {9 P
min=0;) @: P. r0 _! Q% Q/ b, E
hour++; g9 w2 R* |2 q) @
if(hour==24)
2 E- \9 R' M3 I( E$ K {
- o' b8 ^# \! y6 c! I( O hour=0;. k' A; F2 Z- X2 }2 U. B
% H5 w# w6 [2 [3 h }
: B4 z- x% l1 b7 i9 p }
5 G$ [' T; Z6 f8 U/ w }, a( t) F8 a* j1 h% G
7 ?# [2 Y' `; L" E
}
1 I0 I3 M* Y. u5 \2 _1 H9 ^- J! q //TMR1H=(65536-5000)/256;. x; V" w& \. {9 k% N
// TMR1L=(65536-5000)%256;
1 Q0 u( D( t1 {& W3 ~& b TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;! U2 s' \! ] `1 R- \ {7 L
TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;
' r* P$ @1 g5 x# f9 n. {1 a TMR1IF=0;2 w Y5 ]" V. U! m5 \0 ]
}3 j9 r1 L) t1 Z8 h4 Z7 _. h
} |
|