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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

$ j3 ]9 @  l- E9 d- }//基于pic16f676宝贵的IO,本程序使用2片74HC5957 ~$ u8 B6 A& K$ J) c7 f
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。: R1 ]" E( F. }
//小弟初学,水平有限,大家多多指点,不吝赐教。
& V9 G  X" A0 |$ V# _. S' b//QQ交流:271344691! I7 U$ H% p3 H$ J, t
#include<pic.h>//PIC16F676-SOP14
. J! A' ^! r: Y5 ^6 X- R- K#define uint unsigned int% d2 L  z7 _& [8 Q/ a& Z& j! c
#define uchar unsigned char4 {3 {8 y0 q# N
#define SH_CP RC0//595端口4 R$ k- i5 L) r& f% u: l
#define DS RC1! w  |! k4 E2 X* ~
#define ST_CP RC2
8 @2 I* C: k8 e1 O5 G/ l* O#define key0 RC3//按键端口
1 [8 ]1 C' t- S, C#define key1 RC4* U3 Q& `- x3 k$ _) x
#define key2 RC5) q; V9 y+ `0 t
#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
! {- U( F7 T* _const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码 2 @! H0 K, _. H5 ]
uchar sec=0;
+ X+ m8 v/ K' |uchar min=0,hour=0;1 X% B" n* s6 {8 o" \* }! G0 H& D
uchar count=0;
2 G9 U; Y! L! O* G0 n6 g1 i4 W__CONFIG(0X0002);//外接16MHZ晶振' X& t/ O& _- Y% i
void delayms(uint z)   //1ms延时函数! t2 B9 ?$ o% C( l' e$ |
  {
9 C' q* d' u4 L; f  uint x,y;
- V+ u. n, y" w' h: s  for(x=z;x>0;x--)
& {( ~( _8 M  t5 t" O9 t   for(y=100;y>0;y--);' q8 Y$ q- d3 h5 R1 L
}
/ P- L8 m7 n. c3 D+ R. B5 ]* {' U8 nvoid delayus(uint z)
6 x: z6 Z2 V, |4 k' }! n" \2 z- V  [{
, w! J$ d8 b  A- V  uint x,y;  z9 K3 u5 d3 k+ l: ~
  for(x=z;x>0;x--)! B  Z5 [+ x4 W1 z7 S
    for(y=10;y>0;y--);
% t  \* m# d2 z; l6 {}
; ^" U' U9 X' m8 ~+ Zvoid serial_input_595(uint dat)7 z2 h3 G( |; E6 m) ~9 `
{  T/ }  M8 T% k4 N- s( T; _$ ?
  for(uchar i=0;i<8;i++)
* U. D/ H. o% Q& j" h/ J    {
$ ]; W* _* R" [2 c6 j2 e      if(dat&0x80) DS=1;else DS=0;: x& L+ c; z! V( k, ?% t
      dat<<=1;0 M8 z4 E" h2 ~4 a( J
      SH_CP=0;delayus(3);. P4 C+ y# v5 J( A; k! M
      SH_CP=1;delayus(3);/ i  B# v- \+ y! Z
      SH_CP=0;delayus(3);& R3 m% q; U7 _0 [& p0 \% ^* J2 S
    }
9 A7 e3 E( D  w' G1 a3 ^}
2 w( R+ G5 @' V# f* _6 Q+ I/ ivoid parallel_output_595()' t/ R6 A! W- T; x
{
9 I/ }* ~! f& s0 ?  ST_CP=0;delayus(2);7 Z5 H& i4 L. _1 f0 k( v
  ST_CP=1;delayus(2);
% Q8 A$ H) p/ h4 ]! J/ F  ST_CP=0;delayus(2);3 S7 o! s$ E  }* Q5 ^) p2 e% C/ |
}
2 j. {- }+ M% b6 w1 \) ]void distime()//显示时间
' z  w% @+ \2 i5 [{
3 v- Q9 [5 Q3 O! p) c) P      serial_input_595(0x01);
1 z$ E, m9 l$ b0 W3 W2 Z0 T8 _7 c      serial_input_595(table[hour/10]);
4 M" ^4 H' b  [) ^      parallel_output_595();2 V0 A( Z  K1 X- Y3 a  W- a. O
      delayms(1);
6 u6 [4 c" p' g* Z3 [- H      serial_input_595(0x02);8 P3 X. r9 l: P8 ~7 X
      serial_input_595(table[hour%10]);, ]/ V% W2 u7 d" m2 ?
      parallel_output_595();& \  G! J' s& H! I$ }( [2 {  M4 O
      delayms(1);5 p5 k# r; r  Z( Y6 L" f4 e
      serial_input_595(0x04);
# j* Z' p. Q* U6 }0 \* S$ d1 y8 `      serial_input_595(table[10]);
) N) M; d6 ?" A# c* g      parallel_output_595();
8 u: ]# d& J9 l0 w      delayms(1);& @/ }% q9 V5 M+ k! P# q6 q: X
      serial_input_595(0x08);
$ G- c7 G' [2 Y2 P, {6 h/ n      serial_input_595(table[min/10]);1 k7 h, ^$ S9 t) Y7 X3 L
      parallel_output_595();5 g; ^3 T$ y% f; D
      delayms(1);
9 a+ U* p( j( G; H( Z      serial_input_595(0x10);
+ O+ V- i8 [# u: i! j( s. ]5 U, S" z" ?      serial_input_595(table[min%10]);9 \9 f. m* `' c! V2 F
      parallel_output_595();  
: @; z: u% S- o& |1 s/ U0 G      delayms(1);
% h0 L8 ?) ?1 X  D5 E( ]      serial_input_595(0x20);. U  R6 e! N: Y  G7 l
      serial_input_595(table[10]);
' T/ f3 a+ Z# v/ D# r' I      parallel_output_595();# z# W. W" Q* I0 P* p
      delayms(1);  
3 Q' y7 X  S1 t+ B/ K      serial_input_595(0x40);
( q! z! \$ y+ B5 _9 H      serial_input_595(table[sec/10]);
$ M5 o5 x3 H3 }/ K; _8 q3 }8 S* L      parallel_output_595();4 q0 K4 [% S8 B, q  a( M
      delayms(1);
" b( g! c; @; s' k: d- f      serial_input_595(0x80);
: E6 o* p/ R' `5 O; `6 V) j      serial_input_595(table[sec%10]);
, C; k# l- e$ e8 U+ A      parallel_output_595();
$ A/ Q3 G2 s' [& d      delayms(1);! u2 t1 h! b# b/ J4 f! K* c
}
, z7 F- t; b2 N! @( ^void keyscan()//简单按键处理,实现调时。
# L5 L! P  h+ [2 x4 f7 A{
& w& O* G% a3 n3 r  if(key0==0)9 j. G" ?9 H8 X; p: `  Z7 @
     {
1 ~. k2 U. W( r1 K- W       delayms(10);+ H. c* [$ Q% G1 {
         if(key0==0); [) V6 b& L9 u: f, w% q/ I1 M% U2 [
            {7 U* f% t. m5 ?) C+ K" T
              sec++;6 O. A# d4 u7 s
              if(sec==60)
# H5 M: v/ \1 }) T$ ~6 y9 S9 y                 sec=0;
( ]# f, v0 K2 r0 ~6 k              distime();+ S( Q) T2 A0 y2 g  p  P

% b* ?5 p. l! Z: I            }
# A1 d8 @9 J. o0 P1 U       while(key0==0);3 D0 w- B% n. c8 X/ z' D! x
     }
& t4 F; y; @1 n) W. h# d   
$ Z: ?2 P* k* Q" P% H& j- T  if(key1==0)8 p: h$ {3 a1 T9 z! h2 \7 Q& B! V
     {, j% G+ X4 m2 J/ x* Z: M9 C: u
       delayms(10);4 A/ `6 Y  J% x3 N* X5 s6 |  D
        if(key1==0)% a! }# l: i4 L9 B4 a- [- l
            {
: S. ^7 }2 Q2 Z* N6 H              min++;
# c  G9 x6 Z- U4 V: ], Q0 X7 l& C              if(min==60)) v. R: O# ^& O& _
                 min=0;
) ?' T7 B  i, h/ z" D2 e/ a              distime();
4 N- L' F8 `, |5 g7 S9 L            }
7 {4 h: k1 f) a& \1 i7 O        while(key1==0);
' U- N3 E# r7 U: D8 @; l     }
$ r, N0 K8 l! f: W  k  G   if(key2==0)
. K* z+ P6 P' J% e+ X       {
8 T8 ?" i! \( r( y& u. }" `1 T' }          delayms(10);* {3 X) T4 @7 A6 r6 c! g# P9 K
           if(key2==0)! J( D/ f& b+ \9 H- p+ G
              {' P& B4 U3 X$ \8 `8 x% r
                hour++;: ~; M& [9 w$ i; j1 V
                if(hour==24); ~3 E6 ~1 p( ^' {& L/ p4 n) q
                    hour=0;
5 i" f' c4 |1 H  z  V                distime();( T, U% V, _+ q1 W0 L6 C- F7 i
              }$ F* H% `, ]* x% d7 i4 s
          while(key2==0);) K% G) C  n- L
       }
/ I3 t+ _( V. b5 I& Z1 G& L}( g+ i. Y' j% o
void main()( Q$ y2 y2 A+ \2 u0 b% u
{$ a( S0 a6 T" q
  TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写
. h5 ^/ F4 N; s0 {( ^  TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读
) z/ _" h6 e8 P/ n$ ^  PORTC=0XFF;
$ \3 d2 w1 Q4 |2 E5 y( W' x  ANSEL=0X00;0 L4 p8 I* d# D
  T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms
; e0 P+ [, z+ E4 i; _/ X3 k$ r' u  TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间
7 L4 I2 z0 t2 |; |+ S2 G  TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;
' v# G5 d9 }$ N! g. J) z3 a' ~) o1 s! ?  //TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样
' l% P: S5 [# S1 X1 P  // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。. y4 T" o/ f( A& {2 @
  TMR1CS=0;; g! U0 U+ X' s% g$ h: |5 G
  TMR1IF=0;
: ]! M1 c# }, |  TMR1IE=1;: U0 t- Z, J/ e1 k5 b# ]& j
  TMR1ON=1;$ O) E+ E9 V( q5 t6 s6 g
  GIE=1; 9 R' k9 [: g& ^
  PEIE=1;( R; T* \$ Y( N. U7 o0 L
  while(1)- w6 l' z2 b. n
     {
, k' H% h. A+ a" w) }2 H       distime();
; U9 x) |( n! D8 k5 O, B       keyscan();
! t) ^( {: c( Z. {6 i3 a3 {% W      }- k5 k- R+ e, a% E% \# k
}$ Z+ e2 ]2 Z4 r
void interrupt TMR_CONTROLL()
+ R$ c* E- w' _1 n+ ^- Z4 b{3 `$ f6 H) }: E$ |2 `) A5 c
if(TMR1IF==1)
; h# t3 s5 T6 `7 Y7 A3 ^  {
( ]- ^1 e. T7 W' ^$ G2 O    //TMR0=6;
- n. ^5 E- M$ ^, f0 t    count++; " M6 U; b9 d  L4 o+ D: ~
    if(count==100)//16M crystal
, n$ E. T: X  w& v; y. k# F8 I2 k      {& F& P  O" J5 n, g; h5 e
         count=0;
* _  u: ~4 H" d9 B* l$ V! ]* z         sec++;      1 R, j6 _+ Y$ q" W
         if(sec==60)0 X* J3 Q5 M8 d% A) b! a
             {: B0 ]% i7 `: f3 w" Q% n5 a
               sec=0;0 T& X2 x3 n3 M
               min++;# L( T  J* K8 }: d
               if(min==60)
& \4 e/ o; [# b" z% l5 M  H                   {
3 a$ v# U! \- u. ^) m9 @0 i) U                     min=0;
, f; v+ l$ }; C) R5 o7 w                     hour++;
9 K3 u8 u/ y+ u" D                     if(hour==24)
# }, O% q0 w7 j3 n: \                        {1 @9 f% \/ y2 F
                           hour=0;
+ F9 @4 ^* `8 l) ?$ T+ t8 T               ! I2 h: K0 M+ a" f9 l3 g
                        }
# t9 ^, G7 j# a' k- S0 C) W* M6 Z9 Q% q                   }
* {: z& F9 p3 I4 R4 J  @             }# M# B5 C  `" o* \$ ~
      " N' i7 `8 f  R6 }1 q2 O+ I. I! m
      }
( V9 ~4 |+ C& k- ^* }        //TMR1H=(65536-5000)/256;
0 ?1 H- g9 u& S6 {) j       // TMR1L=(65536-5000)%256;2 Q# O" O- k; ~! ]
         TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;
9 r8 A+ D+ n+ I4 _$ n; E- h         TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;" ^6 Q  g& Y% x- f" x' R
         TMR1IF=0;
) Z% W2 s( X! }& V8 f7 ?$ b$ |0 ^  }8 r; n7 ?! f8 O# z
}  

676_595_TIME.rar

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

该用户从未签到

2#
发表于 2016-7-4 14:24 | 只看该作者
支持楼主!加油' w" E0 @* |& o' H! w* [

该用户从未签到

3#
发表于 2016-7-5 10:37 | 只看该作者
支持楼主!加油' r8 I( y. V4 j! Y9 f2 ^# F  \

该用户从未签到

4#
发表于 2016-7-27 17:38 | 只看该作者
支持一下,很不错哦!6 K9 V( c7 R) L* K3 ^& g. ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 10:02 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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