找回密码
 注册
关于网站域名变更的通知
查看: 451|回复: 3
打印 上一主题 下一主题

PIC16F676使用74HC5951驱动8位数码管时钟

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-7-2 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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}  

676_595_TIME.rar

15.71 KB, 下载次数: 3, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2016-7-4 14:24 | 只看该作者
支持楼主!加油- `+ ^: l- E) ~6 R% g+ p! j2 m

该用户从未签到

3#
发表于 2016-7-5 10:37 | 只看该作者
支持楼主!加油+ O. V+ q$ J' P. r

该用户从未签到

4#
发表于 2016-7-27 17:38 | 只看该作者
支持一下,很不错哦!
% ]* g( j( ^; i. w' n
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-12 17:43 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表