第七章 点阵LED的学习

上传人:工**** 文档编号:506640053 上传时间:2023-08-02 格式:DOC 页数:24 大小:2.24MB
返回 下载 相关 举报
第七章 点阵LED的学习_第1页
第1页 / 共24页
第七章 点阵LED的学习_第2页
第2页 / 共24页
第七章 点阵LED的学习_第3页
第3页 / 共24页
第七章 点阵LED的学习_第4页
第4页 / 共24页
第七章 点阵LED的学习_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《第七章 点阵LED的学习》由会员分享,可在线阅读,更多相关《第七章 点阵LED的学习(24页珍藏版)》请在金锄头文库上搜索。

1、第七章 点阵LED的学习 复制链接 admin 当前离线 积分47557 292主题2233帖子914黑币管理员收听TA 发消息 电梯直达 楼主 admin 发表于 2013-7-11 20:15:41 | 只看该作者 |倒序浏览 |阅读模式 我们现在走在马路上,经常看到马路两侧有一些LED点阵广告牌,这些广告牌看起来绚烂夺目,非常吸引人,而且还会变化很多种不同的显示方式。本章我们就会学习到点阵LED的控制方式,按照惯例,先普及部分C语言知识。7.1变量的作用域所谓的作用域就是指变量起作用的范围。变量按他的作用域可以分为局部变量和全局变量1.局部变量在一个函数内部声明的变量是内部变量,他只在本

2、函数内有效,在此函数以外是不能使用的,这样的变量就是局部变量。此外,函数的形参也是局部变量,形参我们后边详细解释。比如上节课定义的unsignedlongstopwatch=0,这个变量是定义在main函数内部的,所以只能由main函数使用,中断函数就不能用这个变量。同理,我们如果在中断函数内部定义的变量,在main函数中也是不能使用的。2.全局变量在函数外声明的变量是全局变量。一个源程序文件可以包含一个或者多个函数,全局变量的作用范围是从它开始声明的位置一直到程序结束。比如上节课的unsignedcharLedNumber6=0;这个数组的作用域就是从开始定义的位置一直到程序结束,不管是ma

3、in函数,还是中断函数InterruptTimer0,都可以直接使用这个数组。局部变量只有在声明它的函数范围内有效,而全局变量可以被作用域内的所有的函数直接引用。所以在一个函数内既可以使用本函数内声明的局部变量,也可以使用全局变量。在习惯上,我们把全局变量定义在我们程序所有函数的最前边。由于函数通常只能有一个返回值,但是我们希望一个函数运行完了可以提供多个结果值给我们使用的时候,我们就可以利用全局变量来实现。但是考虑到全局变量的一些特征,应该限制全局变量的使用,过多使用全局变量也会带来一些问题。(1)全局变量可以被作用域内所有的函数直接引用,可以增加函数间数据联系的途径,但同时加强了函数模块之

4、间的数据联系,使这些函数的独立性降低,对其中任何一个函数的修改都可能会影响到其他函数,函数之间过于紧密的联系不利于程序的维护。(2)全局变量的应用会降低函数的通用性,函数在执行的时候过多依赖于全局变量,不利于函数的重复利用。我们现在程序编写比较简单,就一个.c文件,将来以后我们要学到一个程序中有多个.c文件,当一个函数被另外一个.c文件调用的时候,必须将这个全局变量的变量值一起移植,而全局变量不只被一个函数调用,这样会引起一些不可预见的后果。(3)过多使用全局变量会降低程序的清晰度,使程序的可读性下降。在各个函数执行的时候都可能改变全局变量值,往往难以清楚的判断出每个时刻各个全局变量的值。(4

5、)定义全局变量会直接占用单片机的内存单元,而局部变量只有进入定义局部变量的函数内才会分配内存,函数退出后会自动释放所占用的内存。所以大量的全局变量会额外增加内存占用。综上所述之原因,我们一项原则就是尽量减少全局变量的使用,能用局部变量代替的就不用全局变量。还有一种特殊情况,大家在看别人程序的时候注意。C语言是允许局部变量和全局变量同名的,他们定义后在内存中占有不同的内存单元。如果在同一源文件中,全局变量和局部变量同名,在局部变量作用域范围内,只有局部变量有效,全局变量不起作用,也就是说局部变量具有更高优先级。但是我们在编写程序的时候,尽量不要让变量重名,以避免不必要的误解。.2变量的存储类别变

6、量的存储类别分为自动、静态、寄存器和外部这四种。其中后两种我们暂不介绍,主要是自动变量和静态变量这两种。函数中的局部变量,如果不加static这个关键字来进行特别声明,都属于自动变量,也叫做动态存储变量。这些存储类别的变量,在调用该函数的时候系统会给他们分配存储空间,在函数调用结束后会自动释放这些存储空间。动态存储变量的关键字是auto,但是这个关键字是可以省略的,所以我们平时都不用。那么与动态变量对应的就是静态变量。首先,全局变量均是静态变量,此外,还有一种特殊的局部变量也是静态变量。即我们在局部变量声明前边加上static这个关键字,加上这个关键字的变量就称之为静态局部变量,他的特点是,在

7、整个生存期中只赋一次初值,函数调用的时候,如果是第一次调用,它的值就是我们给定的那个初值;如果不是第一次调用,那么它的值就是上一次函数调用结束后的值。在某一些场合中,一些变量只在一个函数中使用了,但是这个变量每次变化的值我们还想保存,如果定义成局部动态变量的话,每次进入函数后上一次的值就丢失了,如果定义成全局变量的话,又违背了我们上面提到的关于全局变量使用的一般原则,这个时候我们就可以定义成局部静态变量了。比如上节课中断程序中有一个用于动态刷新数码管控制的变量j,我们上节课的程序是定义成了全局变量,现在我们可以直接改成局部静态变量来试试。#include/包含寄存器的库文件sbitADDR0=

8、P10;sbitADDR1=P11;sbitADDR2=P12;sbitADDR3=P13;sbitENLED=P14;unsignedcharcodeLedChar=/用数组来表示数码管真值表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e,;unsignedcharLedNumber6=0;/定义全局变量unsignedintcounter=0;voidmain()unsignedlongstopwatch=0; ENLED=0;ADDR3=1;P0=0XFF;/74HC138和

9、P0初始化部分 TMOD=0x01; /设置定时器0为模式1 TH0=0xFC;TL0=0x67; /定时值初值,定时1msTR0=1; /打开定时器0EA=1; /打开中中断 ET0=1; /打开定时器0中断while(1) if(1000=counter) /判断定时器0溢出是否达到50次 counter=0; stopwatch+; LedNumber0=stopwatch%10; LedNumber1=stopwatch/10%10; LedNumber2=stopwatch/100%10;LedNumber3=stopwatch/1000%10; LedNumber4=stopwat

10、ch/10000%10; LedNumber5=stopwatch/100000%10; voidInterruptTimer0() interrupt1/中断函数的特殊写法,数字1为中断入口号staticunsignedcharj=0; TH0=0xFC; /溢出后进入中断重新赋值 TL0=0x67;counter+; /计数值counter加1P0=0xFF; /消隐 switch(j) case0:ADDR0=0;ADDR1=0;ADDR2=0;j+;P0=LedCharLedNumber0;break;case1:ADDR0=1;ADDR1=0;ADDR2=0;j+;P0=LedCha

11、rLedNumber1;break; case2: ADDR0=0;ADDR1=1;ADDR2=0;j+;P0=LedCharLedNumber2;break; case3: ADDR0=1;ADDR1=1;ADDR2=0;j+;P0=LedCharLedNumber3;break; case4: ADDR0=0;ADDR1=0;ADDR2=1;j+;P0=LedCharLedNumber4;break; case5: ADDR0=1;ADDR1=0;ADDR2=1;j=0;P0=LedCharLedNumber5;break;default:break; /动态刷新 大家注意看这个程序的中断

12、函数的静态变量j,如果加上了static,他的初始化j=0操作只进行一次,下边的程序会进行j+操作,下次进入中断函数的时候,j会保持上次的值。但是如果去掉static这个关键字,那每次进入函数后,j都会被初始化成0,大家可以自己修改程序做尝试。1.3点阵LED的初步认识点阵LED显示屏作为一种现代电子媒体,具有灵活的显示面积(可分割、任意拼装)、高亮度、长寿命、数字化、实时性等特点,应用非常广泛。前边学了LED小灯和LED数码管后,学LED点阵就要轻松得多了。一个数码管是8个LED组成,同理,一个8*8的点阵是由64个LED小灯组成。图7-1就是一个点阵LED最小单元,一个8*8的点阵LED,

13、图7-2是它的内部结构图。图7-18*8点阵LED7-28*8点阵LED结构原理图点阵LED内部原理图如图7-2所示,从7-2图上可以看出来,其实点阵LED点亮原理还是很简单的。在我们图上蓝色方框外侧的就是点阵LED的引脚号,左侧的8个引脚是接的内部LED的阳极,上侧的8个引脚接的是内部LED的阴极。那从图上可以看出来,我们的9脚如果是高电平,13脚是低电平的话,最左上角的那个LED小灯就会亮,那我们用程序来实现一下,特别注意,我们现在用的74HC138是原理图上的U4。#include/包含寄存器的库文件sbitLED=P00;sbitADDR0=P10;sbitADDR1=P11;sbitADDR2=P12;sbitADDR3=P13;sbitENLED=P14;voidmain() ENLED=0; ADDR0=0;ADDR1=0; ADDR2=0; ADDR3=0; /74HC138开启三极管 LED

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号