芯片的功能介绍
说明:8 位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。
应用:串行到并行的数据转换。
15 和 1 到 7 脚 QA–QH:并行数据输出
9 脚 QH 非:串行数据输出
10 脚 SCLK 非( MR) : 低电平复位引脚
11 脚 SCK( SHCP) : 移位寄存器时钟输入
12 脚 RCK( STCP) : 存储寄存器时钟输入
13 脚 G 非( OE) : 输出有效
14 脚 SER( DS) : 串行数据输入
595 是具有 8 位移位寄存器和一个存储器,三态输出功能。
真值表解读
G =1,其他=x;QA-QH为三态状态(可能高或低)
RCK,SCK任意,SCLR=0,G =0,清空移位寄存器
SCK=上升沿时, SCLR=1,G =0,数据进入移位寄存器
RCK=上升沿时,SCLR=1,G *=0, 移位寄存器的内容转移到输出锁存器
时序图
开发板原理图
由真值表可知,对数据读写操作SRCLR*=1,OE*=0就好了,所以分别接GND、VCC
软件设计
void Hc595SendByte(u8 dat)// 74H595 发送一个字节的数据
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat >> 7; //从最高位开始发送
dat <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
在main()中
ledNum = ~0x01;
while(1)
{
Hc595SendByte(ledNum);// ~0x01, ~0x02, ~0x04,一次点亮led灯
ledNum = _crol_(ledNum, 1);
delay(50000);
}
课后作业
(1)设计一个 0-9 数字循环显示器。(温馨提示:在 main 函数内使用 for
循环语句,间隔一定时间调用数码管段码数组数据)
while(1)
{
for(i=0;i<15;i++)
{
delay(50000);
Hc595SendByte(~smgduan
);
delay(50000);
}
}
(2)使用 74HC595(A)的并行输出口连接动态数码管的位选,实现在动态
数码管上显示 0-7。
//595循环位选,smgduan;数码管循环显示。
u8 i,ledNum;
ledNum = ~0x01;
while(1)
{
for(i=0;i<8;i++)
{
Hc595SendByte(ledNum);
ledNum = _crol_(ledNum, 1);
GPIO_DIG=smgduan;
delay(100);
GPIO_DIG=0x00;//消隐
}
}
LED 点阵实验
开发板原理图
级联时,两条时钟线是连在一起的,输出QH*接到下一个595的串行输入口SER
软件设计
/*********注意RCLK在reg51文件中已经定义过了,你得起一个新名字
//第一个字节数据,会从SEG传送到最后一个595,最后一个字节数据,送给第一个595;
//第一个字节控制列NEG8~NEG16;最后一个字节数据控制行POS1~POS7
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat1 >> 7; //从最高位开始发送
dat1 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat2 >> 7; //从最高位开始发送
dat2 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat3 >> 7; //从最高位开始发送
dat3 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat4 >> 7; //从最高位开始发送
dat4 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
keil错误解析
9.18.c(11): warning C206: ‘Hc595SendByte’: missing function-prototype
原因:这个函数没有定义。需要在调用’Hc595SendByte’这个函数前先声明。
解决方法:添加.h文件
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
原因:缺函数声明呀,实现函数呀
解决方法:看.c.h,都有不
APP74hc595.h(8): error C231: ‘RCLK’: redefinition
原因:reg52.h中定义过RCLK
很不舍,接下来的日子,我要断更了,人总是要顺应时势发展的,眼看开学在即,借本考试也会接踵而来,我不能再由着性子,搞单片机了,接下来的日子,我要加油!
待到合适的时间,我会卷土重来。
芯片的功能介绍
说明:8 位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。
应用:串行到并行的数据转换。
15 和 1 到 7 脚 QA–QH:并行数据输出
9 脚 QH 非:串行数据输出
10 脚 SCLK 非( MR) : 低电平复位引脚
11 脚 SCK( SHCP) : 移位寄存器时钟输入
12 脚 RCK( STCP) : 存储寄存器时钟输入
13 脚 G 非( OE) : 输出有效
14 脚 SER( DS) : 串行数据输入
595 是具有 8 位移位寄存器和一个存储器,三态输出功能。
真值表解读
G =1,其他=x;QA-QH为三态状态(可能高或低)
RCK,SCK任意,SCLR=0,G =0,清空移位寄存器
SCK=上升沿时, SCLR=1,G =0,数据进入移位寄存器
RCK=上升沿时,SCLR=1,G *=0, 移位寄存器的内容转移到输出锁存器
时序图
开发板原理图
由真值表可知,对数据读写操作SRCLR*=1,OE*=0就好了,所以分别接GND、VCC
软件设计
void Hc595SendByte(u8 dat)// 74H595 发送一个字节的数据
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat >> 7; //从最高位开始发送
dat <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
在main()中
ledNum = ~0x01;
while(1)
{
Hc595SendByte(ledNum);// ~0x01, ~0x02, ~0x04,一次点亮led灯
ledNum = _crol_(ledNum, 1);
delay(50000);
}
课后作业
(1)设计一个 0-9 数字循环显示器。(温馨提示:在 main 函数内使用 for
循环语句,间隔一定时间调用数码管段码数组数据)
while(1)
{
for(i=0;i<15;i++)
{
delay(50000);
Hc595SendByte(~smgduan
);
delay(50000);
}
}
(2)使用 74HC595(A)的并行输出口连接动态数码管的位选,实现在动态
数码管上显示 0-7。
//595循环位选,smgduan;数码管循环显示。
u8 i,ledNum;
ledNum = ~0x01;
while(1)
{
for(i=0;i<8;i++)
{
Hc595SendByte(ledNum);
ledNum = _crol_(ledNum, 1);
GPIO_DIG=smgduan;
delay(100);
GPIO_DIG=0x00;//消隐
}
}
LED 点阵实验
开发板原理图
级联时,两条时钟线是连在一起的,输出QH*接到下一个595的串行输入口SER
软件设计
/*********注意RCLK在reg51文件中已经定义过了,你得起一个新名字
//第一个字节数据,会从SEG传送到最后一个595,最后一个字节数据,送给第一个595;
//第一个字节控制列NEG8~NEG16;最后一个字节数据控制行POS1~POS7
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat1 >> 7; //从最高位开始发送
dat1 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat2 >> 7; //从最高位开始发送
dat2 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat3 >> 7; //从最高位开始发送
dat3 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat4 >> 7; //从最高位开始发送
dat4 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
keil错误解析
9.18.c(11): warning C206: ‘Hc595SendByte’: missing function-prototype
原因:这个函数没有定义。需要在调用’Hc595SendByte’这个函数前先声明。
解决方法:添加.h文件
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
原因:缺函数声明呀,实现函数呀
解决方法:看.c.h,都有不
APP74hc595.h(8): error C231: ‘RCLK’: redefinition
原因:reg52.h中定义过RCLK
很不舍,接下来的日子,我要断更了,人总是要顺应时势发展的,眼看开学在即,借本考试也会接踵而来,我不能再由着性子,搞单片机了,接下来的日子,我要加油!
待到合适的时间,我会卷土重来。
举报