74HC595驱动四位数码管

合集下载

74hc595驱动数码管

74hc595驱动数码管

74hc595驱动数码管版本一顶层例化文件module seg7x8(input CLOCK_50, // 板载50MHz时钟input Q_KEY, // 板载按键RSToutput [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;elsecnt <= cnt + 1'b1;wire seg7_clk = cnt[16]; // (2^17/50M = 2.6114)ms //--------------------------------------// 分频部分 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 动态扫描, 生成seg7_addr 开始//++++++++++++++++++++++++++++++++++++++reg [2:0] seg7_addr; // 第几个seg7always @ (posedge seg7_clk, negedge i_rst_n)if (!i_rst_n)seg7_addr <= 0;elseseg7_addr <= seg7_addr + 1'b1;//--------------------------------------// 动态扫描, 生成seg7_addr 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 译出位码 开始//++++++++++++++++++++++++++++++++++++++reg [2:0] o_sel_r; // 位选码寄存器// 开发板上SEG7的方向是低位在左,高位在右// 但是实际上我们看数的方向是高位在左,低位在右// 故此处将第0位对应DIG[7],第7位对应DIG[0]alwayscase (seg7_addr)0 : o_sel_r = 3'b111; // SEG7[7]1 : o_sel_r = 3'b110; // SEG7[6]2 : o_sel_r = 3'b101; // SEG7[5]3 : o_sel_r = 3'b100; // SEG7[4]4 : o_sel_r = 3'b011; // SEG7[3]5 : o_sel_r = 3'b010; // SEG7[2]6 : o_sel_r = 3'b001; // SEG7[1]7 : o_sel_r = 3'b000; // SEG7[0]endcase//--------------------------------------// 根据seg7_addr, 译出位码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 选择熄灭码 开始//++++++++++++++++++++++++++++++++++++++reg turn_off_r; // 熄灭码alwayscase (seg7_addr)0 : turn_off_r = i_turn_off[0];1 : turn_off_r = i_turn_off[1];2 : turn_off_r = i_turn_off[2];3 : turn_off_r = i_turn_off[3];4 : turn_off_r = i_turn_off[4];5 : turn_off_r = i_turn_off[5];6 : turn_off_r = i_turn_off[6];7 : turn_off_r = i_turn_off[7];endcase//--------------------------------------// 根据seg7_addr, 选择熄灭码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 选择小数点码 开始//++++++++++++++++++++++++++++++++++++++reg dp_r; // 小数点码alwayscase (seg7_addr)0 : dp_r = i_dp[0];1 : dp_r = i_dp[1];2 : dp_r = i_dp[2];3 : dp_r = i_dp[3];4 : dp_r = i_dp[4];5 : dp_r = i_dp[5];6 : dp_r = i_dp[6];7 : dp_r = i_dp[7];endcase//--------------------------------------// 根据seg7_addr, 选择小数点码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 选择待译段码 开始//++++++++++++++++++++++++++++++++++++++reg [3:0] seg_data_r; // 待译段码alwayscase (seg7_addr)0 : seg_data_r = i_data[3:0];1 : seg_data_r = i_data[7:4];2 : seg_data_r = i_data[11:8];3 : seg_data_r = i_data[15:12];4 : seg_data_r = i_data[19:16];5 : seg_data_r = i_data[23:20];6 : seg_data_r = i_data[27:24];7 : seg_data_r = i_data[31:28];endcase//--------------------------------------// 根据seg7_addr, 选择待译段码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据熄灭码/小数点码/待译段码// 译出段码,开始//++++++++++++++++++++++++++++++++++++++reg [7:0] o_seg_r; // 段码寄存器/** 0* -------* | |* 5| 6 |1* -------* | |* 4| |2* ------- . 7* 3*/// 共阳always @ (posedge i_clk, negedge i_rst_n)if (!i_rst_n)o_seg_r <= 8'hFF; // 送熄灭码 elseif(turn_off_r) // 送熄灭码 o_seg_r <= 8'hFF;elseif(!dp_r)case(seg_data_r) // 无小数点 4'h0 : o_seg_r <= 8'hC0;4'h1 : o_seg_r <= 8'hF9;4'h2 : o_seg_r <= 8'hA4;4'h3 : o_seg_r <= 8'hB0;4'h4 : o_seg_r <= 8'h99;4'h5 : o_seg_r <= 8'h92;4'h6 : o_seg_r <= 8'h82;4'h7 : o_seg_r <= 8'hF8;4'h8 : o_seg_r <= 8'h80;4'h9 : o_seg_r <= 8'h90;4'hA : o_seg_r <= 8'h88;4'hB : o_seg_r <= 8'h83;4'hC : o_seg_r <= 8'hC6;4'hD : o_seg_r <= 8'hA1;4'hE : o_seg_r <= 8'h86;4'hF : o_seg_r <= 8'h8E;endcaseelsecase(seg_data_r) // 加小数点4'h0 : o_seg_r <= 8'hC0 ^ 8'h80;4'h1 : o_seg_r <= 8'hF9 ^ 8'h80;4'h2 : o_seg_r <= 8'hA4 ^ 8'h80;4'h3 : o_seg_r <= 8'hB0 ^ 8'h80;4'h4 : o_seg_r <= 8'h99 ^ 8'h80;4'h5 : o_seg_r <= 8'h92 ^ 8'h80;4'h6 : o_seg_r <= 8'h82 ^ 8'h80;4'h7 : o_seg_r <= 8'hF8 ^ 8'h80;4'h8 : o_seg_r <= 8'h80 ^ 8'h80;4'h9 : o_seg_r <= 8'h90 ^ 8'h80;4'hA : o_seg_r <= 8'h88 ^ 8'h80;4'hB : o_seg_r <= 8'h83 ^ 8'h80;4'hC : o_seg_r <= 8'hC6 ^ 8'h80;4'hD : o_seg_r <= 8'hA1 ^ 8'h80;4'hE : o_seg_r <= 8'h86 ^ 8'h80;4'hF : o_seg_r <= 8'h8E ^ 8'h80;endcase//--------------------------------------// 根据熄灭码/小数点码/待译段码// 译出段码,结束//--------------------------------------assign o_sel = o_sel_r; // 寄存器输出位选码 assign o_seg = o_seg_r; // 寄存器输出段码endmodule版本2顶层例化文件module seg7x8(input CLOCK_50, // 板载50MHz时钟input [1:1] KEY, // KEY[1]output [7:0] SEG7_SEG, // 七段数码管 段脚 output [7:0] SEG7_DIG // 七段数码管 位脚);// 显示效果:// -------------------------// |1 |2.|3 |4 | |B |C |D |// -------------------------seg7x8_drive u0(.i_clk (CLOCK_50),.i_rst_n (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_dig (SEG7_DIG));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 [7:0] o_dig // 位脚);//++++++++++++++++++++++++++++++++++++++// 分频部分 开始//++++++++++++++++++++++++++++++++++++++reg [16:0] cnt; // 计数子always @ (posedge i_clk, negedge i_rst_n)if (!i_rst_n)cnt <= 0;elsecnt <= cnt + 1'b1;wire seg7_clk = cnt[16]; // (2^17/50M = 2.6114)ms //--------------------------------------// 分频部分 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 动态扫描, 生成seg7_addr 开始//++++++++++++++++++++++++++++++++++++++reg [2:0] seg7_addr; // 第几个seg7always @ (posedge seg7_clk, negedge i_rst_n)if (!i_rst_n)seg7_addr <= 0;elseseg7_addr <= seg7_addr + 1'b1;//--------------------------------------// 动态扫描, 生成seg7_addr 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 译出位码 开始//++++++++++++++++++++++++++++++++++++++reg [7:0] o_dig_r; // 位码寄存器// 开发板上SEG7的方向是低位在左,高位在右// 但是实际上我们看数的方向是高位在左,低位在右// 故此处将第0位对应DIG[7],第7位对应DIG[0]alwayscase (seg7_addr)0 : o_dig_r = 8'b0000_0001;1 : o_dig_r = 8'b0000_0010;2 : o_dig_r = 8'b0000_0100;3 : o_dig_r = 8'b0000_1000;4 : o_dig_r = 8'b0001_0000;5 : o_dig_r = 8'b0010_0000;6 : o_dig_r = 8'b0100_0000;7 : o_dig_r = 8'b1000_0000;endcase//--------------------------------------// 根据seg7_addr, 译出位码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 选择熄灭码 开始//++++++++++++++++++++++++++++++++++++++reg turn_off_r; // 熄灭码alwayscase (seg7_addr)0 : turn_off_r = i_turn_off[0];1 : turn_off_r = i_turn_off[1];2 : turn_off_r = i_turn_off[2];3 : turn_off_r = i_turn_off[3];4 : turn_off_r = i_turn_off[4];5 : turn_off_r = i_turn_off[5];6 : turn_off_r = i_turn_off[6];7 : turn_off_r = i_turn_off[7];endcase//--------------------------------------// 根据seg7_addr, 选择熄灭码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 选择小数点码 开始//++++++++++++++++++++++++++++++++++++++reg dp_r; // 小数点码alwayscase (seg7_addr)0 : dp_r = i_dp[0];1 : dp_r = i_dp[1];2 : dp_r = i_dp[2];3 : dp_r = i_dp[3];4 : dp_r = i_dp[4];5 : dp_r = i_dp[5];6 : dp_r = i_dp[6];7 : dp_r = i_dp[7];endcase//--------------------------------------// 根据seg7_addr, 选择小数点码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据seg7_addr, 选择待译段码 开始//++++++++++++++++++++++++++++++++++++++reg [3:0] seg_data_r; // 待译段码alwayscase (seg7_addr)0 : seg_data_r = i_data[3:0];1 : seg_data_r = i_data[7:4];2 : seg_data_r = i_data[11:8];3 : seg_data_r = i_data[15:12];4 : seg_data_r = i_data[19:16];5 : seg_data_r = i_data[23:20];6 : seg_data_r = i_data[27:24];7 : seg_data_r = i_data[31:28];endcase//--------------------------------------// 根据seg7_addr, 选择待译段码 结束//--------------------------------------//++++++++++++++++++++++++++++++++++++++// 根据熄灭码/小数点码/待译段码// 译出段码,开始//++++++++++++++++++++++++++++++++++++++reg [7:0] o_seg_r; // 段码寄存器/** 0* -------* | |* 5| 6 |1* -------* | |* 4| |2* ------- . 7* 3*/// 共阳always @ (posedge i_clk, negedge i_rst_n)if (!i_rst_n)o_seg_r <= 8'hFF; // 送熄灭码 elseif(turn_off_r) // 送熄灭码 o_seg_r <= 8'hFF;elseif(!dp_r)case(seg_data_r) // 无小数点 4'h0 : o_seg_r <= 8'hC0;4'h1 : o_seg_r <= 8'hF9;4'h2 : o_seg_r <= 8'hA4;4'h3 : o_seg_r <= 8'hB0;4'h4 : o_seg_r <= 8'h99;4'h5 : o_seg_r <= 8'h92;4'h6 : o_seg_r <= 8'h82;4'h7 : o_seg_r <= 8'hF8;4'h8 : o_seg_r <= 8'h80;4'h9 : o_seg_r <= 8'h90;4'hA : o_seg_r <= 8'h88;4'hB : o_seg_r <= 8'h83;4'hC : o_seg_r <= 8'hC6;4'hD : o_seg_r <= 8'hA1;4'hE : o_seg_r <= 8'h86;4'hF : o_seg_r <= 8'h8E;endcaseelsecase(seg_data_r) // 加小数点4'h0 : o_seg_r <= 8'hC0 ^ 8'h80;4'h1 : o_seg_r <= 8'hF9 ^ 8'h80;4'h2 : o_seg_r <= 8'hA4 ^ 8'h80;4'h3 : o_seg_r <= 8'hB0 ^ 8'h80;4'h4 : o_seg_r <= 8'h99 ^ 8'h80;4'h5 : o_seg_r <= 8'h92 ^ 8'h80;4'h6 : o_seg_r <= 8'h82 ^ 8'h80;4'h7 : o_seg_r <= 8'hF8 ^ 8'h80;4'h8 : o_seg_r <= 8'h80 ^ 8'h80;4'h9 : o_seg_r <= 8'h90 ^ 8'h80;4'hA : o_seg_r <= 8'h88 ^ 8'h80;4'hB : o_seg_r <= 8'h83 ^ 8'h80;4'hC : o_seg_r <= 8'hC6 ^ 8'h80;4'hD : o_seg_r <= 8'hA1 ^ 8'h80;4'hE : o_seg_r <= 8'h86 ^ 8'h80;4'hF : o_seg_r <= 8'h8E ^ 8'h80;endcase//--------------------------------------// 根据熄灭码/小数点码/待译段码// 译出段码,结束//--------------------------------------/** | c[1]* b[in] -|* | e[out]*/assign o_dig = ~o_dig_r; // 寄存器输出位码 assign o_seg = o_seg_r; // 寄存器输出段码endmodul。

avr74hc595驱动四位数码管程序

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);

74HC595驱动四位数码管

74HC595驱动四位数码管
输出电流 Io(Q0-Q7) Io(Q7S) ±35 ±25 mA mA
_____________________________________________________
电源端/地端电流 ±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

51单片机+74HC595驱动数码管程序

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:感谢大家的阅读,本文由我司收集整编。

10、74HC595控制数码管

10、74HC595控制数码管

连接电路:其时序图为:进行了仿真,由于没有这个芯片,没有进行下载测试。

`timescale 1ns / 1ps///////////////////////////////////////////////////////////////////// /////////////// Company:// Engineer://// Create Date: 10:19:45 11/24/2010// Design Name:// Module Name: HC595// Project Name:// Target Devices:// Tool versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// /////////////module HC595(clk,rst_n,ds_stcp,ds_shcp,ds_data);input clk,rst_n; //时钟为50MHzoutput ds_stcp,ds_shcp,ds_data;//--------------------------------------------------------------//定义参数/*共阴数码管编码,共阳的取反即可。

0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0 1 2 3 4 50x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,6 7 8 9 A B0x39 , 0x5e , 0x79 , 0x71 , 0x00C D E F 无显示*///参数定义(共阴数码管的编码)parameter SEG_NUM0 = 8'h3f,SEG_NUM1 = 8'h06,SEG_NUM2 = 8'h5b,SEG_NUM3 = 8'h4f,SEG_NUM4 = 8'h66,SEG_NUM5 = 8'h6d,SEG_NUM6 = 8'h7d,SEG_NUM7 = 8'h07,SEG_NUM8 = 8'h7f,SEG_NUM9 = 8'h6f,SEG_NUMa = 8'h77,SEG_NUMb = 8'h7c,SEG_NUMc = 8'h39,SEG_NUMd = 8'h5e,SEG_NUMe = 8'h79,SEG_NUMf = 8'h71;//位选输出parameter SEG_WE0 = 4'b1110,SEG_WE1 = 4'b1101,SEG_WE2 = 4'b1011,SEG_WE3 = 4'b0111;//---------------------------------------------------------------//递增数据,每1s加1reg [25:0] cnt_1s;reg [15:0] dis_data; //数码管显示,16位,每4位为一数字,显示四位数//1s的计数器always @(posedge clk or negedge rst_n)if(!rst_n)cnt_1s <= 1'b0;else if(cnt_1s == 26'd49_000_000)cnt_1s <= 1'b0;elsecnt_1s <= cnt_1s + 1'b1;wire done_1s = (cnt_1s == 26'd49_000_000); //1s的标志位//显示数据每秒递增always @(posedge clk or negedge rst_n)if(!rst_n)dis_data <= 16'b0;else if(done_1s)dis_data <= dis_data + 1'b1;//----------------------------------------------------------------reg [7:0] seg_num; //当?跋允???据reg [7:0] seg_duan; //段选reg [7:0] seg_we; //位选reg [7:0] cnt_4;//分时计数器always @(posedge clk or negedge rst_n)if(!rst_n)cnt_4 <= 8'b0;elsecnt_4 <= cnt_4 + 1'b1;//显示数据always @(posedge clk or negedge rst_n)if(!rst_n)seg_num <= 8'b0;elsecase(cnt_4[7:6])2'b00: seg_num <= dis_data[3:0];2'b01: seg_num <= dis_data[7:4];2'b10: seg_num <= dis_data[11:8]; 2'b11: seg_num <= dis_data[15:12]; default: seg_num <= 8'h00;endcase//段选always @(posedge clk or negedge rst_n)if(!rst_n)seg_duan <= 8'b0;elsecase(seg_num)4'd0: seg_duan <= SEG_NUM0;4'd1: seg_duan <= SEG_NUM1;4'd2: seg_duan <= SEG_NUM2;4'd3: seg_duan <= SEG_NUM3;4'd4: seg_duan <= SEG_NUM4;4'd5: seg_duan <= SEG_NUM5;4'd6: seg_duan <= SEG_NUM6;4'd7: seg_duan <= SEG_NUM7;4'd8: seg_duan <= SEG_NUM8;4'd9: seg_duan <= SEG_NUM9;4'ha: seg_duan <= SEG_NUMa;4'hb: seg_duan <= SEG_NUMb;4'hc: seg_duan <= SEG_NUMc;4'hd: seg_duan <= SEG_NUMd;4'he: seg_duan <= SEG_NUMe;4'hf: seg_duan <= SEG_NUMf;default: ;endcase//位选always @(posedge clk or negedge rst_n)if(!rst_n)seg_we <= 8'b0;elsecase(cnt_4[7:6])2'b00: seg_we <= SEG_WE0;2'b01: seg_we <= SEG_WE1;2'b10: seg_we <= SEG_WE2;2'b11: seg_we <= SEG_WE3;default: seg_we <=4'b1111; //全灭endcase//---------------------------------------------------------------------//74HC595reg ds_stcp_r;reg ds_shcp_r;reg ds_data_r;//串行移位时钟always @(posedge clk or negedge rst_n)if(!rst_n)ds_shcp_r <= 1'b0;else if((cnt_4 > 8'h02 && cnt_4 <= 8'h22)||(cnt_4 > 8'h42 && cnt_4 <= 8'h62)||(cnt_4 > 8'h82 && cnt_4 <= 8'ha2)||(cnt_4 > 8'hc2 && cnt_4 <= 8'he2))ds_shcp_r <= ~ds_shcp_r;//串行移位数据always @(posedge clk or negedge rst_n)if(!rst_n)ds_data_r <= 1'b0;elsecase(cnt_4)8'h02,8'h42,8'h82,8'hc2: ds_data_r <=seg_duan[7];8'h04,8'h44,8'h84,8'hc4: ds_data_r <=seg_duan[6];8'h06,8'h46,8'h86,8'hc6: ds_data_r <=seg_duan[5];8'h08,8'h48,8'h88,8'hc8: ds_data_r <=seg_duan[4];8'h0a,8'h4a,8'h8a,8'hca: ds_data_r <=seg_duan[3];8'h0c,8'h4c,8'h8c,8'hcc: ds_data_r <=seg_duan[2];8'h0e,8'h4e,8'h8e,8'hce: ds_data_r <=seg_duan[1];8'h10,8'h50,8'h90,8'hd0: ds_data_r <=seg_duan[0];8'h1a,8'h5a,8'h9a,8'hda: ds_data_r <=seg_we[0];8'h1c,8'h5c,8'h9c,8'hdc: ds_data_r <=seg_we[1];8'h1e,8'h5e,8'h9e,8'hde: ds_data_r <=seg_we[2];8'h20,8'h60,8'ha0,8'he0: ds_data_r <=seg_we[3];default: ; //全灭endcase//并行移位时钟always @(posedge clk or negedge rst_n)if(!rst_n)ds_stcp_r <= 1'b0;else if((cnt_4 == 8'h02)||(cnt_4 == 8'h42)||(cnt_4 ==8'h82)||(cnt_4 == 8'hc2))ds_stcp_r <= 1'b0;else if((cnt_4 == 8'h23)||(cnt_4 == 8'h63)||(cnt_4 ==8'ha3)||(cnt_4 == 8'he3))ds_stcp_r <= 1'b1;assign ds_shcp = ds_shcp_r;assign ds_stcp = ds_stcp_r;assign ds_data = ds_data_r;endmoduleTest Benth File`timescale 1ns / 1ps///////////////////////////////////////////////////////////////////// ///////////// Company:// Engineer://// Create Date: 11:29:46 11/24/2010// Design Name: HC595// Module Name: E:/FPGA/vedio/74hc595/hc595.v// Project Name: 74HC595// Target Device:// Tool versions:// Description://// Verilog Test Fixture created by ISE for module: HC595//// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// ///////////module hc595_v;// Inputsreg clk;reg rst_n;// Outputswire ds_stcp;wire ds_shcp;wire ds_data;// Instantiate the Unit Under Test (UUT)HC595 uut (.clk(clk),.rst_n(rst_n),.ds_stcp(ds_stcp),.ds_shcp(ds_shcp),.ds_data(ds_data));always #100 clk = ~clk;initial begin// Initialize Inputsclk = 0;rst_n = 1;// Wait 100 ns for global reset to finish#100 rst_n = 0;#100 rst_n = 1;// Add stimulus here endendmodule仿真波形:效果图(教程上的)。

74HC595驱动数码管设计

74HC595驱动数码管设计

74HC595驱动数码管设计2009年09月18日星期五 10:111.1 LED数码管简介发光二极管LED是能将电信号转换成光信号的发光器件,7段LED数码管则是在一定形状的绝缘材料上,利用单只LED组合排列成的“8”字型,分别引出它们的电极,点亮相应的笔段来显示出0-9的数字。

1.1.1 LED数码管的结构与特性LED数码管根据LED的接法不同分为共阴和共阳两类,了解这些特性,对编程是很重要的,不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

共阴和共阳极数码管的外形及内部电路如图1.1所示,它们的发光原理是一样的,只是电源极性不同。

图1.1 数码管外形和内部电路将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。

以共阴式为例,若把阴极接地,在相应段的阳极接上正电源,该段即会发光。

LED数码管的主要特点如下:l)能在低电压、小电流条件下驱动发光,能与CMOS、TTL电路兼容;2)发光响应时间极短(<0.1μs),高频特性好,单色性好,亮度高;3)体积小,重量轻,抗冲击性能好;4)寿命长,使用寿命在10万小时以上,甚至可达100万小时,成本低。

LED数码管被广泛用作数字仪器仪表、数控装置、计算机的数显器件。

1.1.2 LED数码管原理说明LED数码管中各段发光二极管的伏安特性和普通二极管类似,只是正向压降较大,正向电阻也较大。

在一定范围内,其正向电流与发光亮度成正比。

由于常规的数码管用电电流只有1~2 mA,最大极限电流也只有10~30 mA,所以它的输入端在5 V电源或高于TTL高电平(3.5 V)的电路信号相接时,一定要串加限流电阻,以免损坏器件。

1.2 74HC595简介74HC595是具有8位移位寄存器和一个存储器,三态输出功能。

移位寄存器和存储器是分别的时钟。

数据在SHCP的上升沿输入,在STCP的上升沿进入到存储寄存器中去。

如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。

74hc595的用法 -回复

74hc595的用法 -回复

74hc595的用法-回复74HC595是一种串行输入/并行输出的8位移位寄存器,被广泛应用于数字电路和嵌入式系统设计中。

它是通过串行数据输入的方式将数据存储在内部的8位移位寄存器中,并且可以通过并行输出的方式将数据输出到8个输出引脚上。

本文将一步一步回答有关74HC595的用法。

第一步:了解74HC595的引脚功能74HC595一共有16个引脚,每个引脚都有特定的功能。

以下是74HC595引脚的功能解释:- SER(Serial Data Input):串行数据输入引脚,用于输入要存储的数据。

- SRCLK(Shift Register Clock Input):移位寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将串行输入的数据存储到移位寄存器中。

- RCLK(Register Clock Input):寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将移位寄存器中的数据并行输出到输出引脚上。

- OE(Output Enable):输出使能引脚,通过控制该引脚的高低电平,可以使输出引脚处于高阻态或工作态。

- STCP(Storage Register Clock Input):存储寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将移位寄存器中的数据存储到存储寄存器中。

- SHCP(Shift Register Clock Input):移位寄存器时钟输入引脚,通过上升沿或下降沿的时钟信号,将存储寄存器中的数据并行输出到输出引脚上。

- Q0-Q7(Parallel Data Outputs):并行数据输出引脚,通过并行方式输出存储在移位寄存器中的数据。

第二步:连接74HC595到微控制器为了正确使用74HC595,需要将其连接到微控制器或其他数字电路中。

以下是连接74HC595到微控制器的步骤:1. 将74HC595的VCC引脚连接到微控制器的电源引脚,并确保电压匹配(一般为5V)。

2. 将74HC595的GND引脚连接到微控制器的地引脚。

数码管程序(74hc595)

数码管程序(74hc595)

#include<reg52.h> //让两个数码管同时由0→F亮起来:#define uchar unsigned char#define uint unsigned intuint a,b;uchar c,d,e,t;sbit RCK=P0^0; //位定义(显示控制)sbit SCK=P0^1; //位定义(数据控制)sbit SI=P0^2; //位定义(数据输入)void delay(uint z) //延时函数{for(a=z;a>0;a--)for(b=1000;b>0;b--);}uchar code table[]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x05,0x31,0x93,0x61,0x13,0x17};void main(){while(1){for(t=0;t<16;t++)//这个for语句的作用是取0→F的数;{for(e=0;e<2;e++)//这个for语句是让同一个数据送两次,分别送到两个芯片里面{c=table[t];for(d=0;d<8;d++)//这个for语句用来送数据;{c=c>>1;SCK=0; //低电平SI=CY; //把这个数装到CY(溢出寄存器),CY再把这个数推到SI线上,于是这一位数就进入到芯片去了;for语句一共循环了八次,这数组也向右移了八次,全部溢出,于是这个数就进入到芯片里面去;这叫串行输入;SCK=1; //高电平(在SCK由0→1过程中(低电平→高电平或叫上升沿),SI线上的数据就进到芯片里面)}}RCK=1;RCK=0; //(在RCK由1→0过程中(高电平→低电平或叫下降沿)开启显示delay(80);}}}。

74hc595芯片驱动数码管的工作原理

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 资源的情况。

51单片机C编程(74HC595控制四位数码管)

51单片机C编程(74HC595控制四位数码管)
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P30=P3^0;
sbit P31=P3^1;
uchar temp;
void delay(int ms)
{
int k;
while(ms--)
{
for(k=0;k<250;k++)
{
_nop_();
_nop_();
}
}
}void WR_59来自(void) //将显示数据送入74HC595内部移位寄存器
{
uchar j;
for(j=0;j<8;j++)
{
temp=temp<<1;
[转] 51单片机C编程(74HC595控制四位数码管)2011.3.3阅读(0)下一篇:51单片机C编程(... |返回日志列表赞赞赞赞转载(6)分享评论复制地址编辑
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
temp=DAT[8];
WR_595();
OUT_595();
}
if(P30==0)
{
while(P30==0);
temp=DAT[9];
WR_595();
OUT_595();
}

74HC595与数码管

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静态驱动
#include<reg51.h>
//#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
for(i=0;i<8;i++)
{
HC595SH=0;
HC595Data=num&0x80;//数据的高位到595的输入端(把数据放到595的输入端)
num=num<<1;//向左移一位数据,为下次写入第二位数据到595做准备
//HC595SH=0;
HC595SH=1;//拉高时钟信号,才正真的把高位数据写入595
}
}
void Display(uchar ge ,uchar shi,uchar bai ,uchar qian)
{
HC595ST=0;//ST拉低不允许并行输出
HC595SendByte(qian); //把第一个8位移入寄存器,
HC595SendByte(bai);//把第二个8位移入寄存器,
HC595SendByte(shi);//把第三个8位移入寄存器,
HC595SendByte(ge);//把第四个8位移入寄存器,
HC595ST=1;//完成32位数据都移到4个595里面了,拉高ST把32位数据同时输出,让数码管显示
}
void main()
{
while(1)
{
Display(1,2,3,4);
}
}
sbit HC595SH=P2^4;//数据输入时钟信号

第二十篇 SPI与74HC595

第二十篇 SPI与74HC595

第二十篇 SPI与74HC595SPI,全称为Serial Peripheral interface,意思是“串行外围设备接口”,主要应用在:EEPROM,FLASH,实时时钟,AD转换器灯。

SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SSEL。

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。

传输原理:每个SCK边沿(上升沿或下降沿,需要事先设定),MISO或MOSI会被采样一次,连续八次,就可以传输一个字节。

其接口配置示例如下:下面介绍LPC2000的SPI接口:以LPC2103的SPI0为例:引脚的对应关系为:SCK0——P0.4,MISO0——P0.5,MOSI0——P0.6,SSEL0——P0.7LPC2000的SPI接口的功能模块如下图:图中五个功能分别对应着5个寄存器:SPCR——SPI Control Register,SPI控制寄存器,用于控制SPI的功能SPSR——SPI Status Register,SPI状态寄存器,用于显示当前SPI的状态。

SPDR——SPI Data Register,SPI数据寄存器,用于发送和接收数据,向其写入字节,就会自动发送,接收数据也从它里面取出。

SPCCR——SPI Clock Counter Register,SPI时钟计数器寄存器,用于控制主机SPI总线速率SCK。

Fspi=Fpclk/SPCCRSPINT——SPI Interrupt Flag,SPI中断标志寄存器,包含SPI接口的中断标志。

展开来说,我们会用到:CPHA——SPCR[3],时钟相位控制位,CPHA=0, 数据在SCK的第一个时钟沿采样;CPHA=1, 数据在SCK的第二个时钟沿采样。

单片机和74HC595驱动芯片对数码管的控制设计

单片机和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驱动数码管C程序

74HC595驱动数码管C程序

/*************************************
用途:
注意:内部8M晶振
************************************************/
#include "config.h"
volatile unsigned int countnum=0;
extern void HC_595_OUT(unsigned char data);
extern void Seg7_Led_Update(void);
extern void Seg7_Led_display(unsigned int data);
extern void Seg7_Led_float(float data);
文件:spi.h
用途:
注意:内部8M晶振
************************************************/
#ifndef __spi_H__
#define __spi_H__
#define SS 0
#define SCK 1
#define MOSI 2
#define Seg7_Bitselect_DDR DDRB
#define Seg7_Bit0 4
#define Seg7_Bit1 5
#define Seg7_Bit2 6
#define Seg7_Bit3 7
#define dp 7
#define Seg7_Bit0_En() {Seg7_Bitselect_DDR|=(1<<Seg7_Bit0);Seg7_Bitselect_PORT|=(1<<Seg7_Bit0);}

AT24C02,74HC595,数码管倒计时(加一减一调初值)显示

AT24C02,74HC595,数码管倒计时(加一减一调初值)显示
{
i=AT24C02_ReadOneByteFromAddr(10);
Delay(200);
j=AT24C02_ReadOneByteFromAddr(20);
Delay(200);
while(1)
{
display(1,i);
display(2,j);
Key_Detect();
}
}
void beep()
AT24C02_SCL = 1;
AT24C02_SDA = 0;
DELAY;
AT24C02_SCL = 0;
}
/******************************************************************************
函数名称:AT24C02_Stop
ucData>>=1;
}
SEG_STCP=0;
SEG_STCP=1;
}
/******************************************************************************
函数名称:AT24C02_Start
函数功能:程序主函数
入口参数:无
返回值:无
display(2,j);
}
beep();
while((i!=0)||(j!=0))
{
beep1();
if((i>0)&&(i<9))
i+=1;
else if((i==0)&&(j!=9))
{
i=1;
j+=1;
}
else if((i==0)&&(j==9))
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VI
-0.5~VCC+0.5
V
_____________________________________________________
输出电压
VO
-0.5~VCC+0.5
V
_____________________________________________________
钳位二极管电流
IIK/IOK
74HC595
74HC595控制四位数码管
74HC595芯片资料 74HC595是8位串入并出的接口芯片
74HC595芯片资料
74HC59Leabharlann 芯片资料74HC595的控制端说明
CR(10脚):低电平时将移位寄存器的数据清零,通常将字接VCC CPSR(11脚):上升沿时数据寄存器的数据移位。Q0-Q1-..Q7:下降沿移位寄存器数据不
变。(脉冲宽度:5V时,大于几十纳秒就行了,通常选微秒级) CPLA(12脚):高电平时移位寄存器的数据进入数据存储寄存器,低电平时存储寄存器数据
不变,通常将CPLA置为低电平,当移位结束后,在CPLA端产生一个正脉冲 (5V时,大于几十纳秒就行了,通常都选微秒级),更新显示数据。 EN(13脚):高电平时禁止输出(高阻态),如果单片机的引脚下不紧张,用一个引脚控制 它,可以方便的产生闪烁和熄灭的效果,比通过数据端移位控制要省时省力。
±20
mA
_____________________________________________________
输出电流
Io(Q0-Q7)
±35
mA
Io(Q7S)
±25
mA
_____________________________________________________
电源端/地端电流
-
±70
mA
_____________________________________________________
贮存温度
Tstg
-65~+150

74HC595驱动四位数码管电原理图
74HC595芯片资料
极限参数:
参数
符号
参数范围
单位
_____________________________________________________
电源电压
VCC
-0.5~7
V
_____________________________________________________
输入电压
相关文档
最新文档