#循循渐进学51单片机#变量进阶与点阵LED#not.6
1、掌握变量的作用域及存储类别。
局部变量
函数内部声明的变量,只在函数内部有效,在本函数以外是不能使用的,叫局部变量。
全局变量
在函数外部声明的变量就是全局变量,一个源程序可以包含一个或多个函数,全局变量的作用范围是从它开始声明的位置一直到程序结束。
全局变量的副作用
1)降低函数的独立性,对任何一个函数的修改都可能影响到其他函数。
2)降低函数的通用性,不利于函数的重复利用。
3)降低程序的清晰度,每个函数执行都有可能改变全局变量值,无法清楚判断每个时刻的全局变量的值。
4)全局变量永久占用内存单元。
原则:能用局部变量就不用全局变量
全局变量和局部变量同名,在局部变量作用域范围内,局部变量有效。
自动变量
函数中的局部变量,如果不加static关键词修饰,都属于自动变量,也叫动态变量。
静态变量
所有的全局变量都属于静态变量,局部变量加了static关键词修饰的话,也是静态变量
2、了解点阵的显示原理,理解点阵动画显示原理。
点阵的显示原理是多个LED小灯组合在一起,点亮不同的LED小灯集合下来组成不同的图案,点阵的动画显示实际上就是不同图案的高帧变化。
3、独立完成点阵显示I❤U向下移动的程序。
clude <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedBuff[] = {
0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
0xE7,0xC3,0x81,0x00,0x00,0x99,0xFF,0xC3,
0x81,0x99,0x99,0x99,0x99,0x99,0xFF,0xFF,
};unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;void main()
{ENLED = 0;addr3 = 0;TMOD = 0x01;TH0 = 0xfc;TL0 = 0x67;TR0 = 1;while(1)
{if(TF0 == 1){TF0 = 0;cnt++;if(cnt >= 5){cnt = 0;flag1s++;}}P0 = 0xff;switch (i){case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 7];i++;break;case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 6];i++;break;case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 5];i++;break;case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 4];i++;break;case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 3];i++;break;case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 2];i++;break;case 6 :addr0 = 0;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 1];i++;break;case 7 :addr0 = 1;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 0];i=0;break;default:break;}if(flag1s >= 16){flag1s = 0;}}
}
4、独立完成点阵显示I❤U向右移动的程序。
#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedBuff[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7D,0x01,0x01,0x7D,0xFF,0xFF,0xE3,0xC1,0x81,0x03,0x03,0x81,0xC1,0xE3,0xFF,0xFF,0x81,0x01,0x3F,0x3F,0x3F,0x01,0x81,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;void main()
{ENLED = 0;addr3 = 0;TMOD = 0x01;TH0 = 0xfc;TL0 = 0x67;TR0 = 1;while(1)
{if(TF0 == 1){TF0 = 0;cnt++;if(cnt >= 5){cnt = 0;flag1s++;}}P0 = 0xff;switch (i){case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 7];i++;break;case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 6];i++;break;case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 5];i++;break;case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 4];i++;break;case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 3];i++;break;case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 2];i++;break;case 6 :addr0 = 0;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 1];i++;break;case 7 :addr0 = 1;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 0];i=0;break;default:break;}if(flag1s >= 32){flag1s = 0;}}
}
5、用点阵做一个9到0的倒计时牌显示。
#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedBuff[][8] = {
0xFF,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xFF,0xFF,0xE3,0xDF,0xDF,0xEF,0xF7,0xC3,0xFF,
0xFF,0xC3,0xDF,0xDF,0xE3,0xDF,0xDF,0xC3,0xFF,0xEF,0xE7,0xEB,0xC1,0xEF,0xEF,0xEF,
0xFF,0xC3,0xFB,0xC3,0xDF,0xDF,0xDF,0xE3,0xFF,0xC3,0xDF,0xDF,0xC3,0xDB,0xDB,0xC3,
0xFF,0xC3,0xDF,0xEF,0xF7,0xF7,0xF7,0xF7,0xFF,0xC3,0xDB,0xDB,0xE7,0xDB,0xDB,0xC3,
0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xEF,0xFF,0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;void main()
{ENLED = 0;addr3 = 0;TMOD = 0x01;TH0 = 0xfc;TL0 = 0x67;TR0 = 1;while(1)
{if(TF0 == 1){TF0 = 0;cnt++;if(cnt >= 10){cnt = 0;flag1s++;}}P0 = 0xff;switch (i){case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s][0];i++;break;case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s][1];i++;break;case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s][2];i++;break;case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s][3];i++;break;case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s][4];i++;break;case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s][5];i++;break;case 6 :addr0 = 0;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s][6];i++;break;case 7 :addr0 = 1;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s][7];i=0;break;default:break;}if(flag1s >= 10){flag1s = 0;}}
}
6、尝试实现流水灯、数码管和点阵的同时显
#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned int i = 0;void main()
{EA = 1;ENLED = 0;TMOD = 0x01;TH0 = 0xfc;TL0 = 0x67;ET0 = 1;TR0 = 1;while(1)
{}
}
void InterruptTimer0() interrupt 1
{TH0 = 0xfc;TL0 = 0x67;P0 = 0xff;switch (i){case 0 :addr3 = 0;addr0 = 0;addr1 = 0;addr2 = 0;P0 = 0;i++;break;case 1 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 0;P0 = 0;i++;break;case 2 :addr3 = 0;addr0 = 0;addr1 = 1;addr2 = 0;P0 = 0;i++;break;case 3 :addr3 = 0;addr0 = 1;addr1 = 1;addr2 = 0;P0 = 0;i++;break;case 4 :addr3 = 0;addr0 = 0;addr1 = 0;addr2 = 1;P0 = 0;i++;break;case 5 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;case 6 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;case 7 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;case 8 :addr3 = 1;addr0 = 0;addr1 = 0;addr2 = 0;P0 = 0;i++;break;case 9 :addr3 = 1;addr0 = 1;addr1 = 0;addr2 = 0;P0 = 0;i++;break;case 10 :addr3 = 1;addr0 =0;addr1 = 1;addr2 = 0;P0 = 0;i++;break;case 11 :addr3 = 1;addr0 = 1;addr1 = 1;addr2 = 0;P0 = 0;i++;break;case 12 :addr3 = 1;addr0 = 0;addr1 = 0;addr2 = 1;P0 = 0;i++;break;case 13 :addr3 = 1;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;case 14 :addr3 = 1;addr0 = 0;addr1 = 1;addr2 = 1;P0 = 0;i=0;break;default:break;}}
相关文章:
#循循渐进学51单片机#变量进阶与点阵LED#not.6
1、掌握变量的作用域及存储类别。 局部变量 函数内部声明的变量,只在函数内部有效,在本函数以外是不能使用的,叫局部变量。 全局变量 在函数外部声明的变量就是全局变量,一个源程序可以包含一个或多个函数,全局变量…...

访问者模式
图片转载自 #include<iostream> using namespace std; #include<list> /*模板工厂单例化,所有的商品被注册进工厂中*/ /*访问者模式(行为型模式) 访问者,被访问者 visit accept 让访问变成一种操作,不同…...

epoll 的实现
epoll 这么好,为什么迟至 2.6 版本的 kernel 才支持(epoll manual: The epoll API was introduced in Linux kernel 2.5.44.)?2.4 版本的 kernel 不支持 epoll? 原因很简单,epoll 没什么神奇的。在早期没有太多的并发连接要处理&…...

怎么用excel管理固定资产
在当今的数字时代,我们已经习惯了使用各种电子工具来提高我们的生产力。其中,Excel无疑是一个强大的工具,它不仅可以帮助我们处理数据,还可以用来进行复杂的计算和分析。然而,你可能不知道的是,Excel也可以…...

记录crack某IDE插件过程
声明:本文仅记录学习过程,已对关键位置脱敏处理,未提供任何工具,请支持正版。 反编译jar包 使用cfr进行对插件核心jar包MyBxxxxxx-obfuss.jar进行反编译,在本地生成a.txt。 java -jar cfr-0.152.jar MyBxxxx-obfuss.…...
Android DEX相关,ART加载OAT文件
android .dex文件,对于Android DEX文件详细说明 Android dex、odex、oat、vdex、art区别 Android下的DEX文件和SO文件梳理总结 Android[art]-Android dex,odex,oat,vdex,art文件结构学习总结 第四章 常见的 Android 文件格式&…...

laravel框架 - 安装初步使用学习 composer安装
一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目,内容管理系统(Content Management System,CMS)是一种比较典型的项目,常见的网站类型(如门户、新闻、博客、文章等)都可以利用CM…...

API实战教程:使用身份证OCR识别API构建一个应用
1. 引言 你是否曾经想过,只需拍一张身份证的照片,就能自动读取上面的所有信息?今天,我们要介绍的就是这样一个神奇的工具:身份证OCR识别API。不管你是技术小白还是初学者,跟着我们的步骤,你都可…...

前端-layui动态渲染表格行列与复杂表头合并
说在前面: 最近一直在用layui处理表格 写的有些代码感觉还挺有用的,顺便记录下来方便以后查看使用; HTML处代码 拿到id 渲染位置表格 <div class"layui-table-body salaryTable"><table class"layui-table" i…...

IDM(Internet Download Manager)下载器2024最新版本如何下载?
IDM(Internet Download Manager)下载器能够兼容支持多种浏览器进行文件下载,很多时候只要复制一个地址IDM的下载弹窗就自动弹出来,有时候不需要下载的时候也会弹,时间久了就会感觉很烦,不过这个问题其实可以…...

前端综合练手小项目
导读 本篇文章主要以小项目的方式展开,其中给出的代码中均包含详细地注释,大家可以参照理解。下面4个小项目中均包含有 HTML、CSS、JavaScript 等相关知识,可以拿来练手,系统提升一下自己的前端开发能力。 废话少说,…...

接口优化1
接口优化 文章目录 接口优化1. 内容概述2. 集成RabbitMQ2.1 下载2.2 SpringBoot集成RabbitMQ 快速入门1.相关配置2.创建发送者者和接收者 2.3 rabbitmq四种交换模式2.4 秒杀接口优化 1. 内容概述 核心思路:减少对数据库的访问,利用Redis的高并发特性来实现。 系统初…...

【无公网IP内网穿透】 搭建Emby媒体库服务器并远程访问「家庭私人影院」
目录 1.前言 2. Emby网站搭建 2.1. Emby下载和安装 2.2 Emby网页测试 3. 本地网页发布 3.1 注册并安装cpolar内网穿透 3.2 Cpolar云端设置 3.3 Cpolar内网穿透本地设置 4.公网访问测试 5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力…...

QML android 采集手机传感器数据 并通过udp 发送
利用 qt 开发 安卓 app ,采集手机传感器数据 并通过udp 发送 #ifndef UDPLINK_H #define UDPLINK_H#include <QObject> #include <QUdpSocket> #include <QHostAddress>class UdpLink : public QObject {Q_OBJECT public:explicit UdpLink(QObjec…...
stableDiffusion安装
下载git 下载python-3.10.6版本 clone git至本地 使用git clone命令 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 更换pip源为为百度镜像 pip config --global set global.index-url https://mirror.baidu.com/pypi/simple 最后的镜像源链接 阿里云 h…...
QT基础教程(QPushButton及信号与槽)
文章目录 前言一、信号与槽二、QPushButton总结 前言 本篇文章来带大家学习QPushbutton和信号与槽,其中信号与槽是QT中的核心也是比较重要的一个知识点。 资料合集地微信公众号:优质程序猿一、信号与槽 信号与槽(Signals and Slots&#x…...

Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅
一、项目概述 欢迎来到创意之源!我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio,我们实现了绘制贝塞尔曲线的功能,让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习…...

Windows系统关机后自动重启的解决方法
打开控制面板,找到【电源选项】; 方式一,打开Windows终端(管理员),输入“powercfg /h on”然后回车; 方式二,键盘按下开始键,搜索“控制面板”然后打开; 点击…...

微服务如何改变软件开发:实战经验与最佳实践分享
文章目录 什么是微服务?微服务实战经验1. 定义明确的服务边界2. 使用API网关3. 自动化部署和持续集成4. 监控和日志记录 微服务最佳实践1. 文档和通信2. 弹性设计3. 安全性4. 版本控制5. 监控和警报 微服务的未来 🎉欢迎来到架构设计专栏~微服务如何改变…...

安装深度(Deepin)系统
Deepin系统安装 Deepin是和Ubuntu一样,是一个基于Debian的Linux的发型版本。 Deepin相对于Ubuntu,Deepin更适合中国用户的使用习惯。 一 官网工具制作启动盘 制作启动盘、和安装系统,操作非常简单,nice! 官网提供了…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...