#循循渐进学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;}}

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

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

相关文章

需求是怎么一步一步变态的

最初的需求 需求是处理一些数据&#xff0c;数据例子&#xff1a; 而界面要显示的样子&#xff1a; 看起来不太难&#xff0c;可以分解出需求&#xff1a; 每一列的所有数据要都能参与选择&#xff0c;或者输入当一个参数选中之后&#xff0c;比如选中A选中1&#xff0c;则…

Jenkins用户管理(二):不同用户分配不同的任务访问权限

需求:不同用户访问到不同的Jenkins任务。 依赖插件:Role-based Authorization Strategy 1. 插件安装 进入【系统管理】-【插件管理】-【可用插件】,搜索Role-based Authorization Strategy进行安装,随后重启jenkins 2. 全局安全配置 进入【系统管理】-【全局安全配置】,【…

K8S:Pod容器中的存储方式及PV、PVC

文章目录 Pod容器中的存储方式一&#xff0e;emptyDir存储卷1.emptyDir存储卷概念2.emptyDir存储卷示例 二.hostPath存储卷1.hostPath存储卷概念2.hostPath存储卷示例 三.nfs共享存储卷1.nfs共享存储卷示例 四.PV和PVC1.PV、PVC概念2.PVC 的使用逻辑及数据流向3.storageclass插…

自动化测试:yaml结合ddt实现数据驱动!

在pythonunittestseleniumddt的框架中&#xff0c;数据驱动常见有以下几种方式实现&#xff1a; Csv/txtExcelYAML 本文主要给大家介绍测试数据存储在YAML文件中的使用场景。首先先来简单介绍一下YAML。 1. 什么是YAML 一种标记语言类似YAML&#xff0c;它实质上是一种通用…

git安装配置教程

目录 git安装配置1. 安装git2. git 配置3.生成ssh key:4. 获取生产的密钥3. gitee或者github添加ssh-key4.git使用5. git 使用-本地仓库与远程仓库建立连接第一步&#xff1a;进入项目文件夹&#xff0c;初始化本地仓库第二步&#xff1a;建立远程仓库。 建立远程连接的小技巧 …

Git学习笔记9

Gitlab中的代码是要部署到生产服务器上。 CI&#xff1a; Continuous integration 简称CI&#xff1a; 是一种软件开发实践&#xff0c;即开发团队成员经常集成他们的工作&#xff0c;通常每个成员每天至少集成一次&#xff0c;也就意味着每天可能会发生多次集成。每次集成都…

多目标优化算法:基于非支配排序的鱼鹰优化算法(NSOOA)MATLAB

一、鱼鹰优化算法 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕食行为。 Python&#xff1a;鱼鹰优化算法&#xff08;Osprey optimization algorithm&a…

新版发布 | Cloudpods v3.10.5 和 v3.9.13 正式发布

Cloudpods v3.10.5 本期发布中&#xff0c;ocboot 部署脚本有较多变化&#xff0c;首先支持以非 root 用户执行安装流程&#xff0c;其次响应社区的呼吁&#xff0c;增加了–stack 参数&#xff0c;允许 Allinone 一键安装仅包含私有云&#xff08;参数为 edge&#xff09;或云…

ESP8266 WiFi物联网智能插座—项目简介

目录 1、项目背景 2、设备节点功能 3、上位机功能 物联网虽然能够使家居设备和系统实现自动化、智能化管理&#xff0c;但是依然需要依靠更为先进的终端插座作为根本保障&#xff0c;插座是所有家用电器需要使用的电源设备&#xff0c;插座的有序智能管理&#xff0c;对于实…

服务器免密登录设置

例如服务器A想要免密连接服务器B&#xff0c;需要以下2个步骤 步骤1&#xff1a;在服务器A上执行命令ssh-keygen –t rsa&#xff0c;直接回车&#xff0c;会在默认路径/root/.ssh下生成私钥和公钥 步骤2&#xff1a;将服务器A上生成的公钥id_rsa.pub的内容&#xff0c;复制粘…

进程的管理

#include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status); status参数&#xff1a;是进程退出时的状态信息&#xff0c;父进程在回收子进程资源的时候可以获取到 #include<stdio.h> #include<stdlib.h> #includ…

【C++】搜索二叉树底层实现

目录 一&#xff0c;概念 二&#xff0c;实现分析 1. 插入 &#xff08;1.&#xff09;非递归版本 &#xff08;2.&#xff09;递归版本 2. 打印搜索二叉树 3.查找函数 &#xff08;1.&#xff09;非递归版本 &#xff08;2.&#xff09;递归版本 4. 删除函数&#x…

flex弹性盒模型与阿里图标的使用

华子目录 flex布局flex布局原理flex使用三要素 阿里图标&#xff08;字体&#xff09; flex布局 相关学习网站&#xff1a;http://c.biancheng.net/css3/flex.html 1.flex是当前最主流的布局方式&#xff1a;用它布局起来更方便&#xff0c;取代了浮动的作用。 2.浮动布局有缺…

Redis混合模式持久化原理

前言 前面文章中我们也介绍过Redis的持久化方式有两种&#xff1a;rdb持久化和aof持久化&#xff0c;具体详情可查看之前文章redis持久化。rdb持久化还是aof持久化它们都有各自的缺点。 rdb和aof缺点 rdb持久化&#xff1a;由于是定期对内存数据快照进行持久化&#xff0c;因此…

宝塔重装注意事项

欢迎关注我的公众号&#xff1a;夜说猫&#xff0c;让一个贫穷的程序员不靠打代码也能吃饭~ 前言 宝塔8.0版本&#xff0c;宝塔卸载重装&#xff0c;或者重装Linux系统后重新安装宝塔也适用。 不能上来直接就执行安装宝塔脚本&#xff0c;除非之前没有安装过宝塔。 步骤 1、…

Flutter粒子生成演示

演示&#xff1a; 直接上代码&#xff1a; import dart:math; import dart:ui;import package:flutter/material.dart; import package:kq_flutter_widgets/widgets/chart/ex/extension.dart;class ParticleView extends StatefulWidget {const ParticleView({super.key});ove…

Vue 使用vue-cli构建SPA项目(超详细)

目录 一、什么是vue-cli 二&#xff0c;构建SPA项目 三、 运行SPA项目 前言&#xff1a; 在我们搭建SPA项目时候&#xff0c;我们必须去检查我们是否搭建好NodeJS环境 cmd窗口输入以下指令&#xff1a;去检查 node -v npm -v 一、什么是vue-cli Vue CLI&#xff08;Vu…

Qt/C++音视频开发53-本地摄像头推流/桌面推流/文件推流/监控推流等

一、前言 编写这个推流程序&#xff0c;最开始设计的时候是用视频文件推流&#xff0c;后面陆续增加了监控摄像头推流&#xff08;其实就是rtsp视频流&#xff09;、网络电台和视频推流&#xff08;一般是rtmp或者http开头m3u8结尾的视频流&#xff09;、本地摄像头推流&#…

短视频矩阵系统,短视频矩阵源码技术开发

开发短视频矩阵系统的源码需要以下步骤&#xff1a; 确定系统需求&#xff1a;根据客户的需求&#xff0c;确定系统的功能和特点&#xff0c;例如用户注册登录、视频上传、视频浏览、评论点赞等。 设计系统架构&#xff1a;根据系统需求&#xff0c;设计系统的整体架构&#x…

【Java 基础篇】Java同步代码块解决数据安全

多线程编程是现代应用程序开发中的常见需求&#xff0c;它可以提高程序的性能和响应能力。然而&#xff0c;多线程编程也带来了一个严重的问题&#xff1a;数据安全。在多线程环境下&#xff0c;多个线程同时访问和修改共享的数据可能导致数据不一致或损坏。为了解决这个问题&a…