【【51单片机实现LED点阵屏幕和动画显示】】

news2025/3/1 9:39:40

LED点阵屏幕和驱动代码

我们先搞清楚74HC595的原理
sfr 特殊功能寄存器声明

sbit 特殊位声明
就举个例子,我们在之前的各种测试中对LED进行控制会直接输入P2=什么什么,那我想问你怎么知道P2口控制的就是LED呢,其实这些就是已经在内部声明完成了,我们可以直接拿来使用 
内部已经声明完成了
sfr P0=0x80;
声明P0口寄存器,物理地址为0x80
sbit P0_1=0x81;
声明P0寄存器的第一位
因为内部已经偷偷将其进行了地址编码了现在我们还与其他的方法实现
可位寻址和不可位寻址
因为位有8位,我们在进行设计的时候不可能完全照顾到每一位的方方面面,所以在设计的时候就已经弱化了位数的概念,在每8个寄存器中,只有一个可位寻址的。
就像我们以前的TCON是可位寻址的
而TMOD是不可位
我们先写一个

void _74HC595_WriteByte(unsigned char Byte)

{
//首先把数值赋给SER 而且有种入栈高位在前
//怎么取出第八位就是用
//因为他不是说的那种地可寻

unsigned char i;
    for(i=0;i<8;i++)
    {
        SER=Byte&(0x80>>i);
        SCK=1;
        SCK=0;
    }
  RCK=1;
    RCK=0;    
}

这个目的就是我们写入的数据都会通过SER进入这几个引脚上
然后我们再写一个

void MatrixLED_Showcolumn(unsigned char column , Data)
{
_74HC595_WriteByte(Data);
    P0=~(0x80>>column);
}

在这里插入图片描述
SER输入的第一个数字是D7 然后依次类推
在这里插入图片描述
我懂了这两个组合才可以生成一系列的数字
第一个相当于是对行进行操作
就是你输入的后入先出 第一个是最大的,依次
下面这个代码的作用是控制列 用来确定列的一些信息
MatrixLED_Showcolumn(0,0xAA);
所以我在输入这句话之后,得出的结论是 先锁定第0行再确定灯是10101010 因为是16进制 ,
我觉得我发现一个问题就是 我并不是特别需要考虑后入先出的问题 因为我的灯是D7 D6-----D0如此排列的 maybe 我们只要按照自己的常规思路去搭建就行了
and 为什么你说是0就是第0列 原因在这里
因为我用的是P0=~(0x80>>column);
而例如我们选择了P7 那相当于把P7置于0 其他位上都是1 就是0111 1111
相对来说岂不是 1000 0000 的翻版
我选择第1列 1011 1111相当于0100 0000 的翻版 很合理
所以是如此选择
我们每次进行亮灯之后 我们都需要即时把灯的信息更新归位?不然会影响下一次的操作
就像之前的那个一样 一闪一闪不方便
我们就像之前做数字灯管,进行 段选 位选 段选 位选 段选 位选 中间有一个小小的隔开的操作 以便快闪的发生
整个流程就是 段选 位选 延时 位清零 , 段选 位选 延时 位清零 , 段选 位选 延时 位清零
//此处添加代码 完成 了上述各项操作
//此处添加代码 完成 了上述各项操作
#include <REGX52.H>
#include"Delay.h"
sbit RCK=P3^5;//是P3的第五位 RCLK
sbit SCK=P3^6; // SRCLK
sbit SER=P3^4; // SER
//编译的时候可能会出错因为我们在系统内部已经有了一个RCLK的存在了
//所以我们稍微修改一下名字

void _74HC595_WriteByte(unsigned char Byte)
{
    //首先把数值赋给SER 而且有种入栈高位在前 
    //怎么取出第八位就是用
    //因为他不是说的那种地可寻
unsigned char i;
    for(i=0;i<8;i++)
    {
        SER=Byte&(0x80>>i);
        SCK=1;
        SCK=0;
    }
  RCK=1;
    RCK=0;    
}
void MatrixLED_Showcolumn(unsigned char column , Data)
{
_74HC595_WriteByte(Data);
    P0=~(0x80>>column);
    Delay(1);
    P0=0xFF;//段选 位选 位清零 
}
void main()
{
    //为了方便串口的实现将串口名字进行统一的修改
    SCK=0;
    RCK=0;
    
//操纵点阵屏需要用到数码管类似的代码
      while(1)
    {
      MatrixLED_Showcolumn(0,0x80);
        MatrixLED_Showcolumn(1,0x40);
        MatrixLED_Showcolumn(2,0x20);
        MatrixLED_Showcolumn(3,0x10);
        
    }    
    
}
//显示效果是点阵对角线
maybe 我们可以用excel先划定大概的范围确定 图形的样子 例如我们可以画出一整个爱心什么的
  MatrixLED_Showcolumn(0,0x3c);
        MatrixLED_Showcolumn(1,0x42);
        MatrixLED_Showcolumn(2,0xA9);
        MatrixLED_Showcolumn(3,0x85);
            MatrixLED_Showcolumn(4,0x85);
            MatrixLED_Showcolumn(5,0xA9);
            MatrixLED_Showcolumn(6,0x42);
            MatrixLED_Showcolumn(7,0x3C);

/爱心代码
对于整个数字的偏移的话,我们可以就是画完整个图然后一帧一帧的偏移移动
取字是不是太麻烦了 ,我们选择用文字取模软件 嘻嘻
在这里插入图片描述
0xFF,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,0x15,0x15,0x09,0x00,0xFF,0x00,
0xFF,0x00,0x00,0x0F,0x09,0x09,0x0F,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00,
存东西要存的很大我们可以放在flash 里面
unsigned char code Animation[]
但是存在flash里面 只能读取不能修改
//以下是流动显示HELLO ! 的代码
main.c

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


unsigned char Animation[]={     
	0xFF,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,0x15,0x15,0x09,0x00,0xFF,0x00,
0xFF,0x00,0x00,0x0F,0x09,0x09,0x0F,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00};



void main()
{
	unsigned char i , offset=1,count=3;
	//为了方便串口的实现将串口名字进行统一的修改
	MatrixLED_Init();
	

	//操纵点阵屏需要用到数码管类似的代码
	
	
	while(1)
	{
		for(i=0;i<8;i++)
		{
	  MatrixLED_Showcolumn(i,Animation[i+offset]);
	}	
		count++;
	if(count>10)
	{
		count=0;
		offset++;
		if(offset>24)
		{
			offset=0;
		}
	}
	
}
	}

Delay.c

void Delay(unsigned int xms)
	//
//
//
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

MartixLED.c

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





sbit RCK=P3^5;//是P3的第五位 RCLK
sbit SCK=P3^6;            // SRCLK
sbit SER=P3^4;            // SER 
//编译的时候可能会出错因为我们在系统内部已经有了一个RCLK的存在了
//所以我们稍微修改一下名字

#define MATRIX_LED_PORT P0
//74HC595 写入一个字节
//要写入的字节
//第一个是控制整行
//然后下一个是确定单列的数据
//
//
//

void _74HC595_WriteByte(unsigned char Byte)
{
	//首先把数值赋给SER 而且有种入栈高位在前 
	//怎么取出第八位就是用
	//因为他不是说的那种地可寻
unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
  RCK=1;
	RCK=0;	
}


void MatrixLED_Init()
{
	
	
	SCK=0;
	RCK=0;
}

matrixLED.h

#ifndef __MATRIX_LED_H_
#define __MATRIX_LED_H_

void MatrixLED_Init();
void MatrixLED_Showcolumn(unsigned char column , Data);

#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux后台运行Python脚本

Linux后台运行Python脚本命令&#xff1a; nohup python webui.py > myout.file 2>&1 &nohup&#xff1a;nohup命令用于不挂断地运行命令python&#xff1a;执行python代码的命令webui.py: python程序脚本源代码>: 打印程序输出信息到指定日志文件中myout.fi…

[vue]使用Element--Tree 树形控件使用props解决自定义slot-scope=“{ node, data }“的对象问题

在未用props定义的情况下&#xff0c;slot-scope"{ node, data }"解析data对象只有data含有lable和children才能识别出内容和子节点 当我获取的数据如下&#xff0c;没有lable和children&#xff0c;使用的是name和childList&#xff0c;如下图所示&#xff1a; 注意…

设计必备的矢量插画素材,这几个网站超齐全。

分享几个设计必备的矢量插画、插图素材网站&#xff0c;建议收藏~ 菜鸟图库 https://www.sucai999.com/searchlist/bianpingchahua----all-0-1.html?vNTYxMjky 菜鸟图库是一个素材非常丰富的网站&#xff0c;这里面涵盖了平面、电商、UI、图片、高清背景、插画、视频、音频等…

【新星计划】技术博客写作技巧经验分享

序言 写技术博客需要一定的专业知识和写作技巧&#xff0c;它是一个很好的方式来分享你的经验和知识&#xff0c;同时也是一个展示你的专业能力和建立自己品牌的机会。 以下是一些准备和建议&#xff0c;希望可以帮助你写出有用和有吸引力的技术博客&#xff1a; 写在前面 我报…

使用Elasticsearch进行word,excel,PDF的全文检索 windows实现 超完整(ingest-attachment实现)

首先要明确的一点就是Elasticsearch的版本要和ingest-attachment的版本一致&#xff0c;要不然没办法安装。然后还有一点JAVA版本要在11以上 先说说原理吧&#xff0c;其实就是将文件base64编码&#xff0c;然后再用插件读取文件内容并保存到es中。 1.如果你的版本是JAVA1.8的…

win11系统升级后QT的程序识别套件失败解决

解决方法&#xff1a; QTCreator的配置文件存放位置:C:\Users\%USERNAME%\AppData\Roaming\QtProject。删除这个文件夹下的文件&#xff0c;重启QT就会自动识别kits套件初始化信息等 就是QT我配置的颜色也消失了按照如下步骤重新配置后再次重启QT即可 这个方法导致我QT 上配…

苹果开发者账号续费流程及苹果开发者账号续费流程及下架处理

当开发者的苹果开发者账号即将到期时&#xff0c;可能会面临以下问题&#xff1a;“如何查看开发者账号剩余时间&#xff1f;”和“如何进行续费&#xff1f;”本文将详细解答这些问题。 如何查询账号过期时间&#xff1f; 如果距离开发者账号过期时间不到一个月&#xff0c;您…

KNIME工作流和节点比较功能

KNIME工作流和节点比较功能是一个在 << KNIME 视觉化数据分析 >> 中没有讲到的知识点。 KNIME工作流和节点比较功能在以下几种情况下非常有用&#xff1a; 版本控制&#xff1a;此功能可以跟踪工作流和节点中的更改。如果需要返回到之前的工作流或节点版本&#xf…

Spring + ECharts数据可视化

Apache ECharts是一个基于 JavaScript 的开源可视化图表库&#xff0c;在网页上实现数据的可视化&#xff0c;非常好用&#xff0c;来简单写一个demo&#xff0c;实践一下。 目录 一、成果 二、数据准备 三、具体实现 某年每个学生各科分数的柱状图 后端 前端 后端代码 …

Echarts设置X轴只显示刻度线,不显示X轴轴线

Echarts设置X轴只显示刻度线&#xff0c;不显示X轴轴线&#xff1a; option {xAxis: {......axisLine: {show: false,lineStyle: {color: red,}},......},...... } 效果&#xff1a; 上图中X轴轴线位置的横线&#xff0c;其实是yAxis的splitLine&#xff0c;将splitLine的sh…

(十九)数据编辑——属性编辑②

数据编辑——属性编辑② 使用键盘输入值并不是编辑表中值的唯一方式。在某些情况下&#xff0c;为了设置字段值&#xff0c;可能要对单条记录甚至是所有记录执行数学计算。ArcMap 中的字段计算器可以对所有或所选记录进行简单和高级计算。 此外&#xff0c;还可以基于字段计算…

Vue生态及实践 - vuex

目录 Vuex vuex基础 阶段小结&#xff08;vuex的四种对象&#xff09; vuex响应式原理 vuex.js的实现 index.js Module 局部状态 命名空间 跨模块访问数据 小结 目标 Vuex相关基本概念和使用方式vuex响应式原理过程vuex中如何进行模块式开发 Vue2.0是单向数据流的…

H5学习期间 问题文档(更新中)

目录 一、html与css中让标签 二、css鼠标滑入显示div 三、git报错解决方案 四、ul>li中给h1标签设置行高 一、html与css中让标签<li>在同一行显示 li标签一行显示 效果展示&#xff1a; 代码块&#xff1a; <!DOCTYPE html> <html lang"en"…

国内做MES系统的企业哪家好?

什么是MES&#xff1f;国内做MES系统的企业哪家好&#xff1f;下面分为两块跟大家详细讲解。 一、什么是MES&#xff1f; 1、概念&#xff1a; MES&#xff08;英文全称&#xff1a;Manufacturing Execution System&#xff09;制造执行系统&#xff0c;是面向车间生产的管理…

常用调用链等监控对比

1 了解监控 什么是监控&#xff1f; 指对计算机系统、网络、应用程序等进行实时、持续的管理和控制&#xff0c;以确保系统的性能、稳定性和安全性。 具体来说&#xff0c;监控可以通过收集和分析各种指标数据来实现&#xff0c;例如CPU、内存、网络、磁盘等硬件指标&#xf…

NamedPipeClientStream连接远程主机异常的处理

NamedPipeClientStream连接远程主机异常的处理 命名管道通讯测试异常解决方法&#xff1a; 命名管道通讯测试异常 在两个PC主机上测试命名管道通讯&#xff0c;设置服务器IP&#xff0c;初始化客户端时&#xff0c;会报无法访问路径异常。 解决方法&#xff1a; 在Windows功能…

软件测试项目案例去哪找【银行/金融/电商/外卖】

项目经验&#xff08;案例一&#xff09; 项目时间&#xff1a;2016-08 - 2017-07 项目名称&#xff1a;小花钱包&#xff08;Web&#xff09; 项目描述&#xff1a; 项目介绍 这个产品产是互联网金融理财服务平台&#xff0c;既可以发起投标&#xff0c;也可以借款&#xf…

使用Python实现.mat文件转换、读取

目录 一、前言 二、将excel文件转换为mat文件 三、读取mat文件并进行可视化 四、将mat文件转换为excel文件 一、前言 有时候我们拿到一个数据文件不是excel或者csv的怎么办呢&#xff1f;比如&#xff1a;你可恶的合作伙伴测实验数据时&#xff0c;用MATLAB丢给你一个mat…

【mac切换go不同版本】

1.需求是&#xff1a;mac本机想要同时拥有几个版本的go&#xff0c;并可以方便切换 第一种brew link切换失败&#xff0c;手动切换成功 第二种gvm方法失败 第三种docker成功 &#xff08;别看前面啰里八嗦&#xff0c;我只是记录一下&#xff0c;请直接跳到第三个&#xff09; …

【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

代码自取【14.key_tree_pinctrl_gpios_interrupt】&#xff1a; https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数&#xff1a; 1. of_gpio_count&#xff08;获得GPIO的数量&#xff09; static inline int of_gpio_count(struct device_node *np)2. kzalloc…