|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
; B/ f# d0 O2 x! h( Y2 F
//基于pic16f676宝贵的IO,本程序使用2片74HC5954 w$ X" X* f u: v. l/ U2 L) {0 N
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
* @$ A9 M7 {0 A; x" T//小弟初学,水平有限,大家多多指点,不吝赐教。
9 S# {& X; {: ^; I//QQ交流:271344691: i5 a7 n5 [) { g( B. l# O6 o
#include<pic.h>//PIC16F676-SOP14
: v# y" t) B6 ^( B P#define uint unsigned int
* i% Q, B4 Z) t5 j( Q1 e2 E4 |1 [#define uchar unsigned char8 ^; T6 V, `0 B9 `9 J: C
#define SH_CP RC0//595端口
! O+ f# U0 _) p8 f% v& f0 Z#define DS RC1
. {5 X8 W; p- B, L# v#define ST_CP RC2
9 E) c/ m4 e3 g#define key0 RC3//按键端口: D+ z4 x4 B' R7 z/ V$ ]4 C+ i' t
#define key1 RC40 e% `. ?$ ~$ s7 j
#define key2 RC5
! }: d0 z1 E3 N* T#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒9 E, Q* |% t, E/ ~* w" J( Z0 H
const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码 * h% f: o& H, O, B1 \ s' r9 k
uchar sec=0;6 X* e' w0 j5 z8 k* H( W3 M- {! Y) w
uchar min=0,hour=0;7 S l2 V) D6 m" V7 V6 f
uchar count=0; : Q; m, t0 o0 c, c1 M! Q. w
__CONFIG(0X0002);//外接16MHZ晶振
2 k4 D) w( }/ `% j9 C. ivoid delayms(uint z) //1ms延时函数
- D' O+ {2 c2 g7 u7 R( b9 ?8 } {1 E, d2 R5 Q* f4 P
uint x,y;
6 w" p4 O, {3 s8 e/ n# r for(x=z;x>0;x--)1 P# q6 i: v& R: \4 J4 p! U% d7 V
for(y=100;y>0;y--);6 i' c6 `) B. ?6 k
}0 p/ E6 N; h; F. `/ q/ E2 T
void delayus(uint z)" K% _5 ?. A. v% S$ l! ]0 o
{# X% e& a9 \, o2 q |* J) t, n
uint x,y;
+ z$ O$ X1 n+ T, z5 F: F8 S for(x=z;x>0;x--)* W( W7 W0 P8 R0 S# v
for(y=10;y>0;y--);8 ^) @" M3 h2 p j: \% t$ p
}
. l7 F7 j4 I$ v! yvoid serial_input_595(uint dat)4 @: c9 Z8 W' D1 L. n& s( p1 g) ^% a9 N
{4 l# e" s' F7 x [) w! J
for(uchar i=0;i<8;i++)4 F" [+ l1 N" u$ L+ ^* O$ a- {
{% g) Z" s$ s' o) m
if(dat&0x80) DS=1;else DS=0;
8 m9 U2 X& |& K& J4 l/ H dat<<=1;6 X' I- X1 Y; k. ~" g" K6 {% c
SH_CP=0;delayus(3);
5 B& e1 a2 I5 O3 y ?2 s SH_CP=1;delayus(3);6 e: f* t7 o/ \
SH_CP=0;delayus(3);
: F. g# R: M, r [9 U4 N }9 x2 H# f/ l4 Z8 y& p8 ?
} ( m4 ?' ?( C: P$ u g( U; ^
void parallel_output_595()/ I- v: i. P' `" P
{
9 X" \, d0 {2 s& y ST_CP=0;delayus(2);
* N6 X# A# }1 @, o9 S6 U% Q ST_CP=1;delayus(2);
' r% P* ?# X8 q5 Q. `4 s ST_CP=0;delayus(2);0 T4 b( @, P: x
} 1 z/ v7 r1 I+ f+ B9 P
void distime()//显示时间7 `1 m. ], l" I# b# i0 q1 r
{. Q8 N$ C6 L6 Q/ K/ ?$ ]7 |& u. ]
serial_input_595(0x01);
$ \& K: L* \8 m; u+ \$ M. ~ serial_input_595(table[hour/10]);8 m; p5 l3 f# r6 {
parallel_output_595();: _7 m! e$ _" k! z6 a% g5 [
delayms(1);
& Q: e9 L+ a/ p% Y) I1 J( I$ ^$ v2 G serial_input_595(0x02);
4 f% _# B# {5 L0 `7 v serial_input_595(table[hour%10]);( h, O. k5 w8 o$ }0 C, k
parallel_output_595();1 E' A+ j# n! D5 A, L
delayms(1);4 n [7 b) v+ ~" V( b; ~; B
serial_input_595(0x04);
; L, I* \$ Y; P) z J! c8 b+ h serial_input_595(table[10]);
8 [. p. d" W# M1 j parallel_output_595();
& D7 M/ L3 Q& N2 }1 | delayms(1); N3 i* j) F% A( l9 [
serial_input_595(0x08);
+ L/ M7 B" J1 b( V# J serial_input_595(table[min/10]);
- h8 w. a ]# f+ `7 ]# k parallel_output_595();6 S/ C# I8 \! O5 a4 H e9 c" _/ `
delayms(1);0 l8 t: D6 p; a, g9 ~
serial_input_595(0x10);9 x6 r; p" L7 F! i# ^" L3 ~
serial_input_595(table[min%10]);
. v, @0 @3 ~: Y) M s3 V) T- O( u parallel_output_595(); # K3 h f9 z: F, H8 _& a; _
delayms(1);
" L6 ]1 u% [) W- b# O( t serial_input_595(0x20);2 s: e j' V' y" `( [$ _5 U
serial_input_595(table[10]);" s) w3 e2 ]0 p) d" z3 `4 \
parallel_output_595();
& g2 l9 d/ v9 U! a& n5 _# p delayms(1);
N Q% N0 N9 ^1 O. u' j serial_input_595(0x40);
4 U* G5 V/ a) H8 w serial_input_595(table[sec/10]);7 ?5 K7 c- M7 |9 v5 x2 }/ k# E4 A' C
parallel_output_595();
; w$ X. m' r( a2 k6 T) c: X delayms(1);% ]- {) t4 ?5 x
serial_input_595(0x80);$ d6 H9 p$ i [ u
serial_input_595(table[sec%10]);" _ V! j( @/ D8 p
parallel_output_595();
' Y' T) l! q) ~( R) q- | delayms(1);. z5 h" q F7 I' s# F
}1 K: H1 Q$ i8 P# F
void keyscan()//简单按键处理,实现调时。
6 K2 h5 k* w: F) v{/ {$ J* N' |. ^, B$ y
if(key0==0)
5 p/ o6 c$ G+ @4 |( j* \0 L {. X$ P' T: U* k B1 [- m7 E
delayms(10);/ W ]' ~% f' X2 C$ U: {; I K
if(key0==0)
! b$ J. _/ ]) t4 L1 G/ V A* t { f* v( e0 |9 V7 W6 ?7 _; `
sec++;; V* ~3 @: P$ b! \' Z
if(sec==60)
; j. v; b1 ^7 C" o' D7 O sec=0;; P( a) Q; K# F+ d% q% F7 Y# ^3 E1 B
distime();
, _; S* [; l9 j) t0 L: e& _8 ]* J) I! q- O1 K6 g
}
) k. @# |6 E# ~, r# i' p0 ^2 H while(key0==0);
+ o, F! P( ?' }. r* x }
8 Q& `3 h- U$ n" N. G
$ s- t$ H2 I3 B6 W6 p& | if(key1==0)
0 {/ e" O3 Z9 s, X' m4 o( t {
o p; u( V+ G+ k delayms(10);, E3 x" n: a8 O# W8 Q
if(key1==0)! f2 F. E; F0 g. B: Z+ O. d
{
4 z, f0 }0 k1 Y$ ]" Z$ H4 l4 x5 ^. ^ min++;# W3 [$ Q- L* q9 l6 F& [" |0 @5 O
if(min==60)$ S6 c3 I; \0 v) \5 ?! {
min=0;9 y- b! @6 z4 h% l6 H( b( E/ V
distime(); ]$ R, a- J$ C/ W; |
}
. e, {/ X; E+ @; u1 h/ D8 e$ O) \; Y while(key1==0); @6 f0 F0 w% V$ O& K2 N4 R
}
R Q8 K9 a1 T4 Q( S if(key2==0)( |2 n {$ E1 [$ _; W
{' c9 o3 D/ [( H' X& W; t( J% D
delayms(10);$ K; a& t; \/ ]5 s
if(key2==0)
0 H3 S5 g% j! ]" E( s$ P {) T) R" N" ^7 ?2 p e
hour++;
5 \" {& j4 U: d% V1 o6 k if(hour==24)% E( F4 l4 C$ y1 Q3 ?
hour=0;( B" k4 P$ @7 C
distime();) R4 A+ |8 s! M
}
9 K1 c# z9 A" V" ^" E8 b3 G7 f5 m while(key2==0);2 c+ i& N' K# `' D) e3 @2 D
}
: p, [! J0 } V9 j& Q8 Y}
) V$ G! v/ t4 R, I- ~6 Yvoid main()
3 M$ O& z' X/ L! b{ q* p# M% y, Q% r3 i
TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写. b1 M8 u' j. O8 I8 E- m O
TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读* @/ i; l. z/ O( O n
PORTC=0XFF;
+ `9 l1 S' T- Y9 z2 r3 s ANSEL=0X00;
7 T9 w; Y0 b- }. K/ H T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms$ S# v( Y6 Z1 q" \7 t( K, p4 d e3 L
TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间3 r$ h$ F( N- @
TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;% J, Y6 g" M7 S1 ~6 u8 V' ^
//TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样) Y9 U* P% c% m T% l2 N6 I1 C
// TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。1 }1 N* k. K. p% A& a' ?
TMR1CS=0;1 ?: s0 O& }; y9 ^5 U% e
TMR1IF=0;
( I0 g/ M( i5 n# G: z TMR1IE=1;
$ b1 i) u$ A4 S& Q. t TMR1ON=1;3 O' Y7 _) L' M
GIE=1;
# w8 r) H. Y% G; @ PEIE=1;
7 F- G8 i( R" A1 w while(1)
. e$ r+ s2 y: b { {4 V$ \" B+ i: ]7 V0 `6 \# Y* u
distime();/ K, T3 L) g: j! D7 V# S
keyscan(); h+ c$ y1 V; z
}
' q6 N+ D$ @8 u# y1 ?9 n3 g}) b" L1 b8 V6 c" N& _" ~
void interrupt TMR_CONTROLL(), ]1 t3 h8 }/ n0 \% u) `# o4 ?+ n
{
% _6 b0 o4 w% M. O0 Vif(TMR1IF==1)! M3 P! ^- E' ~, z6 b
{: E' W- M+ G6 B9 Z$ O2 }! g' w
//TMR0=6;
9 M$ U! R* d3 ~# T/ C ]; s count++;
" f$ c0 C7 ^' m, O( t9 x! E$ K if(count==100)//16M crystal9 a1 p: y+ {0 \3 x8 q
{, p3 @: r# N, x
count=0;" w# k" ]' h( P$ X4 F' \5 Q
sec++;
/ c5 R& T- |. T h: X! ?6 { if(sec==60)
8 o4 M6 l9 F1 G% M {, y$ l/ ~- `; Q! i1 Q( Y
sec=0;8 t7 V9 A( B- ^' j
min++;
! J9 {8 F. b" M0 }0 Z8 O0 b if(min==60); ^, |9 V5 t- d2 e* x% v; d0 _1 ~) Z( z
{6 `' ], j4 L) Z% q: J- ~# U k# P' v
min=0;! m0 b1 v1 X% P3 m6 @& N( P
hour++;& S2 K* c0 D! x/ {
if(hour==24)/ ^* g- o" p" W# t g2 |) h, t
{
9 @' ^7 D( S: q, n e# \7 F hour=0;
7 {7 w1 ]) }# b. Z ' q. O7 Q7 F3 ~- m2 P
}
! Z) R) i% ` O+ v }
# P1 X( z$ Q" D, p4 [ }$ d3 {& ?9 `6 T- @+ c+ }. |
$ t. N) |* K, { j0 d/ J
}
# l0 \1 I" i4 B3 g R$ G+ } //TMR1H=(65536-5000)/256;
9 T. \9 l5 i# d" N6 Z4 c8 k // TMR1L=(65536-5000)%256;) t3 Z& Z4 l* Y" ~3 l: b
TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;9 G# X, j" z" a0 q! ]5 y& M
TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;5 F" _0 y$ ]7 O
TMR1IF=0;
. _4 Q4 {2 `! O) O% p1 \4 j8 ^ }
; ]# y; f( ?2 d} |
|