74HC164应用实例驱动数码管两例电路图和源程序.docx
《74HC164应用实例驱动数码管两例电路图和源程序.docx》由会员分享,可在线阅读,更多相关《74HC164应用实例驱动数码管两例电路图和源程序.docx(14页珍藏版)》请在冰豆网上搜索。
74HC164应用实例驱动数码管两例电路图和源程序
4HC164应用实例:
驱动数码管两例(电路图和源程序)
文章编号:
8
文章分类:
电路 > 电子元件
点击:
...
关键词:
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 @0B;0
91. RETL @0B;1
92. RETL @0B;2
93. RETL @0B;3
94. RETL @0B;4
95. RETL @0B;5
96. RETL @0B;6
97. RETL @0B;7
98. RETL @0B;8
99. RETL @0B;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.}