本文主要是介绍串转并74hC595控制流水灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include <reg51.h>
//重新定义系统数据类型
typedef unsigned int u16;
typedef unsigned char u8;
//宏定义数据端口
#define LEDDZ_COL_PORT P0
#define SER_AP_PORT P1
//定义数据存储端口
sbit SER=P3^4;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
//依次闪烁每行灯数组
u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//函数名:delay_10us,延时函数ten_us=1时,大约延时10us,输入:ten_us,输出无
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//函数名:delay_ms,延时函数ms=1时,大约延时1ms,输入ten_us,输出无
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--) //ms=1时,下一个for循环110次,ms=>1,两循环一次走ms次,多少次就是多少毫秒
for(j=110;j>0;j--); //ten-us=1延时10us,循环110,大约1100us大约1ms
}
void hc595_write_data(u8 dat) //位移寄存器主函数,把一个字节的数据按高位到低位的方式依次送入(芯片要求高位至低位的顺序)
{
u8 i=0; //定义一个字符型变量并赋初值
for(i=0;i<8;i++) //循环8次可将一个字节写吧位移寄存器中,无符号型不考虑符号
{
SER=dat>>7; //优先传输数据高位后右移动7位,就把数据移入了右边最低位
dat<<=1; //把数据从最右边最低位往左向高位移动一位,最右边最低位补0
SRCLK=0; //赋予位移时钟初值为低电平
delay_10us(1); //消抖延时10us,根据芯片说明来定义时长
SRCLK=1; //给位移时钟赋高电平,送出一个上升沿电流
delay_10us(1); //消抖延时10us,根据芯片说明来定义时长
}
RCLK=0; //给寄存存储器时钟赋初值0低电平
delay_10us(1); //消抖延时10us
RCLK=1; // 给寄存存储器时钟赋1高电平,发送一个时钟信号,并输出信号
delay_10us(1); //消抖延时10us
}
//主函数,
void main()
{
u8 i=0;
LEDDZ_COL_PORT=0x00; //将LED点阵列全部设置为0,即LED阴极为低电平
while(1)
{
for(i=0;i<8;i++) //依次循环点亮8行,o对应最低位的代码行点亮
{
hc595_write_data(0x00); //清除前寄存器缓存数据
hc595_write_data(ghc595_buf[i]); //写如新的数据
delay_ms(500); //延时500ms
}
}
}
这篇关于串转并74hC595控制流水灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!