找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 82|回复: 3
打印 上一主题 下一主题

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

[复制链接]

262

主题

1157

帖子

2065

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
1 s; @1 L8 X6 U* _
//基于pic16f676宝贵的IO,本程序使用2片74HC5957 z1 B8 y3 D+ v8 }% T* e
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。
& q6 a2 ?2 `9 i4 C5 \% U5 B//小弟初学,水平有限,大家多多指点,不吝赐教。. [6 q' y1 j) E2 K4 v7 [' \
//QQ交流:2713446914 B0 z$ t+ X2 n. u9 o2 L% d7 m. E& p
#include<pic.h>//PIC16F676-SOP14
$ |3 R1 F- Q8 r3 Z- y1 i% m8 V#define uint unsigned int
7 U6 I; F) m0 j- a4 {# X#define uchar unsigned char
$ M/ I: T. {- H; b) i#define SH_CP RC0//595端口# M+ N. f+ N6 j- V# l$ Y0 P! e, _
#define DS RC12 E/ i$ B* R9 q, l" n: o( y
#define ST_CP RC2# x& Q+ \3 x- b
#define key0 RC3//按键端口
" G( G9 F* ^' s+ {3 e+ i#define key1 RC4
% z: j' j/ e7 a# C& N' ?/ `#define key2 RC5
% v4 u. S4 h$ }#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒
1 j/ R- m& s; h: C4 \& Tconst uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码
+ n' P. y# f2 U! y( ruchar sec=0;$ e; @- {6 [: I, K3 h
uchar min=0,hour=0;
# e+ s! E) l6 t  s/ U5 T" yuchar count=0; 4 _( b( @  K. Q+ ]( h, @
__CONFIG(0X0002);//外接16MHZ晶振
' [) x- @6 s5 H; u( yvoid delayms(uint z)   //1ms延时函数
3 g  V; W9 e0 o& t+ y! v, ]" L  {4 I/ s7 ~- x) a# r; v8 Q3 N
  uint x,y;0 k8 D  @; ~  s* [% ~' v: M) ^
  for(x=z;x>0;x--)
9 ~; n  o4 P( @   for(y=100;y>0;y--);! z0 D8 W, b8 u, H$ |
}5 B8 s8 I1 q: u5 h# |. J/ }! ~; v: j
void delayus(uint z)
) l5 G0 r+ w3 Z# S. K7 `9 J{
& p4 v3 ~2 Y9 u, u! {  uint x,y;9 O0 h  i) u4 h1 i
  for(x=z;x>0;x--)
& K6 n9 u$ n1 ]    for(y=10;y>0;y--);7 G3 _% L4 b* x0 {  d8 |" s
}
' e5 E3 _9 {  j8 A; dvoid serial_input_595(uint dat): C6 y4 z  Z) ^2 F
{* s) U. p1 d: X! B. G" M
  for(uchar i=0;i<8;i++)
, ~3 r5 O. A# L2 \' g    {0 d2 A$ G3 a+ r: I
      if(dat&0x80) DS=1;else DS=0;
0 j8 z% \) b8 C      dat<<=1;$ e, u* f* ]% Q  X) ?1 {
      SH_CP=0;delayus(3);: _/ K# E- e. a! i
      SH_CP=1;delayus(3);4 p, s& P! I: \3 U
      SH_CP=0;delayus(3);/ D0 p4 b* i  B% S
    }
* \! h; u, f% }- K4 d; J' |2 k7 L} 9 b! p$ R% z" W' ]* Q7 W
void parallel_output_595()
' S9 ]/ R- G$ t; X9 p/ I2 C{0 c# }* B! O$ `. Y! b$ l6 G& ^
  ST_CP=0;delayus(2);( i% S# F6 |/ z* _' i
  ST_CP=1;delayus(2);
; @  v( o, ~$ Z, R1 f' A  ST_CP=0;delayus(2);" M) u1 \* j2 f
} $ z5 ^. S$ h" ~+ N" T
void distime()//显示时间* {; X- z2 U. E
{
! J% j* _1 x1 ?  x: o0 n" j0 n      serial_input_595(0x01);/ @5 Q# u* N" U; S, U/ N6 p
      serial_input_595(table[hour/10]);) I4 |: P( x; A: D* E
      parallel_output_595();
# c. u0 v3 w) N6 H& k      delayms(1);7 V2 A3 x6 m' F% |, z6 Q- V6 {) W4 X
      serial_input_595(0x02);
. p5 i) @. O( F5 `: b  \6 [      serial_input_595(table[hour%10]);7 [0 o" {0 c8 S4 T
      parallel_output_595();
8 q- q& U6 C3 L: L  f+ L      delayms(1);" ]5 Y3 R( z3 ]# J6 ~. y, z
      serial_input_595(0x04);
' B1 l; C" U& H* G3 s      serial_input_595(table[10]);
8 ^2 S3 x7 l/ e6 [. V      parallel_output_595();
* d" U2 ]$ M, H- [; Y$ U- Q2 q2 e      delayms(1);; G" d+ m' z1 q8 A6 D$ e
      serial_input_595(0x08);; S% f- r5 y( B. ^& o! p. s% [
      serial_input_595(table[min/10]);
% s/ E) y& \8 O; E3 B7 o; d: O      parallel_output_595();
* r. b" W8 J; P      delayms(1);
) V, @* A% v- I! ^      serial_input_595(0x10);
9 ~4 e1 p# y) J  |4 o8 r      serial_input_595(table[min%10]);# x- W6 J7 n  D9 m) i; V% f
      parallel_output_595();  
% i% y: l7 N; ~  V      delayms(1);
) G* E# i+ e: s% i; l8 @0 w      serial_input_595(0x20);8 p! _- q! F6 Q! q' w# ]- Z! H# |
      serial_input_595(table[10]);, ~5 h# l2 o+ f& v* m
      parallel_output_595();* T& u8 j/ b, b) i: n6 O
      delayms(1);  
% `& F" m8 m! b      serial_input_595(0x40);
0 \# K$ \: ^4 i% |2 ^; u      serial_input_595(table[sec/10]);- C: |" ~! t  ?( X" Q0 L/ `) i
      parallel_output_595();
, H$ d' a$ L" `* ^& v9 a' Y3 ~      delayms(1);& [1 T7 M; K8 P- N, k7 H6 s
      serial_input_595(0x80);
& c% O" V$ m& P  w9 c      serial_input_595(table[sec%10]);
) q0 E& O1 c: f- G. {9 d4 U      parallel_output_595();) b* k5 `( q9 ]
      delayms(1);! q9 F0 l$ Y% l6 w
}! j( c* l& E0 ?6 A& c/ J7 u' C
void keyscan()//简单按键处理,实现调时。
6 z4 X! D8 s  J$ K9 V1 A8 g- k/ V{
! k4 W, v1 k0 U  t5 N  if(key0==0)
" h' c- D# z; S: z& p     {8 S' H. c" O8 K0 [0 G
       delayms(10);* t* |* Z: u! K( D- {5 j
         if(key0==0)
5 @  m( ]0 m* t            {3 d+ T9 K! F* [( h( e- Y
              sec++;
8 ~2 g& @' ~+ ?$ P0 F              if(sec==60)7 M: \: l+ F( R# L; ~: _6 x; M6 G
                 sec=0;2 @5 c0 O" V7 L( v5 `( u  [
              distime();! f+ v/ l% n+ Q8 H& O2 G, g

$ Y5 E8 O+ Y, |$ X" l8 x            }
3 N6 H4 A+ O: N7 W  Z% I       while(key0==0);
; T1 p% W0 L/ V/ i     }
1 f" U" j; `0 c2 S7 P+ Y0 s/ g; e   9 p5 k' t+ e6 L; r8 k/ k# N7 H3 W0 ~
  if(key1==0)
! Q& {' C2 r1 ^3 [" d% ~     {
( P- l/ f" q/ y( y2 Z1 D       delayms(10);
. ~. b" o5 R6 I( L+ x! ]& P4 d        if(key1==0)( K1 B$ O3 G+ D
            {
7 ]0 X- K# h1 \' n              min++;$ l) s( P+ b) p  R
              if(min==60)
( z# @6 w  ^- N/ ~) J( B                 min=0;1 S# r  V5 ]1 @# {, _) ^
              distime();
1 m% L2 u. ^8 }; x5 U' w            }' s1 y! |1 F! e4 A" Y
        while(key1==0);0 ?' S1 s+ r" ^; @& ]$ s- U
     }
& K% l0 Z2 h, t; ?5 D8 }9 V, |7 t   if(key2==0)9 f; e% \, T, Z; |' t5 @; O- Q! R
       {
7 S- o! m* w  q# D          delayms(10);& u# e) S$ G7 U, q; i
           if(key2==0)  e" w+ }! M. @  \% j
              {+ f0 ~  d, {) D0 Z
                hour++;2 o' h. ?8 O) Q0 C. g
                if(hour==24)2 r7 g' \( F8 `' E. s+ O+ s& N
                    hour=0;
; W- B6 q" @3 @% z: h* Y2 d                distime();
. G$ i. \1 i* w3 G+ k1 a              }
$ ]1 w$ Y5 ?4 a- A          while(key2==0);
0 D+ y! [( B5 S) }! u       }
* m3 c* a$ d' Q/ W$ ^. }+ H. O9 f}
! W- i" q& }5 G# H, V- zvoid main()  c0 j/ E: H; J+ Y8 ^1 s
{7 a: @) v+ T4 T1 a1 W% o& ?" U
  TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写$ z  U) i# @: e8 I: D2 l5 e' y1 _
  TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读
' Y8 A4 C, n$ y7 e1 H  PORTC=0XFF;
# u6 P7 p+ d( m3 A0 ?9 O% B4 S$ n& L  ANSEL=0X00;/ N2 o2 ]7 s  G% Y" C/ h
  T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms
( K& z+ {' _2 @$ W  B& t  TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间/ o4 U* l7 Q: D& z) ]6 `' c
  TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;/ b+ h0 @% T: o* u
  //TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样
9 @( B1 ]) y$ Y3 y$ \! N  // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。+ q9 w8 I& H/ |$ I
  TMR1CS=0;! y% t6 j$ m( F$ @+ }3 i) f* j# `! U
  TMR1IF=0;
6 X& w) D+ u  ]1 Q* @: Z  TMR1IE=1;
' b1 n6 n! ^: z* X2 {" ~7 A1 j  TMR1ON=1;
) b+ m4 Y5 Y; d" s4 `$ S  GIE=1;
9 L5 ^4 ?) l! k7 S; W+ j& @  PEIE=1;3 K- m* X8 l, p: B+ Y5 ?6 l
  while(1)
' D4 w! m" ^$ b, Y7 n' a' _6 j7 x     {, z( j. t9 |8 [$ ]$ ~) ~! \2 q) v" y
       distime();- h: F* m3 b' j# D$ K5 S
       keyscan();; K, Y$ P7 _6 g. g$ J9 h$ K7 T) I
      }/ d, A* r. E/ J/ t0 O7 N/ a
}
# k) E8 o/ ~# {( Cvoid interrupt TMR_CONTROLL()8 q- p* L% ~9 }! K
{
* ~4 f& o: @1 G2 Q9 b- Bif(TMR1IF==1)
% j2 w4 K9 [' Y5 h6 B6 J7 i* x( z  {
) c- O+ J0 v  L    //TMR0=6;
" \' z; A5 t; e# t. [+ p    count++; 8 J+ ?8 |# d& U2 x# A0 J
    if(count==100)//16M crystal
  K- I2 @# b" F( a9 E' I0 Q      {$ [) ?( ?- l) n; `) ^; L7 j
         count=0;
9 f8 }: B7 i2 i% O. v' F) O, L         sec++;      
4 ~/ u% E( u/ B: g& a         if(sec==60)
8 ], N% h7 |+ \             {
! p$ B7 k9 C* C  I4 A7 b6 {               sec=0;( f7 D3 |- i! C0 Y
               min++;
2 R( ]1 L1 E4 {9 `$ o  d! e) p               if(min==60)
$ A) ]" h. R0 K( R, J0 d& {) f: \                   {3 ^! l/ X/ ^, o, S5 {) P, ]3 v
                     min=0;
( ]  @3 t3 ?- r0 U( Q- a; f                     hour++;8 M6 Y( }& _; D- b0 @
                     if(hour==24)
  g/ l7 Q+ r+ T" y' `( G                        {0 D5 I% ]2 ^2 o2 ]$ T
                           hour=0;
+ S9 r2 U. m  e- j               
# M1 Z- x$ q: F& L7 G4 k& s& E! ]                        } 9 M! P2 k9 c. e3 S0 o8 R; q
                   }
  G3 f( v( B. t% O, u1 H. C             }
0 Q, z6 Y' R0 l* ?      
* g% F% U) a4 P0 y      }, b* H' e0 C5 E; @& Y2 H
        //TMR1H=(65536-5000)/256;
4 _3 z( d: C4 a8 X0 j. t7 ~6 j# f       // TMR1L=(65536-5000)%256;
. T5 ~  P; p+ P; }; y0 ]5 H         TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;- v1 g  s# V+ E+ e1 p; @' t
         TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;
/ ^( g- n2 E8 X) L+ G         TMR1IF=0;: k: D/ H' \; G1 Y: J1 M: o& d" L
  }3 {  F9 K  I, j5 B$ I3 p+ q7 R
}  

676_595_TIME.rar

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

155

主题

662

帖子

1191

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1191
2#
发表于 2016-7-4 14:24 | 只看该作者
支持楼主!加油
/ T: ?( N% w6 q! R0 l7 E. Z

163

主题

615

帖子

1265

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1265
3#
发表于 2016-7-5 10:37 | 只看该作者
支持楼主!加油
6 F* Y! [0 w/ j

157

主题

559

帖子

1198

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1198
4#
发表于 2016-7-27 17:38 | 只看该作者
支持一下,很不错哦!7 x+ u# k2 d+ x6 k6 F: @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-19 06:26 , Processed in 0.068459 second(s), 35 queries , Gzip On.

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

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

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