两片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;}}}}}}}}}}。
- 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还多有输出端时能/禁止控制端,可以使输出为高阻态。