74HC164的驱动和应用
164和165的使用

浅谈单片机系统中I/O的扩展--基于74HC164和74HC165在我们的单片机应用系统中,常常会遇到I/O口不够的情况。
譬如说接有外部RAM而且要求有16个以上的按键,8位数码管以上的显示。
而且还不包括其它的外围器件。
这时整个系统的I/O资源就很吃紧了。
系统的扩展性也不好。
这时我们就需要考虑对单片机的I/O进行扩展了。
虽然专门的I/O扩展芯片市场上也有不少,但对于我们一般的应用,没有必要整的那么复杂。
用一些简单的移位寄存器芯片一样可以实现我们的目标。
下面我们首先来认识一下74HC164这款芯片。
这款芯片的作用是把串行输入的数据并行输出。
注意,它没有锁存功能,在允许输出的情况下,每一个时钟的上升沿,数据依次从最低位移向最高位。
因此,在做数码管的输出显示的时候会出现拖影的想象,在设计此电路时要注意考虑此情况。
下面是它的引脚图。
A1,A2是数据输入端,一般情况下两者连在一起,作为串行数据的输入端。
Qa----Qh j就是并行数据的输出端了。
CLOCK 和RESET分别为时钟和复位端下面我们再看看它的真值表,有了真值表我们才知道如何正确的去编写程序去驱动它(其它复杂的器件还需要对照时序图编写相应的驱动程序)呵呵,怎么样,这个表很简单吧,相信大家都能够看的懂。
当Reset为低电平时不管时钟为高电平还是低电平也不管输入引脚A1,A2为何值,输出的并行数据均为低电平。
当Reset 为高电平时,只有在时钟的上升沿,A1A2上的值才被移位输出。
看懂了这张表那么剩下的事情就好办多了。
下面我以级联的8块74HC164驱动8位共阴的数码管为例来阐述它的用途。
当然它的用途并不仅仅在于此。
你可以发挥你的聪明才智去应用它到你的设计中。
以上的连接中Reset脚要全部接高电平。
所有的Clock引脚都要连接在一块。
第一块74HC164的AB引脚接在一块作为串行数据的输入端。
第二块74HC164的AB引脚接在第一块74HC164并行数据输出端的H脚上。
74HC164的驱动和应用

74HC164的驱动和应用74HC164的几点说明:1.74HC164是串行输入,并行输出的;2.它的并行输出其实是有延时的,只是延时时间小,可以认为是并行输出;74hc164封装和真值表:真值表中文解释说明:H-高电平 L -低电平 X -任意电平↑-低到高电平跳变(上升沿有效)QA0,QB0,QH0 -规定的稳态条件建立前的电平QAn,QGn -时钟最近的↑前的电平看真值表的第三条和第五条:就可以知道,在保持clear为 H, clock为↑状态下,AB都为H时,移位寄存器移入H,而当移位寄存器移入L时,必须令B为L,而A不受约束。
所以可以把AB断相连再接入单片机数据端口。
还有一种是A脚直接接高电平,B脚连入单片机数据端(P2_7)时序图:1. 首先区分输入输出信号。
这里CLEAR、A、B、CLOCK是输入信号,Qa~Qh是输出信号;2. 拿尺子开始扫描……2.1. 首先可以看到CLEAR的下降沿后输出全部置低电平。
结合后面的一个CLEAR 下降沿,可以得出结论:当CLEAR输入下降沿时,无论A、B、CLOCK状态为何,输出全部拉低;2.2. 尺子向右移动……找到Qa的第一个上升沿,可以看到这个上升沿是与CLOCK的上升沿对齐的,可以得出结论:输出在逻辑上与上升沿同步。
此时将会注意到在此之前已经有3个上升沿但输出始终为低电平,尺子移动分别比较这3个上升沿,其A、B输入分别为10、01,于是可以得出结论:Q a = A · B。
2.3. 尺子继续向右移动……可以分别看出在随后的CLOCK上升沿处,Qa全部按照A与B进行输出,从而验证以上结论。
此外Qb~Qh的波形为Qa波形依次移位得到。
74HC164中文资料及引脚功能图

74HC164引脚图与中文资料8 位串入、并出移位寄存器1. 概述74HC164、74HCT164 是高速硅门CMOS 器件,与低功耗肖特基型TTL (LSTTL) 器件的引脚兼容。
74HC164、74HCT164 是8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA 或DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟(CP) 每次由低变高时,数据右移一位,输入到Q0,Q0 是两个数据输入端(DSA 和DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位(MR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
2. 特性•门控串行数据输入•异步中央复位•符合JEDEC 标准no. 7A•静电放电(ESD) 保护:·HBM EIA/JESD22-A114-B 超过2000 V·MM EIA/JESD22-A115-A 超过200 V 。
•多种封装形式•额定从-40 °C 至+85 °C 和-40 °C 至+125 °C 。
3. 功能图图 1. 逻辑符号图 2. IEC 逻辑符号图 3. 逻辑图图 4. 功能图4. 引脚信息图 5. DIP14、SO14、SSOP14 和TSSOP14 封装的引脚配置引脚说明符号引脚说明DSA 1 数据输入DSB 1 数据输入Q0~Q3 3~6 输出GND 7 地(0 V)CP 8 时钟输入(低电平到高电平边沿触发)/M/R 9 中央复位输入(低电平有效)Q4~Q7 10~13 输出VCC 14 正电源。
LED驱动芯片74HC164

K 0.46 0.56 K1 0.46 0.51
Unit:mm
0.178~0.278
3.90±0.20 6.00±0.20
0.65±0.10
1.55±0.20
1.27TYP 0.406~0.496 0.175±0.10
1.38±0.20
0°~7° Unit:mm
Rev 2.2 2007-12-05 7/7
0.5 1.35 1.8 VCC VCC 1000 500 400 85
单位 V V
V V V ns ℃
电参数
特性
测试条件
VOH VI = VIH 或 VIL
IOH =20μA
IOH =-4mA
IOH =-5.2mA
VOL VI = VIH 或 VIL
IOL =20μA
IOL =4mA
IOL =5.2mA
2V
6
10
5
fMAX
4.5V
31
54
25
MHz
6V
36
62
28
2V
140
205
255
tPHL
CLR Any Q 4.5V
28
41
51
6V
24
35
46
ns
2V
115
175
220
tpd
CLK Any Q 4.5V
23
35
44
6V
20
30
38
2V
38
75
95
tt
4.5V
8
15
19
ns
6V
6
13
16
TM74HC164

SHENZHEN TITAN M ICRO ELECTRONICS CO., LTD.
TM74HC164与SN74HC164测试参数对比:
特性
电源电流
输入高电 平电压
输入低电 平电压
输出高电 平电压
输出低电 平电压
输入漏电 流
时钟上升 沿到数据 有效时间 数据到时 钟建立时
间 工作频率
驱动电流
符号
IDD VIH
—
—
100
58
65
TM74HC164 SN74HC164 单位
25℃
2
2
μA
4.2
4.2
V
1.35
1.35
V
5.99
5.99
V
0.05
0.05
V
0.01
0.01
μA
2
8
ns
5
5
ns
80
36
MHz
60
50
mA
地址:深圳市高新技术产业园中区深圳软件园 4 栋 522 室
Add:522,5/F,Bldg. No.4,Keji Central Road 2, Software Park,High-Tech Industrial Park,Shenzhen
地址:深圳市高新技术产业园中区深圳软件园 4 栋 522 室
Add:522,5/F,Bldg. No.4,Keji Central Road 2, Software Park,High-Tech Industrial Park,Shenzhen
电话:86-755-86185092
传真: 86-755-86185093
和异步清零端。串行数据输入端(A、B)可非常方便的控制输入数据,当A、B 任意 一个为低电平,则禁止新数据输入,并在时钟端(CLK)脉冲上升沿,复位第一个触 发器,使Q0输出为低电平;当A、B 有一个为高电平,则允许另一个输入数据,在CLK 上升沿时下,决定第一个触发器Q0的状态;
74HC164级联实现四位数码管显示电路

中北大学课程设计说明书学生姓名:XXXXXX 学号:1005xxxxx学院:信息与通信工程学院专业:电子信息科学与技术题目:74HC164级联实现四位数码管显示电路设计指导教师:程耀瑜职称: 教授李文强职称:讲师2013 年 1 月 17 日中北大学课程设计任务书2012/2013 学年第一学期学院:信息与通信工程学院专业:电子信息科学与技术学生姓名:xxxxxxx 学号:100xxxxxxx 课程设计题目:74HC164级联实现四位数码管显示电路设计起迄日期:1月4日~1月15日课程设计地点:中北大学指导教师:程耀瑜,李文强系主任:程耀瑜下达任务书日期: 2010 年 1 月 3 日课程设计任务书目录一、设计目的 (6)二、设计任务 (6)三、设计条件 (6)四、设计内容和要求 (6)1、74CH164的逻辑功能、逻辑图、引脚说明、波形图 (7)2、七段显示数码管 (9)3、74164QUARTUS 2仿真 (10)4、分步设计 (10)5、电路设计图 (11)6、仿真波形图 (12)六、设计总结 (15)1、设计总结 (15)2、设计中的优点与不足 (15)3、心得体会 (15)六、计参考资料 (16)一、设计目的本课程设计主要针对模拟电子技术和数字电子技术课程要求,培养学生在查阅资料的基础上,进行实用电路设计、计算、仿真、调试等多个环节的综合能力,同时培养学生用课程中所学的理论独立地解决实际问题的能力。
另外还培养学生用专业的、简洁的文字,清晰的图表来表达自己设计思想的能力。
二、设计任务设计一个74HC164级联实现四位数码管显示电路,通过在74HC164上输入时钟信号(CP)和控制信号(D),在数码管上显现出来相应的信号。
三、设计条件本设计是基于在学习过数字电子技术基础和模拟电子技术基础且在完成电子技术实验后设计的,通过在电脑上利用各种软件设计而成,包括Quartus II 5.0,Multisim2001等设计仿真软件。
矩阵键盘状态机之74HC164驱动数码管依次显示键值要点

用视图Web模式看uchar code smg_duan[]= //数码管(共阴)编码0-F,全灭; 按键对应的数字不是上图,而是-------------------------这里下面的{//用IO口P0,所以把A B C D E F G DP分别接到P0^0 P0^1 P0^2 P0^3 P0^4 P0^5 P0^6 PO^7 所以编码如下---------- --------------|-1--|-2--|-3--|-----------------------------------|-4--|-5--|-6--|-----------------------0X3f,0X06,0X5B,0X4f,0X66,0X6D,0X7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x7 1,0X00---------------|-7--|-8--|-9--|-----------------//可以把0x71或任意一个改为0x00,这样就可以按下0x71这个案件时清楚显示了---------------|-C--|-0--|-E--|---------------------/* 0xfC,0x0C,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00 //多写了0x00,代表段选全部熄灭*/};0X3f,0X06,0X5B,0X4f,0X66,0X6D,0X7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x7 1,0X00//可以把0x71或任意一个改为0x00,这样就可以按下0x71这个案件时清楚显示了完整程序如下:/*==========================================================* 开发人员:laowang* 当前版本:V1.0* 创建时间:11/26/2013* 修改时间:04/21/2017* 功能说明:对4*3矩阵键盘扫描,用4位共阴数码管进行显示,刚开始时不亮,依次按下按键时数码管依次显示0-F,扫描方法为状态机方法+定时器中断* 修改人员:梁超云*==========================================================*/#include<reg52.h>#include"Define.h"#include"display.h"#include"matrixkeyscan.h"#include "74HC164.h"void Timer0_init(); //定时器初始化函数uint flag1=0;uint flag=0; //按键扫描标志,每中断一次,扫描一次bit power_on=1;//主函数void main(){uchar key_state=0;uchar readkey;readkey=0xff;Timer0_init();Display_init(); //使之不亮while(1){if(flag==1){flag=0;flag1++;if(flag1>=4){flag1=0;}readkey=Keyscan();if (power_on==0){power_on=1;num2++;if(num2>=4){num2=0;}DisplayBUFF(readkey);}Display();}}}void Timer0() interrupt 1{// TH0=0xD8; //10Ms产生一次中断// TL0=0xF0;// TH0=0xB1; //20Ms产生一次中断// TL0=0xE0;// TH0=0xec; //5Ms产生一次中断// TL0=0x78;TH0=0x63; //40Ms产生一次中断TL0=0xc0;flag++;}void Timer0_init(){// TH0=0xD8; //12MHz--10Ms产生一次中断// TL0=0xF0;// TH0=0xB1; //20Ms产生一次中断// TL0=0xE0;// TH0=0xec; //5Ms产生一次中断// TL0=0x78;TH0=0x63; //40Ms产生一次中断TL0=0xc0;EA=1;ET0=1;TR0=1;}/*==================硬件电路===============================*说明:数码管为共阴数码管,驱动方式为74hc164扫描方式为动态扫描*==========================================================*/ //梁超云改为P0.0-P0.7直接数码管的A-H,P2接数码管位选#include<reg52.h>#include"Define.h" //把常用的宏定义写成了头文件,包含进来#include"display.h"#include "74HC164.h"#include"matrixkeyscan.h"uchar segbuff[4];uchar num2=0;//sbit wela=P3^5; //位选//sbit dula=P3^4; //段选uchar code smg_duan[]= //数码管(共阴)编码0-F,全灭;{//用IO口P0,所以把A B C D E F G GP分别接到P0^0 P0^1 P0^2 P0^3 P0^4 P0^5 P0^6 PO^7 所以编码如下0X3f,0X06,0X5B,0X4f,0X66,0X6D,0X7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,/*0x79*/0 x00,0x71,0X00//用IO口P0,所以把A B C D E F G GP分别接到P0^7 P0^6 P0^5 P0^4 P0^3 P0^2 P0^1 PO^0 所以编码如下//可以把0x79或任意一个改为0x00,这样就可以按下0x79这个案件时清楚显示了//0xfC,0x0C,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,/*0x9E*/ 0X00,0x8E,0x00 //多写了0x00,代表段选全部熄灭};//uchar code smg_wei[]={0xfe,0xfd,0xfB,0xf7};//数据向左移动。
74HC164驱动数码管

只要用到一片164就够了,作动态扫描,下面程序是两个数码管动态扫描,164并行输出口再接一片功率驱动芯片,如TD62083。
程序如下:/**************************************//* 74LS164数码管动态显示*//**************************************///-------------------------------------库函数声明,管脚定义------------#include <at89x51.h>#define uchar unsigned charsbit simuseri_CLK=P1^1; //用P1^1模拟串口时钟sbit simuseri_DATA=P1^0; //用P1^0模拟串口数据sbit a0=ACC^0;unsigned char code dis_code[11]={0x28,0x7E,0xa2,0x62, //查表显示0, 1、、9 0x74,0x61,0x21,0x7A,0x20,0x60, 0x01};uchar numer,temp;uchar ge,shi;//----------------------------------------------------------------------------// 函数名称:out_simuseri// 输入参数:data_buf// 输出参数:无// 功能说明:8位同步移位寄存器,将data_buf的数据逐位输出到simuseri_DATA//----------------------------------------------------------------------------void out_simuseri(uchar data_buf){uchar i;i=8;ACC=data_buf;do{simuseri_CLK=0;simuseri_DATA=a0;simuseri_CLK=1;ACC=ACC>>1;}while(--i!=0);}/************************************/void delay(uchar ms) //延时程序{uchar i;while(ms--){for (i=0;i<125;i++);}}/***********************************/void main(){uchar m;while(1){for(temp=0;temp<99;temp++){ge=temp/10;shi=temp%10;for(m=0;m<20;m++) //显示频率200ms加1次{P2_0=0; //位段码numer=dis_code[ge];out_simuseri(numer); //个位移位显示delay(5);P2_0=1;P2_1=0;numer=dis_code[shi]; //十位移位out_simuseri(numer);delay(5);P2_1=1;}m=0;}}}/****************************************/#i nclude<reg51.h>#define uint unsigned int#define uchar unsigned charsbit DAT=P1^1; //模拟串口数据发送端sbit CLK=P1^2;//模拟时钟控制端uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭(共阳字段表)void sendbyte(uchar byte){uchar num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80; //(0x80即十进制的128, 二进制的10000000 按位发送)CLK=1;num<<=1;}}void delay_50ms(unsigned int t) //50MS演示程序{unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}main(){unsigned char h;while(1){for(h=0;h<10;h++){delay_50ms(1);sendbyte(h);delay_50ms(10);}h=0;}}下面这段是74ls164 驱动共阴数码管的程序源码#i nclude<reg51.h>#define uint unsigned int#define uchar unsigned charsbit DAT=P1^1;sbit CLK=P1^2;uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};//0-9,-,全灭void sendbyte(uchar byte){uchar num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x01;CLK=1;num>>=1;}}void delay_50ms(unsigned int t) {unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}main(){unsigned char h;while(1){for(h=0;h<10;h++){delay_50ms(1);sendbyte(h);delay_50ms(10);}h=0;}}刚开始的时候把74HC164当成了74HC573使了,还看了原理图,半天摸不出个所以然,然后上网查了资料,才知道原来74HC164是串入并出的,此时才知道思考方向出错了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
74HC164的驱动和应
74HC164的几点说明:
1.74HC164是串行输入,并行输出的;
2.它的并行输出其实是有延时的,只是延时时间小,可以认为是并行输出;
74hc164封装和真值表:
真值表中文解释说明:
H-高电平 L -低电平 X -任意电平↑-低到高电平跳变(上升沿有效)
QA0,QB0,QH0 -规定的稳态条件建立前的电平
QAn,QGn -时钟最近的↑前的电平
看真值表的第三条和第五条:就可以知道,在保持clear为 H clock
为↑状态下,AB都为H时,移位寄存器移入H,而当移位寄存器移入
L时,必须令B为L,而A不受约束。
所以可以把AB断相连再接入单
片机数据端口。
还有一种是A脚直接接高电平,B脚连入单片机数据
端(P2_7)
电路仿真图:
R为clear端, C1/->为clock端,&为A端(1脚)和B端(二角),3~13脚分表为QA~QH,
源程序:
/***74hc164是上升沿有效***/
#include<regx51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar ch;
sbit DAT=P2^7;//A,B端接一块后接入DAT
sbit CLK=P2^6;
char code
seg[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0
xff};
/*0~9和全灭状态*/
/*数经过移位寄存器后低位数为高位数,高位数为低位数
如:0000 0011移位以后为1100 0000*/
/*延时一毫秒函数*/
void delay(uint ms)
{
uchar i;
for(;ms!=0;ms--)
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/***把代码发送到移位寄存器***/
void sendchar(ch)
{
uchar i;
for(i=0;i<8;i++)//8位数据传输完毕后才给数码管显示
{
DAT=ch&0x01;//P2_7=0000000x
/*DAT一直保持该状态,等时钟脉冲触发传递数值*/
CLK=0;//下面两句制造一个上升沿
CLK=1;
/*一个seg[]刚好八位,164是串行输入的,分成八位输入*/
ch>>=1;
/*DAT=ch&0x01和ch>>=1的功能是一次取出八位二进制ch的每一
位赋值给74hc164*/
}
}
void main(void)
{
uint m=0;
while(1)
{
sendchar(seg[m]);
if(++m==11) m=0;
delay(200);
}
}。