|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 s; @1 L8 X6 U* _
//基于pic16f676宝贵的IO,本程序使用2片74HC5957 z1 B8 y3 D+ v8 }% T* e
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
& q6 a2 ?2 `9 i4 C5 \% U5 B//小弟初学,水平有限,大家多多指点,不吝赐教。. [6 q' y1 j) E2 K4 v7 [' \
//QQ交流:2713446914 B0 z$ t+ X2 n. u9 o2 L% d7 m. E& p
#include<pic.h>//PIC16F676-SOP14
$ |3 R1 F- Q8 r3 Z- y1 i% m8 V#define uint unsigned int
7 U6 I; F) m0 j- a4 {# X#define uchar unsigned char
$ M/ I: T. {- H; b) i#define SH_CP RC0//595端口# M+ N. f+ N6 j- V# l$ Y0 P! e, _
#define DS RC12 E/ i$ B* R9 q, l" n: o( y
#define ST_CP RC2# x& Q+ \3 x- b
#define key0 RC3//按键端口
" G( G9 F* ^' s+ {3 e+ i#define key1 RC4
% z: j' j/ e7 a# C& N' ?/ `#define key2 RC5
% v4 u. S4 h$ }#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
1 j/ R- m& s; h: C4 \& Tconst uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码
+ n' P. y# f2 U! y( ruchar sec=0;$ e; @- {6 [: I, K3 h
uchar min=0,hour=0;
# e+ s! E) l6 t s/ U5 T" yuchar count=0; 4 _( b( @ K. Q+ ]( h, @
__CONFIG(0X0002);//外接16MHZ晶振
' [) x- @6 s5 H; u( yvoid delayms(uint z) //1ms延时函数
3 g V; W9 e0 o& t+ y! v, ]" L {4 I/ s7 ~- x) a# r; v8 Q3 N
uint x,y;0 k8 D @; ~ s* [% ~' v: M) ^
for(x=z;x>0;x--)
9 ~; n o4 P( @ for(y=100;y>0;y--);! z0 D8 W, b8 u, H$ |
}5 B8 s8 I1 q: u5 h# |. J/ }! ~; v: j
void delayus(uint z)
) l5 G0 r+ w3 Z# S. K7 `9 J{
& p4 v3 ~2 Y9 u, u! { uint x,y;9 O0 h i) u4 h1 i
for(x=z;x>0;x--)
& K6 n9 u$ n1 ] for(y=10;y>0;y--);7 G3 _% L4 b* x0 { d8 |" s
}
' e5 E3 _9 { j8 A; dvoid serial_input_595(uint dat): C6 y4 z Z) ^2 F
{* s) U. p1 d: X! B. G" M
for(uchar i=0;i<8;i++)
, ~3 r5 O. A# L2 \' g {0 d2 A$ G3 a+ r: I
if(dat&0x80) DS=1;else DS=0;
0 j8 z% \) b8 C dat<<=1;$ e, u* f* ]% Q X) ?1 {
SH_CP=0;delayus(3);: _/ K# E- e. a! i
SH_CP=1;delayus(3);4 p, s& P! I: \3 U
SH_CP=0;delayus(3);/ D0 p4 b* i B% S
}
* \! h; u, f% }- K4 d; J' |2 k7 L} 9 b! p$ R% z" W' ]* Q7 W
void parallel_output_595()
' S9 ]/ R- G$ t; X9 p/ I2 C{0 c# }* B! O$ `. Y! b$ l6 G& ^
ST_CP=0;delayus(2);( i% S# F6 |/ z* _' i
ST_CP=1;delayus(2);
; @ v( o, ~$ Z, R1 f' A ST_CP=0;delayus(2);" M) u1 \* j2 f
} $ z5 ^. S$ h" ~+ N" T
void distime()//显示时间* {; X- z2 U. E
{
! J% j* _1 x1 ? x: o0 n" j0 n serial_input_595(0x01);/ @5 Q# u* N" U; S, U/ N6 p
serial_input_595(table[hour/10]);) I4 |: P( x; A: D* E
parallel_output_595();
# c. u0 v3 w) N6 H& k delayms(1);7 V2 A3 x6 m' F% |, z6 Q- V6 {) W4 X
serial_input_595(0x02);
. p5 i) @. O( F5 `: b \6 [ serial_input_595(table[hour%10]);7 [0 o" {0 c8 S4 T
parallel_output_595();
8 q- q& U6 C3 L: L f+ L delayms(1);" ]5 Y3 R( z3 ]# J6 ~. y, z
serial_input_595(0x04);
' B1 l; C" U& H* G3 s serial_input_595(table[10]);
8 ^2 S3 x7 l/ e6 [. V parallel_output_595();
* d" U2 ]$ M, H- [; Y$ U- Q2 q2 e delayms(1);; G" d+ m' z1 q8 A6 D$ e
serial_input_595(0x08);; S% f- r5 y( B. ^& o! p. s% [
serial_input_595(table[min/10]);
% s/ E) y& \8 O; E3 B7 o; d: O parallel_output_595();
* r. b" W8 J; P delayms(1);
) V, @* A% v- I! ^ serial_input_595(0x10);
9 ~4 e1 p# y) J |4 o8 r serial_input_595(table[min%10]);# x- W6 J7 n D9 m) i; V% f
parallel_output_595();
% i% y: l7 N; ~ V delayms(1);
) G* E# i+ e: s% i; l8 @0 w serial_input_595(0x20);8 p! _- q! F6 Q! q' w# ]- Z! H# |
serial_input_595(table[10]);, ~5 h# l2 o+ f& v* m
parallel_output_595();* T& u8 j/ b, b) i: n6 O
delayms(1);
% `& F" m8 m! b serial_input_595(0x40);
0 \# K$ \: ^4 i% |2 ^; u serial_input_595(table[sec/10]);- C: |" ~! t ?( X" Q0 L/ `) i
parallel_output_595();
, H$ d' a$ L" `* ^& v9 a' Y3 ~ delayms(1);& [1 T7 M; K8 P- N, k7 H6 s
serial_input_595(0x80);
& c% O" V$ m& P w9 c serial_input_595(table[sec%10]);
) q0 E& O1 c: f- G. {9 d4 U parallel_output_595();) b* k5 `( q9 ]
delayms(1);! q9 F0 l$ Y% l6 w
}! j( c* l& E0 ?6 A& c/ J7 u' C
void keyscan()//简单按键处理,实现调时。
6 z4 X! D8 s J$ K9 V1 A8 g- k/ V{
! k4 W, v1 k0 U t5 N if(key0==0)
" h' c- D# z; S: z& p {8 S' H. c" O8 K0 [0 G
delayms(10);* t* |* Z: u! K( D- {5 j
if(key0==0)
5 @ m( ]0 m* t {3 d+ T9 K! F* [( h( e- Y
sec++;
8 ~2 g& @' ~+ ?$ P0 F if(sec==60)7 M: \: l+ F( R# L; ~: _6 x; M6 G
sec=0;2 @5 c0 O" V7 L( v5 `( u [
distime();! f+ v/ l% n+ Q8 H& O2 G, g
$ Y5 E8 O+ Y, |$ X" l8 x }
3 N6 H4 A+ O: N7 W Z% I while(key0==0);
; T1 p% W0 L/ V/ i }
1 f" U" j; `0 c2 S7 P+ Y0 s/ g; e 9 p5 k' t+ e6 L; r8 k/ k# N7 H3 W0 ~
if(key1==0)
! Q& {' C2 r1 ^3 [" d% ~ {
( P- l/ f" q/ y( y2 Z1 D delayms(10);
. ~. b" o5 R6 I( L+ x! ]& P4 d if(key1==0)( K1 B$ O3 G+ D
{
7 ]0 X- K# h1 \' n min++;$ l) s( P+ b) p R
if(min==60)
( z# @6 w ^- N/ ~) J( B min=0;1 S# r V5 ]1 @# {, _) ^
distime();
1 m% L2 u. ^8 }; x5 U' w }' s1 y! |1 F! e4 A" Y
while(key1==0);0 ?' S1 s+ r" ^; @& ]$ s- U
}
& K% l0 Z2 h, t; ?5 D8 }9 V, |7 t if(key2==0)9 f; e% \, T, Z; |' t5 @; O- Q! R
{
7 S- o! m* w q# D delayms(10);& u# e) S$ G7 U, q; i
if(key2==0) e" w+ }! M. @ \% j
{+ f0 ~ d, {) D0 Z
hour++;2 o' h. ?8 O) Q0 C. g
if(hour==24)2 r7 g' \( F8 `' E. s+ O+ s& N
hour=0;
; W- B6 q" @3 @% z: h* Y2 d distime();
. G$ i. \1 i* w3 G+ k1 a }
$ ]1 w$ Y5 ?4 a- A while(key2==0);
0 D+ y! [( B5 S) }! u }
* m3 c* a$ d' Q/ W$ ^. }+ H. O9 f}
! W- i" q& }5 G# H, V- zvoid main() c0 j/ E: H; J+ Y8 ^1 s
{7 a: @) v+ T4 T1 a1 W% o& ?" U
TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写$ z U) i# @: e8 I: D2 l5 e' y1 _
TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读
' Y8 A4 C, n$ y7 e1 H PORTC=0XFF;
# u6 P7 p+ d( m3 A0 ?9 O% B4 S$ n& L ANSEL=0X00;/ N2 o2 ]7 s G% Y" C/ h
T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms
( K& z+ {' _2 @$ W B& t TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间/ o4 U* l7 Q: D& z) ]6 `' c
TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;/ b+ h0 @% T: o* u
//TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样
9 @( B1 ]) y$ Y3 y$ \! N // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。+ q9 w8 I& H/ |$ I
TMR1CS=0;! y% t6 j$ m( F$ @+ }3 i) f* j# `! U
TMR1IF=0;
6 X& w) D+ u ]1 Q* @: Z TMR1IE=1;
' b1 n6 n! ^: z* X2 {" ~7 A1 j TMR1ON=1;
) b+ m4 Y5 Y; d" s4 `$ S GIE=1;
9 L5 ^4 ?) l! k7 S; W+ j& @ PEIE=1;3 K- m* X8 l, p: B+ Y5 ?6 l
while(1)
' D4 w! m" ^$ b, Y7 n' a' _6 j7 x {, z( j. t9 |8 [$ ]$ ~) ~! \2 q) v" y
distime();- h: F* m3 b' j# D$ K5 S
keyscan();; K, Y$ P7 _6 g. g$ J9 h$ K7 T) I
}/ d, A* r. E/ J/ t0 O7 N/ a
}
# k) E8 o/ ~# {( Cvoid interrupt TMR_CONTROLL()8 q- p* L% ~9 }! K
{
* ~4 f& o: @1 G2 Q9 b- Bif(TMR1IF==1)
% j2 w4 K9 [' Y5 h6 B6 J7 i* x( z {
) c- O+ J0 v L //TMR0=6;
" \' z; A5 t; e# t. [+ p count++; 8 J+ ?8 |# d& U2 x# A0 J
if(count==100)//16M crystal
K- I2 @# b" F( a9 E' I0 Q {$ [) ?( ?- l) n; `) ^; L7 j
count=0;
9 f8 }: B7 i2 i% O. v' F) O, L sec++;
4 ~/ u% E( u/ B: g& a if(sec==60)
8 ], N% h7 |+ \ {
! p$ B7 k9 C* C I4 A7 b6 { sec=0;( f7 D3 |- i! C0 Y
min++;
2 R( ]1 L1 E4 {9 `$ o d! e) p if(min==60)
$ A) ]" h. R0 K( R, J0 d& {) f: \ {3 ^! l/ X/ ^, o, S5 {) P, ]3 v
min=0;
( ] @3 t3 ?- r0 U( Q- a; f hour++;8 M6 Y( }& _; D- b0 @
if(hour==24)
g/ l7 Q+ r+ T" y' `( G {0 D5 I% ]2 ^2 o2 ]$ T
hour=0;
+ S9 r2 U. m e- j
# M1 Z- x$ q: F& L7 G4 k& s& E! ] } 9 M! P2 k9 c. e3 S0 o8 R; q
}
G3 f( v( B. t% O, u1 H. C }
0 Q, z6 Y' R0 l* ?
* g% F% U) a4 P0 y }, b* H' e0 C5 E; @& Y2 H
//TMR1H=(65536-5000)/256;
4 _3 z( d: C4 a8 X0 j. t7 ~6 j# f // TMR1L=(65536-5000)%256;
. T5 ~ P; p+ P; }; y0 ]5 H TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;- v1 g s# V+ E+ e1 p; @' t
TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;
/ ^( g- n2 E8 X) L+ G TMR1IF=0;: k: D/ H' \; G1 Y: J1 M: o& d" L
}3 { F9 K I, j5 B$ I3 p+ q7 R
} |
|