关于用51单片机8X8点阵显示一个爱心

目录

 LED点阵的原理图

 74HC595芯片原理图

实现方法

定义需要使用的IO口

 宏定义端口

 构造数组

 编写延时函数

 74HC595芯片数据的读写

显示图案

完整代码


 LED点阵的原理图

要控制LED点阵就需要控制P0口来以此控制LED的负极,控制 74HC595芯片来控制LED的正极。只要给正极高电平负极低电平,LED就会点亮。

 74HC595芯片原理图

 通过74HC595芯片进行IO口的扩展通过控制P3^4,P3^5,P3^6三个IO口来同时控制QA~QH这八个引脚。 

实现方法

定义需要使用的IO口

sbit SRCLK=P3^6;	//移位寄存器时钟输入
sbit RCLK=P3^5;		//存储寄存器时钟输入
sbit SER=P3^4; 		//串行数据输入

 宏定义端口

宏定义P0口来控制的LED的负极

#define LEDDZ_COL_PORT	P0	//点阵列控制端口

 构造数组

数组中的元素为后期编码图案是所用。

u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 a[8]= {0xef,0xc7,0x83,0x01,0x00,0x00,0x11,0xbb};

 编写延时函数

void delay_10us(u16 ten_us)	 //延时函数
{
	while(ten_us--);	
}

 74HC595芯片数据的读写

void hc595_write_data(u8 dat)	   //595读取数据
{
	u8 i=0;
	
	for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
	{
		SER=dat>>7;//优先传输一个字节中的高位
		dat<<=1;//将低位移动到高位
		SRCLK=0;
		delay_10us(1);
		SRCLK=1;
		delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中	
	}
	RCLK=0;
	delay_10us(1);
	RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出	
}

通过输入数据给74HC595芯片既可以控制LED灯的正极

显示图案

	u8 i=0; u16 j=0 ;	  //定义初值
	while(1)
	{	
		//爱心
		while(1)	
		{	j++	;
			for(i=0;i<8;i++)
			{	
				hc595_write_data(0x00);//消除前面寄存器缓存数据
				LEDDZ_COL_PORT=a[i];
				hc595_write_data(ghc595_buf[i]);//写入新的数据
				delay_10us(1);	
			}
			if (j==100)
			{	
				j=0	;
				break;
			}
			
		}
    }

 通过给LED的正负极高电平和低电平来点亮LED灯,再通过数组里面的元素循环出现来让LED灯显示出一个固定的图案,注意显示的速度一定要非常的快,不然将会一行一行的显示。

完整代码

#include "reg51.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义74HC595控制管脚
sbit SRCLK=P3^6;	//移位寄存器时钟输入
sbit RCLK=P3^5;		//存储寄存器时钟输入
sbit SER=P3^4; 		//串行数据输入

#define LEDDZ_COL_PORT	P0	//点阵列控制端口

//	  编码点阵图案
u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 a[8]= {0xef,0xc7,0x83,0x01,0x00,0x00,0x11,0xbb};

void delay_10us(u16 ten_us)	 //延时函数
{
	while(ten_us--);	
}


void hc595_write_data(u8 dat)	   //595读取数据
{
	u8 i=0;
	
	for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
	{
		SER=dat>>7;//优先传输一个字节中的高位
		dat<<=1;//将低位移动到高位
		SRCLK=0;
		delay_10us(1);
		SRCLK=1;
		delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中	
	}
	RCLK=0;
	delay_10us(1);
	RCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出	
}

void main()
{	
	u8 i=0; u16 j=0 ;	  //定义初值
	while(1)
	{	
		//爱心
		while(1)	
		{	j++	;
			for(i=0;i<8;i++)
			{	
				hc595_write_data(0x00);//消除前面寄存器缓存数据
				LEDDZ_COL_PORT=a[i];
				hc595_write_data(ghc595_buf[i]);//写入新的数据
				delay_10us(1);	
			}
			if (j==100)
			{	
				j=0	;
				break;
			}
			
		}
    }
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值