本文实验目的:用51单片机8*8的LED点阵实验实现点亮一个点和显示一个数字。
一、LED点阵介绍
通常应用较多的是 8*8 点阵,然后使用多个 8*8 点阵可组成不同分辨率的 LED点阵显示屏,比如 16*16 点阵可以使用 4 个 8*8 点阵构成。因此理解了 8*8LED点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样的。这里以 8*8LED 点阵来做介绍。
如要将第二行第四列的灯点亮,则 2脚接高电平(所在列其余接低电平), d脚接低电平所在行接高电平,则第二行第四列的灯就亮了。如图:
二、程序介绍
1、初始化
首先,我们需要初始化单片机的端口和74HC595的控制端口。在代码中,我们定义了三个控制74HC595的端口:
SRCLK
:移位寄存器时钟输入RCLK
:存储寄存器时钟输入SER
:串行数据输入
这些端口与51单片机的特定IO口相连。
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
2、延时函数
由于74HC595在传输数据时需要一定的时间来稳定,我们设计了一个延时函数delay_10us
,该函数通过简单的循环来实现大约10微秒的延时。
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
3、数据传输函数
hc595_write_data
函数是向74HC595写入数据的关键函数。它通过循环8次,每次将数据的最高位发送到SER端口,然后通过SRCLK的上升沿将数据送入移位寄存器。之后,通过RCLK的上升沿将数据从移位寄存器输出到存储寄存器
void hc595_write_data(u8 dat)
{
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;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}
4、主函数
在main
函数中,我们首先设置P0口的数据,使得除了第4个LED为低电平外,其他所有LED的阴极(列)都是高电平(二进制表示为1110 1111)。然后,通过调用hc595_write_data
函数,我们将0x80(二进制表示为0100 0000)发送到74HC595,这样只有第一行的第一个LED(阳极)被设置为高电平,从而点亮第一个点。
void main()
{
u8 i=0;
LEDDZ_COL_PORT=0xef;//这行代码设置P0口的数据为1110 1111,其中第四位是0,表示第四列的阴极为低电平,其他列为高电平。
while(1)
{
hc595_write_data(0x40);//这行代码发送0000 0100到74HC595,表示第二行的阳极为高电平,其他行为低电平。
}
}
程序中是用十六进制表示,可用计算机二进制转换成十六进制,如图:
综上所述可得实验现象第二行第四列的LED就会被点亮。同理可将8*8点阵上任意一点点亮,上述功能实现后还可实现显示数字、文字和图形等。
三、完整程序:
#include "reg51.h"
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
#define LEDDZ_COL_PORT P0 //点阵列控制端口
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void hc595_write_data(u8 dat)
{
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;
LEDDZ_COL_PORT=0xef;//这行代码设置P0口的数据为1110 1111,其中第四位是0,表示第四列的阴极为低电平,其他列为高电平。
while(1)
{
hc595_write_data(0x40);//这行代码发送0000 0100到74HC595,表示第二行的阳极为高电平,其他行为低电平。
}
}