51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极,LED 点阵的列则为发光二极管的阴极

根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。

因此通过单片机P0口可控制点阵列,74HC595可控制点阵行

11 脚 SRCLK( SHCP):移位寄存器时钟输入

12 脚 RCLK( STCP):存储寄存器时钟输入

14 脚 SER( DS):串行数据输入

74HC595 需要用到的控制管脚SER、RCLK、SRCLK直接连接到 51 单片机的P3.4-P3.6 IO 口上

1、IO扩展(串转并)-74HC595芯片

要实现的功能是:通过 74HC595 模块控制 LED 点阵以一行循环滚动显示

#include "reg52.h"

typedef unsigned char u8;

typedef unsigned int u16;

void delay_10us(u16 ten_us){

while(ten_us--);

}

//595管脚
sbit SRCLK=P3^6; //移位寄存器
sbit RCLK1=P3^5; //存储寄存器
sbit SER=P3^4; //串行数据输入

//8*8点阵P0口

#define LEDDZ_COL_PORT P0

//8*8点阵控制口,横向,向595中传数据

u16 hc_595_buf\[\]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //行

void hc595_write_date(u16 dat){

u16 i=0;

//位移

for(i=0;i<8;i++){

//要求:从高位开始传

SER=dat>>7;

dat<<=1; //dat=dat<<1;把次高位移到了最高位

//移位寄存器时钟上升沿将端口数据送入寄存器中

SRCLK=0;

delay_10us(1);

SRCLK=1;

delay_10us(1);

}

//存储寄存器时钟上升沿将前面写入到寄存器的数据输出

//并行输出,数据寄存器

RCLK1=0;

delay_10us(1);

RCLK1=1;

}

void main(){

u16 i=0;

LEDDZ_COL_PORT=0x00; //列值全部都是低电平,P0口可控制点阵列

while(1){

for(i=0;i<8;i++){

hc595_write_date(hc_595_bufi); //74HC595可控制点阵行

delay_10us(50000);

}

}

}

注意事项:LED 点阵旁的J24黄色跳线帽短接到GND一端

2、LED点阵实验

#include "reg51.h"

typedef unsigned int u16;

typedef unsigned char u8;

void delay(u16 time){

while(time--);

}

//定义595控制管脚

sbit srclk=P3^6; //移位寄存器

sbit rclk=P3^5; //存储寄存器

sbit ser=P3^4; //串行数据输入

//P0口

#define LEDDZ_PORT P0

//LED点阵,行,取模

gled_row\[\]={0x49,0x52,0x7C,0x52,0x49,0x7F,0x00,0x00};

//LED点阵,列,自己对P0口赋值

gled_col\[\]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //第一列-第八列

//往595中写数据

void hc595_write_data(u8 dat){

u16 i=0;

for(i=0;i<8;i++){

ser=dat>>7; //优先传最高位

dat<<=1; //次高位移到最高位

srclk=0;

delay(1);

srclk=1;

delay(1);

}

rclk=1;

delay(1);

rclk=0;

}

void main(){

u16 i=0;

while(1){

for(i=0;i<8;i++){

LEDDZ_PORT=gled_coli; //P0口可控制点阵列

hc595_write_data(gled_rowi); //74HC595可控制点阵行

delay(10); //等待显示稳定

hc595_write_data(0x00); //消隐或消影

}

}

}

3、 流动LED点阵实验

#include "reg51.h"

typedef unsigned int u16;

typedef unsigned char u8;

void delay(u16 time){

while(time--);

}

//定义595控制管脚

sbit srclk=P3^6; //移位寄存器

sbit rclk=P3^5; //存储寄存器

sbit ser=P3^4; //串行数据输入

//P0口

#define LEDDZ_PORT P0

//LED点阵,行,取模

//gled_row\[\]={0x49,0x52,0x7C,0x52,0x49,0x7F,0x00,0x00};

gled_row\[\]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x10,0x10,0x7E,0x00,0x7E,

0x10,0x10,0x7E,0x00,0x7E,0x10,0x10,0x7E,0x00,0x4A,0xFE,0x22,0x00,0x20,0x04,0x79,

0x4C,0x50,0x00,0x00,0x2C,0x04,0x51,0x0E,0x06,0x48,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00}; //前后16个0x00是为了使两次流水灯不连在一起,中间为要流动的图形(4*8长)

//LED点阵,列,自己对P0口赋值

gled_col\[\]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//往595中写数据

void hc595_write_data(u8 dat){

u16 i=0;

for(i=0;i<8;i++){

ser=dat>>7; //优先传最高位

dat<<=1; //次高位移到最高位

srclk=0;

delay(1);

srclk=1;

delay(1);

}

rclk=1;

delay(1);

rclk=0;

}

void main(){

u16 i=0;

u16 offset=0; //偏移量

u16 count=0;

while(1){

for(i=0;i<8;i++){

LEDDZ_PORT=gled_coli;

hc595_write_data(gled_rowi+offset);

delay(10); //等待显示稳定

hc595_write_data(0x00); //消隐或消影

}

count++;

if(count>10){

count=0;

offset++;

}

if(offset>40){

offset=0;

}

}

}

相关推荐
新晨单片机设计10 小时前
S018A-基于STM32单片机脉搏计(光电对管)【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·proteus
HRTOS10 小时前
HRTOS Debug:8051实时操作系统资源状态监控与分析
单片机·嵌入式硬件·51单片机
李永奉10 小时前
中科蓝讯SDK开发-耳机项目功耗问题排查教程
c语言·开发语言·嵌入式硬件·物联网·智能手机
崇山峻岭之间10 小时前
HC32F460PETB的PH2的EMB_IN4
单片机
Rocktech_ruixun10 小时前
机器人集群调度方案硬件如何选型?瑞迅科技RK3588/3576/3568分级方案解析
人工智能·嵌入式硬件·机器人·边缘计算
youcans_11 小时前
【嵌入式软件AI编程】12. Claude Code的基本操作
stm32·单片机·ai编程·嵌入式软件·claude code
SilicoCode11 小时前
正点原子HAL库与江协科技标准库关于中断的对比解析
单片机·嵌入式硬件
smartpi_ai11 小时前
离线语音模块能当麦克风用吗?识别与录音的两套逻辑、“150 条“的词数语义与中英文切换固件的两条路径
嵌入式硬件·语音识别
神威难绷泪11 小时前
51单片机 ds18b20
51单片机
Brilliantwxx11 小时前
【STM32】 从HAL库源码深度解析I2C(源码解析+面试题)
开发语言·stm32·单片机·嵌入式硬件·架构