编写程序之前,要对所使用到的芯片功能、引脚了解。据自己所需要的功能,编写程序。
单片机IO口的扩展很有必要,因为单片机的引脚数固定,当外设过多的时候,单片机引脚资源的合理利用就变得很重要。
74HC595是一块串转并的芯片,74HC595具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器有相互独立的时钟。数据在SH_CP(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_CP(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。将串行输入的8位数字,转变为并行输出的8位数字,例如控制一个8位数码管,将不会有闪烁。
程序功能:使用74HC595扩展IO,制作流水灯
```c
#include "reg51.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
//定义使用的IO
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
//延时函数
void delay(u16 i)
{
while(i--);
}
//使用74HC595发送一个字节的数据
void HC595SendByte(u8 data)
{
u8 a;
SRCLK=1;
RCLK=1;
for(a=0;a<8;a++)
{
SER=data>>7;
data<<=1;
SRCLK=0;
_nop_();
_nop_();
SRCLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;
}
//主函数
void main()
{
u8 ledNum;
ledNum=~0x01;
while(1)
{
HC595SendByte(ledNum);
ledNum=_crol_(ledNum,1);
delay(50000);
}
}