#循循渐进学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;
	}
	}
相关推荐
WIZnet 中国社区官方博客2 分钟前
第二章 开发板与芯片介绍
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·系统框架·开发板介绍·硬件资源
学习噢学个屁2 分钟前
基于STM32音频频谱分析设计
c语言·stm32·单片机·嵌入式硬件·音视频
恰薯条的屑海鸥10 分钟前
零基础学前端-传统前端开发(第三期-CSS介绍与应用)
前端·css·学习·css3·前端开发·前端入门·前端教程
阑梦清川1 小时前
国防科技大学计算机基础慕课课堂学习笔记
笔记·学习·数学建模
电子科技圈1 小时前
IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
arm开发·嵌入式硬件·设计模式·性能优化·软件工程·代码规范·risc-v
水水沝淼㵘2 小时前
嵌入式开发学习日志(数据库II && 网页制作)Day38
服务器·c语言·网络·数据结构·数据库·学习
守护者1702 小时前
JAVA学习-练习试用Java实现“一个词频统计工具 :读取文本文件,统计并输出每个单词的频率”
java·学习
位东风3 小时前
【凌智视觉模块】rv1106 部署 ppocrv4 检测模型 rknn 推理
c++·人工智能·嵌入式硬件
不太可爱的叶某人3 小时前
【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略
java·笔记·学习
Chef_Chen3 小时前
从0开始学习R语言--Day21--Kruskal-Wallis检验与Friedman检验
学习