74hc595驱动问题
74HC595详解

74HC595 详解
工作电压2-6V,推荐5V。
14 脚串行输入:595 的数据来源只有这一个口,一次只能输入一个位,那
幺连续输入8 次,就可以积攒为一个字节了。
13 脚OE 输出使能控制脚:如果它不工作,那幺595 的输出就是高阻态,595 就不受我们程序控制了,这显然违背我们的意愿。
OE 的上面画了一条线,表示他是低电平有效。
于是我们将他接GND。
10 脚SRCLR 位移寄存器清空脚:他的作用就是将位移寄存器中的数据
全部清空,这个很少用到,所以我们一般不让他起作用,也是低电平有效,于是我们给他接VCC。
12 脚RCLK 存储寄存器:数据从位移寄存器转移到存储寄存器,也是需要
时钟脉冲驱动的,这就是12 脚的作用。
它也是上升沿有效。
11 脚SRCLK 移位寄存器时钟输入:当一个新的位数据要进来时,已经进
入的位数据就在移位寄存器时钟脉冲的控制下,整体后移,让出位置。
分析下数据输入和输出过程:
假如,我们要将二进制数据0111 1111 输入到595 的移位寄存器中,下面。
51单片机+74HC595驱动数码管程序

51单片机+74HC595驱动数码管程序这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595=P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}voidled_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。
74HC595驱动两个7段数码管

一个程序输出正好要用两个BCD数码管显示P0的读出数据,不巧手头只有单个的这种共阳极7段数码管。
于是用两片74HC595驱动了这两个数码管,达到显示数据的目的。
网上的很多程序都是74HC595驱动多位数码管的,如果要驱动这样比较“原始”的单个数码管,只好自己参考了一些程序,改写了程序,仿真以及实践成功。
本程序简单修改也可以用在其他74HC595电路以及7段数码管驱动等应用上。
Proteus仿真画面如下:源程序如下:#include<reg51.h> //51头文件#include<intrins.h>//“空指令”头文件sbit H_SH=P3^0;sbit H_DS=P3^1;sbit H_ST=P3^2; //H 管脚定义sbit L_SH=P3^3;sbit L_DS=P3^4;sbit L_ST=P3^5; //L 管脚定义int num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管,先显示A~H各段,确认各段电路是否正常,然后显示0~F。
// int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管的编码//-----延时子程序------void delay(int i) //延时大小与i有关{int j;while(i--)for(j=255;j>0;j--);}//-----LED显示子程序------void led(){static int j=0;int i;for(i=0;i<8;i++){H_DS=(num[j]<<i)&0x80;//位//shcp=0;H_SH=0;_nop_();_nop_();H_SH=1; //上升沿有效}//stcp=0;H_ST=0;_nop_();_nop_();H_ST=1; //上升沿有效j++;if(j==24)j=0; //满24后,从新计次}void led1(){static int j=0;int i;for(i=0;i<8;i++){L_DS=(num[j]<<i)&0x80;//位L_SH=0;_nop_();_nop_();L_SH=1; //上升沿有效}L_ST=0;_nop_();_nop_();L_ST=1; //上升沿有效j++;if(j==24)j=0; //满24后,从新计次}//---主程序-------void main(){while(1) //循环{led();delay(100);led1();delay(100);}}。
74HC595驱动程序 测试可用

74HC驱动程序#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit SDA = P1^0;sbit SHIFT_CP = P1^1;sbit ST_CP = P1^2;#define NOP _nop_()uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void disp(uint var,uchar rol,uchar pot); void InitSerialPort(void){SDA = 0;SHIFT_CP = 0;ST_CP = 0;}void SerialSendData(uint dat){uchar ii;uint sdata=dat;for(ii=0;ii<16;ii++){if(sdata&0x8000)SDA=1;else SDA = 0;sdata<<=1;SHIFT_CP =0;NOP;NOP;SHIFT_CP = 1;NOP;NOP;}ST_CP = 1;NOP;NOP;ST_CP = 0;}void disp(uint var,uchar rol,uchar pot) {unsigned int dx;uchar a=var/1000;uchar b=(var%1000)/100;uchar c=(var%100)/10;uchar d=var%10;if(rol==0){InitSerialPort();dx=wei[0];if(pot==0){dx=((dx<<8)|duan[a]&0x7f);}else{dx=((dx<<8)|duan[a]);}SerialSendData(dx);dx=wei[1];if(pot==1){dx=((dx<<8)|duan[b]&0x7f);}else{dx=((dx<<8)|duan[b]);}SerialSendData(dx);dx=wei[2];if(pot==2){dx=((dx<<8)|duan[c]&0x7f);}else{}SerialSendData(dx);dx=wei[3];if(pot==3){dx=((dx<<8)|duan[d]&0x7f);}else{dx=((dx<<8)|duan[d]);}SerialSendData(dx);}else if(rol==1){InitSerialPort();dx=wei[4];if(pot==0){dx=((dx<<8)|duan[a]&0x7f);}else{dx=((dx<<8)|duan[a]);}SerialSendData(dx);dx=wei[5];if(pot==1){dx=((dx<<8)|duan[b]&0x7f);}else{dx=((dx<<8)|duan[b]);}SerialSendData(dx);dx=wei[6];if(pot==2){dx=((dx<<8)|duan[c]&0x7f);}else{}SerialSendData(dx);dx=wei[7];if(pot==3){dx=((dx<<8)|duan[d]&0x7f);}else{dx=((dx<<8)|duan[d]);}SerialSendData(dx);}}void main(){while(1){disp(1234,0,0);disp(5678,1,0);}}。
如何控制74hc595驱动led产生灰度等级

如何控制74hc595驱动led产生灰度等级如何控制74hc595驱动led产生灰度等级问:平常我们用595来驱动led的话要么亮,要么灭,灰度怎么产生呢?整体的灰度倒是很好控制。
直接将数据送号,然后用一个pwm波形控制oe脚就可以了,但是如果要产生一个每个点都好像是有灰度,每个点的灰度值都不同改怎么处理呢?市面上我见过一种灯饰控制器,七彩的流水效果,各个颜色之间是过渡色,并不是突兀的直接变化,比如大屏幕它们的灰度是怎么控制的呢?----------------------------------------------------------------------------------------------------------------------------------------- 答:我本来不想说的,因为以前有人说过现在LED的资料漫天飞,没什么行业秘密16个灰度,也就是 0--15,用4个BIT来表示, 8-4-2-1用PWM产生4个联系不同占空比的脉冲T8 8/16 对应BIT8T4 4/16 对应BIT4T2 2/16 对应BIT2T1 1/16 对应BIT18/16表示的是把PWM的周期划分为16份,其中量的周期占8份,其他雷同当这4个脉冲运行后,由于人的生理特点。
也会出现需他的灰度;同上面的方法比较,它需要4次个周期人眼才能感觉出灰度;但是对PWM的要求就很低;比如256种灰度,不过送8次,1024也不过要10次大大减低了对硬件的要求,现在基本都是使用这种方法;在一个595上+出现不同的灰度,就必须结合上面说的东东;把一个灰度分解成4帧例如灰度9: 1001T8 8/16 对应BIT8T4 不亮对应BIT4T2 不亮对应BIT2T1 1/16 对应BIT1所以我们的各个灰度分解为4帧,送4次都595,就可以了例如在1个595上出现下面不同灰度的4个点,(就以4个点举例,)4个点的灰度3,12,10,7转化为BIN码0011 1100 1010 0111把8-4-2-1码分割出来,得到独立的4帧BIT80 1 1 0BIT40 1 0 1BIT21 0 1 1BIT11 0 0 1步骤:1.把BIT8的数据送到595,用PWM控制OE的脉冲为T82.把BIT4的数据送到595,用PWM控制OE的脉冲为T43.把BIT2的数据送到595,用PWM控制OE的脉冲为T24.把BIT1的数据送到595,用PWM控制OE的脉冲为T1经过4帧的时间叠加后,就得到不同的灰度。
51单片机控制74HC595驱动的编程要点

51单片机控制74HC595驱动的编程要点51单片机编程要点51单片机控制74HC595驱动的编程要点:74595外形图______QB--|1 16|--VccQC--|2 15|--QAQD--|3 14|--SIQE--|4 13|--/GQF--|5 12|--RCKQG--|6 11|--SCKQH--|7 10|--/SCLRGND-|8 9|--QH'|_____|74595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。
我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:/SCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(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芯片驱动数码管的工作原理

74hc595芯片驱动数码管的工作原理
74HC595 是一种串行输入、并行输出的移位寄存器芯片,常被用于驱动数码管、LED 等输出设备。
它的工作原理基于串行-并行转换和移位操作。
以下是使用74HC595 驱动数码管的基本工作原理:
一、串行输入:74HC595 芯片具有三个输入引脚,分别是:
DS(Data Input):串行数据输入
SHCP(Shift Register Clock Input):移位寄存器时钟输入
STCP(Storage Register Clock Input):存储寄存器时钟输入
通过串行数据输入引脚DS,可以将一个字节的数据(8位)串行输入到74HC595 中。
二、移位操作:在输入完一个字节数据后,通过向SHCP 引脚提供时钟信号,数据将从串行输入DS 移位到移位寄存器中。
三、并行输出:74HC595 还有8 个并行输出引脚,分别是Q0 到Q7。
这些输出引脚可以连接到数码管的段或LED 灯的正极。
通过向STCP 引脚提供时钟信号,移位寄存器中的数据会并行输出到存储寄存器中。
四、存储寄存器:存储寄存器中的数据在时钟信号到达STCP 时被锁存,此时数据会被保持在存储寄存器中,不再改变。
通过不断重复以上的移位和存储操作,可以将多个字节的数据依次输出到74HC595 的并行输出引脚,从而实现对多个数码管或LED 灯的控制。
总的来说,74HC595 通过串行输入、移位操作和并行输出的方式,实现了对大量输出设备的控制。
这种级联的方式可以有效地减少需要的引脚数量,适用于有限的GPIO 资源的情况。
移位寄存器芯片74HC595实现LED动、静态显示的基本原理

移位寄存器芯片74HC595实现LED动、静态显示的基本原理摘要:本文介绍了应用移位寄存器芯片74HC595实现LED动、静态显示的基本原理。
提出了一种用74HC595实现多位LED显示的新方法。
同时对该系统的硬件组成和软件实现作了详细说明。
实际应用表明,此方法连线简单方便,成本低廉,可用于24位LED或更多位LED显示。
关键词:LED 74HC595 动态显示静态显示1 引言单片机应用系统中使用的显示器主要有LED和LCD两种。
近年来也有用CRT显示的。
前者价格低廉,配置灵活,与单片机接口方便;后者可进行图形显示,但接口较复杂,成本也较高。
LED(Ling Emiting Diode)是发光二极管的缩写。
实际应用非常普遍的是八段LED显示器。
LED显示器在大型报时屏幕,银行利率显示,城市霓虹灯建设中,得到广泛应用。
在这些需要多位LED显示的场合,怎样实现系统稳定,价格低廉的显示,成为决定其成本的关键所在。
2 74HC595实现LED静、动态显示基本原理74HC595是美国国家半导体公司生产的通用移位寄存器芯片。
并行输出端具有输出锁存功能。
与单片机连接简单方便,只须三个I/O口即可。
而且通过芯片的Q7引脚和SER引脚,可以级联。
而且价格低廉,每片单价为1.5元左右.2.1 静态显示每位LED显示器段选线和74HC595的并行输出端相连,每一位可以独立显示(见图1)。
在同一时间里,每一位显示的字符可以各不相同(每一位由一个74HC595的并行输出口控制段选码)。
N位LED显示要求N个74HC595芯片及N+3条I/O口线,占用资源较多,而且成本较高。
这对于多位LED显示很不利。
2.2 动态显示在多位LED显示时,为了简化电路,降低成本,节省系统资源,将所有的N位段选码并联在一起,由一片74HC595控制(见图2)。
由于所有LED的段选码皆由一个74HC595并行输出口控制,因此,在每一瞬间,N位LED会显示相同的字符。
最新74HC595-驱动LED

精品资料74H C595-驱动L E D........................................第17节:两片联级74HC595驱动16个LED灯的基本驱动程序时间:2015-07-29关键字:[导读]从业将近十年!手把手教你单片机程序框架第17讲:开场白:上一节讲了如何把矩阵键盘翻译成独立按键的处理方式。
这节讲74HC595的驱动程序。
要教会大家两个知识点:第一点:朱兆祺的学习板是用74HC595控制LED,因此可以从业将近十年!手把手教你单片机程序框架第17讲:开场白:上一节讲了如何把矩阵键盘翻译成独立按键的处理方式。
这节讲74HC595的驱动程序。
要教会大家两个知识点:第一点:朱兆祺的学习板是用74HC595控制LED,因此可以直接把595的OE引脚接地。
如果在工控中,用来控制继电器,那么此芯片的片选脚OE 不要为了省一个IO口而直接接地,否则会引起上电瞬间继电器莫名其妙地动作。
为了解决这个问题,OE脚应该用一个IO口单独驱动,并且千万要记住,此IO必须接一个15K左右的上拉电阻,然后在程序刚上电运行时,先把OE 置高,并且尽快把所有的74HC595输出口置低,然后再把OE置低.当然还有另外一种解决办法,就是用一个10uF的电解电容跟一个100K的下拉电阻,组成跟51单片机外围复位电路原理一样的电路,连接到OE口,这样确保上电瞬间OE口有一小段时间是处于高电平状态,在此期间,尽快通过软件把74hc595的所有输出口置低。
第二点:两个联级74HC595的工作过程:每个74HC595内部都有一个8位的寄存器,两个联级起来就有两个寄存器。
ST引脚就相当于一个刷新信号引脚,当ST引脚产生一个上升沿信号时,就会把寄存器的数值输出到74HC595的输出引脚并且锁存起来,DS是数据引脚,SH是把新数据送入寄存器的时钟信号。
也就是说,SH引脚负责把数据送入到寄存器里,ST引脚负责把寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来。
74hc595的引脚功能和作用

描述74HC59574HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
[编辑本段]特点8位串行输入/8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率[编辑本段]输出能力并行输出,总线驱动;串行输出;标准中等规模集成电路595移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
[编辑本段]参考数据CPD决定动态的能耗,PD=CPD×VCC×f1+∑(CL×VCC2×f0) F1=输入频率,CL=输出电容f0=输出频率(MHz)Vcc=电源电压[编辑本段]引脚说明符号引脚描述Q0…Q7 15,1,7 并行数据输出GND 8 地Q7’ 9 串行数据输出MR 10 主复位(低电平)SHCP 11 移位寄存器时钟输入STCP 12 存储寄存器时钟输入OE 13 输出有效(低电平)DS 14 串行数据输入VCC 16 电源[编辑本段]功能表输入输出功能SHCP STCP OE MR DS Q7’ Qn × × L ↓ × L NC MR为低电平时仅仅影响移位寄存器× ↑ L L × L L 空移位寄存器到输出寄存器×× H L × L Z 清空移位寄存器,并行输出为高阻状态↑ × L H H Q6 NC 逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入,例如,以前的状态6(内部Q6”)出现在串行输出位。
用 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级联问题

一次调试公司新改的单片机板,用3个74HC595级联驱动24个LED灯(见下图)发现每当驱动信号跨过第一个芯片时,LED灯就会出错乱闪,当时以为是程序问题但是参考了原来老板子程序,在LED灯驱动方面程序并没有改动。
于是找了块老板子调试发现原来的板子也存在同样问题,不知道原来的板子是没人发现问题还是没找到办法解决?(呵呵!公司内部的事情在此就不讨论了)既然发现了问题作为一个技术人员当然就不能置之不理啦!于是偶就打开了百度输入74HC595级联问题,发现74HC595级联还真是问题网上也有不少人反映遇到过同样的问题,有用来驱动数码管的有用来驱动LED显示屏的都说级联后会乱闪,有说法是干扰引起的得在芯片电源脚加滤波电容,看看我的板子每个芯片电源脚都加了滤波电容啊!应该不是干扰引起的。
再看一贴说是单片机驱动电流不够的原因得加上拉电阻,说用示波器看RCK和SCK的信号,上升沿时是爬行上升的,单片机驱动电流不够导致输入时钟信号失真,有可能-看看自己的板子DATA、RCK、SCK管脚均没加上拉电阻,于是加了个10K的上拉电阻再调-不行,换个5K的再调-还不行,再换个1K的再调-OK!:-)驱动信号跨芯片时LED灯再也不会乱闪了,至此LED灯乱闪问题得到圆满解决,剩下的就是改PCB图加上拉电阻了。
回头来总结一下,74HC595级联理论上来说并没有问题,但实际应用过程中往往会遇到驱动能力、时延等问题,正验证了“实践才是检验真理的唯一标准”。
书本上的知识终究只是纸上谈兵没经过实践的检验终究是行不通的。
以后在设计单片机系统时一定要考虑单片机管脚的驱动能力,能避免设计过程中产生许多莫名奇妙的问题。
新手第一次发帖参与请高手多包涵啊!发得有点迟但我想迟到总比不到好但愿版主能够看到。
“一个苹果交换一个苹果,每个人还是只有一个苹果。
而如果一个思想去交换另一个思想,则就可以获得两个思想。
” 但愿大家都能够得到两个思想o(∩_∩)o...。
74hc595驱动问题

//delay(2000); PORTC=0x00;
//时钟下降沿
} PORTG=0Xff;//delay(2000); PORTG=0X00;
//bit=0;
} j+=8; byte=0; } j=0; }
}
void main(void) { DDRC=0XFF; DDRD=0XFF; DDRF=0XFF; DDRE|=0X80;
void In_595(unsigned char Shu)
{
unsigned char n;
for(n = 0; n < 8; n++) //循环 8 次,刚好移完 8 位
{
DAT = Shu & 0x01; //取数据的最低位
Shu >>= 1;
//将数据的次低位移到最低位
SRCLK = 0;
//先将移位寄存器控制引脚置为低
74hc595驱动问题sdhc卡驱动普中科技hc6800驱动sdhc卡驱动下载hp2020hc驱动win10驱动问题win10显卡驱动问题显卡驱动有问题怎么办显卡驱动有问题xboxone手柄驱动问题
74hc595 驱动问题
74hc595驱动lcd

{ unsigned char i,j;
for(i=0; i<8; i++)
{ LCDsrclk = 0; // SCK置低 // 循环8次
sbit LCDser=P3^3;
sbit LCDout =P3^4;
sbit LCDsrclk =P2^7;
#define LCD_CMD 0x01 //寄存器
#define LCD_DATA 0x00 //数据
LCD_driver(lcdcom,lcddata);
}
else
{
lcdcom=LCD_CMD_W_DATA_END; //00111111 E,R/W,R/S结束写数据操作结束写数据操作,低电平,与上面组合完成写操作,下降沿
LCD_driver(lcdcom,lcddata);
//显示数据
lcd_com_data=LCD_CMD;
lcddata=0x80+0x10;;
LCD_write(lcd_com_data,lcddata) ;
lcdpoint=&Vdata; //取地址
for(lcd_data_count=16;lcd_data_count>0;lcd_data_count--)//显示第一行字符
LCDser = (lcdcom & 0x80); // 将byte最高位输出到MOSI
for(j=0; j<40; j++);
LCDsrclk = 1; // 拉高SCK,
74HC595工作原理 用于驱动点阵

74HC595工作原理输出使能端13脚我们一直让它使能,复位端10脚我们一直让它无效,这两个引脚在硬件设计时为了方便,就直接给它们连到相应的电平上了。
程序中我们只需要关注数据输入引脚14脚、移位脉冲引脚11脚和锁存脉冲引脚12脚。
(见图一)图中的SRA——SRH是移位寄存器(Shift Register),数据从它们的D引脚输入,从Q引脚输出,每次移位脉冲引脚(Shift Clock)提供一个脉冲,D引脚的数据就会输出并保持到Q引脚,因为这里的移位脉冲引脚(Shift Clock)是连到每一个SR上的,所以自然每次给一个移位脉冲的时候,所有的数据都向后移动了一位。
这里我们注意到,SRA的D 脚连接的是串行数据输入,也就是我们的数据引脚。
所以每次给脉冲移位之前,我们需要准备好该引脚的值,因为每次给一个脉冲,它的数据就会移入后方。
很直观的看到,我们给几个脉冲,数据引脚就会有几次被移入移位寄存器,并且这些值会保持在各个SR的Q脚。
所以假设我们要将一个字节移入移位寄存器,因为1个字节是8位的,所以我们需要给出8个脉冲,那么SRA——SRH的Q脚就保持了这8位值,再看看这8位值,它是先在数据引脚输出的值就会走得越远,所以如果我们先输出数据高位的话,最高位在8个脉冲后就会跑到SRH 的Q脚。
这就像我们排队一样,一个寄存器里面有8个位置,每次给一个脉冲就好比一次呼叫:“大家可以往前移一位了!”就这样,队伍不断得往前移,很简单吧!然后我们看到LRA——LRH,它们是锁存寄存器(Latch Register),每次锁存脉冲引脚(Latch Clock)给一个脉冲,Q脚就会输出并保持D脚的值。
其实聪明的人肯定会看出来了,LR和SR其实是差不多的功能,只是SR多了个复位脚。
我们可以把LR看成是照相机,锁存脉冲引脚就相当于是照相机的快门,我们给一个锁存脉冲,那么数据就被锁存在了对应的Q脚。
而当我们没有操作锁存引脚的时候,照相机只是摆在那里,不管队伍怎么前进了,照相机的输出始终是不变的。
单片机驱动74HC595的c51程序

单片机驱动74HC595的c51程序//该子程序为74HC595 发送字符的程序,该程序是先发送的是最低位!//芯片74HC595 的时钟引脚为第11 脚//芯片74HC595 的数据引脚为第14 脚//芯片74HC595 的锁存引脚为第12 脚//当有多片74HC595 串联时,只有当所有数据都发送完成后,再锁存信号!//同样74hc164 与51 单片机连接也可以由这个程序来驱动#include#define uchar unsigned char#define uint unsigned int sbit clk=P3 ;sbit dat=P3;sb it shuo_cun=P3;uchar volatile e,f;uchar code tab[]={0x03,/*0*/0x9F,/*1*/0x25,/*2*/0x0D,/*3*/0x99,/*4*/0x49,/*5*/0x41,/*6*/0x1F,/*7*/0x01,/*8*/0x09,/*9*/};void fa_shon(uchar k) //{uchar i; //定义循环变量for(i=0;i8;i++) //因为是1 字节是8 位,所以循环8 次{dat=k0x01; //将要发送的数据与上0X01 送到数据引脚clk=0; //时钟引脚加低电平clk=1; //时钟引脚加高电平k=1; //将发送的数据右移1 位} }void main() {TMOD=0x01;TH0=15535/256;TL0=15535%256;EA=1;ET0=1;TR0=1;while(1){ uchara;for(a=0;a3;a++){fa_shon(tab[e%10]);fa_shon(tab[e%100/10]);fa_shon(tab[e/100]);}s huo_cun=0; //锁存为低电平shuo_cun=1; //锁存为高电平}}void tt()interrupt1{TH0=15535/256;TL0=15535%256;f++;if(f10){f=0;e++;if(e250)e=0;}}tips:感谢大家的阅读,本文由我司收集整编。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//delay(2000); PORTC=0xff;
//时钟上升沿
//delay(1000);
if(B1[bit]==0) PORTE=0Xff;//如果该点不应亮则 74_138 输出高阻
else {PORTE=0X00; delaTF=0XFF;
//扫描点后面通通熄灭
void In_595(unsigned char Shu)
{
unsigned char n;
for(n = 0; n < 8; n++) //循环 8 次,刚好移完 8 位
{
DAT = Shu & 0x01; //取数据的最低位
Shu >>= 1;
//将数据的次低位移到最低位
SRCLK = 0;
//先将移位寄存器控制引脚置为低
}
void Display(void) {
In_595(Led[WW]); In_595(Wei[0]); Out_595(); In_595(Led[QW]); In_595(Wei[1]); Out_595(); In_595(Led[BW]); In_595(Wei[2]); Out_595(); In_595(Led[SW]); In_595(Wei[3]); Out_595(); In_595(Led[GW]); In_595(Wei[4]); Out_595(); In_595(Led[BW_3]); In_595(Wei[5]); Out_595(); In_595(Led[SW_3]); In_595(Wei[6]); Out_595(); In_595(Led[GW_3]); In_595(Wei[7]); Out_595(); }
谁能帮忙写个 52 单片机驱动 74hc595 控制 LCD1602 的程序
浏览次数:986 次悬赏分:0 | 解决时间:2009-3-15 11:05 | 提问者:Snoopylm123 | 检举
先感谢了...
最佳答案 你敢不敢给点分
#include <reg51.h> #include <intrins.h>
_nop_();
SRCLK = 1;
//再置为高,产生移位时钟上升沿,
上升沿时数据寄存器的数据移位
_nop_();
} }
void Out_595(void) {
SCLK = 0; //先将存储寄存器引脚置为低 _nop_(); SCLK = 1; //再置为高,产生移位时钟上升沿,上升沿时移位 寄存器的数据进入数据存储寄存器,更新显示数据。
#define uchar unsigned char #define uint unsigned int #define LcdBus P0 sbit LED1602_RS=P2^6; //LCD 端口定义 sbit LED1602_RW=P2^5 ; sbit LED1602_EN=P2^4 ;
unsigned long Hex_B(void)
{ unsigned long B_data;
B_data=((AD_data>>9)&0x001)*512+((AD_data>>8)&0x001)*256+((AD_data >>7)&0x001)*128+((AD_data>>6)&0x001)*64+((AD_data>>5)&0x001)*32
//开机信号
//PORTE=0X00; print(); }
这是我刚写的一个 64*8 的点阵扫描程序用 74HC595 做行选,但是没用锁存,可 以显示,但亮度很低。一直在找 595 的中文资料,不知到怎么用输出锁存。有的 话希望能分享一下
74HC595 驱动数码管问题
浏览次数:634 次悬赏分:20 | 解决时间:2010-6-6 15:49 | 提问者:futureyuanjian | 检举
//delay(2000); PORTC=0x00;
//时钟下降沿
} PORTG=0Xff;//delay(2000); PORTG=0X00;
//bit=0;
} j+=8; byte=0; } j=0; }
}
void main(void) { DDRC=0XFF; DDRD=0XFF; DDRF=0XFF; DDRE|=0X80;
BW = 1+a; SW = 1+a; GW = 1+a;
BW_3 = 1+a; SW_3 = 1+a; GW_3 = 1+a;
Display();
如果直接给 WW,QW,BW,SW,GW, BW_3,SW_3,GW_3 赋常数值,没有问题, 亮度也很好,但是给他们赋变量值就出现问题!!
最佳答案 看了你的程序,你用什么单片机?51 的话速度很慢!!你又用 xdata,而且有如 此大的浮点 Dis5_data = 0.009765625*Range*D_data+0.5;!!又有乘法!速度 会很慢!直接付值根本没有经过上述过程,所以速度很快,扫描的速度就快, Display(); 函数执行的次数就多!所以亮度应该比较好!你可以在 Display(); 加上 for()循环,数码管多循环几次!!!这样就够亮了,不亮的原因是每个数码 管亮的时间太短。。。。我的看法是这样的。。
74hc595 驱动问题
#define uc unsigned char #define ui unsigned int #include<iom128v.h>
uc Bmp[]= { /*-----------------------------------------------------------------------------; 源文件 / 文字 : ; 宽×高(像素): 64×8 ; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/64 字节 ; 数据转换日期 : 2009-4-7 11:11:41
效
DDRG =0Xff;
//PC 口为时钟输出 //PD 为行选,连 74_138 的 ABC 输入端 //PF 为列选,扫描点,接 74_595 的 DS 端 //PE7 为输出,74_138 使能控制,低电平有
PORTG=0X00; PORTE=0XFF; delay(5000); PORTE=0X00;
+((AD_data>>4)&0x001)*16+((AD_data>>3)&0x001)*8+((AD_data>>2)&0x00 1)*4+((AD_data>>1)&0x001)*2+(AD_data&0x001);
return(B_data); }
main () {
unsigned char a;
main()
{ uchar disp1[16]={'S','u','n','J','i','e',' ','m','a','d','e',' ','a','t',' ',' '}; uchar disp2[16]={'2','0','0','8',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}; while(1) {
while(1) {
Range=1000; AD_data = 0x0ff;
//最大量程目前(0520)为 7000kg
D_data = Hex_B();
Dis5_data = 0.009765625*Range*D_data+0.5;
a = Dis5_data/10000;
} }
问题补充:
WW = 1+a; QW = 1+a;
uc B1[8]={0}; uc B2[8]={0};
void delay(ui n) { ui j; ui i;
//延时函数
for(i=0;i<n;i++) for(j=0;j<20;j++);
} void H_B1(uc h) B1 中
{ B1[7]=h&0x01;
//十六进制转换为二进制,转换后放在数组
void LcdIni(void); void WrOp(uchar dat); void WrDat(uchar dat); void ChkBusy(void); void print_LCD(uchar disp[],uchar num); //延时 n ms 子程序 void delayms(unsigned int n) { unsigned int i,j; for(i=0;i<n;i++) for(j=0;j<120;j++); }
B1[6]=h&0x02; B1[5]=h&0x04; B1[4]=h&0x08; B1[3]=h&0x10; B1[2]=h&0x20; B1[1]=h&0x40; B1[0]=h&0x80; }