|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
/ }( _8 }6 b$ q, v! V2 w: {+ g) H//基于pic16f676宝贵的IO,本程序使用2片74HC595
0 q1 p) m1 O0 A8 t7 v//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
A: l# `% s: h//小弟初学,水平有限,大家多多指点,不吝赐教。" y Q3 R2 g5 t8 Q2 Q# Y
//QQ交流:271344691
- ?. ?8 a. V4 B6 f: w* l#include<pic.h>//PIC16F676-SOP14
; h2 W$ M' _9 F) L3 D#define uint unsigned int9 }6 s2 A2 N5 r/ P3 d
#define uchar unsigned char
( i5 }8 U. e+ k- p0 ^6 u#define SH_CP RC0//595端口) ^$ Q% K9 k$ I5 m5 ?0 ~8 u% P
#define DS RC1
I( d( U8 E9 U, A* a#define ST_CP RC2
3 E( c: q- e2 C2 n: a- k% s5 R1 A#define key0 RC3//按键端口
% T7 Y: h9 h! |; g4 q#define key1 RC4
) e0 G9 h6 ^1 ~9 ~0 C( X! F0 N#define key2 RC58 Y- [+ d7 J" J) l3 V* x, q
#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
! k& d7 l, O# @& I( f5 aconst uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码
& g) p/ Z" i$ I) d0 i% Cuchar sec=0;6 v" ~2 G: Y4 k- Q' X& H
uchar min=0,hour=0;
5 i% Z7 s- W( Nuchar count=0; : m! y5 b1 v P; S5 n! u$ O
__CONFIG(0X0002);//外接16MHZ晶振
) I2 M5 C i$ V0 uvoid delayms(uint z) //1ms延时函数- ]- {- e$ R6 n
{
5 I6 G) f# r2 K1 d uint x,y;
3 K/ [" W' v& A0 v2 D" C4 l5 j for(x=z;x>0;x--)
d2 B* h: |! U$ ? j& P for(y=100;y>0;y--);7 {" ?! U b6 Z
}" w8 t) N0 e3 i! B
void delayus(uint z)
/ ~: G8 H' a$ y+ j% o1 Q, n{3 i* a5 d9 [8 R) v
uint x,y;
8 \9 @7 U6 l- {7 {1 ?9 }7 y. a for(x=z;x>0;x--)
, N4 t, o9 c; y for(y=10;y>0;y--);$ E* O0 S% d( F; b
}0 t, n2 {0 Q, g- E* p- o9 _
void serial_input_595(uint dat)
/ ~, l: K @9 b! q9 }4 P( c( R{
* r9 r% C( g9 l! j& U) F for(uchar i=0;i<8;i++)% f; z9 ^- n) N
{; W2 `0 d, r# `' z' r* a
if(dat&0x80) DS=1;else DS=0;
/ G: ^$ r/ d9 J5 W k dat<<=1;
3 `8 o ]8 E! l& J; G, w3 q H SH_CP=0;delayus(3);# U: k: Y t2 q3 {$ _% w
SH_CP=1;delayus(3);" g4 ~, L$ t% [8 ?
SH_CP=0;delayus(3);, V( l6 s, R% d4 c& r
}/ \% p4 S. j, \+ }4 o
} % B; C* v1 c9 e0 ]; ?( D3 s
void parallel_output_595()
# Z. U" C- F9 _! ]' D9 X. Z{
6 h, I9 V3 v- K3 b ST_CP=0;delayus(2);0 v/ i& |) b, K. P7 M( K
ST_CP=1;delayus(2);
# e z3 G4 d9 F2 r0 f( t ST_CP=0;delayus(2);
2 @% e* R# O* {6 x} 1 ^7 J f5 P, ^$ M3 F" w9 f
void distime()//显示时间
8 |9 F, H) x+ Y9 o{- t5 z$ h$ V- f& ]
serial_input_595(0x01);* u1 r& E' e$ ^
serial_input_595(table[hour/10]);) w" ?( U! ]2 Z6 d# t) ^2 v
parallel_output_595();
6 k) E( _7 @; G# x+ o delayms(1);" h3 @7 r+ B2 z5 H% U
serial_input_595(0x02);! y$ P7 _. Q6 o& |
serial_input_595(table[hour%10]);
9 B5 t2 y7 m; r9 l7 W parallel_output_595();3 L9 Z7 ~: Q6 Z$ z4 k6 C! s& q4 u6 B
delayms(1);! D3 l; A k3 B
serial_input_595(0x04);
- z1 {4 i3 t) Q# h serial_input_595(table[10]);
/ F9 n: x+ F0 h5 r/ K) Q- H6 _6 }4 a7 {9 P parallel_output_595();
; N: s5 e- j/ I5 T5 N& E delayms(1);
0 B M3 L0 C8 W! f7 r. U- y2 l serial_input_595(0x08);
( p+ M: a3 S1 }" ^ serial_input_595(table[min/10]);) [8 ]( z6 ]2 H1 ?0 f
parallel_output_595();
$ N9 ]7 F; b' ^$ q delayms(1);3 @3 ]' X& s4 J R) n
serial_input_595(0x10);% Q& e( L9 m/ [) p& V1 ~
serial_input_595(table[min%10]);! h9 h) @: N: S: @. Q+ z# b# F
parallel_output_595(); / N b. S! I) u# Q. T2 X* u
delayms(1); & W% T# l' a7 |* {7 m7 q
serial_input_595(0x20);* M* Q. u* N* t) Y, m
serial_input_595(table[10]);3 \- D0 ?) S6 d$ q7 l
parallel_output_595();
^+ }) Y6 u, I' Y/ p) v& @5 r8 K delayms(1); ) y- ]) K. G% O: G7 B
serial_input_595(0x40);
( p6 J1 G1 D4 G0 ~7 u9 V+ a serial_input_595(table[sec/10]);
5 k8 I, k2 n, n# z: D parallel_output_595();" U8 ~* ]# B: B) [; t. M
delayms(1);
; ]: @) L, b% ?% g9 \! ~# ~ serial_input_595(0x80);' P8 B0 @6 r2 @- w0 T) G0 a
serial_input_595(table[sec%10]);
: q' V- C9 n0 @# h5 F parallel_output_595();- Q1 e" t( l. }; i$ ~2 c
delayms(1);
2 Y A7 f% u F8 ^( m}
2 ?% s. q0 Z; { J& W4 v, qvoid keyscan()//简单按键处理,实现调时。2 d" n2 Z$ O" ^; _. N& K
{
: P( e* E' T; f( X. V7 @ if(key0==0)
% [6 r& l+ w- y+ A8 t {5 {: Y% w' ^" @" Z, x9 ~
delayms(10);# S3 p5 F' w$ D# @7 C, m ?
if(key0==0)
* y: H5 n) x+ k \7 @" K {
. x5 a& v7 M- c2 \/ z sec++;
! T5 Y: v& Z$ i/ k' j if(sec==60)* T; R5 m2 x" z! E$ S# F
sec=0;
! ^% G9 ?6 K2 t n) t0 F distime();
* T8 ~ O$ J/ Z! ?6 m( x5 t3 e1 J6 E
+ ?0 c8 \+ q+ Q' l( e }
" f) q! R4 _. u9 Q8 Y: E- o2 x while(key0==0);
7 a" w" _- Z/ I& Y. ? }
, h% z0 d$ |4 O" x% F
& ^0 K% `( h0 s if(key1==0)
2 t1 S- q5 E. F {
+ }% M0 t/ O1 e# [% r/ y delayms(10);
$ w+ g! P- z8 @# s0 z if(key1==0)
9 V0 w: X% g- f- v {' f' S I# \! u2 }2 d
min++;
2 K, u1 f" P. b p0 R1 w if(min==60)' Z7 o3 u! Z1 r
min=0;3 m& U7 e" t2 ~/ v5 T( _
distime();" |4 m3 o0 P+ g4 u+ V
}/ i: `1 L" ^* _
while(key1==0);
$ y5 Y7 A; \8 I' y2 `( o" i }1 Q2 ^9 t# a! v1 L( w, d H+ I+ H
if(key2==0)
; @7 S. P1 m4 S0 K {
6 @2 @- Z5 B" |: h' F `+ K delayms(10);
" U5 Z% U5 v3 C& h6 z4 `) e if(key2==0) v. g e3 r7 w. c3 h6 @
{" K# E' A W3 [) Y$ M
hour++;
3 W5 X& f7 q6 ~* U if(hour==24)
$ }& M* O8 s0 S9 _( t+ q$ ~ hour=0;0 d( ]" I' p! x" Z$ q
distime();
( X: R* S, _8 i* \ }8 O& _* V: ^7 E- U+ ~
while(key2==0);. @7 ?( T ]6 D" q$ S; B
}
1 I" c7 d+ n% C9 ]% W}
/ n' j+ Q/ a$ q1 J' j" Avoid main()) ]% T! y4 C* s" v# A
{
+ r4 |# o8 R9 S( _' N Q TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写& T ?1 a- X- x
TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读 v. ?" P- X8 |6 N* x$ f) K' T* P
PORTC=0XFF;) q) o d% s) Y! D1 F
ANSEL=0X00;! S9 R" `2 o4 p ]* u
T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms6 F5 l* z' g$ K, [2 _
TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间2 }. y& ?8 }) T; b5 B+ V9 c
TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;
# U5 d. N$ K1 q; p //TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样
0 W4 ]$ P4 v4 t- U% |2 y: { // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。
% \% T! }; Q# |1 V/ J! G TMR1CS=0;6 @5 ?9 ` y5 G2 s2 z
TMR1IF=0;- y K: ]4 c9 c$ g! k
TMR1IE=1;
* J4 G G9 J' Y8 h& R TMR1ON=1;
' Y2 d+ d# [8 D0 k6 g3 v GIE=1;
( ^8 \7 h7 K- d5 D: Z1 J$ e PEIE=1;
2 f: s- t( y; P6 Z* B1 \! r while(1)
: [) ^# S" O- ^4 c/ s {6 l j8 f5 O% T b- c! ~1 s1 n: c
distime();9 L2 l' _ Z& V; K( f# U
keyscan();
1 b$ ^$ p) p9 Q3 } }! l D" {/ [% ?% y+ q7 r: |
}
3 N0 [* T6 ^3 Mvoid interrupt TMR_CONTROLL()9 c3 O7 L8 E# T& q4 m8 }: d. G
{
3 }/ [4 y0 D8 ]if(TMR1IF==1)
& O+ W5 d5 q0 Z4 C) T/ a8 K {3 g: o! L4 H2 U7 m* b; |, Z$ e
//TMR0=6;& H3 {7 I$ ~) {. k3 r {
count++;
! |2 B z% Y# [* y+ K if(count==100)//16M crystal* h9 F: R* V) K J8 v+ i1 j
{
" [: m& H, j# ?, c1 J count=0;
- {3 A ^* P* n# ^) @/ I" {& k sec++;
6 e3 f d' P/ Y! W$ t+ l; ^7 C, ^ if(sec==60). ?+ w3 v/ M$ F! _" X/ I- h& W0 C4 ?6 L
{
8 H' c* p b g1 u4 w! U* }8 T8 v sec=0;
* X9 r4 i' l6 P# j) J min++;
. l, I; _5 @6 L2 Q6 U if(min==60)
) T# h9 i; U+ P$ U k2 j {) V2 |2 Z! S( g9 P) i( K
min=0;1 x4 D W' R7 z) E$ U) Q2 a! r
hour++;
" O* P& _. z! r if(hour==24)$ I* }' H/ \0 r5 L
{3 G6 M) r2 _) h6 \
hour=0;9 ~! E. T6 p: ~* P! s. b
# u& E7 k8 W6 k; u, a5 u
}
; O) @9 t5 P5 @6 b! U }9 W6 [2 @" M/ ^, ?
}
I- N+ \$ E3 ]4 ~' H 3 ]* ?, c9 O1 B* n" w
}
0 ]2 g1 u. {( e //TMR1H=(65536-5000)/256;
5 q2 ?4 G3 h3 w // TMR1L=(65536-5000)%256;) U |9 ?: C0 X
TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;" s7 Z% [% V# v- A
TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;
, y/ e4 k A' S TMR1IF=0;9 i0 g' j5 e. ]; t& m
}
" I: B& d/ U# ]9 D) A' n: x2 u* m} |
|