2. 串行口方式0扩展并行输出口 单片机的串口方式0外接移位寄存器74LS164,从而利用串行口方式0扩展并行输出口。74LS164的输出控制8个LED,利用串行输入并行输出的功能,先进行向上流水灯操作2次,向下流水灯操作2次, 跑马灯闪烁2次,然后再重复刚才过程,如此循环
时间: 2024-02-27 11:59:07 浏览: 93
利用74LS164芯片扩展8位LED串行显示接口电路单片机课
好的,这是一个比较具体的问题。下面是一个基本的代码框架,可以实现您所描述的功能:
```c
#include<reg52.h>
#include<intrins.h>
sbit SDA=P3^4; // 串行数据输入引脚
sbit SCLK=P3^5; // 串行时钟引脚
sbit RCLK=P3^6; // 并行数据锁存引脚
void delay(unsigned int k) // 延时函数
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<125;j++);
}
}
void sendByte(unsigned char dat) // 发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=dat&0x80; // 将最高位送入SDA
dat=dat<<1;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
}
}
void send(unsigned char dat) // 发送数据
{
sendByte(dat); // 发送数据
RCLK=0; // 使输出无效
_nop_();
_nop_();
RCLK=1; // 使输出有效
}
void main()
{
unsigned char i;
while(1)
{
for(i=0;i<2;i++) // 向上流水灯操作2次
{
send(0x01<<i);
delay(500);
}
for(i=2;i>0;i--) // 向下流水灯操作2次
{
send(0x01<<i);
delay(500);
}
for(i=0;i<2;i++) // 跑马灯闪烁2次
{
send(0x55);
delay(500);
send(0xAA);
delay(500);
}
}
}
```
这段代码中,我们首先定义了SDA、SCLK和RCLK三个引脚,分别对应74LS164芯片的串行数据输入、串行时钟和并行数据锁存引脚。接着,我们定义了三个函数,分别为延时函数、发送一个字节的函数和发送数据的函数。在主函数中,我们通过向上流水灯、向下流水灯和跑马灯闪烁等操作,完成了对8个LED灯的控制。最后,我们通过一个无限循环,实现了不断循环这些操作的功能。
阅读全文