/*==================================================================== ====================================================================== ==*/
/*============================================================================= ==============================================================*/
#include
#include
#include
#include
#include
#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 2
sfr 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的话。
如果是其他的只要让延时在30ms就可以了*/
ButtonDelay();
if(P3^4 == 0)
{
I_address++;
if (I_address==100)
{
I_address== 0;
}
}
while(!P3^4); /*等待按键松开*/
ButtonDelay();
ButtonNum = an_UP;
}
if(P1^7 == 0)
{
ButtonDelay();
if(P1^7 == 0)
{
I_address--
if (I_address==100)
{
I_address== 0;
}
}
while(!P1^7); /*等待按键松开*/
ButtonDelay();
ButtonNum = an_DOWN ;
}
return ButtonNum;
}
/*
--------------------------------------------------------------------------------------------------------------------------------------------------------*/
void diss (unsigned char Data)
{
unchar i;
for(i=0;i<8;i++);
{
clk=0;
sdo=Data&0x80;
Data<<=1;
_nop_();
_nop_();
clk=1;
_nop_();
_nop_();
}
stb=0;
_nop_();
_nop_();
stb=1;
}
/*--------------------------------------------------------------------------------------------------------------------------*/
void display(void)
{
unchar num1,num2;
num1=I_address/10;
num2=I_address%10;
diss(disp[num1]);
delay10ms();
diss(disp[num2]);
delay10ms();
}
/*-------------------------------------------------------------------------------------------------------------------------------*/
void main(void)
{
while(1)
{
display(disp);
ButtonScan(I_address);
}
}
(注:可编辑下载,若有不当之处,请指正,谢谢!)
74hc595驱动数码管 版本一 顶层例化文件 module seg7x8( input CLOCK_50, // 板载50MHz时钟 input Q_KEY, // 板载按键RST output [7:0] SEG7_SEG, // 七段数码管 段脚 output [2:0] SEG7_SEL // 七段数码管 待译位脚 ); // 显示效果: // ------------------------- // |1 |2.|3 |4 | |B |C |D | // ------------------------- seg7x8_drive u0( .i_clk (CLOCK_50), .i_rst_n (Q_KEY), .i_turn_off (8'b0000_1000), // 熄灭位[2进制][此处取第3位 .i_dp (8'b0100_0000), // 小数点位[2进制][此处取第6位 .i_data (32'h1234_ABCD), // 欲显数据[16进制] .o_seg(SEG7_SEG), .o_sel(SEG7_SEL) ); endmodule 驱动文件 module seg7x8_drive(
input i_clk, input i_rst_n, input [7:0] i_turn_off, // 熄灭位[2进制 input [7:0] i_dp, // 小数点位[2进制 input [31:0] i_data, // 欲显数据[16进制 output [7:0] o_seg, // 段脚 output [2:0] o_sel // 使用74HC138译出位脚 ); //++++++++++++++++++++++++++++++++++++++ // 分频部分 开始 //++++++++++++++++++++++++++++++++++++++ reg [16:0] cnt; // 计数子 always @ (posedge i_clk, negedge i_rst_n) if (!i_rst_n) cnt <= 0; else cnt <= cnt + 1'b1; wire seg7_clk = cnt[16]; // (2^17/50M = 2.6114)ms //-------------------------------------- // 分频部分 结束 //-------------------------------------- //++++++++++++++++++++++++++++++++++++++ // 动态扫描, 生成seg7_addr 开始 //++++++++++++++++++++++++++++++++++++++ reg [2:0] seg7_addr; // 第几个seg7 always @ (posedge seg7_clk, negedge i_rst_n) if (!i_rst_n) seg7_addr <= 0; else seg7_addr <= seg7_addr + 1'b1; //-------------------------------------- // 动态扫描, 生成seg7_addr 结束 //-------------------------------------- //++++++++++++++++++++++++++++++++++++++
51单片机驱动两片74HC595级联动态驱动8位数码管 功能: 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选 平台: STC89C52 现象: 8位数码管从第一位开始从0计数,满10进位 版本说明: 第0版本没有使用定时器中断,同时定义了一个unsigned long int 变量计数,再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,而且没有用unsigned long int 之类的变量,而是用数组Val[8] 来计数, 主函数只负责显示,其它的在中断函数里面处理,这样显示一点都不闪屏, 备注: 可以用ULN2003A 接在数码管的com 口来提高驱动能力,ULN2003A里面有7个NPN三极管, 可以大大提高驱动能力 #include <> 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;
两片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位
/******************************************************************************* * 标题: 试验74HC595驱动数码管上显示数字(C语言)* 连接方法:JP12用条线冒短接JP3和JP2 用8PIN排线连接 ******************************************************************************** * 通过本例程了解74HC595(串入并出)基本原理和使用* 请学员认真消化本例程,懂74C595在C语言中的操作* ********************************************************************************/ #include
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--);}void led_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实现I/O口的扩展 一、实验目的 1. 了解74HC595(串入并出)基本原理和使用 2. 了解数码管的基本原理和驱动方式 3. 学会使用74HC595来驱动静态数码管 二、实验器材 C51单片机开发板(含74HC595芯片,静态数码管)1块 8PIN排线1根 数据线1根 三、实验原理 1. 数码管 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管(还有一种“米”字型的数码管,其段数更多),八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。 (1)数码管的分类 按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。 (2)数码管段、位引脚的确定(以4位8段数码管为例) 数码管引脚测量分三步:极性判断(共阳极还是共阴极)、公共端判断(位选端口)、段码端判断(段选端口)。 首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的某一段是否会点亮,如果全部引脚试过都没有亮的,那么将电源正极(串电阻)换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极(串电阻)逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。相反,按住电源正极不动,电
74HC595是美国国家半导体公司生产的通用移位寄存器芯片。并行输出端具有输出锁存功能。与单片机连接简单方便,只须三个I/O口即可。而且通过芯片的Q7引脚和SER引脚,可以级联。 595引脚介绍 ________ QB--|1 16|--Vcc QC--|2 15|--QA QD--|3 14|--SER-------------------串行输入 QE--|4 13|--/G---------------------使能端输出有效(低电平) QF--|5 12|--RCK-------------------存储寄存器时钟输入 QG--|6 11|--SCK-------------------移位寄存器时钟输入 QH--|7 10|--/SCLR----------------主复位(低电平) GND-|8 9|--QH'--------------------串行输出端 |________| 74595的数据端: 1)、QA--QH: 八位并行输出端,可以直接控制数码管的8个段。 2)、QH': 级联输出端。我将它接下一个595的SER端。 3)、SER: 串行数据输入端。 74595的控制端说明: 1) 、/SCLR(10脚): 低点平时将移位寄存器的数据清零。通常我将它接Vcc。 2)、SCK(11脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级) 3)、RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。 4)、/G(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。 注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。 74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。 与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。 程序讲解: //Note: 74HC595驱动 //File: 74HC595.H //Date: 08-7-16 //Time: 8:50 // ______ __ //Note: SCLR(10脚)主复位接电源正极, G(13脚)使能端,输出有效接电源负极 //防止74HC595.H头文件被主程序重复调用 /*--------------------------------------------*/ #ifndef __74HC595_H__ #define __74HC595_H__
器件:74hc595. 引脚说明: SDA:数据输入口。 SH_CP:数据输入控制端,在每个SH_CP的上升沿, SDA口上的数据移入寄存器, 在SH_CP的第9个上升沿, 数据开始从QS移出。 ST_CP:数据置入锁存器控制端。 Q0~Q7:数据并行输出端。 数据从SDA 口送入74HC595 , 在每个SH_CP的上升沿, SDA口上的数据移入寄存器, 在SH_CP的第9个上升沿, 数据开始从QS 移出。如果把第一个74HC595的QS和第二个74HC595 的SDA 相接, 数据即移入第二个74HC595中,照此一个一个接下去, 可接任意多个。数据全部送完后, 给ST_CP一个上升沿, 寄存器中的数据即置入锁存器。此时如果EN 为低电平, 数据即从并口Q0~Q7输出, 把Q0~Q7 与LED的8 段相接, LED就可以实现显示了。要想软件改变LED的亮度, 只需改变EN的占空比就行了。 实验原理及内部结构:
如图所示: 74HC595 内含8 位串入、串/并出移位寄存器和8位三态输出锁存器。 寄存器和锁存器分别有各自的时钟输入(SH_CP和ST_CP) , 都是上升沿有效。 当SH_CP从低到高电平跳变时,串行输入数据(SDA) 移入寄存器; 当ST_CP从低到高电平跳变时, 寄存器的数据置入锁存器。 清除端(CLR) 的低电平只对寄存器复位(QS 为低电平) ,而对锁存器无影响。 当输出允许控制(EN) 为高电平时, 并行输出(Q0~Q7) 为高阻态, 而串行输出(QS) 不受影响。 74HC595 最多需要5 根控制线,即SDA、SH_CP、ST_CP、CLR 和EN。其中CLR 可以直接接到高电平, 用软件来实现寄存器清零; 如果不需要软件改变亮度, EN可以直 接接到低电平, 而用硬件来改变亮度。把其余三根线和单片机的I/ O 口相接, 即可实现对LED 的控制。数据从SDA 口送入74HC595 ,在每个SH_CP的上升沿, SDA 口上的数据移入寄存器, 在SH_CP的第9个上升沿, 数据开始从QS 移出。如果把第一个 74HC595 的QS和第二个74HC595 的SDA 相接, 数据即移入第二个74HC595 中, 照此一个一个接下去, 可接任意多个。数据全部送完后, 给ST_CP 一个上升沿,寄存器中的数据即置入锁存器。此时如果EN 为低电平, 数据即从并口Q0~Q7 输出, 把Q0~Q7 与LED 的8 段相接, LED就可以实现显示了。要想软件改变LED 的亮度, 只需改变EN 的占空比就行了。。LED 的亮度用PR1~PR3 的阻值来控制。P1 口的P115 、P116 、P117 用来控制LED 的显示,分别接到ST_CP、SH_CP和SDA 脚。 实验内容: 按下图连接器件:
74595外形图 ______ QB--|1 16|--Vcc QC--|2 15|--QA QD--|3 14|--SI QE--|4 13|--/G QF--|5 12|--RCK QG--|6 11|--SCK QH--|7 10|--/SCLR GND-|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是串入并出带有锁存功能移位寄存器,
74HC595实现多位LED显示的方法 单片机应用系统中使用的显示器主要有LED和LCD两种。近年来也有用CRT显示的。前者价格低廉,配置灵活,与单片机接口方便;后者可进行图形显示,但接口较复杂,成本也较高。LED(Ling Emiting Diode)是发光二极管的缩写。实际应用非常普遍的是八段LED显示器。LED显示器在大型报时屏幕,银行利率显示,城市霓虹灯建设中,得到广泛应用。在这些需要多位LED显示的场合,怎样实现系统稳定,价格低廉的显示,成为决定其成本的关键所在。 2 74HC595实现LED静、动态显示基本原理 74HC595是美国国家半导体公司生产的通用移位寄存器芯片。并行输出端具有输出锁存功能。与单片机连接简单方便,只须三个I/O口即可。而且通过芯片的Q7引脚和SER引脚,可以级联。而且价格低廉. 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并行输出口输出相应字符段选码,而位选则控制I/O口在该显示位送入选通电平,以保证该位显示相应字符。如此轮流,使每位分时显示该位应显示字符。由于74HC595具有锁存功能,而且串行输入段选码需要一定时间,因此,不需要延时,即可形成视觉暂留效果。 N位LED显示时,只需要一片74HC595即可完成,成本最低。但是,此种方法的最大弱点就是当LED的位数大于12位时,出现闪烁现象,这是所有动态LED显示方式共同的弱点。 3 多位LED显示方法的实现 74HC595具有一个8位串行输入并行输出的移位寄存器和一个8位输出锁存器。 ;================================================ ;74HC595 走马灯演示程序 ;================================================ SDATA_595 EQU P1.0 ;串行数据输入 SCLK_595 EQU P1.1 ;移位时钟脉冲 RCK_595 EQU P1.2 ;输出锁存器控制脉冲 ;================================================ ORG 0000H LJMP MAIN ORG 0030H ;================================================ MAIN: MOV SP,#60H MOV R0,#0FEH MAIN1: CALL OUT_595 CALL DELAY MOV A,R0 RL A MOV R0,A JMP MAIN1 ;--------------------------------------------------------------- ;输出锁存器输出数据子程序 ;--------------------------------------------------------------- OUT_595: LCALL WR_595 CLR RCK_595
#include
hc595sendbyte(Disp_Tab[gw]); hc595sendbyte(Disp_Tab[sw]); hc595sendbyte(Disp_Tab[bw]); hc595sendbyte(Disp_Tab[qw]); rck=1; } void T_init() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; } void main(void) { T_init(); while(1) { display(); } } void T0_time() interrupt 2 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; jishu++; if(jishu==6) { jishu=0; num++; if(num==9999)num=0; } }
/*==================================================================== ====================================================================== ==*/ /*============================================================================= ==============================================================*/ #include
//两片74HC595控制8位数码管,按下键盘时使第一个发光二极管点亮,同时使数码管的示数加1,第一个数码管显示十位,第二个数码管显示个位,一直加到99! #include
一个程序输出正好要用两个BCD数码管显示P0的读出数据,不巧手头只有单个的这种共阳极7段数码管。 于是用两片74HC595驱动了这两个数码管,达到显示数据的目的。 网上的很多程序都是74HC595驱动多位数码管的,如果要驱动这样比较“原始”的单个数码管,只好自己参考了一些程序,改写了程序,仿真以及实践成功。 本程序简单修改也可以用在其他74HC595电路以及7段数码管驱动等应用上。 Proteus仿真画面如下: 源程序如下: #include
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]<74HC595驱动两位数码管程序教学资料
74H C595驱动两位数 码管程序
/*=========================================================== ============================================================= ====================*/ /*=========================================================== ============================================================= ===================*/ #include
51单片机74HC595驱动一位数码管显示程序 #include _nop_(); SCLK=1; } } void Out_595() { RCLK=0; _nop_(); _nop_(); RCLK=1; _nop_(); _nop_(); RCLK=0; } main() { In_595(Tab[8]); Out_595(); while(1) ; } #include 74hc595驱动串行led显示 串行驱动led显示 //一个74hc595位移寄存器驱动三极管驱动led位, //两个74hc595驱动led段,方式位5位x8段x2=10个数码管//5分频,每次扫描时间位1.25ms //定义特殊符号 #define nul 0xf #define qc 0xc #define qb 0xb #define q_ 0xa #define q__ 0xd #define q___ 0xe #define qp 0x10 #define qe 0x11 #define qj 0x12 #define qn 0x13 #define qf 0x14 #define qa 0x15 #define qr 0x16 #define qd 0x17 #define qu 0x18 #define ql 0x19 #define qh 0x1a #define qwen 0x1b #define qt 0x1c #define qla 0x1d #define qlb 0x1e #define qlc 0x1f #define qld 0x20 #define qle 0x21 #define qlf 0x22 #define qlg 0x23 #define qldp 0x24 //显示段信息,不同led排列组合的段信息只需更改8个数值即可。//因此,该定义具有通用性。 // 显示 // -d 20 // |c 40 |e 10 // - g 80 // |b 2 |f 4 // _a1 .dp 8 #define pa 1 #define pb 2 #define pc 0x40 #define pd 0x20 #define pe 0x10 #define pf 4 #define pg 0x80 #define pdp 8 //-------------- #define l0 pdp+pg #define l1 255-pf-pe #define l2 pdp+pc+pf #define l3 pdp+pc+pb #define l4 pdp+pa+pb+pd #define l5 pdp+pb+pe74hc595驱动串行led显示(精)