【51单片机】LED点阵

这次的程序是通过控制LED点阵,点亮一个+号。我们使用的是一个8×8的电子,需要操作16bit,实现对行和列的管理,这点其实和矩阵按键是有些类似,只不过一个是输入,一个是输出,都是通过逐行扫描实现的(矩阵按键由于每次只检查一个按键,也可以使用行列扫描)。
下面是LED点阵的原理图
在这里插入图片描述
从上图可以看出,每一个LED都是一个发光二极管,要让某一个LED发光,就需要在一端设置为高电平(1),另一端是低电平(0);按照上图的实现,行是要设置为高电平,列设置为低电平,行列交叉的LED就会被点亮。每次可以控制一行或一列的LED,然后进行逐行或逐列扫描即可。

下面是实现代码:

#include<reg51.h>
#include<intrins.h>
typedef unsigned int u16;	  
typedef unsigned char u8;
sbit SER=P3^4;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
#define LEDS P0
u8 tmp,i;
u8 ledNum;
u8 plus[8]={0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18}; //显示+号需要一次显示的内容
void Hc595SendByte(u8 byte) //这个函数是用来发送串转并的数据,每次发送一个字节,对应8个行引脚
{
	u8 i;
	RCLK=1;
	SRCLK=1;
	for(i=0; i<8; i++)
	{
		SER=byte >> 7; //将最高位右移7位到最低位,然后赋给SER
		byte=byte<< 1; //将次高位左移到最高位,然后通过上一行代码,赋给SER
		SRCLK=0;   //这两句是让SRCLK产生一个上升沿,这样SER的值就可以
		SRCLK=1;   //保存在74HC595中的寄存器了
	}
	RCLK=0;  //让RCLK输入一个上升沿,并口输出数据
	RCLK=1;
}
void delay_ms(u16 n)
{
	u8 i;
	while(n--)
	{
		i = 111;
		while(i--);
	}
}

void main()
{
	LEDS=0xFE;
	ledNum=0xFF;
	tmp=0xFE;
	i=0;
	while(1)
	{
		Hc595SendByte(plus[i]); //发送数组中的第一个字节,即控制第i列的LED显示
		i=(i+1)%8; //移动到下一列,如果大于等于8,则从0开始
		delay_ms(1);
		tmp=_crol_(tmp, 1);//循环控制哪一列有效,
		Hc595SendByte(0); //在打开具体一列有效时,先把该列LED全部关闭,防止出现残影
		LEDS=tmp;
	}
}

上面就是LED点阵的实现代码了,是通过逐列扫描实现的,当然也可以通过逐行事项,需要注意的就是残影的消除。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值