找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

262

主题

1157

帖子

2065

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
% m1 C9 S% e4 ~" ?" t
//基于pic16f676宝贵的IO,本程序使用2片74HC5951 ^" t) A& `1 ~
//驱动8位数码管的小时钟。可做成实物,特附PROTEUS仿真图。5 z; h! E8 K6 _' Q3 Q8 A* @
//小弟初学,水平有限,大家多多指点,不吝赐教。
: \2 p- J, s4 t8 e: R+ G8 e//QQ交流:271344691
, R" A+ n2 y+ R% f#include<pic.h>//PIC16F676-SOP14
6 M/ ~& Q4 y: v  r3 c#define uint unsigned int
/ e. `" E! x7 L: {. F#define uchar unsigned char
- |; N+ i. R1 a4 E; r7 _#define SH_CP RC0//595端口
* ]/ `$ Z2 r' z6 ]6 s. [/ X#define DS RC1+ h0 H) B' E' K- }  Z4 M
#define ST_CP RC20 z$ r, M8 y& f8 q, x" _- m
#define key0 RC3//按键端口
+ b1 \% b: `$ p+ o! p8 z#define key1 RC44 }* j' W1 |8 `7 H( @$ W& X
#define key2 RC5
# m1 @" Y8 W* Q& |1 F4 s#define _XTAL_FREQ 16000000UL//16MHZ时钟,指令周期0.25微秒# P' P# r- s( k! c( G; ^, ^
const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0-9共阳数码管代码 - C$ b7 {. I7 y6 e& \
uchar sec=0;
( H. L% k7 X, ~7 @8 j$ Puchar min=0,hour=0;+ E! l+ H, m; E, N7 z
uchar count=0; 6 b  t) y5 K/ m" r% a
__CONFIG(0X0002);//外接16MHZ晶振
8 T5 s# W5 L' f. q2 y5 f) u) g, k/ Qvoid delayms(uint z)   //1ms延时函数. E1 c& P; s! u0 ?
  {
9 d/ s, }3 y3 |& n7 |$ X* g  uint x,y;! F* z7 w9 I; n4 ^
  for(x=z;x>0;x--)8 P! H! H- E+ k5 B2 C8 l' J
   for(y=100;y>0;y--);* y4 l8 O2 ]9 ]3 J0 e( Y# o
}
. E# o2 u+ {) k! h* g4 D3 R* _void delayus(uint z)
  j! Y9 @# A1 W/ k; s* H' D  W/ f{5 X# {! J9 T5 ~: W( v, s, u
  uint x,y;8 P9 l2 g! i$ \  N2 A9 Z9 N6 B- X
  for(x=z;x>0;x--)
7 ?; q* J+ x' |7 C    for(y=10;y>0;y--);# w% Y! {6 o$ i" M8 O3 R
}
4 P# c! `) E! u0 M  Evoid serial_input_595(uint dat)( u0 D8 P1 B& H. c: F
{
7 `9 r; z6 M- L8 u1 J; |' Z4 ]  for(uchar i=0;i<8;i++)2 [  [0 v; u1 v4 u0 t' P  d" q
    {  ~$ J% l3 F; ?4 {' R
      if(dat&0x80) DS=1;else DS=0;
. p3 q  o4 {" e0 A$ B% L      dat<<=1;! E2 Q# c/ D- x# h& W
      SH_CP=0;delayus(3);
. P3 r; v, A  ?) J      SH_CP=1;delayus(3);; m; q: K  D+ j
      SH_CP=0;delayus(3);3 Z/ d1 @" m6 S# F
    }
0 G, l, r3 q3 b9 X} $ [; s/ V# P5 D$ ]9 {
void parallel_output_595()4 w* s5 {( J. n
{* z3 p, d- d9 c2 g8 s" C
  ST_CP=0;delayus(2);
$ m1 p: a7 ?/ k# E4 j8 N6 W  ST_CP=1;delayus(2);
* k) P% L* X! f; _' J0 B  ST_CP=0;delayus(2);
: Z3 p  p- w4 G3 _2 c- \}
* P# u! x4 i& b. `8 avoid distime()//显示时间
# c1 j. s5 [4 w+ i' k{& ^, }% f( m2 f9 S4 o" W$ x/ h. y
      serial_input_595(0x01);! P! q6 i3 F; P
      serial_input_595(table[hour/10]);+ ~9 Z" z; [3 v
      parallel_output_595();
( U; m* J- X) E  p4 O0 z* h! N; f4 R      delayms(1);, ]! l9 p$ \& S; c; j, m
      serial_input_595(0x02);4 [5 A8 D# e; N7 Z! M3 x* S
      serial_input_595(table[hour%10]);. z& x7 ?* r: ^, E7 |: F
      parallel_output_595();# Y  ]( A) R6 ?( X9 ?( L7 M$ R
      delayms(1);4 i7 D( k3 j* J% d* S
      serial_input_595(0x04);/ C- o: B; b0 n, R( b
      serial_input_595(table[10]);
4 h5 R& X1 t, g2 j( V3 V; ~2 y      parallel_output_595();
0 q  l+ O  ~# Q4 I      delayms(1);
% V$ p4 A& P5 O3 y      serial_input_595(0x08);9 x& ?/ k3 |3 A4 x
      serial_input_595(table[min/10]);+ _% i! M8 I4 g5 ^0 I/ C  g) K6 _+ Q) s
      parallel_output_595();
% z" t; n* j/ U  q. ?6 E3 ]1 h6 S      delayms(1);
- L3 U1 n) O" R5 m      serial_input_595(0x10);5 @9 `# q8 t) r, @6 V
      serial_input_595(table[min%10]);
" S7 y2 a/ \( W1 h1 Q* m      parallel_output_595();  - z, Q# H- ~8 v+ u$ o+ L7 |: k. M. M
      delayms(1);
8 v) U6 E1 ]4 Z      serial_input_595(0x20);* _: w7 K- u* E6 @7 H/ t: I7 @
      serial_input_595(table[10]);
; r! d/ O& o$ |# ]8 K* m9 }      parallel_output_595();
! n* L9 W2 U2 N8 ]+ i      delayms(1);  
3 f) n5 W, r% l6 y      serial_input_595(0x40);
- q* X$ ]' |) m      serial_input_595(table[sec/10]);
& q4 q, I% m& i4 ~8 O8 \8 Z& g      parallel_output_595();
$ t( q$ s  N0 s8 V( {      delayms(1);' w6 ~, V/ l, V$ k# q' P, q
      serial_input_595(0x80);' Q6 r; b( y: C- Y0 t0 E, @
      serial_input_595(table[sec%10]);
! P* S1 w6 S2 Z      parallel_output_595();
, i3 ^4 I+ G5 s3 T- i4 w      delayms(1);
5 @  [3 w; ?, \0 l  g9 A" P}
6 w" k; H- v( i, R0 ?6 lvoid keyscan()//简单按键处理,实现调时。
6 m: F6 T& D  W5 ]! ^{
6 x0 C5 i, p2 r6 }  if(key0==0)" s9 M; j) Y* d; K# [! L( {
     {
" ^- {, a2 R/ x' J0 f: z       delayms(10);2 Z9 C' X9 I1 j9 A3 G5 Z
         if(key0==0)
: i/ r$ x1 S8 X            {* s3 F& q" ?; v3 J3 e" t
              sec++;2 c; a4 F# Z- E/ t; X
              if(sec==60)
6 k) s( d/ l' `- c, v                 sec=0;
& k! m4 _2 y! E) K' @7 w" `6 K              distime();# h+ |( h7 M& i! O0 g2 j: I

; x% W! \; D5 s9 \4 K0 j1 F) d            }) ]2 k8 m: U, u: X& R
       while(key0==0);
$ u; _; C7 ]8 U! V     }
; ]( X2 s8 a. T: B) O$ Z   
/ D+ J! b9 m3 P0 u  if(key1==0)( O) q* R& d1 d  r4 F
     {
- u0 F5 [; Z7 l  b- A- {       delayms(10);
+ r/ P/ i5 }6 Z$ d% f- S& m& r        if(key1==0)
& ?) W  w/ [, o            {
$ N3 ?* R5 I- C7 ^0 h              min++;
5 C% C# ?! ~$ P* B3 t7 Q              if(min==60)& R  x9 M. `  W( q* {
                 min=0;; J' \' J/ G6 p0 Y, J
              distime();
7 p" D% o; u, @5 o* d9 k            }4 U' P; _) O- T! t) w  E5 x
        while(key1==0);
2 N0 M7 }4 ^& m     }
; q) o3 s! S; m. ^4 {# S! [$ p   if(key2==0)
2 z3 v# v1 q5 ?: m0 w, s' y       {
+ {8 r  D! |+ U$ U          delayms(10);  l- P. G3 o. h: A0 }
           if(key2==0)  c; a3 Z6 l+ I+ x# B
              {
, o4 ]# O  O% \* }+ B) d: x2 \                hour++;
$ }/ j0 N* @& ~                if(hour==24)5 F" Q  G2 \6 G4 b  ?& l
                    hour=0;  F4 e" r  T( M
                distime();: o4 I7 W3 y/ v- o% s
              }
/ T% g8 L% D$ |* J' g* m          while(key2==0);- x6 T. V9 X' u1 \6 E
       }
8 O5 o$ o( J' _7 S+ ]& D}0 }' d  |4 H1 \$ K
void main()( P! X7 s; d8 L" l. j
{
! G! _' V: d( h% R( v/ [  TRISC0=TRISC1=TRISC2=0X00;//595端口设置成写
' X$ y& g. I6 n* }6 B; @- O  N& {3 z  TRISC3=TRISC4=TRISC5=0XFF;//按键端口设置为读1 I0 u% \- h' S" H% M; \0 I. J1 L
  PORTC=0XFF;, t1 o4 }+ I. ^* g9 d
  ANSEL=0X00;
  i0 c( i2 {$ J  G8 e" s  d: W) ~  T1CKPS1=T1CKPS0=1;//16位定时器1设置为8分频,//总计时为65536*8*0.25=131ms+ A9 b: S; E  g. F8 x9 }' J
  TMR1H=(uint)(65536-_XTAL_FREQ/4*8*0.01)>>8;//定时10ms,注意不能超过总计时时间
' ~  R# Q# {) t- {0 ^  TMR1L=(uint)(65536-_XTAL_FREQ/4*8*0.01)&0XFF;  D9 Y; U$ E7 L( v
  //TMR1H=(65536-5000)/256;也可采用这种方法装初值,跟51单片机一样/ f6 d1 M) u! C0 `7 e
  // TMR1L=(65536-5000)%256;5000*8*0.25=10ms,效果一样。
0 S) ?& A  o# c7 I  TMR1CS=0;! z) `6 j( U- }% ~. ^- R% {& O
  TMR1IF=0;3 C; Q6 B5 K3 O' }
  TMR1IE=1;
7 w, K$ C1 Y2 [) t) w+ W7 R  TMR1ON=1;
) P$ g# y3 ^1 X0 p1 r) h( w  GIE=1;
+ i; ^# h3 ]5 k- G9 Q% Q6 h& l  PEIE=1;4 f2 A6 N# K# h
  while(1)
' ?8 z( u) [( P+ F& x. _' I' }     {
/ O! q$ W" d8 `4 d) s+ y5 s; m       distime();- s2 P( o7 z+ c. }
       keyscan();
4 j( p7 Z% r& j; M& Q7 D- o. U      }+ [8 ^1 `2 N( a  ]/ V
}- K% l% c& O* ?8 K  ]- E
void interrupt TMR_CONTROLL()
2 Q9 D& {) O6 |  X; V{( F; V2 v, l7 |8 p0 o; s
if(TMR1IF==1)
6 a  e2 s! b& n% @9 Y7 d  {% {% m& d, C! q7 I4 H: j$ P- n4 J
    //TMR0=6;
; e; P, Z+ t5 o2 M    count++; 6 K5 Q6 M/ w- K9 A! N# b- [$ o
    if(count==100)//16M crystal3 l5 q, H% [* x3 ~
      {' Q: Q$ }% `" ]( K: m
         count=0;
8 G: W% r$ r' z' [8 i+ X+ \         sec++;      % {, W# |" v- a
         if(sec==60)
) |) A7 }% ~1 Z3 J  H             {6 U$ v: b& [* u  s; `% X, C, A
               sec=0;  z' j! z+ a: s) l. ~! s
               min++;5 w0 X+ @- m$ Q3 N1 H5 _' M3 t! k0 x9 p
               if(min==60)
" @, o9 j& A1 ]0 S                   {. L0 W: p0 ^/ x1 y- U1 X- p$ s
                     min=0;( D) C) P: S) h6 j! S
                     hour++;% h) U' M; O, x% W
                     if(hour==24)
2 L% x  x2 y  U$ U0 Y8 |* ^* W. a                        {
, y; u" y2 s2 U. _8 Y9 T  [                           hour=0;
, p. J5 `0 U; U5 e. P* D               ; o7 ?5 C6 T# b. n
                        } ' x) u; l5 f8 Q: }
                   }2 c! ?0 V* D. I) w" c
             }( t. L8 n  N0 ^# q
      6 _- R9 }. t6 c4 H9 O) x/ N+ K
      }
' m$ i2 G0 g4 e& W1 N: f1 H  T        //TMR1H=(65536-5000)/256;
+ D$ ], x9 I/ m' y3 G$ L       // TMR1L=(65536-5000)%256;; u. |' f. |2 p9 A
         TMR1H=(uint)(65536-_XTAL_FREQ/4/8*0.01)>>8;
  S" `/ `/ v  S  Z6 `8 c* X% v. k         TMR1L=(uint)(65536-_XTAL_FREQ/4/8*0.01)&0XFF;( F5 n8 o' a1 \3 h. l
         TMR1IF=0;
" T: B& B; d. v8 }  }
' Y% h' j7 A. V! S) D}  

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 | 只看该作者
支持楼主!加油
7 A3 d1 o6 q, t3 N/ S, P+ J. g; L  l3 z

163

主题

615

帖子

1265

积分

四级会员(40)

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

积分
1265
3#
发表于 2016-7-5 10:37 | 只看该作者
支持楼主!加油: p% u9 @1 Y) C$ E- Q

157

主题

559

帖子

1198

积分

四级会员(40)

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

积分
1198
4#
发表于 2016-7-27 17:38 | 只看该作者
支持一下,很不错哦!1 U3 D: Y, E  t* d' C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:27 , Processed in 0.060262 second(s), 34 queries , Gzip On.

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

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

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