串并转模块74hc595
74HC595 是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是单独的时钟。数据在 SCK 的上升沿输入,在 RCK 的上升沿进入到存储器中。如果两个时钟连在一起,则移位寄存器总是比存储器早一个脉冲。移位寄存器有一个串行输入(DS),和一个串行输出(Q7 非),和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具有三态的总线输出,当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在STCP 上升沿输出到并行端口。
管脚功能
15和1到7脚 QA–QH:并行数据输出
9 脚 QH 非:串行数据输出
10 脚 SCLK 非( MR) : 低电平复位引脚
11 脚 SCK( SHCP) : 移位寄存器时钟输入
12 脚 RCK( STCP) : 存储寄存器时钟输入
13 脚 G 非( OE) : 输出有效
14 脚 SER( DS) : 串行数据输入
功能表![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bdeb5c844748476dbe3c2ae83fc298e9.png#pic_center)
当MR 为高电平,OE 为低电平时,数据在SHCP 上升沿进入移位寄存器,在
STCP 上升沿输出到并行端口。
根据上述图片可知;MR(10引脚接vcc始终高电平,OE低电平),因此只需控制针脚11,12,即可控制输入输出;SER(14针脚)用于串行输入;
//点阵滚动;74hc595
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define LED_DZ P0
#define ZI 8 //值为字数×8
sbit SRCLK=P3^6; //移位寄存器时钟输入SRCLK
sbit RC=P3^5; //存储寄存器时钟输入RCLK
sbit SER=P3^4; //串行输入 SER
//按行刷新上下滚动
//上下移动按照行刷依次点亮行
u8 ser_xscan[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//行控制
u8 ser_yscan[8]={0xFF,0x7D,0xBB,0xD7,0x00,0xEF,0xEF,0xEF};//列控制
//按列刷新左右滚动
//左右移动//按照列刷依次点亮列字8*8点阵 “大”
u8 ser_xscan1[8]={0x12,0x14,0x18,0xf0,0x18,0x14,0x12,0x10};//行控制
u8 ser_yscan1[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//列控制
void delay(u16 ms)
{
u16 i=0,j=0;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void delay_10us(u16 us)
{
while(us--);
}
//数据串行输入,一个字节8位
void SER_8(u8 dat)
{
u16 i=0;
for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1;
delay_10us(1);
// 移位寄存器时钟输入 SHCP上升沿
SRCLK=0;
delay_10us(1);
SRCLK=1;
}
//RCLK存储寄存器时钟 STCP上升沿
RC=0;
delay_10us(1);
RC=1;
}
void main()
{
while(1)
{
u16 i=0,j=0;
while(1)
{
for(i=0;i<8;i++,j++)
{
j=j%ZI;//防止j溢出;j范围0-255;
SER_8(ser_xscan[i]); //传行
LED_DZ=ser_yscan[j]; // 传列
delay_10us(200);
//SER_8(0x00);
}
j++;//差值实现点阵图像滚动,循环8次差1,若改为i++/i--可实现左右滚动
delay(200);
}
}
}
}
j++;//差值实现点阵图像滚动,循环8次差1,若改为i++/i--可实现左右滚动
delay(200);
}
}
}