74HC595 的工作原理 74HC595 的工作原理-编程-显示 SCH 74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存 储器是分别的时钟。 数据在 11 SHcp(SCLK P0.4)的上升沿输入,在 12 STcp(nCS P0.8)的上升 P0.4) P0.8) ( ( 沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个 脉冲。 移位寄存器有一个串行移位输入 14 (Ds) P0.6) 和一个串行输出 9 (Q7’) MISO (MOSI P0.6), ( P0.5) P0.5),和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具备三态的总线输出,当 使能 OE 时(为低电平),存储寄存器的数据输出到总线。 74HC595 各个引脚的功能: Q1~7 是并行数据输出口,即储寄存器的数据输出口 Q7' 串行输出口,其应该接 SPI 总线的 MISO 接口 STcp 存储寄存器的时钟脉冲输入口 SHcp 移位寄存器的时钟脉冲输入口 OE 的非 输出使能端 MR 的非 芯片复位端 Ds 串行数据输入端 程序说明: 每当 SHcp(SCLK)(SCLK P0.4)上升沿到来时,DS(MOSI P0.6) P0.4) ( (MOSI P0.6)引脚当前电平值 在移位寄存器中左移一位,在下一个上升沿到来时移位寄存器中的所有位都会向左移一位, 同时 Q7'( MISO) ( MISO P0.5) P0.5)也会串行输出移位寄存器中高位的值,这样连续进行 8 次,就 可以把数组中每一个数(8 位的数)送到移位寄存器;然后当 STcp(nCS)(nCS P0.8)上升 P0.8) ( 沿到来时,移位寄存器的值将会被锁存到锁存器里,并从 Q1~7 引脚输出。 //74HC595 串行输出数据 void outdisp(unsigned char num) { unsigned char i; for (i=0;i<8;i++ ) { DS=num; SHCP=1; SHCP=0; num<<=1; } } 设计显示 PCB 板(595 一为传送位选信号,一为传送代码段信号) CEPARK AVR 单片机 之 HC595 驱动数码管显示 (2009-09-16 17:30:13) 标签: 分类:Avr it 这里我用的 CEPARK 的 M64 AVR 开发板,这一课的重点是学会如何使用 74HC595 来驱动数码管。 74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时 钟。数据在 SHcp 的上升沿输入,在 STcp 的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移 位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’), 和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具备三态的总线输出,当使能 OE 时(为低电 平),存储寄存器的数据输出到总线。 引脚说明: QA--QH: 八位并行输出端,可以直接控制数码管的 8 个段。 QH': 级联输出端。我将它接下一个 595 的 SI 端。 SER(DS): 串行数据输入端。 74595 的控制端说明: /SCLR(MR)(10 脚): 低点平时将移位寄存器的数据清零。通常我将它接 Vcc。 SCK(SHCP)(11 脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据 不变。(脉冲宽度:5V 时,大于几十纳秒就行了。我通常都选微秒级) RCK(STCP)(12 脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通 常我将 RCK 置为低电平,当移位结束后,在 RCK 端产生一个正脉冲(5V 时,大于几十纳秒就行了。我通常 都选微秒级),更新显示数据。 /G(OE)(13 脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便 地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。 注:74164 和 74595 功能相仿,都是 8 位串行输入转并行输出移位寄存器。74164 的驱动电流(25mA)比 74595(35mA)的要小,14 脚封装,体积也小一些。 74595 的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度 慢的场合很有用处,数码管没有闪烁感。 与 164 只有数据清零端相比,595 还多有输出端时能/禁止控制端,可以使输出为高阻态。 注明:74HC595 引脚命名我现在看到两种,如串行数据输入端(14 脚)有的 Datasheet 上叫 SER,还有一种 叫 DS。不过这都没有关系,只是名字不一样,大家看这些文档时,注意点就行。 现在大家对 595 有了一定的了解,现在我们看 CEPARK AVR 单片机开发板上这一部分的原理图: 大家这里只要注意 11,12,14 这三个引脚由单片机的哪几个口控制就好。 SHCP(11)-----------PG0 STCP(12)-----------PG1 DS(14)-------------PG2 下面是源程序: 效果:第一位和第二位数码管显示 5; #include <avr/io.h> #include <util/delay.h> #define SER_PORT PORTG //PG 口 #define SER_DATA PG2 //DS,串行数据入口 #define SER_RCK PG1 //STCP,来一个上升沿时数据进入并行输出 #define SER_SCK PG0 //SHCP,来一个上升沿时数据移位 unsigned char Led_Disbuf[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳极 void Send_Byte_HC595(unsigned char byte) //并行数据移位输出函数 { 一个数码管亮 //byte 是表示我们想哪一位数码管亮, 如为 0x01,表示第 unsigned char i; //循环变量 for(i = 0;i < 8;i++) { if(byte & 0x80) { SER_PORT |= _BV(SER_DATA); //PG2 输出 1 } else { SER_PORT &= ~_BV(SER_DATA);//PG2 输出 0 } SER_PORT |= _BV(SER_SCK); //上升沿触发,SER_DATA 数据进入移位寄存器 _delay_us(5); SER_PORT &= ~_BV(SER_SCK); byte <<= 1; //通过左移,逐个点亮个个数码管 } SER_PORT |= _BV(SER_RCK); //上升沿触发,移位寄存器中的数据并行输出 _delay_us(5); SER_PORT &= ~_BV(SER_RCK); } int main(void) { PORTB = 0xff; //PB 口赋初值为 ff DDRB = 0xff; //PB 口为输出态 PORTG = 0x00; //PG 口赋初值为 0 DDRG |= _BV(SER_DATA)|_BV(SER_RCK)|_BV(SER_SCK); //PG0,PG1,PG2 为输出态 PORTB = Led_Disbuf[5]; //数码管上显示 5 Send_Byte_HC595(0x03); //第一位,第二位数码管点亮 while(1) {}; }
温馨提示:答案为网友推荐,仅供参考