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

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

[复制链接]

该用户从未签到

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

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}  

676_595_TIME.rar

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

该用户从未签到

2#
发表于 2016-7-4 14:24 | 只看该作者
支持楼主!加油3 Z. h+ H  ?) R1 i8 O6 x7 B+ ]) [

该用户从未签到

3#
发表于 2016-7-5 10:37 | 只看该作者
支持楼主!加油
% o+ ?- v8 N2 K6 z3 q8 a9 D

该用户从未签到

4#
发表于 2016-7-27 17:38 | 只看该作者
支持一下,很不错哦!
5 i) K. d7 c* w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 21:45 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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