|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% m1 C9 S% e4 ~" ?" t
//基于pic16f676宝贵的IO,本程序使用2片74HC5951 ^" t) A& `1 ~
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。5 z; h! E8 K6 _' Q3 Q8 A* @
//小弟初学,水平有限,大家多多指点,不吝赐教。
: \2 p- J, s4 t8 e: R+ G8 e//QQ交流:271344691
, R" A+ n2 y+ R% f#include<pic.h>//PIC16F676-SOP14
6 M/ ~& Q4 y: v r3 c#define uint unsigned int
/ e. `" E! x7 L: {. F#define uchar unsigned char
- |; N+ i. R1 a4 E; r7 _#define SH_CP RC0//595端口
* ]/ `$ Z2 r' z6 ]6 s. [/ X#define DS RC1+ h0 H) B' E' K- } Z4 M
#define ST_CP RC20 z$ r, M8 y& f8 q, x" _- m
#define key0 RC3//按键端口
+ b1 \% b: `$ p+ o! p8 z#define key1 RC44 }* j' W1 |8 `7 H( @$ W& X
#define key2 RC5
# m1 @" Y8 W* Q& |1 F4 s#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒# P' P# r- s( k! c( G; ^, ^
const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码 - C$ b7 {. I7 y6 e& \
uchar sec=0;
( H. L% k7 X, ~7 @8 j$ Puchar min=0,hour=0;+ E! l+ H, m; E, N7 z
uchar count=0; 6 b t) y5 K/ m" r% a
__CONFIG(0X0002);//外接16MHZ晶振
8 T5 s# W5 L' f. q2 y5 f) u) g, k/ Qvoid delayms(uint z) //1ms延时函数. E1 c& P; s! u0 ?
{
9 d/ s, }3 y3 |& n7 |$ X* g uint x,y;! F* z7 w9 I; n4 ^
for(x=z;x>0;x--)8 P! H! H- E+ k5 B2 C8 l' J
for(y=100;y>0;y--);* y4 l8 O2 ]9 ]3 J0 e( Y# o
}
. E# o2 u+ {) k! h* g4 D3 R* _void delayus(uint z)
j! Y9 @# A1 W/ k; s* H' D W/ f{5 X# {! J9 T5 ~: W( v, s, u
uint x,y;8 P9 l2 g! i$ \ N2 A9 Z9 N6 B- X
for(x=z;x>0;x--)
7 ?; q* J+ x' |7 C for(y=10;y>0;y--);# w% Y! {6 o$ i" M8 O3 R
}
4 P# c! `) E! u0 M Evoid serial_input_595(uint dat)( u0 D8 P1 B& H. c: F
{
7 `9 r; z6 M- L8 u1 J; |' Z4 ] for(uchar i=0;i<8;i++)2 [ [0 v; u1 v4 u0 t' P d" q
{ ~$ J% l3 F; ?4 {' R
if(dat&0x80) DS=1;else DS=0;
. p3 q o4 {" e0 A$ B% L dat<<=1;! E2 Q# c/ D- x# h& W
SH_CP=0;delayus(3);
. P3 r; v, A ?) J SH_CP=1;delayus(3);; m; q: K D+ j
SH_CP=0;delayus(3);3 Z/ d1 @" m6 S# F
}
0 G, l, r3 q3 b9 X} $ [; s/ V# P5 D$ ]9 {
void parallel_output_595()4 w* s5 {( J. n
{* z3 p, d- d9 c2 g8 s" C
ST_CP=0;delayus(2);
$ m1 p: a7 ?/ k# E4 j8 N6 W ST_CP=1;delayus(2);
* k) P% L* X! f; _' J0 B ST_CP=0;delayus(2);
: Z3 p p- w4 G3 _2 c- \}
* P# u! x4 i& b. `8 avoid distime()//显示时间
# c1 j. s5 [4 w+ i' k{& ^, }% f( m2 f9 S4 o" W$ x/ h. y
serial_input_595(0x01);! P! q6 i3 F; P
serial_input_595(table[hour/10]);+ ~9 Z" z; [3 v
parallel_output_595();
( U; m* J- X) E p4 O0 z* h! N; f4 R delayms(1);, ]! l9 p$ \& S; c; j, m
serial_input_595(0x02);4 [5 A8 D# e; N7 Z! M3 x* S
serial_input_595(table[hour%10]);. z& x7 ?* r: ^, E7 |: F
parallel_output_595();# Y ]( A) R6 ?( X9 ?( L7 M$ R
delayms(1);4 i7 D( k3 j* J% d* S
serial_input_595(0x04);/ C- o: B; b0 n, R( b
serial_input_595(table[10]);
4 h5 R& X1 t, g2 j( V3 V; ~2 y parallel_output_595();
0 q l+ O ~# Q4 I delayms(1);
% V$ p4 A& P5 O3 y serial_input_595(0x08);9 x& ?/ k3 |3 A4 x
serial_input_595(table[min/10]);+ _% i! M8 I4 g5 ^0 I/ C g) K6 _+ Q) s
parallel_output_595();
% z" t; n* j/ U q. ?6 E3 ]1 h6 S delayms(1);
- L3 U1 n) O" R5 m serial_input_595(0x10);5 @9 `# q8 t) r, @6 V
serial_input_595(table[min%10]);
" S7 y2 a/ \( W1 h1 Q* m parallel_output_595(); - z, Q# H- ~8 v+ u$ o+ L7 |: k. M. M
delayms(1);
8 v) U6 E1 ]4 Z serial_input_595(0x20);* _: w7 K- u* E6 @7 H/ t: I7 @
serial_input_595(table[10]);
; r! d/ O& o$ |# ]8 K* m9 } parallel_output_595();
! n* L9 W2 U2 N8 ]+ i delayms(1);
3 f) n5 W, r% l6 y serial_input_595(0x40);
- q* X$ ]' |) m serial_input_595(table[sec/10]);
& q4 q, I% m& i4 ~8 O8 \8 Z& g parallel_output_595();
$ t( q$ s N0 s8 V( { delayms(1);' w6 ~, V/ l, V$ k# q' P, q
serial_input_595(0x80);' Q6 r; b( y: C- Y0 t0 E, @
serial_input_595(table[sec%10]);
! P* S1 w6 S2 Z parallel_output_595();
, i3 ^4 I+ G5 s3 T- i4 w delayms(1);
5 @ [3 w; ?, \0 l g9 A" P}
6 w" k; H- v( i, R0 ?6 lvoid keyscan()//简单按键处理,实现调时。
6 m: F6 T& D W5 ]! ^{
6 x0 C5 i, p2 r6 } if(key0==0)" s9 M; j) Y* d; K# [! L( {
{
" ^- {, a2 R/ x' J0 f: z delayms(10);2 Z9 C' X9 I1 j9 A3 G5 Z
if(key0==0)
: i/ r$ x1 S8 X {* s3 F& q" ?; v3 J3 e" t
sec++;2 c; a4 F# Z- E/ t; X
if(sec==60)
6 k) s( d/ l' `- c, v sec=0;
& k! m4 _2 y! E) K' @7 w" `6 K distime();# h+ |( h7 M& i! O0 g2 j: I
; x% W! \; D5 s9 \4 K0 j1 F) d }) ]2 k8 m: U, u: X& R
while(key0==0);
$ u; _; C7 ]8 U! V }
; ]( X2 s8 a. T: B) O$ Z
/ D+ J! b9 m3 P0 u if(key1==0)( O) q* R& d1 d r4 F
{
- u0 F5 [; Z7 l b- A- { delayms(10);
+ r/ P/ i5 }6 Z$ d% f- S& m& r if(key1==0)
& ?) W w/ [, o {
$ N3 ?* R5 I- C7 ^0 h min++;
5 C% C# ?! ~$ P* B3 t7 Q if(min==60)& R x9 M. ` W( q* {
min=0;; J' \' J/ G6 p0 Y, J
distime();
7 p" D% o; u, @5 o* d9 k }4 U' P; _) O- T! t) w E5 x
while(key1==0);
2 N0 M7 }4 ^& m }
; q) o3 s! S; m. ^4 {# S! [$ p if(key2==0)
2 z3 v# v1 q5 ?: m0 w, s' y {
+ {8 r D! |+ U$ U delayms(10); l- P. G3 o. h: A0 }
if(key2==0) c; a3 Z6 l+ I+ x# B
{
, o4 ]# O O% \* }+ B) d: x2 \ hour++;
$ }/ j0 N* @& ~ if(hour==24)5 F" Q G2 \6 G4 b ?& l
hour=0; F4 e" r T( M
distime();: o4 I7 W3 y/ v- o% s
}
/ T% g8 L% D$ |* J' g* m while(key2==0);- x6 T. V9 X' u1 \6 E
}
8 O5 o$ o( J' _7 S+ ]& D}0 }' d |4 H1 \$ K
void main()( P! X7 s; d8 L" l. j
{
! G! _' V: d( h% R( v/ [ TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写
' X$ y& g. I6 n* }6 B; @- O N& {3 z TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读1 I0 u% \- h' S" H% M; \0 I. J1 L
PORTC=0XFF;, t1 o4 }+ I. ^* g9 d
ANSEL=0X00;
i0 c( i2 {$ J G8 e" s d: W) ~ T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms+ A9 b: S; E g. F8 x9 }' J
TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间
' ~ R# Q# {) t- {0 ^ TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF; D9 Y; U$ E7 L( v
//TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样/ f6 d1 M) u! C0 `7 e
// TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。
0 S) ?& A o# c7 I TMR1CS=0;! z) `6 j( U- }% ~. ^- R% {& O
TMR1IF=0;3 C; Q6 B5 K3 O' }
TMR1IE=1;
7 w, K$ C1 Y2 [) t) w+ W7 R TMR1ON=1;
) P$ g# y3 ^1 X0 p1 r) h( w GIE=1;
+ i; ^# h3 ]5 k- G9 Q% Q6 h& l PEIE=1;4 f2 A6 N# K# h
while(1)
' ?8 z( u) [( P+ F& x. _' I' } {
/ O! q$ W" d8 `4 d) s+ y5 s; m distime();- s2 P( o7 z+ c. }
keyscan();
4 j( p7 Z% r& j; M& Q7 D- o. U }+ [8 ^1 `2 N( a ]/ V
}- K% l% c& O* ?8 K ]- E
void interrupt TMR_CONTROLL()
2 Q9 D& {) O6 | X; V{( F; V2 v, l7 |8 p0 o; s
if(TMR1IF==1)
6 a e2 s! b& n% @9 Y7 d {% {% m& d, C! q7 I4 H: j$ P- n4 J
//TMR0=6;
; e; P, Z+ t5 o2 M count++; 6 K5 Q6 M/ w- K9 A! N# b- [$ o
if(count==100)//16M crystal3 l5 q, H% [* x3 ~
{' Q: Q$ }% `" ]( K: m
count=0;
8 G: W% r$ r' z' [8 i+ X+ \ sec++; % {, W# |" v- a
if(sec==60)
) |) A7 }% ~1 Z3 J H {6 U$ v: b& [* u s; `% X, C, A
sec=0; z' j! z+ a: s) l. ~! s
min++;5 w0 X+ @- m$ Q3 N1 H5 _' M3 t! k0 x9 p
if(min==60)
" @, o9 j& A1 ]0 S {. L0 W: p0 ^/ x1 y- U1 X- p$ s
min=0;( D) C) P: S) h6 j! S
hour++;% h) U' M; O, x% W
if(hour==24)
2 L% x x2 y U$ U0 Y8 |* ^* W. a {
, y; u" y2 s2 U. _8 Y9 T [ hour=0;
, p. J5 `0 U; U5 e. P* D ; o7 ?5 C6 T# b. n
} ' x) u; l5 f8 Q: }
}2 c! ?0 V* D. I) w" c
}( t. L8 n N0 ^# q
6 _- R9 }. t6 c4 H9 O) x/ N+ K
}
' m$ i2 G0 g4 e& W1 N: f1 H T //TMR1H=(65536-5000)/256;
+ D$ ], x9 I/ m' y3 G$ L // TMR1L=(65536-5000)%256;; u. |' f. |2 p9 A
TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;
S" `/ `/ v S Z6 `8 c* X% v. k TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;( F5 n8 o' a1 \3 h. l
TMR1IF=0;
" T: B& B; d. v8 } }
' Y% h' j7 A. V! S) D} |
|