找回密码
 注册
查看: 347|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include<reg52.h>
4 S4 L' L' G" q6 k2 T3 S#include<intrins.h>! ^1 E9 Y$ C& h* U' ^

+ Q" S. Z: @! w/ f" t#define uchar unsigned char4 [; S* e" [7 [" y
#define uint unsigned int
6 f3 C! {* c6 R7 ~; A+ ^//74HC164
5 _% s+ J$ T( K0 jsbit CLK=P1^0;        // μíμ&ccedil;&AElig;&frac12;μ&frac12;&cedil;&szlig;μ&ccedil;&AElig;&frac12;±&szlig;&Ntilde;&Oslash;′¥·¢4 k3 f" q: T( V8 b. a1 s
sbit MOSI=P1^1;         //         êy&frac34;Yê&auml;è&euml;6 V+ x3 M* v/ w  M" h5 ]6 `
- @: x0 o) }& g) V  o3 Y9 n
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,' ?+ T0 A7 d/ h1 X6 H
                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //12ò&otilde;êy&Acirc;&euml;1ü5 g* ]6 I0 T: j9 v* b5 Z; {
unsigned char DS_data[6];
  n5 ]! V( c/ u* y1 G/*****************************************************$ c3 j6 o$ _2 |3 [
oˉêy1|&Auml;ü:êy&Acirc;&euml;1üé¨&Atilde;è&Ntilde;óê±×óoˉêy
0 {: O! U' c* S( }2 |! }oˉêy1|&Auml;ü:&Ntilde;óê±1ms
( ?% e* {5 @0 g; H; W* n" b3 z0 y
% u3 }. Y( t# S" i& ]6 s***************************************************/
1 ]6 u* n' V" T% L5 K( cvoid delay1ms()1 G" i, D- n/ y4 J  v6 P
{) K  m  M, W- E# P
   unsigned char i,j;        , Q% k/ N* }+ k' T8 }) W% y
         for(i=0;i<10;i++)) S/ l' S! B& V+ c. @+ [% x0 L# Y
          for(j=0;j<33;j++)) L1 d" U4 a8 |: t
           ;                 / _) E; B+ d" |5 f. e( d7 i
}
$ K1 B" Q; w6 W" I. ~5 }5 ivoid separateData(unsigned long dat)         // dat&Icirc;a6&Icirc;&raquo;êy
: T9 y5 C  U( f, z+ D3 ~{' ]. f2 x. l* L8 e6 o" C4 t
   DS_data[0]=dat%10;
5 n& N# V2 V) Q) ^+ ~$ v+ U0 k   DS_data[1]=dat/10%10;. Y& ^+ f! O" U$ j% C) d$ X( N, Z: B
   DS_data[2]=dat/100%10;8 Y6 ^. A: i1 L* p! b8 J
   DS_data[3]=dat/1000%10;3 O3 U7 G6 P2 J0 R2 z
   DS_data[4]=dat/10000%10;
! ]. L' x+ r) X( Z) h  f   DS_data[5]=dat/100000%10;7 e" I: A! N2 z0 j
}
! `7 j6 _! _) s4 wvoid write_164(unsigned char dat)
  M! z1 d4 j% v{
) u% h- m: r1 f( C% P   unsigned char i;
( o% L$ I$ T: {8 j' {! @. s9 U   for(i=0;i<8;i++)
8 p3 o9 c% h3 @% e7 L   {) S1 T/ j1 r4 F! [, T/ K
     CLK=0;            
# ]) _& t2 F" B2 K) `% S6 x     if(dat&0x80)  MOSI=1;- M7 f" z3 a. {
     else          MOSI=0;3 y% ^# |7 ?: ~7 Q& k0 \; d" @1 u
     CLK=1;               ) Z! C, q, R( Z
     dat<<=1; ; i5 N7 O! ^+ [* [  U/ C
  }  R0 J9 o. I' @! M3 J) ^
}
& T7 D, c4 W2 ]1 G  s9 A* J
) v  N- v- a6 c$ Nvoid display()
. s; N% y2 R0 ^5 K! H6 d2 V9 m{
& T6 Y3 s$ i2 ~( a7 Z   unsigned char i;
2 M( i" k; W8 A% {5 G   for(i=0;i<6;i++)5 p$ w0 {. o6 Q. H2 N- v. {
   {1 z. Q6 m- T/ u8 u$ j0 r# Q
                        write_164(Tab[DS_data]);
% K7 m, f6 ?& s, i6 z                        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$ g# F8 {1 M' }2 z% m/ c' _4 `- e
                        delay1ms(); 5 G" z$ B/ |+ N& y
                        P2=0xff;        //êy&Acirc;&euml;1ü&Atilde;e
) i3 x5 n9 X+ h7 R% g6 w   }
! X" m& y% m" k5 U( h
) ~) [* u; x4 i0 E1 d}
3 a* s. A; y6 B& a- m$ Q% p( O: S0 d& ^" N5 M; K; a3 R! g8 Y/ R
main()
8 r8 _& F( @1 U) B$ W{3 k8 |$ ?; N2 _, Z: D
   separateData(654321);
0 T* M7 O6 ]1 d' ]   while(1) 5 Q) c- m# L4 Z4 ]( Q8 Z/ j* V
   {
$ O; A2 f+ R' b3 B7 c+ g     display();- {. J) X6 T. f1 c
   }
' _$ P3 _( ]9 A" d1 b}% U4 e& v7 m( G) J# i' `6 I# l
' Q/ f# }' x, H/ g  U+ h
#include<reg52.h>/ }/ }# ?% o& o! X3 ^+ f4 H
#include<intrins.h>
8 k$ z) W1 z7 {; t; E
) O  z. k! {9 A: _6 Z: f+ S#define uchar unsigned char
, ~" E) q- L+ y) A* u" Q" W- s4 q#define uint unsigned int9 p, |% n) W+ N) w* I4 K+ Y3 S
//74HC164
  A% R: x# A, s8 I' Rsbit CLK=P1^0;        // 低电平到高电平边沿触发
4 R. C9 g) w& z; B0 T# Z/ Ysbit MOSI=P1^1;         //         数据输入
5 U; R! t$ c& X) r
- `  k2 j/ \8 d8 w7 @unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
1 n1 S. q# S5 y/ S# F# y                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //共阴数码管
8 t; s) i3 f) i' k1 j' |unsigned char DS_data[6];
3 ?0 k) ?, H: O. O& j/*****************************************************
2 B$ h& M3 i' B/ ~2 r# Q函数功能:数码管扫描延时子函数3 O9 }# V+ ?! @
函数功能:延时1ms
; |  J7 G& B5 K' T) ^; w% g6 G8 M  B7 z
***************************************************/% G8 O. K( p+ ~  `' {* [2 w! s4 E
void delay1ms()) x: d% j$ K9 r% ^2 y1 q! s) }# i, G
{/ R9 _" K2 g" p( p6 I# o( G6 R+ N
   unsigned char i,j;        $ K# f9 ?+ q) N; N
         for(i=0;i<10;i++)
8 b9 |" m% d5 z5 |% `+ M9 `) y2 u          for(j=0;j<33;j++)
. ]3 }: y) ?: U$ R9 d7 ~! `( z9 r           ;                 # K/ o. Q, X) \" m% w" h+ n7 ^4 e
}- }2 P# a* x; Y. P! M* n" b+ E
void separateData(unsigned long dat)         // dat为6位数
" c3 K, Y% E4 _6 M% B* [{9 K" \/ q2 z6 O
   DS_data[0]=dat%10;
' T) `0 G2 ]& u5 u' ^. |   DS_data[1]=dat/10%10;
3 Q: z: F. V9 K" q' _0 u3 C) d' [3 e   DS_data[2]=dat/100%10;- q- v' ^; |! y1 o& y
   DS_data[3]=dat/1000%10;' y! S. J! [$ \, D: _- X1 [  k
   DS_data[4]=dat/10000%10;6 a6 ]4 {+ D4 \
   DS_data[5]=dat/100000%10;
) R1 z( _- I; g. W8 Y8 ?  C}* V( A% t8 a; p, X$ ^1 p" e4 A
void write_164(unsigned char dat)
! ~6 c0 }# x/ r0 m8 k, x) m{9 g" G/ P( X# |, V$ E: ]) K: c$ O; s
   unsigned char i;* Z+ X, {% b% Q: x7 n5 l
   for(i=0;i<8;i++)
0 G" A- G  i% h- J, @0 H& g& l   {
. U8 s+ ~4 u, q5 T1 P& i. }. D+ b! u! F     CLK=0;             8 U; U+ C* v4 \" o7 \$ D: B
     if(dat&0x80)  MOSI=1;- h9 I$ D) r# s
     else          MOSI=0;- ^/ z) P* G# W
     CLK=1;               
0 j$ n: T" M1 w" h0 h+ u9 X1 r. c: Q6 G     dat<<=1; ) g. x( C9 w& T5 l
  }
* t# \+ P2 }/ q+ s" r}  A7 w  z5 t1 N* ?
# B2 X5 |. f3 t) n3 Y
void display()9 }1 m1 E6 _$ j( D# l$ W
{
: ~* ]6 c" d; V# h/ T+ U   unsigned char i;; k; W; ?; l2 U4 i% P+ x
   for(i=0;i<6;i++)
& H: p( m: _" b; u7 g, O   {5 x1 P; }- x- F4 Z$ L4 \5 L
                        write_164(Tab[DS_data]);0 n! J# c9 t+ L: i6 h1 |/ c* _
                        P2=0x3f&(~(0x01<<i));     //数码管位 共阴低电平选中seg1对应P2.5 seg6对应P2.0
) n8 `$ Z$ h: ?# t  }/ i                        delay1ms();
& t3 T8 s3 l2 }4 ~- S                        P2=0xff;        //数码管灭
$ c) I1 N3 [. M1 M   }
8 M+ O. ]6 }- K+ H3 H4 V2 _& ~: x6 v# _% w
}+ T. K% a( C+ A" R

& M) U- \+ z( o, Dmain()5 k9 Q2 X  T1 X8 s! ~  @2 d
{7 l( g* V% U: {! S* V
   separateData(654321);
* P7 E0 ?1 `; }3 i# q# O" y/ d   while(1) ; M" p; R3 h) _2 I* l/ p$ a
   {
4 L. E: Z* G7 e. ^  Y, p     display();
& h  s7 J5 _% L9 d( t  \   }
( V. m7 u+ ?0 b  W; ^- {}' j( [. a4 M; s& h) Y5 v) D

# r+ Q3 w' p5 N! n' T; x

拓展并行口电路仿真.zip

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

该用户从未签到

2#
发表于 2022-11-16 13:16 | 只看该作者
位选控制亮不亮,而段选控制显示数字,利用了人体肉眼观察的能力。
7 e* |9 a+ `5 K5 T$ h1 d' V3 H给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-3 02:19 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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