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

51单片机的74HC164驱动六位数码管动态显示程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-11-16 10:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
#include<reg52.h>
$ R! p& g* o/ T, ^& t#include<intrins.h>
" o8 i! p; a) I# C5 C6 @; v
% M# ]# O7 G# b. @" U+ n#define uchar unsigned char
4 A" O$ k$ u/ O0 G#define uint unsigned int
9 O0 X1 G. u5 Q' ^& U//74HC164: ^( k: \+ M5 M$ V& W
sbit CLK=P1^0;        // μíμ&ccedil;&AElig;&frac12;μ&frac12;&cedil;&szlig;μ&ccedil;&AElig;&frac12;±&szlig;&Ntilde;&Oslash;′¥·¢
  f/ J! M! I9 w# g2 e' B8 Asbit MOSI=P1^1;         //         êy&frac34;Yê&auml;è&euml;
4 r7 Z' Y$ c  ~) L( A
1 }, P( c# s, u$ uunsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,: H  k# M) J4 T- U& I
                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //12ò&otilde;êy&Acirc;&euml;1ü0 T2 e6 x9 t2 a7 L6 i
unsigned char DS_data[6];0 t% e$ R% N; o& Y
/*****************************************************( T( e' a) Z2 \* K( B
oˉêy1|&Auml;ü:êy&Acirc;&euml;1üé¨&Atilde;è&Ntilde;óê±×óoˉêy
1 h9 K% Q2 c2 G1 l' i) ~& O1 e! J! j8 Ooˉêy1|&Auml;ü:&Ntilde;óê±1ms1 R3 G' ]% {( a8 T, q" b7 [

6 Y7 J, o9 }$ n% U9 I  C$ Q***************************************************/1 ~# v3 l6 }. c& o- K
void delay1ms()
$ a4 e& V( b5 c$ w{% }3 g5 x' u) Z( c
   unsigned char i,j;        
, N( x* \' ~( P! A         for(i=0;i<10;i++)
- c( i: i# G; B( e          for(j=0;j<33;j++)
5 z/ J: a8 R0 p, m9 n& m& G           ;                 ; m5 T# w. y: R( x8 I  e
}) f! j% L1 E: P& h  W2 D; q( O
void separateData(unsigned long dat)         // dat&Icirc;a6&Icirc;&raquo;êy
3 D2 A0 c1 A- @0 E  A: a! L; V{
% h+ f; S% x* ]9 h# ^4 A   DS_data[0]=dat%10;
3 E: e5 M( u; O* @   DS_data[1]=dat/10%10;% p- o' D8 [% @1 q
   DS_data[2]=dat/100%10;/ k5 Q3 K8 d$ C0 ~7 u) H1 g; }( x! M
   DS_data[3]=dat/1000%10;
* P4 Z5 e0 p) `+ f# v   DS_data[4]=dat/10000%10;
3 r3 ^  `- C) A, f   DS_data[5]=dat/100000%10;5 k, g, D. t: n
}
, x& @) v$ }! d* hvoid write_164(unsigned char dat)
4 Y2 R9 M0 _5 H, s; m1 q{+ F* v9 k; a6 Q) f+ p
   unsigned char i;
& o8 q# o; G  ^6 k, p8 K% T   for(i=0;i<8;i++)# C# c' @8 B9 v4 i4 Z6 v
   {' C# e1 \6 L1 {. I7 O" c
     CLK=0;            
  i2 A# G2 o3 K9 v) v7 }     if(dat&0x80)  MOSI=1;
4 A- U% i: W( z1 y; X     else          MOSI=0;# E# F8 v4 F. p
     CLK=1;               - r4 b$ X. a1 v' Z+ f: ?7 f
     dat<<=1;
/ Q7 ^/ w0 o6 ^& s  }- G6 p+ r  _0 U
}
2 x7 m5 X6 V- H9 }- |
) v+ x2 }2 ?$ S. L/ R4 V7 `void display()# o! v7 Z$ T9 t
{7 _4 f( v2 z( b$ T  b
   unsigned char i;
. k: p! x$ W5 x8 k8 ]   for(i=0;i<6;i++)
, a- Y, s$ U% H# ~. O' d0 l, c   {: V& F( m. e/ [) h
                        write_164(Tab[DS_data]);+ c+ a( c- \- ]* U- ]+ J" w
                        P2=0x3f&(~(0x01<<i));     //êy&Acirc;&euml;1ü&Icirc;&raquo; 12ò&otilde;μíμ&ccedil;&AElig;&frac12;&Ntilde;&iexcl;&Ouml;Dseg1&para;&Ocirc;ó|P2.5 seg6&para;&Ocirc;ó|P2.0
; y  Q3 U8 c) q/ ?                        delay1ms();
, |/ q; ]) }2 l0 B0 A: g0 C- O7 T6 W                        P2=0xff;        //êy&Acirc;&euml;1ü&Atilde;e1 O( ], Q8 [$ w% i' F
   }6 ~9 F% b  v0 K0 z: f

% v* y6 Q5 c' \$ A9 k' ]! d}
& L6 ~* Z$ h5 Y  @  [
+ j) X" s  U/ kmain()! E9 R1 ]/ d% b# k6 W6 Z* h
{% G( g: F4 C+ ^$ _( ~
   separateData(654321);
. H& A% F' K+ E   while(1) * I% |0 y, p4 b/ A- X' w' x% e: a
   {8 {0 _4 t& I8 I3 P( f4 x3 m
     display();
3 B+ i- z  r9 H5 |" X7 z1 n  {8 ]5 q   }
  F$ X3 O" S; |/ B1 k" f# c; D1 \}! T- \# _9 n. J. O

9 @0 F) A, O2 h4 Y1 v( ^) F#include<reg52.h>
$ J( g# f$ l0 E. N8 Z6 Y* B#include<intrins.h>
# k: f/ g4 w6 K1 v6 T
- G& l3 w. w$ p( M#define uchar unsigned char
) z6 k6 L- g0 w* ^9 W3 c9 A* o$ p#define uint unsigned int. T8 q7 M0 Y- t5 x& s- H, K0 |
//74HC164
5 `. Z8 L0 E% |+ e6 j4 I3 _sbit CLK=P1^0;        // 低电平到高电平边沿触发
# t5 D9 p9 W- h3 q; W: T, u. hsbit MOSI=P1^1;         //         数据输入: E$ c! Y! Y5 f2 H

" B/ t% x3 k, S, H5 T9 R$ nunsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,6 A( R& r* d* O8 y$ M1 M( z
                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //共阴数码管2 e1 [: {$ H. ]5 e
unsigned char DS_data[6];, O; e2 o& H2 l8 I" Y
/*****************************************************
, g2 {8 j% q! L# K: |1 M0 w$ ?* g函数功能:数码管扫描延时子函数
9 g$ k# W% u0 N' W7 z% Y7 j函数功能:延时1ms0 ~0 X3 b' S/ _9 l7 t0 y( E
+ p. D5 y* i, ^. c
***************************************************// R6 h' Q  R0 x* o4 v8 H
void delay1ms()+ t  k/ Y4 ?  `7 S! D3 W
{+ K( q* M% k3 Z* i; r: a* d
   unsigned char i,j;        + h; t8 v, n! d
         for(i=0;i<10;i++)
; k, j2 ^$ C! ?1 @* {+ R% R          for(j=0;j<33;j++)+ B0 K# O( b. t; V3 k, O' }
           ;                 7 \* O' c6 ^" R8 F7 D. T
}+ @; S: X) E$ W# d+ \
void separateData(unsigned long dat)         // dat为6位数
9 M1 d. [- w/ b{$ G2 l' v$ Z; _' w
   DS_data[0]=dat%10;
% G% H1 A) Y0 x) k, K1 F+ e   DS_data[1]=dat/10%10;) t' v3 v' n8 e0 [" h$ r
   DS_data[2]=dat/100%10;4 m9 z) V% d: ^: |; f
   DS_data[3]=dat/1000%10;
, Z( U+ f, g0 Y% @1 e   DS_data[4]=dat/10000%10;
5 c3 U5 h; V4 g   DS_data[5]=dat/100000%10;  K: n, `9 A* K. \7 {, f
}
; F8 D4 D: a: R; gvoid write_164(unsigned char dat), O- ~: V! ^  V$ N3 I$ {
{
& G. k" N0 f8 A% x; _   unsigned char i;# e+ }# p8 M8 X0 [" I6 b
   for(i=0;i<8;i++)5 h' u2 ?& e8 l. p. W9 b
   {) v1 r* M% P1 A2 R( k) d+ K: K
     CLK=0;            
7 f9 q( ^/ G# |$ w3 z     if(dat&0x80)  MOSI=1;# J0 j; ]( L3 n& i! ?4 Y' Y; X* c
     else          MOSI=0;) H; n1 z% L' s5 H6 S. p. r( Y
     CLK=1;               
/ \& D, t- \( M  c     dat<<=1; 0 D; m8 r. a, {- K8 n! p0 {5 M
  }( x# {( Z5 K9 D' ^4 B
}
2 f5 `8 _, G7 J1 W7 R( b9 D# V# f$ D9 i& x# e, j$ K. m
void display()) D# {  O/ H, C, f
{8 A" z4 {/ N( g. c+ P; z( y. P
   unsigned char i;
( z+ X. W: N" z8 o' _   for(i=0;i<6;i++)8 @. L- e- F$ I) E9 o: \9 r8 D1 z
   {
- N& h+ U1 f& `) B2 h                        write_164(Tab[DS_data]);: ?, s8 {0 C% k/ D5 J2 C  P/ f3 a: p
                        P2=0x3f&(~(0x01<<i));     //数码管位 共阴低电平选中seg1对应P2.5 seg6对应P2.0
) F% `6 h: l8 o5 y2 R                        delay1ms();
* r: t! K+ q% {" S$ {" K) d" G                        P2=0xff;        //数码管灭0 h+ ^6 Y1 [4 C" x1 p. r0 T
   }& Z" _! D" K5 |" R' l

8 Y1 S  m5 ~' z# d}
, d7 L* i. h* Y  F1 H5 T: c9 ~2 y4 o6 N" ^$ D3 i2 q! n0 C
main()
3 u6 t0 T$ a# r, v{
% n- i$ h' E( ?' E   separateData(654321);" A- G5 l+ o- S3 ~+ @9 U- ]
   while(1)
+ M6 u9 i: m* h2 i   {9 \) P! G: b) F) ~) m' F* f$ w
     display();' J* k$ p) [, e
   }
( @/ {3 S* n, f- ?. H* a5 C}" x4 C- U8 m% [# D8 {- m# s- z. d

& e# p: K2 W, g. C' P4 M7 b9 Q

拓展并行口电路仿真.zip

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

该用户从未签到

2#
发表于 2022-11-16 13:16 | 只看该作者
位选控制亮不亮,而段选控制显示数字,利用了人体肉眼观察的能力。# M( _6 `2 n; T, ~# y* C& w6 x
给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。

该用户从未签到

3#
发表于 2022-11-16 13:29 | 只看该作者
高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。
0 U' {( K/ R3 b0 \  n) s是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。

该用户从未签到

4#
发表于 2022-11-16 13:45 | 只看该作者
动态显示:动态显示占用CPU时间长,只要不执行显示程序,就立刻停止显示。动态显示使用硬件少,占用 I/O较少。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-2 23:16 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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