51单片机嵌入式开发:11、 STC89C52RC 实现一个滑动的led点阵程序

STC89C52RC 实现一个滑动的led点阵程序

  • 1 概述
  • 2 LED点阵介绍
    • 2.1 LED概述
    • 2.2 LED点阵注意事项
  • 3 LED点阵原理
    • 3.1 Led点阵内部电路
    • 3.2 原理图电路
  • 4 软件实现点阵图案的滑动
    • 4.1 软件工程代码
    • 4.2 Protues仿真
  • 5 扩展74HC595(后续专题开展)
  • 6 总结


第十一节

1 概述

LED点阵是由多个LED(发光二极管)组成的矩阵型显示器件。它通常以行和列的形式排列,每个LED代表一个像素点。通过控制每个LED的亮灭状态,可以在点阵上显示各种图形、字符或动画。

2 LED点阵介绍

2.1 LED概述

常见的LED点阵屏有各种尺寸和类型,如8x8、16x16、32x32等。每个像素点通常由一个LED和一个驱动电路组成,该驱动电路负责控制LED的亮灭状态。
为了使用LED点阵屏,一般需要通过微控制器或单片机来控制。控制LED点阵屏的基本原理是通过逐行或逐列扫描的方式,将要显示的图形数据发送到对应的行和列,从而控制LED的亮灭状态。具体操作步骤如下:
连接硬件:将LED点阵屏与微控制器或单片机连接。根据点阵屏的引脚布局和控制器的IO口分配,连接适当的引脚,确保数据和控制信号传输正确。
编写驱动代码:根据点阵屏的型号和规格,编写相应的驱动代码。这通常包括设置引脚模式、发送数据、控制扫描等操作。
数据处理:根据需要显示的内容,将图形、字符或动画等转换为对应的点阵模式。可以使用预定义的字符模式数组或自定义生成字符模式的方法。
显示控制:根据点阵屏的工作原理,控制扫描的顺序和速度,逐行或逐列将数据发送到点阵屏上。通过适当的延时和刷新频率,可以实现所需的显示效果。

2.2 LED点阵注意事项

具体的驱动代码和操作步骤可能会因所使用的LED点阵屏型号和控制器类型而有所差异。通常,LED点阵屏的厂商会提供相应的文档和示例代码,可根据具体情况进行参考和调整。

3 LED点阵原理

3.1 Led点阵内部电路

8x8LED点阵内部结构图如下,这两种图片只是接法不同,要点亮LED,左图需要行置为高电平,列置为低电平;右图则需要行置为低电平,列置为高电平。

8x8LED点阵内部结构图

8x8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管将点亮。

比如对于左图,如果要将第一个点点亮,则将第一行的⑨脚接高电平,第一列的13脚接低电平,第一个点就会点亮;如果要将第一行点亮,则第一行的⑨脚接高电平,所有列(13、3、4、10、6、11、15、16脚)接低电平,第一行就会点亮;如果要将第一列点亮,则第一列的13脚接低电平,所有行(9、14、8、12、1、7、2、5脚)接高电平,第一列就会点亮;如果要将对角线点亮,可以动态显示,首先点亮第一个点,然后点亮第2行第2列的点…这样依次循环点亮,就可以显示对角线的点。

在这里插入图片描述

如果要显示数字或字符,在需要的位置点亮,比如显示0(如下),可以循环点亮如下位置的LED。

3.2 原理图电路

在这里插入图片描述

仿真电路:
在这里插入图片描述

4 软件实现点阵图案的滑动

4.1 软件工程代码

软件代码工程:

在这里插入图片描述

软件代码:

//main.c文件

#include "includes.h"/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){}
}/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(Ms--){delay_us(100);}
}/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}//	P2 = 0xFF;	//代表列 发光二级管的负端
//	P0 = 0x00;	//代表行 发光二级管的正端
//	
//	P20 = 0;
//	P00 = 1;
//	P01 = 1;
#define rowp P0
#define colp P2
//0-9字模
unsigned char disp[][8]={
{0x0c,0x12,0x22,0x44,0x22,0x12,0x0c,0x00},//?
{0x00,0x00,0x3e,0x41,0x41,0x3e,0x00,0x00},//0
{0x00,0x40,0x44,0x7e,0x7f,0x40,0x40,0x00},//1
{0x00,0x00,0x66,0x51,0x49,0x46,0x00,0x00},//2
{0x00,0x00,0x22,0x41,0x49,0x36,0x00,0x00},//3
{0x00,0x10,0x1c,0x13,0x7c,0x7c,0x10,0x00},//4
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//5
{0x00,0x00,0x3e,0x49,0x49,0x32,0x00,0x00},//6
{0x00,0x03,0x01,0x71,0x79,0x07,0x03,0x00},//7
{0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00},//8
{0x00,0x00,0x26,0x49,0x49,0x3e,0x00,0x00},//9
};// 定义字符模式数组
unsigned char code charPatterns[8] = {0x0c,0x12,0x22,0x44,0x22,0x12,0x0c,0x00//0x18, 0x24, 0x42, 0x81, 0x42, 0x24, 0x18, 0x00
};/*------------------------------------------------主函数
------------------------------------------------*/
void main (void)
{unsigned char i, j,m;unsigned char displayData[8] = {0}; // 初始化显示数据IIC_AT24C02_Test1();delay(2);while (1){// 滚动效果for (j = 0; j < 8; j++) {for (i = 0; i < 8; i++) {displayData[i] = (displayData[i] << 1) | (charPatterns[i] >> (7 - j));}// 逐行扫描点阵屏for(m=0;m<20;m++){for (i = 0; i < 8; i++){P2 = ~(1 << i); // 控制点阵屏的行P0 = displayData[i]; // 发送数据delay_ms(1); // 延时//P0 = 0x00; // 清空数据}//delay_ms(500); // 控制滚动速度}for (i = 0; i < 8; i++){P2 = ~(1 << i); // 控制点阵屏的行P0 = 0x00; // 发送数据delay_ms(1); // 延时//P0 = 0x00; // 清空数据}}}
}

// c51_iic.c 文件

#include "includes.h"/*------------------------------------------------(1)启动IIC总线
------------------------------------------------*/
void Start(void)
{Sda=1;_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();Sda=0;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;
}/*------------------------------------------------(2)停止IIC总线
------------------------------------------------*/
void Stop(void)
{Sda=0;_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();Sda=1;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;
}/*------------------------------------------------(3) 应答IIC总线
------------------------------------------------*/
void Ack(void)
{Sda=0;_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;_nop_();_nop_();
}/*------------------------------------------------(4) 非应答IIC总线
------------------------------------------------*/
void NoAck(void)
{Sda=1;_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;_nop_();_nop_();
}/*------------------------------------------------(1) 发送一个字节
------------------------------------------------*/
void Send(unsigned char Data)
{ unsigned char BitCounter=8;unsigned char temp;do{temp=Data;Scl=0;_nop_();_nop_();_nop_();_nop_();_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;
}/*------------------------------------------------(2)读入一个字节并返回
------------------------------------------------*/
unsigned char Read(void)
{unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{Scl=0;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);
}/*------------------------------------------------(1) 写入数据
------------------------------------------------*/
void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{unsigned char i;unsigned char *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(AddWr);    //写入芯片地址Ack();Send(Address+i);//写入存储地址Ack();Send(*(PData+i));//写数据Ack();Stop();delay_ms(20);}
}/*------------------------------------------------(2) 读出数据
------------------------------------------------*/
void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
{unsigned char i;unsigned char *PData;PData=Data;for(i=0;i<Num;i++){Start();        //写入芯片地址Send(AddWr);Ack();Send(Address+i);//写入存储地址Ack();Start();Send(AddRd);    //读入地址Ack();*(PData+i)=Read();//读数据Scl=0;NoAck();Stop();}
}void IIC_AT24C02_Test1(void)
{unsigned char Number[1];WP=0;//写保护关掉RdFromROM(Number,0,1);	//调用存储数据 从地址0开始写一个数据Number[0]++;WrToROM(Number,0,1);	//写入24c02P1 =  Number[0];		//在P1口上显示 反向显示 LED亮代表1
}

//includes.h文件

#ifndef __INCLUDES_H__
#define __INCLUDES_H__//#include<reg52.h> #include<intrins.h> //汇编指令_nop_
#include<stdio.h> 	//标准输入输出//_nop_(); 产生一条NOP指令
//作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。
//NOP指令为单周期指令,可由晶振频率算出延时时间。
//对于12M晶振,延时1uS。
//11.0592M晶振,延时1.0851uS。
//对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "STC89C5xRC_RDP.h"//应用层头文件
//#include "c51_gpio.h"
//#include "c51_ledtube.h"
//#include "c51_key.h"
//#include "c51_timer.h"
//#include "c51_exit.h"
//#include "c51_lcd1602.h"
#include "c51_iic.h"extern void delay(unsigned int cnt);
extern void delay_us(unsigned int us);//delay us;
extern void delay_ms(unsigned int Ms);//delay Ms;#endif

//c51_iic.h文件

#ifndef __C51_IIC_H__
#define __C51_IIC_H__#include "STC89C5xRC_RDP.h"#define AddWr 0xAE   //写数据地址,需要参考24c02芯片文档
#define AddRd 0xAF   //读数据地址#define Sda	P12       //定义总线连接端口
#define Scl	P11
#define WP	P10       //写保护,这里不使用extern void Start(void);
extern void Stop(void);
extern void Ack(void);
extern void NoAck(void);
extern void Send(unsigned char Data);
extern unsigned char Read(void);
extern void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num);
extern void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num);extern void IIC_AT24C02_Test1(void);#endif

4.2 Protues仿真

在这里插入图片描述

5 扩展74HC595(后续专题开展)

5.1 74HC595原理 5.2 多点阵屏仿真电路 5.3 74HC595驱动程序 5.4 实现滑动显示点阵屏

6 总结

LED点阵在许多应用场景中得到广泛应用,以下是一些常见的LED点阵应用场景的总结:

  1. 信息显示:LED点阵屏可用于显示各种信息,如时间、日期、温度、湿度等。它们常见于数字时钟、温度计、计时器、计数器等设备中。

  2. 文字和图形显示:LED点阵屏可用于显示文字和简单图形,如在电子信息牌、广告显示屏、户外显示屏、室内装饰等场合中。

  3. 游戏和娱乐:由于其灵活性和可编程性,LED点阵屏广泛应用于小型游戏机、游戏控制器和娱乐设备中,如迷宫游戏、井字棋、俄罗斯方块等。

  4. 交通指示:LED点阵屏可用于交通信号灯、公交站牌、路牌等场景中,提供交通指示、公告和倒计时等信息。

  5. 仪器仪表:LED点阵屏在仪器仪表中用于显示各种测量数据、参数和状态,如数字多用表、频谱分析仪、电子天平等。

  6. 电子设备控制面板:LED点阵屏可用于控制面板,提供用户界面和操作指示,如家电控制面板、工业设备控制面板等。

  7. 艺术装置和装饰:由于其视觉效果和可编程性,LED点阵屏被广泛用于艺术装置、装饰灯光和节日装饰等场合中,创造各种独特的光影效果。

  8. 教育和学习工具:LED点阵屏可用于教育和学习工具,如编程教育工具、学生实验平台等,帮助学生理解和实践编程和电子原理。

  9. DIY项目:由于其易于使用和灵活性,LED点阵屏也常用于各种DIY项目中,如电子艺术作品、电子积木、自制游戏机等。

总而言之,LED点阵屏在信息显示、游戏娱乐、交通指示、仪器仪表、控制面板、艺术装置、教育工具等许多领域都有广泛的应用。其低功耗、可编程性和高可见性使其成为一种常用的显示技术。

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

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

相关文章

如何制定高效的媒体公关解决方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体公关解决方案是指企业或组织为提升品牌形象、塑造公众认知、应对危机事件等目的&#xff0c;通过媒体渠道制定并实施的一系列公关策略和行动计划。这一解决方案旨在通过有效的媒体沟…

socket功能定义和一般模型

1. socket的功能定义 socket是为了使两个应用程序间进行数据交换而存在的一种技术&#xff0c;不仅可以使同一个主机上两个应用程序间可以交换数据&#xff0c;而且可以使网络上的不同主机间上的应用程序间进行通信。 2. 图解socket的服务端/客户端模型

广告投放的智能优化:Kompas.ai如何提高广告效果

在数字广告领域&#xff0c;智能优化已成为提升广告投放效果和投资回报率(ROI)的关键。Kompas.ai&#xff0c;一款先进的广告智能优化工具&#xff0c;利用数据分析和机器学习技术&#xff0c;帮助广告主实现更精准、高效的广告投放。 智能优化在提升广告效果中的作用 智能优化…

30.【C语言】详解printf

1.printf&#xff08;print formate&#xff09;输入函数 01.简单使用 调用前要引用头文件 #include <stdio.h> printf("abc"); 默认情况下打印完光标停留在同一行 \n可以换行 printf("abc\n"); ​ printf("ab\nc"); ​ printf(…

万用表数学功能中的限值(Limits)功能

万用表数学功能中的 限值(Limits)功能 有限值功能的仪表设置上下限的使用方法 创新向上 利向未来 通达世界 限值检查是指示有多少次采样超过指定限值&#xff0c;并且还指示何时超过此限值的数学功能。 限值(Limits)功能 以34465A为例&#xff1a;可以通过[Math] - Limi…

【对顶堆 优先队列】2102. 序列顺序查询

本文涉及知识点 对顶堆 优先队列 LeetCode 2102. 序列顺序查询 一个观光景点由它的名字 name 和景点评分 score 组成&#xff0c;其中 name 是所有观光景点中 唯一 的字符串&#xff0c;score 是一个整数。景点按照最好到最坏排序。景点评分 越高 &#xff0c;这个景点越好。…

CyberVadis认证是什么

CyberVadis认证是一项全球性的、权威的、基于云的网络安全性评估和认证项目。它是由Altimeter公司开发的&#xff0c;专门针对云计算服务提供商、数据中心、软件即服务(SaaS)供应商、安全咨询服务公司和内部IT部门而设计的。 CyberVadis认证旨在评估和验证组织在网络安全方面的…

MongoDB常用命令大全

文章目录 一、MongoDB简介二、服务启动停止备份三、数据库相关四、集合操作五、文档操作六、其他常用命令 一、MongoDB简介 MongoDB是一款流行的NoSQL数据库&#xff0c;以其灵活的文档模型、高可用性、易于扩展等特性而受到广泛关注。 MongoDB 是由C语言编写的&#xff0c;是…

【EXCELL技巧篇】使用Excel公式,获取当前 Excel的Sheet页的名字

【通知】&#xff1a; 正式跟大家说个难过的消息&#xff0c;本来在「中国朝代史」结束后&#xff0c;开启的下一个专栏「中国近代史」前面几期做的还好好的&#xff0c;可是今天起正式通知审核不过&#xff0c;因为一些原因。 其实我对于历史这一块我还是很感兴趣的&#xff0…

GB35114国密算法-GMSSL

C有个三方库-GMSSL是可以进行GB35114所需要的SM2、SM3、SM4等加解密算法的&#xff0c;但是使用国密算法是需要申请报备的 GmSSL是由北京大学自主开发的国产商用密码开源库&#xff0c;实现了对国密算法、标准和安全通信协议的全面功能覆盖&#xff0c;支持包括移动端在内的主流…

工业三防平板可优化工厂流程管理

在当今高度自动化和数字化的工业生产环境中&#xff0c;工业三防平板正逐渐成为优化工厂流程管理的关键工具。其强大的功能和卓越的性能&#xff0c;为工厂带来了更高的效率、更低的成本以及更出色的质量控制。 工业三防平板&#xff0c;顾名思义&#xff0c;具备防水、防尘、防…

gradle学习及问题

一、下载安装 参考&#xff1a;https://blog.csdn.net/chentian114/article/details/123344839 1、下载Gradle并解压 安装包&#xff1a;gradle-6.7-bin.zip 可以在idea的安装目录查看自己适配的版本 路径&#xff1a;D:\IDEA2021.3\plugins\gradle\lib 下载地址&#xff1a…

Qcom平台通过Hexagon IDE 测试程序性能指导

Qcom平台通过Hexagon IDE 测试程序性能指导 1 安装Hexagon IDE工具2 测试工程2.1 打开Hexagon IDE2.2 新建工程2.3 添加测试案例2.3.1 方法一&#xff1a;新建2.3.2 方法二&#xff1a;拷贝 2.4 配置测试环境2.4.1 包含头文件2.4.2 添加程序优化功能(需先bulid一下)2.4.3 添加g…

SEO效果好的wordpress主题

Cyber赛博独立站wordpress主题&#xff0c;黄色风格的产品展示型外贸独立站wordpress建站模板。 https://www.jianzhanpress.com/?p7135 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 绿色简…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-标题菜单及游戏结束界面(九)

文章目录 开发思路标题菜单界面标题菜单脚本代码结束菜单界面结束菜单脚本代码 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版…

前端基础之JavaScript学习——变量、数据类型、类型转换

大家好&#xff0c;我是来自CSDN的博主PleaSure乐事&#xff0c;今天我们开始有关JS的学习&#xff0c;希望有所帮助并巩固有关前端的知识。 我使用的编译器为vscode&#xff0c;浏览器使用为谷歌浏览器&#xff0c;使用webstorm或其他环境效果几乎一样&#xff0c;使用系统自…

【JavaEE】HTTP(2)

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;下一篇文章&#xff1a;【JavaEE】HTTP协议(…

ELK日志管理

文章目录 一、ELK概述什么是ELK?为什么使用ELK&#xff1f;ELK的工作原理 二、安装部署ELK前期准备安装部署Elasticsearch 软件修改系统配置安装插件在应用服务器上部署 Logstash安装 kibana 一、ELK概述 什么是ELK? 通俗来讲&#xff0c;ELK 是由 Elasticsearch、Logstash…

vue3+TS从0到1手撸后台管理系统

1.路由配置 1.1路由组件的雏形 src\views\home\index.vue&#xff08;以home组件为例&#xff09; 1.2路由配置 1.2.1路由index文件 src\router\index.ts //通过vue-router插件实现模板路由配置 import { createRouter, createWebHashHistory } from vue-router import …

集合媒体管理、分类、搜索于一体的开源利器:Stash

Stash&#xff1a;强大的媒体管理工具&#xff0c;让您的影音生活井井有条- 精选真开源&#xff0c;释放新价值。 概览 Stash是一个专为个人媒体管理而设计的开源工具&#xff0c;基于 Go 编写&#xff0c;支持自部署。它以用户友好的界面和强大的功能&#xff0c;满足了现代用…