两片74HC595级联驱动两个四连体数码管
avr74hc595驱动四位数码管程序
avr74hc595驱动四位数码管程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define wei1_h PORTB|=BIT(4);//第1位为高电平
#define wei1_l DDRB&=~BIT(4);//第1位为低电平
#define wei4_h PORTB|=BIT(7);//第4位为高电平
#define wei4_l DDRB&=~BIT(7);//第4位为低电平
void hc595_write(uchar dat)
{
uchar i;
PORTC&=~BIT(7);//输出使能 低有效
DDRC|=BIT(7);
{
wei1_h;//位1
hc595_write(0x3f);//显示0
}
}
#define wei2_h PORTB|=BIT(5);//第2位为高电平
#define wei2_l DDRB&=~BIT(5);//第2位为低电平
#define wei3_h PORTB|=BIT(6);//第3位为高电平
#define wei3_l DDRB&=~BIT(6);//第3位为低电平
PORTB&=~BIT(3);
DDRB|=BIT(3);//MISO置底
PORTB|=BIT(3);
DDRB|=BIT(3);//MISO制高
for(i=0;i<8;i++)
{
PORTB&=~BIT(1);
用两个74HC164驱动两个四位的数码管
用两个74HC164驱动两个四位的数码管~~(一个简易电子钟)几天前我发一了帖寻求用两74HC164做动态扫描数码管~~~ 今天我折腾了一天终于把它难弄出来了~~~~~~其电路图是在一本书上找到的~~由于还没学会用protel 99画图,,所以就只有将就一下了我的程序如下:#include<at89x51.h>sbit DAT=P1^1;sbit CLK=P1^2;unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//显示0~9unsigned char code ff[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x77};//位选;unsigned char a,b,c,d,e,f,ch,hour,minite,second;//开启计时void loading(){TMOD=0x22;TR0=1;ET0=1;EA=1;}以下是显示程序,共八个,因为有八个数码管;void sendbyte(unsigned char byte){unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0xfe;for(c=0;c<8;c++){CLK=0;DAT=num;CLK=1;num<<=1;}}void sendbyte_1(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0xfd;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}}void sendbyte_2(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0xfb;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}}void sendbyte_3(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;num<<=1;}num=0xf7;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}}void sendbyte_4(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0xef;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;}}void sendbyte_5(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0xdf;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}}void sendbyte_6(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0xbf;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}}void sendbyte_7(unsigned char byte) {unsigned char num,c;num=tab[byte];for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}num=0x7f;for(c=0;c<8;c++){CLK=0;DAT=num&0x80;CLK=1;num<<=1;}}//延时~~void delay(){unsigned int j;for(j=0;j<250;j++);}main(){loading();while(1){a=hour/10; b=hour%10;c=minite/10;d=minite%10;e=second/10;f=second%10;ch=10;sendbyte(f);delay();sendbyte_1(e);delay();sendbyte_2(ch);delay();sendbyte_3(d);delay();sendbyte_4(c);delay();sendbyte_5(ch);delay();sendbyte_6(b);delay();sendbyte_7(a);delay();}}void time(void) interrupt 1 {unsigned int tt;tt++;if(tt==3600){tt=0;second++;if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour==24)hour=0;}}}}此程序还有很多不足~希望单片机高手们来给我看一下~~~提一些好的建议吧~~。
74HC595驱动四位数码管
_____________________________________________________
电源端/地端电流 ±70 mA
_____________________________________________________
74HC595
74HC595控制四位数码管
74HC595芯片资料
74HC595是8位串入并出的接口芯片
74HC595芯片资料
74HC595芯片资料
74HC595的控制端说明
CR(10脚):低电平时将移位寄存器的数据清零,通常将字接VCC CPSR(11脚):上升沿时数据寄存器的数据移位。Q0-Q1-..Q7:下降沿移位寄存器数据不 变。(脉冲宽度:5V时,大于几十纳秒就行了,通常选微秒级) CPLA(12脚):高电平时移位寄存器的数据进入数据存储寄存器,低电平时存储寄存器数据 不变,通常将CPLA置为低电平,当移位结束后,在CPLA端产生一个正脉冲 (5V时,大于几十纳秒就行了,通常都选微秒级),更新显示数据。 EN(13脚):高电平时禁止输出(高阻态),如果单片机的引脚下不紧张,用一个引脚控制 它,可以方便的产生闪烁和熄灭的效果,比通过数据端移位控制要省时省力。
输出电压 VO -0.5~VCC+0.5 V
_____________________________________________________
钳位二极管电流 IIK/IOK ±20 mA
_________________________________________5芯片资料
极限参数:
参数 电源电压 输入电压 符号 VCC VI 参数范围 -0.5~7 -0.5~VCC+0.5 单位 V V
2个74HC595级联点亮16个LED灯总结湖北工业大学王晨
2 个74HC595 级联点亮16 个LED 灯总结、芯片介绍74HC595 是一个串行输入,串行或者并行输出的芯片,利用这个芯片可以节省单片机的I/O 口,最少可以用3 个I/O 口就可控制n 个级联的芯片,其管脚图如图一所示。
图一.74HC595 管脚图每个管脚的作用二、设计目标74HC595 与单片机的P0 接口相连,编程输入值。
使只用3 个I/O 口可以控制2 个级联的74HC595 控制16 个LED 中任意一个LED 的亮灭。
三、工作原理3.1 时序分析图二.时序图NC:没有改变3.2 串行输出与并行输出74HC595 输出结构框图如图三所示图三 .串行输入,串行输出与并行输出结构框图四、芯片级联如果要用 595 的级联,把一个芯片的串行输出端口( QH ')连上下一个芯片的串行数据 输入端口( SER ) ,如图四所示。
并行输出图三简化为如下所示: G 低电平串行输出在 SCK 第九个上升沿数据开始从 QH '输出,如此循环,可以连接无数个;数据全部输 入完后,给RCK 一个上升沿,寄存器的数据全部进入锁存器,此时,如果 G 为低电平,数 据从并口( Q0~Q7)输出扩展:如果要改变 LED 的亮度,改变 G 的占空比即可(利用人眼视觉的停滞效应) 。
图四 .级联接法单片机分别控制 SER (数据输入 ),SCK (寄存器时钟输入 ),RCK (锁存器时钟输入 ),G 直接连接 GND (让并行输出使能 ),SCLR 直接接 VCC (可以用软件在使用寄存器之前清零, 在以后的使用就不需要清零了)原理图需要注意的地方: SER,SCK,RCK 加上一个上拉电阻, 原因是单片机的驱动电 流不够。
王晨2014 年 4月 19 日。
74hc595芯片数码管显示
} void write_date(uchar temp)//移位寄存器
{ uint i; for(i=0;i;>;=1;//把输进来的 8 位数据右移一位,从
而最右端的一位溢出 sck=0;//输入时钟位低电平 si=CY;//把移位溢出来的数据赋给最高位 sck=1;//输入时钟位高电平 } }
void main()//主函数 { uint i//对数据输入时钟线的位定义 sbit si=P0^2;//对数据线的位定义 uchar code num[]={0x80,0xed,0x42,0x48,0x2c,0x18,0x10,0xcc,0x 00,0x08};//0~9 的数字显示 void delay(uint time)//延时函数
74hc595 芯片数码管显示
/*74HC595 是硅结构的 CMOS 器件,兼容低电压 TTL 电路, 遵守 JEDEC 标准。
74HC595 是具有 8 位移位寄存器和一个存储器,三态输 出功能。
移位寄存器和存储器是分别的时钟。时钟线 sck 在上升 沿将数据输入(即由低电平编导高电平),
数据在 si 的上升沿输入,在 si 的上升沿进入到存储寄 存器中去。如果两个时钟连在一起,则
移位寄存器总是比存储寄存器早一个脉冲。 移位寄存器 有一个串行移位输入(Ds),
和一个串行输出(Q7’),和一个异步的低电平复 位,存储寄存器有一个并行 8 位的,
具备三态的总线输出,当使能 OE 时(为低电平),存储 寄存器的数据输出到总线。
8 位串行输入/输出或者并行输出移位寄存器,具有高阻 关断状态。 */ #include; #define uint unsigned int #define uchar unsigned char sbit rck=P0^0;//对输出存储器锁存时钟线的位定义
74HC595驱动两位数码管程序Word版
/*==================================================================== ====================================================================== ==*//*============================================================================= ==============================================================*/#include<reg52.h>#include <math.h>#include <intrins.h>#include<string.h>#include<stdio.h>#define unchar unsigned char#define unint unsigned int#define unlong unsigned long/*============================================================================= ==============================================================*//*============================================================================= ==============================================================*/#define dmx_total_data 3#define DMAX 101#define DMIN 0#define CONTIME_T1 20000#define CONTIME_T3 200#define CONTIME_T2 100#define TIME0 256-17#define BUTTON1 1#define BUTTON2 2sfr WDT_CONTR =0XE1;sfr ISP_DATA =0XE2;sfr ISP_ADDRH =0XE3;sfr ISP_ADDRL =0XE4;sfr ISP_LMD =0XE5;sfr ISP_TRIG =0XE6;sfr ISP_CONTR =0XE7;sfr P1M0 =0X91;sfr P1M1 =0X92;sfr AUXR =0X8E;unint data I_address;unint data dis_Addr_Rg;unint data dis_Addr_Rg;unchar data Counter = 10;sbit an_DOWN =P3^7;sbit an_UP =P1^4;sbit sdo =P1^7;sbit clk =P1^6;sbit stb =P1^5;sbit Bd_flg_RT =P3^4;unchar data dis[ ];unsigned code disp[10]={0xA0,0xF9,0xC4,0xD0,0x99,0x92,0x82,0xF8,0x80,0x90};/*-------------------------------------------------------------------------------------------------------------------*/void delay10ms(void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}//-------------按键延时---------------//void ButtonDelay(void){unchar i,j;for(i = 0; i++; i < 50)for(j = 0; j++; j < 200);}/*--------------------------------------------------------------------------------------------------*/unchar ButtonScan (void){unchar ButtonNum = 0;if(P3^4 == 0){/*延时防止按键抖动,如果晶振是12M的话。
74HC595驱动两位数码管
在前文讲述1位LED数码管显示的基础之上,本文进一步介绍2位LED数码管的工作原理及用法。
1.1 2位LED数码管工作原理与1位数码管不同的是,2位数码管显示时要进行位选。
如图1.2所示,公共脚10决定位DIG1是否有效,公共脚5决定位DIG2是否有效。
图1.1与图1.2显示了2位数码管引脚分布和内部电路设计。
其中笔段分布如图1.1所示,引脚对应笔段分布如图1.2所示。
图1.1 2位数码管笔段图1.2 2位数码管引脚图2位数码管引脚分如:1) 公共脚:10、5 ;2)DIG:A-3 B-9 C-8 D-6 E-7 F-4 G-1 DP- 2。
1.2 74HC595简介74HC595是一款具有8位移位寄存器和一个存储器,三态输出功能的驱动芯片。
移位寄存器和存储器分别具有独立的时钟信号。
数据在SHCP的上升沿输入,在STCP的上升沿进入到存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7’),和一个异步的低电平复位(MR),存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
图1.3 74HC595引脚图74HC595引脚排布如图1.3所示,引脚功能见表1.1。
表1.1 74HC595引脚功能1.3硬件电路设计1.3.1设计原理本设计采用LPC2103自带的硬件SPI接口与74HC595进行数据传输。
74HC595将LPC2103发送过来的8位串行数据转换成8位并行数据来驱动2位共阳数码管。
与1位数码管类似,2位LED数码管的输入端在5 V电源或高于TTL高电平(3.5 V)的电路信号相接时,一定要串加限流电阻,以免损坏器件。
如图1.4所示2位数码管设计原理图。
位选控制脚如表1.2所示。
由于本设计采用共阳数码管,所以2位数码管位选引脚选择用LPC2103的P0.8与P0.9控制。
51单片机驱动两片74HC595级联动态驱动8位数码管
51单片机驱动两片74HC595级联动态驱动8位数码管功能: 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选平台: STC89C52 11.0592MHz现象: 8位数码管从第一位开始从0计数,满10进位版本说明: 第0版本没有使用定时器中断,同时定义了一个unsigned long int 变量计数,再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,而且没有用unsigned long int 之类的变量,而是用数组Val[8] 来计数,主函数只负责显示,其它的在中断函数里面处理,这样显示一点都不闪屏,备注: 可以用ULN2003A 接在数码管的com 口来提高驱动能力,ULN2003A里面有7个NPN三极管, 可以大大提高驱动能力#include <reg52.h>sbit SCK = P1^1; // 数据输入时钟线,脉冲sbit SI = P1^0; // 数据线sbit RCK = P1^2; // 锁存unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段码unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选unsigned char Val[8] = {0}; // 要显示的数据************************ 函数声明************************void interrupt_init(void);void timer_init(void);控制74HC595输出数据void Output(void){RCK = 0;RCK = 1;}向74HC595中写入一字节数据void Write_Byte(unsigned char dat){unsigned char i = 0;for(i=0; i<8; i++){SCK = 0;SI = dat & 0x80;SCK = 1;dat <<= 1;}}显示函数void Display(unsigned char * p) {unsigned char * pt = Wei;Write_Byte(*(pt+0));Write_Byte(SMG[*(p+7)]);Output();Write_Byte(*(pt+1));Write_Byte(SMG[*(p+6)]);Output();Write_Byte(*(pt+2));Write_Byte(SMG[*(p+5)]);Output();Write_Byte(*(pt+3));Write_Byte(SMG[*(p+4)]);Output();Write_Byte(*(pt+4));Write_Byte(SMG[*(p+3)]);Output();Write_Byte(*(pt+5));Write_Byte(SMG[*(p+2)]);Output();Write_Byte(*(pt+6));Write_Byte(SMG[*(p+1)]);Output();Write_Byte(*(pt+7));Write_Byte(SMG[*(p+0)]);Output();}int main(void){timer_init();interrupt_init();while(1){Display(Val);}return 0;}void interrupt_init(void){EA = 1; //开总中断ET0 = 1; //开定时器0中断ET1 = 1; //开定时器1中断}void timer_init(void){TMOD = TMOD | 0x01; //定时器0工作方式1TMOD = TMOD & 0xFD;TH0 = 0x4B; //装初值,50ms计数TL0 = 0xFF;TR0 = 1; //开启定时器0}void timer0() interrupt 1{static unsigned char counter0 = 0;counter0++;TH0 = 0x4B; //重新装入初值,定时器0从头开始计数,计数50ms TL0 = 0xFF;if(2 == counter0) //2*50 ms = 100ms = 0.1s{counter0 = 0; //counter0置零,定时器0从头开始计数Val[0]++;if(10==Val[0]){Val[0] = 0;Val[1]++;if(10==Val[1]){Val[1] = 0;Val[2]++;if(10==Val[2]){Val[2] = 0;Val[3]++;if(10==Val[3]){Val[3] = 0;Val[4]++;if(10==Val[4]){Val[4] = 0;Val[5]++;if(10==Val[5]){Val[5] = 0;Val[6]++;if(10==Val[6]){Val[6] = 0;Val[7]++;if(10==Val[7]){Val[7] = 0;}}}}}}}}}}。
两片74HC595控制数码管动态显示
for(y=z;y>0;y--);
}//延时子程序,延时Zms
#define uint unsigned int
sbit d1=P2^0;
sbit key1=P0^4;
sbit SDATA_595=P0^0;//串行数据输入----接板卡上的SPI数据信号输入端
sbit SCLK_595=P0^1;//移位时钟脉冲(输入口)---接板卡上的SPO----串行时钟线----SHcp移位时钟信号输入端
sbit RCK_595=P0^2;//输出锁存器控制脉冲----接板卡上SPKSTcp锁存信号输入端
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar num;
void delay(uint z);
void aa595_in(uchar Data)
{uchar i;
for(i=0;i<8;i++)
{SCLK_595=0;
ge=num%10;
a595_in(duan[shi]);
aa595_in(wei[3]);
aa595_out()duan[ge]);
aa595_in(wei[2]);
aa595_out();
delay(10);}
}
void delay(uint z)
{uint x,y;
//两片74HC595控制8位数码管,按下键盘时使第一个发光二极管点亮,同时使数码管的示数加1,第一个数码管显示十位,第二个数码管显示个位,一直加到99!
两片74HC595级联实现8位7段LED动态显示
74HC595级联动态显示的C程序/*该程序为两片74HC595级联实现8位7段LED动态显示的驱动测试程序在8个7段LED上显示"01234567"*/#include<reg51.h>#define uchar unsigned charuchar bdata OutByte; /*定义待输出字节变量*/sbit Bit_Out=OutByte^7; /*定义输出字节的最高位,即输出位*/sbit Bout=P2^0; /*位输出引脚*/sbit Sclk=P2^1; /*位同步脉冲输出*/sbit SLclk=P2^2; /*锁存脉冲输出*/uchar code Segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, /*共阴7段LED段码表*/0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00};void OneLed_Out(uchar i,uchar Location) /*输出点亮一个7段LED显示器*/{uchar j;OutByte=Location; /*先输出位码*/for(j=1;j<=8;j++){Bout=Bit_Out;Sclk=0;Sclk=1;Sclk=0; /*位同步脉冲输出*/OutByte=OutByte<<1;}OutByte=Segment[i]; /*再输出段码*/for(j=1;j<=8;j++){Bout=Bit_Out;Sclk=0;Sclk=1;Sclk=0; /*位同步脉冲输出*/OutByte=OutByte<<1;}SLclk=0;SLclk=1;SLclk=0; /*一个锁存脉冲输出*/}void main(){uchar i=0;uchar Location=1; /*定义位码*/while(1){OneLed_Out(i,Location);i=i+1;Location=Location<<1;if(i==8) /*8次一轮*/{i=0;Location=1;}}}74hc595串联动态显示2009-06-11 18:06#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数 _nop_() ;#define uchar unsigned char#define uint unsigned intuint code DAT[]={0xfe06,0xfd5b,0xfb4f,0xf766,0xef6d,0xdf7d,} ;sbit SDATA_595=P1^0 ; //串行数据输入,14脚sbit SCLK_595 =P1^1 ; //移位时钟脉冲,11脚sbit RCK_595 =P1^2 ; //输出锁存器控制脉冲,12脚uint temp ;/* 延时子程序 */void delay(int ms){uint x,y;for(x=ms;x>0;x--)for(y=128;y>0;y--);}/*将显示数据送入74HC595内部移位寄存器 */void WR_595(void){uchar j ;for (j=0;j<16;j++){temp=temp<<1 ;SDATA_595=CY ;// 14脚SCLK_595=1 ; //上升沿发生移位,11脚_nop_() ;_nop_() ;SCLK_595=0 ;// 11脚}}/*将移位寄存器内的数据锁存到输出寄存器并显示 */void OUT_595(void){RCK_595=0 ; //12脚_nop_() ;_nop_() ;RCK_595=1 ; //上升沿将数据送到输出锁存器, 12脚_nop_() ;_nop_() ;_nop_() ;RCK_595=0 ;// 12脚}/*主程序 */main(){SCLK_595=0 ;// 11脚RCK_595=1 ;// 12脚while(1){uchar i ;for (i=0;i<6;i++){temp=DAT[i] ; //取显示数据WR_595() ;OUT_595() ;delay(20) ;}}}。
2个74HC595级联点亮16个LED灯总结 湖北工业大学 王晨
2个74HC595级联点亮16个LED灯总结一、芯片介绍74HC595是一个串行输入,串行或者并行输出的芯片,利用这个芯片可以节省单片机的I/O口,最少可以用3个I/O口就可控制n个级联的芯片,其管脚图如图一所示。
图一.74HC595管脚图每个管脚的作用符号引脚描述Q0…Q715,1,2.... 7并行数据输出(G为低电平时)QH’(Q7’)9串行数据输出(G对串行输出无影响)SCLR (MR)10主复位(低电平有效,对寄存器清零)SCK (SHcp)11寄存器时钟输入(上升沿有效,当数据从SER输入,给一个上升沿,数据进入寄存器)RCK(STcp)12锁存器时钟输入(上升沿有效,给一个上升沿,数据从寄存器进入锁存器)G (OE)13低电平时并行输出使能(对串行输出没有影响)SER (DS)14串行数据输入二、设计目标74HC595与单片机的P0接口相连,编程输入值。
使只用3个I/O口可以控制2个级联的74HC595控制16个LED中任意一个LED的亮灭。
三、工作原理3.1时序分析图二.时序图NC:没有改变.3.2串行输出与并行输出74HC595输出结构框图如图三所示;图三.串行输入,串行输出与并行输出结构框图图三简化为如下所示:数据寄存器锁存器四、芯片级联如果要用595的级联,把一个芯片的串行输出端口(QH’)连上下一个芯片的串行数据输入端口(SER ),如图四所示。
并行输出串行输出SCK ↑RCK ↑G 低电平在SCK第九个上升沿数据开始从QH’输出,如此循环,可以连接无数个;数据全部输入完后,给RCK一个上升沿,寄存器的数据全部进入锁存器,此时,如果G为低电平,数据从并口(Q0~Q7)输出扩展:如果要改变LED的亮度,改变G的占空比即可(利用人眼视觉的停滞效应)。
图四.级联接法单片机分别控制SER(数据输入),SCK(寄存器时钟输入),RCK(锁存器时钟输入),G直接连接GND(让并行输出使能),SCLR直接接VCC(可以用软件在使用寄存器之前清零,在以后的使用就不需要清零了)原理图需要注意的地方:SER,SCK,RCK加上一个上拉电阻,原因是单片机的驱动电流不够。
74HC595与数码管
第十九篇 74HC595与数码管2011-03-08 15:07第十九篇 74HC595与数先引用一句官方语:“74HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
长话短说,它的功能是8位串行输入并行输出移位寄存器,也就是串行转并行。
下图是封装图:74HC595内部有两个寄存器:8位移位寄存器和8为存储寄存器,下面要PROTEUS做下各个引脚的调试一下可以看出:DS为串行数据输入口;SH_CP为串行时钟输入口,SH_CP每个上升沿到来时,芯片内部的移位寄存高位移出丢失,次高位成为最高位,并在Q7'体现出来(根据Q7'可以看出,74HC595也有串行输寄存器的值输出到存储寄存器,存储寄存器直接和引脚Q0~Q7相连,所以存储寄存器的值会直接反行功能;OE是输出使能,高电平时Q0~Q7为高阻态,低电平时Q0~Q7为存储寄存器的值;MR为低时无效;VCC接电源;GND接地。
好了,所有引脚介绍完了。
有的封装图引脚名字不太一样,功能下面用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),为了减少连线U1的DS),这样连续向U2的DS写两个字节(第一个是要显示的数字,第二个是位选),就可以连SH_CP,P0.6连DS,P0.7连P0.7ST_CP)就可以操作此四连共阴数码管(注意是共阴,不是上篇示的数字”和“位选”取反即可)。
如下图:这个实验测试下://*********************************************************************************** //功能:LPC2103利用两片74HC595操作四位共阴数码管//说明://用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),//为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写//两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。
单片机和74HC595驱动芯片对数码管的控制设计
单片机和74HC595驱动芯片对数码管的控制设计1. 数码管显示设计本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口。
74HC595部分电路图如下:与单片机相连接的三个脚分别为:HC_DAT,HC_RCK,HC_CLK。
两片595采用级联方式,即U2的第9脚接到U3的第14引脚。
2. 74HC595简介74HC595是8位的移位寄存器,串入并出,并具有锁存功能,被广泛的用于数码管、点阵的驱动电路中。
其管脚介绍如下:15:数据输出A-接数码管数据A段;1:数据输出B-接数码管数据B段;2:数据输出C-接数码管数据C段;3:数据输出D-接数码管数据D段;4:数据输出E-接数码管数据E段;5:数据输出F-接数码管数据F段;6:数据输出G-接数码管数据G段;7:数据输出H-接数码管数据H段;16:电源正脚-接电源正;8:电源负脚-接电源负;14:数据输入脚-接单片机管脚;12:数据锁存时钟-接单片机管脚;11:数据输入时钟-接单片机管脚;13:使能输出脚-低电平有效,接低电平;10:数据清零-不清零,接高电平;9:数据级联输出-接下一片595的数据输入脚;74HC595的真值表如下:知道了74HC595的引脚定义和真值表,那该如何编程呢?下面重点来了,通过时序图来编程。
看重点!!!3. 74HC595时序图我是重点!我是重点!我是重点!通过时序可以看出:SCK是上升沿的时候要把数据写入;RCK是上升沿的时候数据才能锁存显示;有数据操作的过程中RESET必须是高电平;EN必须是低电平,595才能工作;知道了以上4点就可以写程序了。
其中3、4条是硬件连接上的事情(也可以用单片机的IO口来连接,这样的话可以随时控制74HC595的工作与否情况)。
写程序主要靠1、2条。
下面具体操作。
4. 程序实例看下面一段程序:第39行:HC595_CLK(0)的原型如下:HC595_CLK(0)是让CLK处于低电平,即上升沿还没有来到;HC595_DAT(1)就是要把写入的数据准备好;temp《《1是将数据移位,即一个字节分八次写入;HC595_CLK(1)是让CLK处于高电平,即上升沿来了;以上几句解释一下就是:在CLK时钟上升沿来临之前把要写入的数据准备好,等上升沿来了就把准备好的数据写入。
74HC595级联问题
一次调试公司新改的单片机板,用3个74HC595级联驱动24个LED灯(见下图)发现每当驱动信号跨过第一个芯片时,LED灯就会出错乱闪,当时以为是程序问题但是参考了原来老板子程序,在LED灯驱动方面程序并没有改动。
于是找了块老板子调试发现原来的板子也存在同样问题,不知道原来的板子是没人发现问题还是没找到办法解决?(呵呵!公司内部的事情在此就不讨论了)既然发现了问题作为一个技术人员当然就不能置之不理啦!于是偶就打开了百度输入74HC595级联问题,发现74HC595级联还真是问题网上也有不少人反映遇到过同样的问题,有用来驱动数码管的有用来驱动LED显示屏的都说级联后会乱闪,有说法是干扰引起的得在芯片电源脚加滤波电容,看看我的板子每个芯片电源脚都加了滤波电容啊!应该不是干扰引起的。
再看一贴说是单片机驱动电流不够的原因得加上拉电阻,说用示波器看RCK和SCK的信号,上升沿时是爬行上升的,单片机驱动电流不够导致输入时钟信号失真,有可能-看看自己的板子DATA、RCK、SCK管脚均没加上拉电阻,于是加了个10K的上拉电阻再调-不行,换个5K的再调-还不行,再换个1K的再调-OK!:-)驱动信号跨芯片时LED灯再也不会乱闪了,至此LED灯乱闪问题得到圆满解决,剩下的就是改PCB图加上拉电阻了。
回头来总结一下,74HC595级联理论上来说并没有问题,但实际应用过程中往往会遇到驱动能力、时延等问题,正验证了“实践才是检验真理的唯一标准”。
书本上的知识终究只是纸上谈兵没经过实践的检验终究是行不通的。
以后在设计单片机系统时一定要考虑单片机管脚的驱动能力,能避免设计过程中产生许多莫名奇妙的问题。
新手第一次发帖参与请高手多包涵啊!发得有点迟但我想迟到总比不到好但愿版主能够看到。
“一个苹果交换一个苹果,每个人还是只有一个苹果。
而如果一个思想去交换另一个思想,则就可以获得两个思想。
” 但愿大家都能够得到两个思想o(∩_∩)o...。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
两片74HC595级联驱动两个四连体数码管
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
我的硬件连接:用级联方式连接!
工作顺序:单片机先送1个8位数据到第一个595的内部移位寄存器->然后数据会送到内部的输出寄存器->输出
当MR(10引脚)为高电平,OE(13引脚)为低电平时,数据在SH CP上升沿进入移位寄存器,在ST CP上升沿输出到并行端口。
可能这还不太好理解,没关系,咱去程序应用中理解!
请看一个简单的程序:
sbit SDA1 = P0^0; //串行数据输入,对应595的14脚SER
sbit SCL1 = P0^1; //移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2 = P0^2; //存储寄存器时钟输入,对应595的12脚RCK
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0 1 2 3 4 5 6 7 8 9
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay2ms(void)
{
unsigned char i,j;
for(i=133;i>0;i--)
for(j=6;j>0;j--);
}
void 595_in(unsigned char Data)
{
unsigned char i;
for(i = 0; i < 8; i++) //循环8次,刚好移完8位
{
SCL1 = 0; //先将移位寄存器控制引脚置为低
_nop_();
if((Data & 0x80)== 0x80)
SDA1 =1;
else
SDA1 =0;
Data <<= 1; //将数据的次高位移到最高位
SCL1 = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位_nop_();
}
}
void 595_out(void)
{
SCL2 = 0; //先将存储寄存器引脚置为低
_nop_();
SCL2 = 1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
}
void main(void)
{
unsigned char i;
for(i=0;i<8;i++) //有八位数码管,八位依次扫描
{
595_in(wei[i]); //先传位码
595_in(duan[i]); //再传段码
595_out();
delay2ms(); //延迟时间2ms以内
}
}
注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小些。
74595的主要优点是具有数据存储寄存器,在移位过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用,数码管没有闪烁感。
与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。