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 小时前
机器人四大主控板系统分层选型指南:树莓派、ESP32、STM32与Arduino的能力边界与实战定位
stm32·嵌入式硬件·机器人
进击的小头11 小时前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习
点灯小铭11 小时前
基于单片机的多模式智能洗衣机设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
项目題供诗11 小时前
STM32-AD单通道&AD多通道(十九)
stm32·单片机·嵌入式硬件
南岸的水11 小时前
BMS国标充电解析
单片机·嵌入式硬件·mcu
清风66666611 小时前
基于单片机的可调数控电源设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
sramdram11 小时前
低功耗国产蓝牙芯片,蓝牙MCU方案
单片机·嵌入式硬件·mcu·蓝牙mcu·蓝牙方案
yuan1999711 小时前
CMS8S5880 电子锁程序(51单片机)
单片机·嵌入式硬件·51单片机
振南的单片机世界12 小时前
启动流程:上电先取栈顶和复位向量,再进main
arm开发·stm32·嵌入式硬件
fanged12 小时前
设备树学习2--一个设备
嵌入式硬件