HC164应用实例:驱动数码管两例

HC164应用实例:驱动数码管两例
HC164应用实例:驱动数码管两例

4HC164应用实例:驱动数码管两例(电路图和源程序)

文章编号:文章分

类:

电路>电子元件

点击:...关键词:74HC164

文章来

源:

百合电子工作室收集整理

摘要:74HC164应用实例:驱动数码管的两个实例分别提供了汇编源程序和C源程序...

实例1

74HC164是串行输入,并行输出接口器件,可用在单向的并行输出/并行地址锁存等. 74HC164因为价格便宜,容易使用特别适合使用在在需要用到数码管显示IO口又比较紧张的电子产品中,下面浅谈使用方法:

1. 首先先了解他的引脚功能和逻辑图,如下图:

图1 引脚名称和用途

图2 真值表

通过真值表我们可以了解到,A,B两个输入端是互锁的,CLK上升沿时数据移入移位寄存器中,CLEAR为清零用的,接低电平时所有端口都输出低电平,了解了真值表之后开始运用了,先给出如下原理图:

图3 原理图

图中,采用义隆的EM78P153作为控制芯片,P50作为CLK时钟信号,注意平时数据不传输时,时钟信号是不发送的应一直保持低电平或者高电平,数据需要传输的时候才输出时钟信号^_^ ,继续P51作为移位数据输出端,接到74HC164的B端,A端接高电平,当然也可以AB端短路,然后连接到DATA移位数据端,P52作为数码管的选通信号(也可以叫消隐^_^), 作用是使数据传输过程暂时关闭显示,以免显示出不需要的数据,原因是应为164不带锁存功能,数据传输过程是一位一位的向高位移位输出的,所以要等数据全部移入后才打开始点亮数码管.

注意了哦,通过查看164的规格书发现,164输出高电平电流比输出低电平电流要小,亦称灌电流大,扇出电流弱,所以适合选用共阳数码管,如图,本人偷懒没有画出那个数码管的8字

该介绍的介绍的差不多了,废话少说,该开始干活了,任务是: 显示0-9 每秒+1 ,到9后又返回0,一直循环显示,根据任务得到如下流程图:

1. 显示部分:

将需要显示的数值送入A ==>查表求得显示段码==>将段码逐位移入164==>8位移完后点亮数码管==>延时==>返回第一步执行

2. 中断部分:

进入中断==>保存现场(以备调查取证,送你入狱^_^)==>重置TCC==>够1秒钟将需要显示的数据+1,并重置,不够就退出;

根据以上要求就开始写代码调试了,要注意一点,数据移位时一定要记得高位在前哦,否则显示错误别怪我没有说清楚,我当年实验时就因为这个数据移位方向反了排查了半天,甚至以为是时钟频率不对,又以为时许不对.....搞了半天,NND后来重看DATASHEET才发现,原来是低级错误啊,呜呼哀哉.......,希望你不要重蹈我覆辙,哎哟!! 谁! 谁! 谁扔砖头上来啥你扔的我废话太多.........,那俺少来两句,继续上菜, 咦好像没啥可说的了,上源程序吧

1.;中断部分:

2.

3.;;;;;;;;;;中断;;;;;;;;

4.INTPUT:

5.MOV TEMPA, A;

6.MOV A,@130;

7.MOV TCC,A;255-130=125

8.CLR RF;

9.;;;;;此处填写250Us处理程序

10.BS WKREG,T500US

11.;;;;;;;;;;;;;;;;;;;;;;;;;

12.DJZ R1MS

13.JMP INTEXT;

14.MOV A,@4

15.MOV R1MS,A;重置

16.BS WKREG,T1MS

17.;;;;;;;此处填写1ms处理程序

18.

19.;;;;;;;;;;;;;;;;;;;;;;;;;;

20.DJZ R20MS

21.JMP INTEXT;

22.MOV A,@20

23.MOV R20MS,A;重置

24.;;;此处填写1秒处理程序

25.BS WKREG,T20MS

26.;;;;;;;;;;;;;;

27.DJZ R1S

28.JMP INTEXT;

29.MOV A,@50

30.MOV R1S,A;

31.;;;;;;;;;

32.INC NUMBER

33.MOV A,NUMBER

34.SUB A,@10

35.JBS SR,2

36.JMP INTEXT

37.MOV A,@0

38.MOV NUMBER,A

39.

40.

41.INTEXT:

42.MOV A,TEMPA;

43.RETI;;;;;;;;;;;;;;;;;;;;;

44.

45.

46.

47.

48.

49.;显示部分:

50.

51.;==============TXDATA==============

52.TXDATA:

53.BS P5,CC1

54.MOV A,@8

55.MOV DATALOP,A;

56.TXLOP:

57.BC WKREG,T500US

58.BS P5,CLK;clk=高

59.NOP;

60.NOP

61.JBS DATA_BUF,7

62.JMP$+3

63.BS P5,DATA;

64.JMP$+2

65.BC P5,DATA

66.DD1MS: JBS WKREG,T500US

67.JMP$-1

68.BC P5,CLK

69.BC WKREG,T500US

70.JBS WKREG,T500US

71.JMP$-1;

72.RLC DATA_BUF

73.DJZ DATALOP

74.JMP TXLOP

75.;;;;;;;;;;

76.BC WKREG,T500US

77.BS P5,CLK;clk=高

78.BC WKREG,T500US

79.JBS WKREG,T500US

80.JMP$-1;

81.BC P5,CLK

82.;;;;;;;;

83.BC P5,CC1

84.

85.RET;;;;;;;

86.

87.;数据查表

88.;===============DSPTBL============

89.DSPTBL: ADD PC,A

90.RETL @0B01000000;0

91.RETL @0B01111001;1

92.RETL @0B00100100;2

93.RETL @0B00110000;3

94.RETL @0B00011001;4

95.RETL @0B00010010;5

96.RETL @0B00000010;6

97.RETL @0B01111000;7

98.RETL @0B00000000;8

99.RETL @0B00010000;9

100.

101.

102.;循环体部分;

103.

104.;;;;;;;;;;主程序;;;;;;;;;;;

105.MLOOP:

106.MOV A,NUMBER

107.CALL DSPTBL

108.MOV DATA_BUF,A

109.CALL TXDATA

110.BC WKREG,T1MS

111.JBS WKREG,T1MS

112.JMP$-1

113.NOP;

114.

115.JMP MLOOP;;;;;;;;;;;;;;;;;;;;

实例2

在实际应用中驱动数码管常用的方式分动态扫描和静态驱动。动态扫描方式需要x+y 个IO(x*y个数码管的情况,一般x=8,y=位数)这种方法很浪费MPU的IO端口对于2051等20脚的芯片就很难实现。静态显示驱动法,即是指每一个LED灯分别对应一个独立的IO驱动口,这种方法适用较少LED的驱动,不适合数码管驱动。

还有一种利用74HC164来驱动的方法。74HC164是比较典型的移位寄存器,该移位寄存器有一个数据输入端口、一个时钟信号端口和八个输出端口。这种方法只需要2个MPU 的IO端口,而且在锁存器件这2个端口还可以干别的事情。

74HC164驱动共阴、共阳数码管都很方便。

驱动要点:

1、上升沿写入串行数据:

CLK=0;

DAT=num&0x01;

CLK=1;

2、写入数据的数码管编码(指代码中的 tab[])

串行数据是FIFO先进先出,也就是先写高位,移位放入。

电路如图:

3、程序源代码:

1.//共阴数码管74HC164串行驱动

2.

3.#include<>

4.

5.#define uint unsigned int

6.

7.#define uchar unsigned char

8.

9.sbit DAT=P3^7; //模拟串口数据发送端

10.

11.sbit CLK=P3^4;//模拟时钟控制端

12.

13.

14.

15.uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};//0-9,-,全

16.

17.

18.

19.void sendbyte(uchar byte)

20.

21.{ /

22.

23.uchar num,c;

24.

25.num=tab[byte];

26.

27.for(c=0;c<8;c++)

28.

29.{

30.

31.CLK=0;

32.

33.DAT=num&0x01;

34.

35.CLK=1;

36.

37.num>>=1;

38.

39.

40.

41.

42.

43.}

44.

45.

46.

47.}

48.

49.

50.

51.

52.

53.void delay_50ms(unsigned int t)

54.

55.{

56.

57.unsigned int j;

58.

59.for(;t>0;t--)

60.

61.for(j=6245;j>0;j--)

62.

63.{;}

64.

65.}

66.

67.

68.

69.main()

70.

71.{

72.

73.

74.

75.

76.

77.unsigned char h;

78.

79.while(1){

80.

81.for(h=0;h<10;h++){

82.

83.delay_50ms(1);

84.

85.sendbyte(h);

86.

87.

88.

89.

90.

91.delay_50ms(4);

92.

93.}

94.

95.h=0;

96.

97.}

98.

99.

100.

101.}

相关主题
相关文档
最新文档