两个74HC595驱动8位数码管
移位寄存器74hc595控制8位数码管
一不用单片机串口电路原理图:C程序:#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit QS=P2^0; // 串行数据输入端sbit shuchu=P2^1; // 存储寄存器脉冲输入sbit yiwei=P2^2; // 移位寄存器脉冲输入sbit Q1=P2^3; //38译码器输入选择sbit Q2=P2^4;sbit Q3=P2^5;uchar shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void wei(uchar z) //数码管位选择{Q1=z&0x01;Q2=(z>>1)&0x01;Q3=(z>>2)&0x01;}void display(){uchar i,j,temp;for(i=0;i<8;i++){wei(i);temp=shuma[i];for(j=0;j<8;j++){QS=temp&0x80;yiwei=0;yiwei=1;temp=temp<<1;}shuchu=0;shuchu=1;delay(2);for(j=0;j<8;j++) //消影{QS=1;yiwei=0;yiwei=1;}}}void main(){while(1){display();}}二用单片机串口(P3^0和P3^1)电路原理图:C程序:#include<REG51.H>#define uint unsigned int#define uchar unsigned char//sbit QS=P3^0; // 串行数据输入端sbit shuchu=P3^2; // 存储寄存器脉冲输入//sbit yiwei=P3^1; // 移位寄存器脉冲输入sbit Q1=P3^3; //38译码器输入选择sbit Q2=P3^4;sbit Q3=P3^5;uchar shuma[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*由于串口发送是由低向高发送,所以得把数码从高低位调换如‘0’码为0xco 11000000换为00000011 0x03*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void wei(uchar z) //数码管位选择{Q1=z&0x01;Q2=(z>>1)&0x01;Q3=(z>>2)&0x01;}void display(){uchar i;for(i=0;i<8;i++){wei(i); //选择数码管位SBUF=shuma[i]; //向串口缓冲寄存器中存入数据while(!TI); //等待发送完成TI=0; //清楚发送完成标志shuchu=0; //输出shuchu=1;delay(2);SBUF=0xff; //消影while(!TI);TI=0;}}void main(){/*单片机上电后默认为串口方式0,所以不需要设置串口模式*/ // EA=1; //开总中断// ES=1; //开串口中断// IE=0x90;/*SM0=0; //选择串行工作模式0SM1=0;*/// TCON=0x00;// TI=0;while(1){display();}}。
八位数码管显示板相关资料
八位数码管显示板相关资料74hc595是8位串行输入转并行输出移位寄存器。
驱动电流为35mA。
Q0—Q7: 八位并行输出端,可以直接控制数码管的8个段。
Q7': 级联输出端。
可以将它接下一个595的DS端。
DS: 串行数据输入端。
74595的控制端说明:/MR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SHCP(11脚):上升沿时数据按Q0-->Q1-->Q2-->...-->Q7-->Q7’移位到移位寄存器,下降沿移位寄存器数据不变。
使用的时候一般需要延时(脉冲宽度:5V 时,大于几十纳秒就行了。
我通常都选微秒级)。
STCP(12脚):上升沿时移位寄存器内的数据输出到数据存储寄存器(即并行显示数据),下降沿时存储寄存器数据不变。
(通常我将其置为低电平,) 当移位结束后,在STCP端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/OE(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
具体的实现方法如下:一:串行输入,串行输出;说明:1)DS输入一个字节的数据,字节的每个位都依次在Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q7’端口显示。
2)STCP和SHCP同时产生上升沿脉冲来实现。
程序如下:void 595—spi_scend(uchar date){uchar i,date595; //定义变量delay_us(10); // 准备读取数值OE =0;STCP=0;SHCP=0;for(i=0;i<8;i++) //循环9次用于完成所有的数据从低到高移位 {date595=date&1; //去要传输的数据的最低位if(date595) //判断数值的逻辑{SHCP=1; //设置位高电平上升沿开始移位DS=1; //传输高电平}else{SHCP=1; //设置位高电平上升沿开始移位DS=0; //传输低电平}date595=date&1<<i;STCP=1;}}二:串行输入,并行输出;(用于595的级联输出)说明:1),DS输入一个字节的数据,循环8次,SHCP产生8次上升沿后STCP产生上升沿,是数据更新2),若595级联需要输出N个字节,则循环8*N次后STCP产生上升沿,是数据更新程序如下:void HC595_write_to_shift(uchar date) //把数据写入HC595的移位寄存器{uchar date595,i;date595=date;for(i=0;i<8;i++){DS=date595&1<<i;SHCP=1;delay_us(2);SHCP=0;}}void H_595scend_out() //把移位寄存器的数据输出到存储寄存器用来显示{STCP=1;delay_us(2);STCP=0;}void H_595scend_display( ){uchar a ,b=0,k=0;;for(a=0;a<8;a++){HC595_write_to_shift(0); //禁止右半部分点亮HC595_write_to_shift(~code[a+16]);HC595_write_to_shift(line[a]);HC595_write_to_shift(~code[a]);H_595scend_out();}for(b=0;b<8;b++){HC595_write_to_shift(0); //禁止右半部分点亮HC595_write_to_shift(~code[b+8]);H_595scend_out();}}DS1302时钟芯片使用启发资料时序图:功能图:参考程序:#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar led [10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x90}; //数码管显示0-9的字节uchar postion [6]={0x01,0x02,0x04,0x08,0x10,0x20}; // 数码管的为控制字节uchar timer[3]; // 时间的数组uchar disbruff[6]; // 保存每个数码管要显示的字节/**************************************************************************** 延时函数****************************************************************************/ void delay_ms(uchar n){unsigned int i,j,k;for(i=0;i<n;i++){for(k=0;k<4;k++){for(j=0;j<10;j++);}}}/************************************************************************** 将要显示的时间数据经过timer——to——disbruff转换到disbruff[]内**************************************************************************/ void timer_to_disbruff(){uchar i,A=0; //A=0 importmentfor(i=0;i<3;i++){disbruff[A++]=timer[i]%10; //取数据的各位disbruff[A++]=timer[i]/10 ; // 取数据的十位}}/**************************************************************************DS1302专用**************************************************************************/sbit sclk = P1^2; /*实时时钟时钟线引脚*/sbit io = P1^1; /*实时时钟数据线引脚*/sbit rst = P1^0; /*实时时钟复位线引脚*/bdata uchar date_bruff;sbit flag0=date_bruff^0;sbit flag7=date_bruff^7;uchar bcd_bruff[8];/*************************************************************************** 字节传送功能:上升沿传送一个数据位的最低位用途:用于字节的传送****************************************************************************/ void inputbety (uchar ucdate){uchar i;date_bruff=ucdate; // 将要传送的数据赋值给date_brufffor(i=0;i<8;i++) // 循环8次按位传送一个字节{io=flag0; // 将最低位赋值给iosclk=1; // 触发上升沿传送一个位sclk=0; // sclk变低准备下一个上升沿date_bruff=date_bruff>>1;//数据移位将依次右移一位,依次传送0,1,2,3,4,5,6,7}}/*************************************************************************** 字节的读取功能:上升沿读取一个数据的最低位用途:用于读取字节***************************************************************************/ uchar outputbety(){uchar j;for(j=0;j<8;j++){date_bruff=date_bruff>>1; //先右移一位准备接受读取的数据位flag7=io; //把读取的数据赋值给date_bruff的第7位sclk=1; //触发上升沿肚脐眼一个位sclk=0; // 变低准备下一个上升沿}return date_bruff; //返回读取的数据}/****************************************************************************地址字节和数据的传送功能:调用inputbety();先写地址,紧接着写地址内的数据用途:配置DS1302的内部寄存器****************************************************************************/ void wdate(uchar addr, uchar date){rst=0; //变低为sclk变低允许sclk=0; // 变低准备上升沿rst=1; // 使能对ds1302进行操作inputbety(addr); //写入地址inputbety(date); //写入数据sclk=1;rst=0;}/*************************************************************************** 数据的读取功能:写写入要读取数据的地址和指令;然后调用output()用途:用于读取ds1302的实时时间***************************************************************************/uchar rdate(uchar addrx){uchar readdate;rst=0;sclk=0;rst=1;inputbety(addrx);//写入控制命令的字节和数据readdate=outputbety(); // 读取数据sclk=1;rst=0;return readdate; // 返回数据}void initial_ds1302(void) //时钟芯片初始化{unsigned char second=rdate(0x80);if(second&0x80) //判断时钟芯片是否关闭{wdate(0x8e,0x00); //写入允许wdate(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:56 wdate(0x88,0x07);wdate(0x86,0x15);wdate(0x8a,0x07);wdate(0x84,0x15);wdate(0x82,0x52);wdate(0x80,0x55);wdate(0x8e,0x80); //禁止写入}}void readds1302() //读取数据的BCD{uchar i;for(i=0;i<7;i++){bcd_bruff[i]=rdate(0x81+2*i);// 依次读取数据存储在bcd_bruff数组内}}/****************************************************************************** ****将读取的BCD吗转换成能在数码管上显示的数据******************************************************************************/ void bcd_to_timer(){uchar k;for(k=0;k<3;k++){timer[k]=((bcd_bruff[k]&0xf0)>>4)*10 + (bcd_bruff[k]&0x0f) ;}}/****************************************************************************** *数码管的动态显示函数******************************************************************************* /void display(){uchar i;for(i=0;i<6;i++){P2=led[disbruff[i]];P3=postion[i];delay_ms(5);}}/****************************************************************************** **主函数******************************************************************************* /void main(){timer[0]=0;timer[1]=0;timer[2]=0;timer_to_disbruff();initial_ds1302();while(1){readds1302();bcd_to_timer();timer_to_disbruff();display();};}。
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引脚图时序图工作原理74HC595和74hc164一样是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片,使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个数码管的引脚,他还具有一定的驱动能力,可以免掉三极管等放大电路,所以这块芯片是驱动数码管的神器.应用非常广泛。
74HC595引脚图74HC595管脚功能下面我来介绍一下74HC595工作原理:74HC595的数据端:QA--QH:八位并行输出端,可以直接控制数码管的8个段。
QH':级联输出端。
我将它接下一个595的SI端。
SI:串行数据输入端。
74hc595的控制端说明:/SCLR(10脚):低电平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。
QA--QB--QC--...--QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)控制移位寄存器SCK上升沿数据移位SCK下降沿数据保持RCK(12脚):上升沿时移位寄存器的数据进入存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
控制存储寄存器RCK上升沿移位寄存器的数据进入存储寄存器RCK下降沿存储寄存器数据不变/G(13脚):高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
74HC5958位串行输入转并行输出移位寄存器
74HC5958位串行输入转并行输出移位寄存器74HC595中文资料74LS595应用封装图PDF结合引脚说明就能很快理解595 的工作情况74LS595, 74HC595引脚图,管脚图QB--|1 16|--VccQC--|2 15|--QAQD--|3 14|--SIQE--|4 13|--/GQF--|5 12|--RCKQG--|6 11|--SRCKQH--|7 10|--/SRCLRGND- |8 9|--QH'74595 的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8 个段。
QH': 级联输出端。
我将它接下一个595 的SI 端。
SI: 串行数据输入端。
74595 的控制端说明:/SRCLR(10 脚): 低点平时将移位寄存器的数据清零。
通常将它接Vcc。
SRCK(11脚):上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH ;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了,通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
(通常将RCK置为低电平,)当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13 脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注:1) 74164 和74595 功能相仿,都是8 位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小14脚封装,体积也小一些。
2) 74595 的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
3) 595 是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。
数码管显示-74HC595动态扫描
输出第8位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第8位将显示,其它位全部都不显示。
延时一段时间。
如此循环往复,实现8位数码管显示的效果。
四、操作步骤:(1)按照IAR MSP430 项目建立与JTAG仿真设置所讲方法建立名称为M13x LED 595的项目。
(2)将如下程序拷贝粘贴到main.c文件中。
//*******************************************************************************//// 描述; 在TY-DIS1(8位数码管显示模块)上动态扫描显示 4321// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年10月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//******************************************************************************#include <msp430x13x.h>//4位LED数码管显示子程序void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//74HC595串行输出子程序void Led_out(unsigned char X);//LED数码管段码转换表const unsigned char LED_0_F[];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogP5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口//将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT0;P5DIR |= BIT2;P5DIR |= BIT4;for (;;){LED_595(4,3,2,1);//调用显示子程序(改变参数表,改变显示内容)}}//------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//void Led_out(unsigned char X){unsigned char i;。
单片机和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:数据清零-不清零,接高电平;。
AVR单片机595驱动8位数码管的显示的电路实现
A VR单片机595驱动数码管显示一、电路实现8位数码管的电路如下图所示数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数码管和八段数码管(还有一种“米”字型的数码管,其段数更多),八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。
数码管的分类:按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。
数码管段、位引脚的确定(以4位8段数码管为例),我们在实际应用中购买的数码管不像电阻、电容、集成等元件那样有数据手册或者直接在元件上标明管脚序号和用途,并且市场上数码管的管脚排列顺序并不是一致的,所以我们购买回来的数码管一般都要亲自测量一下各个引脚的用途,怎么测量呢?数码管引脚测量分三步:极性判断(共阳极还是共阴极)、公共端判断(位选端口)、段码端判断(段选端口)。
首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。
将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的某一段是否会点亮,如果全部引脚试过都没有亮的,那么将电源正极(串电阻)换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极(串电阻)逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。
使用SPI接口的74HC595控制 8位数码管显示
$swstack = 10
$framesize = 40
Const On = 1
Const Off = 0
Dim I As Byte
Dim A(3) As Byte
Latch Alias Portb.1
Config Spi = Soft , Dout = Portb.3 , Ss = None , Clock = Portb.5
// 74HC595/165驱动程序
//(16ቤተ መጻሕፍቲ ባይዱ,595均为两片)
//*******************************************
unsigned int LED;
unsigned int KEY_DATA;
void Driver_595(unsigned char Bit,unsigned char State)
Latch = Off '使能显示
Waitus 10
Latch = On
Do
Loop
End
'********************************************************************
'--------------------------专用字形表------------------------------------------
{
DDRB=0xff;
PORTB=0x00;
}
//****************************************************************
void Driver_165(void) //Bite所取位0~15,State为改位的状态0,1
74hc595级联工作原理
74hc595级联工作原理74HC595是一种级联式移位寄存器,常用于扩展单片机的输出端口。
其工作原理是通过串行输入、并行输出的方式,实现对多个输出口的控制。
我们来了解一下74HC595的基本结构。
它由一个移位寄存器和一个存储寄存器组成。
移位寄存器由8个D触发器构成,可以实现8位二进制数据的移位操作。
存储寄存器用于存储移位寄存器中的数据,并将其输出到8个输出端口。
在74HC595级联的应用中,我们可以将多个74HC595连接在一起,通过级联的方式扩展输出端口数量。
具体连接方式是将一个74HC595的Q7'输出端口连接到下一个74HC595的串行输入端口(SER)。
这样,通过一个时钟信号(SCK)和一个锁存信号(RCK),我们可以将数据从一个74HC595移位到下一个74HC595,并最终输出到扩展的输出端口。
在级联的过程中,需要注意的是,第一个74HC595的串行输入端口(SER)连接到单片机的输出端口,而最后一个74HC595的输出端口则连接到外部设备。
通过移位操作,我们可以将数据从单片机传输到扩展的输出端口,实现对外部设备的控制。
在控制过程中,我们可以通过时钟信号(SCK)来控制数据的移位操作。
当时钟信号的上升沿到来时,数据从一个74HC595移位到下一个74HC595。
而锁存信号(RCK)则用于控制数据的输出。
当锁存信号的上升沿到来时,数据被锁存到存储寄存器中,并同时输出到扩展的输出端口。
在使用74HC595级联时,我们可以通过编程的方式来控制数据的移位和输出。
通过设置串行输入端口(SER)的高低电平,我们可以将相应的数据送入移位寄存器。
然后,通过时钟信号和锁存信号的控制,将数据移位并输出到扩展的输出端口。
需要注意的是,由于74HC595是级联式移位寄存器,数据的传输是串行的,因此在控制过程中需要按照正确的顺序传输数据。
如果顺序出错,将会导致输出端口的控制错误。
总结一下,74HC595级联工作的基本原理是通过串行输入、并行输出的方式,实现对多个输出端口的控制。
用 74hc138 和 74hc595 驱动 8x8 点阵显示
用74hc138 和74hc595 驱动8x8 点阵显示用STC89C52,74hc138 驱动列,74hc595 驱动行,8x8 点阵显示问题。
想显示箭头,......。
悬赏分:30 解决时间:2010-12-10 08:58//=============================================最佳答案:题目给出的程序基本结构是正确的,稍有瑕疵,HC138 的使能没有打开,关键是消隐做的不够好,导致余辉重叠,显示比较模糊。
经过调整,可以正常工作了,显示箭头和桃心的仿真画面如下。
调试成功的程序如下://=============================================#include#define uint unsigned int#define uchar unsigned charsbit H_shcp = P1;//HC595 芯片sbit H_stcp = P1;sb it H_oe = P1 ;sbit H_ds = P1;sb it HC138_G = P3;//HC138 芯片uchar data_j[] = {0x00,0x00,0x18,0x3c,0x5a,0x18,0x18,0x00}; //箭头uchar data_t[] = {0x00,0x66,0x99,0x81,0x81,0x42,0x24,0x18}; //桃心//----------------------- -------------------------------------------void delaxms(uint xms){ uint i, j; for(i = xms; i > 0; i--) for(j = 118; j > 0; j--);}//------------------------------------------------------------------ void sendbyte_H(uchar aa) //利用HC595 输出{ uchar z; for(z = 0; z >= 1; //右移一位} H_stcp = 0; H_stcp = 1; //上升沿使数据并行输出}//------------------------------------------------------------------void main(){ uint i, r; while(1) { for(r = 30; r > 0; r--) { //显示箭头for(i = 0; i 0; r--) { //显示空白for(i = 0; i 0; r--) { //显示桃心for(i =0; i 0; r--) { //显示空白for(i = 0; i tips:感谢大家的阅读,本文由我司收集整编。
用74HC595和138实现8位数码管秒表,这是我和好友写的共同
LJMP MAIN
ORG 000BH
LJMP INT_0
ORG 0013H
LJMP INT_1;外部中断1的程序入口
DISP EQU 70H;70H到77H里存的是要显示的8个数
;移位寄存器接收数据
MOV 68H,R7
MOV 67H,DPH
MOV 66H,DPL
; 加毫秒
ADD_MS:
MOV R0,#DISP+7
MOV R7,#8
INCLOOP: ;有进位的话高位也累加
CJNE @R0,#10,LOOP5
MOV @R0,Hale Waihona Puke 0 DJNZ R6,DEL2
RET
MAIN:
MOV R3,#8
MOV R0,#70H
LOOP2:
MOV @R0,#10
INC R0
DJNZ R3,LOOP2
MOV TMOD,#01H ;T0工作方式1
MOV TH0,#0FCH
MOV TL0,#18H
SETB EA
CLR ET0
SETB EX1
SETB IT1
SETB PX1
CLR PT0
;循环显示
LOOP_START:
MOV R0,#DISP+7
MOV R7,#8
LOOP5:
INC @R0
CJNE @R0,#10,CLR_STACK
MOV @R0, #0H
DEC R0
DJNZ R7,INCLOOP
CLR_STACK:
;更新列表
; MOV R0,#74H
AVR单片机595驱动8位数码管的显示的电路实现
A VR单片机595驱动数码管显示一、电路实现8位数码管的电路如下图所示数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数码管和八段数码管(还有一种“米”字型的数码管,其段数更多),八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。
数码管的分类:按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。
数码管段、位引脚的确定(以4位8段数码管为例),我们在实际应用中购买的数码管不像电阻、电容、集成等元件那样有数据手册或者直接在元件上标明管脚序号和用途,并且市场上数码管的管脚排列顺序并不是一致的,所以我们购买回来的数码管一般都要亲自测量一下各个引脚的用途,怎么测量呢?数码管引脚测量分三步:极性判断(共阳极还是共阴极)、公共端判断(位选端口)、段码端判断(段选端口)。
首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。
将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的某一段是否会点亮,如果全部引脚试过都没有亮的,那么将电源正极(串电阻)换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极(串电阻)逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。
利用2片74HC595驱动8个数码管显示
/*---------------------------------------------*/ unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0 1 2 3 4 5 6 7 8 9
} 注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25m A)比74595(35mA)的要小,14脚封装,体积也小一些。 74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在 串行速度慢的场合很有用处,数码管没有闪烁感。 与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。
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++) { SCL1 = 0; //先将移位寄存器控制引脚置为低 //取数据的最高位 //将数据的次高位移到最高位 //再置为高,产生移位时钟上升沿,上升沿时数据寄存器 //循环8次,刚好移完8位
用两片74HC595驱动两个四连体数码管(共阳极,动态扫描) 首先介绍一下74HC595芯片:
两片74HC595级联驱动8个数码管
两片74HC595级联动态驱动8位数码管51单片机#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; //开定时器0xxET1 = 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从头开始计数,计数50msTL0= 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)。
{
uchar k;
TMOD|=0x01;
TH0=0XFC;
TL0=0X66; //定时器初始化
TR0=1;
EA=1;
ET0=1;
// IP=0X10;
CS_1302=0; //屏蔽1302的信号
for(k=0;k<8;k++)
/******************************************************************
/* *
/* 单片机开发系统演示程序 *
sbit CS_1302 =P1^4; //ds1302片选
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管编码(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F)(共阴极数码管)
sbit SCLK_595 =P1^6; //移位时钟脉冲 ---接板卡上的SPO
sbit RCK_595 =P1^7; //输出锁存器控制脉冲 ----接板卡上SPK
sbit CS_LED8 =P1^1; //数码管片选 --------接板卡上的CS
*******************************************************/
void display()
{
uchar num,c,i;
for(i=0;i<8;i++)
{
num=dis[i];
CS_LED8=0;
for(c=0;c<8;c++) //写入显示数据
*******************************************************/
void timer0(void) interrupt 1
{
TH0=0XFC;
TL0=0X66;
display();
}
/*******************************************************
* 延时函数 *
* *
*******************************************************/
* *
* 显示函数 *
* *
uchar dis[8]; //显示缓冲区
void delay(uint );
void display();
/*******************************************************
* *
/* *
/* *
/******************************************************************/
* 主函数 *
* *
*******************************************************/
{
SCLK_595=0;
num=num<<1;
SDATA_595=CY;
SCLK_595=1;
SCLK_595=0;
}
num=~(1<<i);
for(c=0;c<8;c++) //写入数码管序号
{
SCLK_595=0;
{
dis[k]=table[k]; //将显示内容送入显示缓冲区
}
while(1);
} //end of main()
num=num<<1;
SDATA_595=CY;
SCLK_595=1;
SCLK_595=0;
}
RCK_595=0;
_nop_(); //短延时
_nop_();
RCK_595=1;
_nop_();
_nop_();
RCK_595=0; //显示数据输出
delay(1);
CS_LED8=1;
}
}
/*******************************************************
* *
* *
* 定时中断函数 *
* *
void delay(uint dt)
{
uint i;
uchar bt;
for(i=0;i<dt;i++)
for(bt=0;bt<200;bt++);
}
/*******************************************************
#include <reg52.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时e uchar unsigned char
#define uint unsigned int
sbit SDATA_595=P1^5; //串行数据输入 ----接板卡上的SPI