51单片机学习--LED点阵屏显示图形&动画

这篇具有很好参考价值的文章主要介绍了51单片机学习--LED点阵屏显示图形&动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机
为了通用性考虑,需要把用到的几个口用特殊位声明来重新命名,由于RCLK在头文件中已有定义,所以这里把P3^5声明成RCK吧。。这样的做法可以提高可读性

sbit RCK = P3^5;  //RCLK
sbit SCK = P3^6;  //SRCLK
sbit SER = P3^4;

51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机



接下来编写74HC595的输入函数
51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机

void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(int i = 0; i < 8; i ++) {
		SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SER
		SCK = 1; //移位1次
		SCK = 0; //手动恢复
	}
	
}


void main()
{
	SCK = 0; //移位初始是0
  while(1)
  {
    
  }
}

执行完八次循环后数据就会存到移位寄存器里面了,接下来要输出只需要给RCLK一个高电平即可
给个完整代码

#include <REGX52.H>


sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;

void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SER
		SCK = 1; //移位1次
		SCK = 0; //手动恢复
	}
	RCK = 1; //输出
	RCK = 0; //手动恢复
}


void main()
{
	P0 = 0;
	SCK = 0; //移位初始是0
	RCK = 0; //锁存初始是0
	_74HC595_WriteByte(0xf0);
  while(1)
  {
    
  }
}

输入了0xf0即为1111 0000 ,而P0全部置0,所以呈现出一半一半的现象!
51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机
接下来需要更具体地来控制LED点阵屏:D0~D7来源于移位寄存器,只需要像之前控制矩阵键盘一样通过扫描每行或者扫描每列的方式来编写即可
51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机

void MatrixLED_ShowColumn(unsigned char Column, Data) 
{
	_74HC595_WriteByte(Data); 
	//依次扫描每一列
	P0 = ~(0x80 >> Column); //打开第Column列
	
}

Data对应D7~D0 ,Column是要打开的某一列(0~7列)
比如在main中执行函数MatrixLED_ShowColumn(0, 0xAA);
0xAA = 1010 1010 ,列Column = 0;效果如下:
51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机



接下来实现一下在LED点阵屏显示一个爱心图形
先在Excel画好,算出它的Data
51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机

#include <REGX52.H>
#include "Delay.h"

sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;

#define MATRIX_LED_PORT   P0

/**
  * @ brief 74HC595写入一个字节
  * @ param 要写的字节
  * @ retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SER
		SCK = 1; //移位1次
		SCK = 0; //手动恢复
	}
	RCK = 1; //输出
	RCK = 0; //手动恢复
}


/**
  * @ brief LED点阵屏亮灯显示一列数据
  * @ param Column 列数 0~7 从左往右
  * @ param Data 选择列显示的数据 高位在上,1亮,0灭
  * @ retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column, Data) 
{
	_74HC595_WriteByte(Data);
	//依次扫描每一列
	MATRIX_LED_PORT = ~(0x80 >> Column); //打开第Column列 ,位选
	Delay(1);
	MATRIX_LED_PORT = 0xFF; //位清零
}


void main()
{
	SCK = 0; //移位初始是0
	RCK = 0; //锁存初始是0
	
  while(1)
  {
    MatrixLED_ShowColumn(0, 0x78);
	MatrixLED_ShowColumn(1, 0x84);
	MatrixLED_ShowColumn(2, 0x42);
	MatrixLED_ShowColumn(3, 0x21);
	MatrixLED_ShowColumn(4, 0x21);
	MatrixLED_ShowColumn(5, 0x42);
	MatrixLED_ShowColumn(6, 0x84);
	MatrixLED_ShowColumn(7, 0x78);
  }
}

51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机
最后把main里面开始的两句写成MatrixLED的初始化函数,一起封装成MatrixLED模块,以下是封装好的MareixLED.c 文件:要注意位声明和重定义都需要写在这个文件里面,同时也需要调用Delay模块

#include <REGX52.H>
#include "Delay.h"

sbit RCK = P3^5;
sbit SCK = P3^6;
sbit SER = P3^4;

#define MATRIX_LED_PORT   P0


/**
  * @ brief 点阵屏初始化
	* @ param 无
	* @ retval 无
	*/
void MatrixLED_Init()
{
	SCK = 0; //移位初始是0
	RCK = 0; //锁存初始是0
}


/**
  * @ brief 74HC595写入一个字节
	* @ param 要写的字节
	* @ retval 无
	*/
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i = 0; i < 8; i ++) {
		SER = Byte & (0x80 >> i); //一个数据赋到一位上,结果非0即1,相当于取Byte的第i + 1位赋给SER
		SCK = 1; //移位1次
		SCK = 0; //手动恢复
	}
	RCK = 1; //输出
	RCK = 0; //手动恢复
}


/**
  * @ brief LED点阵屏亮灯显示一列数据
	* @ param Column 列数 0~7 从左往右
  * @ param Data 选择列显示的数据 高位在上,1亮,0灭
	* @ retval 无
	*/
void MatrixLED_ShowColumn(unsigned char Column, Data) 
{
	_74HC595_WriteByte(Data);
	//依次扫描每一列
	MATRIX_LED_PORT = ~(0x80 >> Column); //打开第Column列 ,位选
	Delay(1);
	MATRIX_LED_PORT = 0xFF; //位清零
}

静态图像显示搞定了,接下来实现简单的动画,一个流动字幕!利用文字取模软件来得到Data并存到main的数组里

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"

unsigned Animation[] = {
/*--  调入了一幅图像:这是您新建的图像  --*/
/*--  宽度x高度=32x8  --*/
0x00,0xFF,0x40,0x20,0x10,0x08,0x04,0x02,0xFF,0x00,0x00,0x9F,0x00,0x00,0x3C,0x42,
0x81,0x81,0x81,0x42,0x00,0x00,0x00,0xFF,0x91,0x91,0x91,0x91,0x81,0x00,0x00,0x00,
};

void main()
{
	MatrixLED_Init();
	
  while(1)
  {
    MatrixLED_ShowColumn(0, Animation[0]);
		MatrixLED_ShowColumn(1, Animation[1]);
		MatrixLED_ShowColumn(2, Animation[2]);
		MatrixLED_ShowColumn(3, Animation[3]);
		MatrixLED_ShowColumn(4, Animation[4]);
		MatrixLED_ShowColumn(5, Animation[5]);
		MatrixLED_ShowColumn(6, Animation[6]);
		MatrixLED_ShowColumn(7, Animation[7]);
  }
}

51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机

这样做可以显示出第一帧的图像,只要每次都偏移8位,就能实现一张张图片的逐帧动画,但这里我就写个简单的每次偏移一位的流动动画

#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"

unsigned Animation[] = {
/*--  调入了一幅图像:这是您新建的图像  --*/
/*--  宽度x高度=32x8  --*/
0x00,0xFF,0x40,0x20,0x10,0x08,0x04,0x02,0xFF,0x00,0x00,0x9F,0x00,0x00,0x3C,0x42,
0x81,0x81,0x81,0x42,0x00,0x00,0x00,0xFF,0x91,0x91,0x91,0x91,0x81,0x00,0x00,0x00,
};



void main()
{
	unsigned char i = 0, offset = 3, Count = 0;
	
	MatrixLED_Init();
	
  while(1)
  {
    for( i = 0; i < 8; i ++) {
			MatrixLED_ShowColumn(i, Animation[i + offset]);
		}
		Count ++;
		if(Count > 5) Count = 0, offset ++; //一帧图像扫描(停留)五遍以后再偏移一位
		if(offset > (32 - 8)) {offset = 0;}; //到末尾重复播放
  }
}

这里设定的Count的判断条件越大,一帧的画面就停留越久,流动字幕速度越慢
Offset是偏移量

当动画素材比较多时,数组Animation会比较占内存,此时可以在数组名前加上关键字code ,这样就能把这些数据放到内存更大的flash里面,但是要注意如果加上关键字code,那么数组里的元素就不能更改了
51单片机学习--LED点阵屏显示图形&动画,51单片机,51单片机,学习,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-627324.html

到了这里,关于51单片机学习--LED点阵屏显示图形&动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于AT89C51单片机的LED点阵显示屏设计

    点击链接获取Keil源码与Project Backups仿真图: [[https://download.csdn.net/download/qq_64505944/88637464?spm=1001.2014.3001.5503]] **[源码获取] B 源码+仿真图+课程设计+50 工程实训(三)课题设计 LED点阵显示屏设计 LED点阵显示屏通过编程控制可以显示中英文字符、图形及视频动态图形,广泛用于指

    2024年02月02日
    浏览(54)
  • 51单片机LED点阵控制原理、74HC595工作原理和字母和滚动显示实验代码

    目录 1. 74HC595工作原理图解  2.LED点阵控制原理 3.点阵LED实验 3.1 配置74HC595代码 3.2 D点阵LED显示H   3.3 滚动LED  (1) 滚动扫描图示  (2)程序代码 4.遇到奇怪的bug    :        输出使能,输入低电平允许输出,因此需要用接线帽j24让oe和地短接。 (但是我普中A2的板子,不

    2024年02月04日
    浏览(57)
  • 【51单片机】LED 点阵

    参考:普中 51 单片机开发攻略 第13章 mian.c

    2024年01月22日
    浏览(41)
  • 51单片机LED点阵屏

    LED点阵屏是一种由许多小型LED灯组成的矩阵式显示屏。这些LED灯可以是单色、双色或全彩的,它们排列成行和列的网格,可以根据需要点亮来显示图像、文字或动画等内容。LED点阵屏广泛应用于户外广告牌、室内显示、交通信号灯、电子价格标签和其他需要显示信息的场合。

    2024年01月23日
    浏览(49)
  • 【51单片机】LED点阵屏

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Waiting For Love】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔74HC595图片 🍔74HC595原理 🍔”上升沿“是什么意思 🎆LED点阵屏显示图形  🎈现象  🎈代码(三部分) main.c  Del

    2024年02月02日
    浏览(40)
  • 51单片机 8*8LED点阵(入门教学)

    LED 点阵介绍 LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随 处可见,被广泛应用于汽车报站器,广告屏等。 通常应用较多的是 8*8 点阵,然后使用多个 8*8 点阵可组成不同分辨率的 LED 点阵显示屏,比如16*16 点阵可以使用 4 个 8*8 点阵构成。因此理解

    2024年02月02日
    浏览(44)
  • 51单片机8*8 LED点阵实现原理讲解

    本篇文章将为大家讲解LED8*8点阵的使用方法。 LED 8 8点阵是由64个LED灯珠组成的,它们排列在一个8 8的矩阵中。每个LED灯珠都可以独立控制,因此可以通过控制不同的LED灯珠来显示不同的图形、数字、字母等。 LED 8 8点阵的原理是利用LED灯珠的发光特性,通过控制LED灯珠的亮灭

    2024年02月09日
    浏览(42)
  • 51单片机——LED 点阵点亮一个点,小白详解

    LED点阵介绍:        LED点阵是由发光二极管排列组成的显示器件,在我们生活中的电器中随处可见,被广泛用于汽车报站器,广告屏等。         通常用用较多的是8*8点阵,然后使用多个8*8点阵组成不同分辨率的LED点阵显示屏,比如16*16点阵可以使用4个8*8点阵构成。因

    2024年02月09日
    浏览(42)
  • 三、51单片机用74HC595控制LED点阵

    (1)外观 (2)作用 LED点阵通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片等,LED点阵显示被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。 以8*8LED点阵为例。 (1)单片机端口直接驱动。驱动8*8的点阵需要2个IO端口(16个IO口)。 (2)使用串转并移位锁存器驱

    2024年02月03日
    浏览(68)
  • 51单片机开发:通过74HC595控制LED点阵

    (1)LED点阵就是多个LED发光二极管的集合,在单个LED的发光原理上没有任何区别; (2)上面是16x16的LED点阵,总共有16x16=256个LED灯,由32个引脚来控制,其中16个引脚是正极(posn,n=1、2······、16),16个引脚是负极(NEGn,n=1、2······、16); (3)LED点阵可以用坐标系的思想来理解,

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包