#循循渐进学51单片机#变量进阶与点阵LED#not.6

2023-09-13 13:22:22

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;
	}
	}

更多推荐

AI-Toolbox

集合你需要的所有AI工具。(GatheralltheAItoolsyouneed.)1.AI绘画工具(AIdrawingtool)Midjourney:目前最强的AI绘画工具。StableDiffusion:最强开源AI绘画工具。Civital:AI艺术共享平台。HuggingFace:开源SD模型下载。VEGA:国内

统计报告期节能率

声明本文是学习GB-T29314-2023电动机系统节能改造规范.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们7综合评估7.1一般规定7.1.1电动机系统节能改造后,应对设备运行效果进行评估,改造后系统的生产效率和系统分界点指标应达到改造设计要求。7.1.2电动机系统改造后,应对与改造设备相关的

苏宁易购商品详情数据接口

苏宁易购商品详情数据接口采集方法如下:下载安装载图助手软件并打开苏宁易购平台,找到需要采集的商品类目。点击一个商品进入详情页,启用软件的批量下载功能并打开“自动粘贴网址”。复制商品上方的链接,链接会自动传送到首页的地址栏里。全部复制完成后,在选项中把“下载主图”、“同时下载视频”、“下载详情图”三项打勾。单击“立即下载

中移链交易模块介绍

中移链交易模块是中移链区块链系统的核心模块之一。它的主要作用是处理用户发起的交易请求,并将其打包成区块添加到区块链上。交易模块接收来自不同合约执行的指令,比如创建账号、转账、部署和执行智能合约等指令,并确保所有交易都是有效且合法的。与其他模块相比,交易模块的工作量较大,每秒需要高效地处理上千个交易请求。01交易的组件构

vision transformer

一、网络构建importtorchfromtorchimportnnfromfunctoolsimportpartial#---------------------------------------##(1)patchembedding'''img_size=224:输入图像的宽高patch_size=16:每个pa

Matlab--高等应用数学问题的MATLAB求解

1.求解n阶导数%%%如何求解n阶导数,用到diff(f,n)symsx;f=sin(x)/(x^2+4*x+3);diff(f,4)%%%如何求解100阶导数tic,F=diff(f,100);toc2.Matlab语言的优越性%%%MATLAB的优点:%MATLAB语言的简洁高效性%MATLAB语言的科学运算功能%

揭秘多数据模型与数据联动如何重塑企业数据处理和决策过程

在数字化时代,数据已经成为企业竞争的核心资源。为了更好地利用数据,许多企业开始采用低代码的多数据模型和数据联动。这些技术和方法可以用于运用多种数据模型来对用户进行分类;可以利用数据联动来提高推荐的准确性和效率,帮助企业更快速、更高效地构建数据驱动的应用程序,从而提升业务效率和竞争力。业务需求说明:1、配置固定资产领用单

Nat. Rev. Bioeng. | 中山大学左涛组详述肠道微生态工程化改造

肠道微生态工程化改造EngineeringthegutmicrobiomeReviewArticle,2023-6-16,NatureReviewsBioengineeringDOI:10.1038/s44222-023-00072-2原文链接:https://www.nature.com/articles/s4422

vue国际化教程

需求背景项目需求要做国际化,结果网上找了好几篇文章,没有一个可以一次性搞定,现在这里总结一下。首先,我们分为两部分处理,一个是前端页面的静态文字,这个由前端vue.json自行处理。第二部分就是后端的错误消息和日志部分,我们由springboot的拦截器来处理。i18n介绍i18n(其来源是英文单词internatio

说说hashCode() 和 equals() 之间的关系?

每天一道面试题,陪你突击金九银十!上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于“hashCode()和equals()之间的关系?”的面试题,本篇来解析一下这道基础面试题。先祭一张图,可以思考一下为什么?介绍equals()的作用是用来判断两个对象是否相

第二证券:算力概念强势拉升,竞业达涨停,南凌科技等大涨

算力概念20日盘中强势拉升,到发稿,竞业达涨停,南凌科技涨近10%,拓维信息涨近9%,亚康股份、神州数码涨约5%,青云科技涨逾4%。音讯面上,9月19日,国际大学生程序设计竞赛(ICPC)官网披露了华为创始人兼CEO任正非与ICPC基金会及金牌获得者的谈话纪要。任正非表明,我们行将进入波澜壮阔的第四次工业革命,其规划之

热文推荐