LED点阵屏动态显示.docx
《LED点阵屏动态显示.docx》由会员分享,可在线阅读,更多相关《LED点阵屏动态显示.docx(17页珍藏版)》请在冰点文库上搜索。
LED点阵屏动态显示
LED点阵屏动态显示
山东大学物理学院
孙俊杰陈泉佑胡庆丽
摘要
随着科技的飞速发展,单片机的应用正在不断的走向深入,同时带动传统控制及LED显示技术日新月异的更新。
大型LED点阵广告牌与传统的广告宣传紧密结合成为新的媒体宣传工具,广泛应用于展览中心、金融市场、医院、体育场馆、机场、码头、车站、街道、高速公路等公共场所的信息显示和广告宣传。
本文提出了一种实现单片机控制LED点阵显示屏的简单方案。
前言
LED是发光二极管英文LightEmittingDiode的简称,是六十年代末发展起来的一种半导体显示器件,七十年代,随着半导体材料合成技术、单晶制造技术和,-,结形成技术的研究进展,发光二极管在发光颜色、亮度等性能得以提高并迅速进入批量化和实用化。
进入八十年代后,LED在发光波长范围和性能方面大大提高,并开始形成平板显示产品即LED显示屏。
LED电子显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。
它是集微电子技术、光电子技术、计算机技术、信息处理技术于一体的显示系统,是目前国际上极为先进的显示媒体。
由于它具有发光效率高、使用寿命长、组态灵活、色彩丰富、工作性能稳定以及对室内室外环境适应能力强等优点而日渐成为显示媒体中的佼佼者。
在我国改革开放之后,特别是进入90年代国民经济高速增长,对公众场合发布信息的需求日益强烈,LED显示屏的出现正好适应了这一市场形势,因而在LED显示屏的设计制造技术与应用水平上都得到了迅速的提高,生产也得到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。
单片机自20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。
单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。
正因为单片机有如此多的优点,因此其应用领域之广,几乎到了无孔不入的地步。
在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、智能化家用电器、航空航天系统和和国防军事、尖端武器等各个方面。
我们可以开发利用单片机系统以获得很高的经济效益。
更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。
以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。
这种以软件结合硬件或取代硬件并能提高系统性能的控制技术称为微控制技术。
关键词
单片机、LED显示屏、动态显示
正文
一、课程设计目的:
1、学习LED点阵显示屏的结构和工作流程,实现LED动态显示字符。
2、学习有关单片机的内容,了解Atmega16芯片和74HC164的相关功能。
3、复习C语言的相关知识。
4、培养自学能力和探索解决问题的能力。
5、培养团队协作精神。
二、应用
应用于展览中心、金融市场、医院、体育场馆、机场、码头、车站、街道、高速公路等公共场所,用于显示信息和宣传广告。
如果丰富其软硬件资源,可以更大程度的开发其潜在价值。
也许可以开发一种新游戏,制作一种定性分析测量系统,或者是发展成一种新型定位仪器„„三、作品
1、硬件
采用74HC164串行输入并行输出的芯片,节省了对单片机端口的占用。
用PORTA对LED的行进行操作,用PORTC的C0和C7分别控制74HC164的AB和Clock。
AVR单片机是增强型内置FLASH的RISC(ReducedInstructionSetCPU)精简指令集高速8位单片机,
硬件采用哈佛(Harward)结构,达到一个时钟周期可以执行一条指令,绝大部分指令都为单周期指令。
支持在系统编程ISP。
内置的FLASH程序存储器可擦写1000次以上,给用户的开发生产和维护带来
方便。
可擦写10万次的E2PROM,为掉电后数据的保存带来方便。
AVR单片机有丰富的片内资源,如
RTC,WATCHDOG,AD转换器,PWM,USART,SPI,TWI接口等,I,O口功能强、驱动能力强。
LED显示系统主要由3部分构成:
PC上位机图像文字转换与数据发送单元、主控单元以及显示子模
块。
上位机完成把图像和文字转换成为显示屏的显示码,并且把显示信息发送到主控单元上。
主控单
元选用具有32kB片内FLASHROM,若要增加存储容量,可以选用外挂存储器,或者用其它更高级
的单片机。
主控单元主要完成对显示数据的滚动和分割处理,然后通过异步串行口发送到每个子模块
中。
用一片ATMEGA8-p.htm"target="_blank"title="ATMEGA8货源和PDF资料">ATMEGA8完成扫
描动态显示。
74HC164是八位串行输入-并行输出移位寄存器.请参见资料。
电路图如下:
实物图如下:
2、软件
基于iccavr的编写要求,将循环语句加入到led点阵屏的现实当中,实现点阵屏对点
阵字的循环显示。
流程图如下:
变
显开LED量初示始存始屏字启储化符动区
该函数从变量存储区采集数据
流程图程序:
//ICC-AVRapplicationbuilder:
2009-5-30下午02:
13:
03
//Target:
M16
//Crystal:
4.0000Mhz
#include
#include
char
jiantou[]={0x7d,0x7d,0x18,0x18,0x18,0x18,0x7d,0x7d,0x00,0x66,0x99,0x99,0x442,0x
24,0x18,0x00,0x00,0x66,0x66,0x66,0x66,0x24,0x18,0x00};
voidport_init(void)
{
PORTA=0x00;
DDRA=0xff;
PORTC=0x00;//m103outputonly
DDRC=0xff;
}
voidinit_devices(void)
{
//stoperrantinterruptsuntilsetup
CLI();//disableallinterrupts
port_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x00;//timerinterruptsources
SEI();//re-enableinterrupts
//allperipheralsarenowinitialized
}
voidsenddata(charb){
chari;
for(i=0;i<8;i++)
{
PORTC|=(~b<
PORTC|=BIT(0);
PORTC=0X80;
}
}
voidchang(void)
{
chari,j;
j=jiantou[0];
for(i=0;i<7;i++)
jiantou[i]=jiantou[i+1];
jiantou[7]=j;
}
voiddisplay()
{
inti,j,k;
for(i=0;i<8;i++)
{
senddata(jiantou[i]);
PORTA=~(0x01<<1);
for(j=0;j<1;j++)
for(k=0;k<1000;k++);
PORTA=0XFF;
}
}
voidmain(void)
{
intj;
init_devices()
while
(1)
{
for(j=0;j<10;j++)
display(jiantou);
chang();
}
}
以上是软件的程序,由于硬件上采用的是共阳极的led点阵屏,所以将程序中的port端口的输出值取用相反值,从而实现点阵屏的显示。
说明:
//ICC-AVRapplicationbuilder:
2009-5-30下午02:
13:
03
//Target:
M16
//Crystal:
4.0000Mhz
注释行,分别说明了程序生成者是ICC-AVRapplicationbuilder,生成时间,CPU类型,晶振大小,在本例中晶振大小没有用途,但在实际操作中,晶振大小将影响定时器的设置,PWM波形的输出,串口波特率的设定,总线时序等多方面的问题。
#include
#include
包含特定头文件,iom16v.h和macros.h都在icc程序安装文件夹下一个include的目录中,iom16v.h和你选择的芯片相对应,如果你选择的是atmega16,那个这个文件就是iom16v.h,等等,在这样的文件中定义了对应的芯片的各个硬件地址。
macros.h文件中定义了一些宏命令和一些老的语言写法。
通常每一个程序都要包含这个头文件。
字符数组
char
jiantou[]={0x7d,0x7d,0x18,0x18,0x18,0x18,0x7d,0x7d,0x00,0x66,0x99,0x99,0x442,0x24,0x18,0x00,
0x00,0x66,0x66,0x66,0x66,0x24,0x18,0x00};
PORTA=0x00;
DDRA=0xff;
定义PA口为0x00,及PA口上的所有管脚输出为低电平,同样道理,如果些微PORTA=0xFF,则都输入高电平,0xFF及二进制的11111111,如果想让某一位输出高,其他为低,如00000001,则是PA0输出为高电平,PA1——PA7输出为低电平。
说明:
每个口线与单片机实际引脚的对应关系请参看技术手册。
voidport_init(void)
voidinit_devices(void)
voidsenddata(charb)
voidchang(void)
voiddisplay()
voidmain(void)
For语句
For(表达式1;表达式2;表达式3)
{
语句(内部可为空)
}
执行过程:
1.求解一次表达式1.
2.求解表达式2,若其值为真(非0即为真),则执行for中语句。
然后执行第3步。
否则结束for语句,直接跳出,不再执行
第3步。
3.求解表达式3.
4.跳到第2步重复执行。
While语句
While(表达式)
{
语句(内部也可为空)
}
特点:
先判断表达式,后执行语句。
原则:
若表达式不是0,即为真,那么执行语句。
否则跳出while语句。
3、测试及分析
(1)测试仪器:
AVRStudio软件、仿真器、开发板
(2)测试与分析
a.测试点阵:
系统上电后,全屏点亮时无暗点,表明点阵正常,可使用。
b.程序调试:
通过AVRStudio下载程序到单片机上,逐步运行程序,并观察相关变量的值的改变,以确定各部分程序是否正常运行并可用,直到检测完毕。
c.实时操作:
运行已通过调试的程序.观察点阵屏幕的变化。
4、项目花费统计
元器件数量价格
排线8条2元
杜邦线4条1元
200欧电阻8支0.5元
插针20支1元
16脚底座1个,
74HC1641个1元
8*8LED点阵屏1个3.5元
合计9元
5、成员分工
硬件、软件主要由孙俊杰负责,陈泉佑、胡庆丽为辅;论文、PPT、网页、总结主要由陈泉佑、胡庆丽负责,孙俊杰
为辅,论文、PPT最终由陈泉
佑定稿;网页、总结最终由胡
孙俊杰庆丽定稿;部分工作请老师和
陈泉佑同学协助。
胡庆丽最终分配比例为:
孙俊杰:
34%
陈泉佑:
33%
胡庆丽:
33%
结束语
经过认真的学习,努力的实践,终于完成了作品,虽然比较简单,但是适当丰富软硬件资源,该作品的实用前景还是相当广阔的。
通过此课程设计,我们不仅学习到了很多实用的知识,而且加强了同学间的交流,培养了合作精神。
在制作课程设计作品期间,曾听到某些人问:
“单片机即将过时了,学这些有什么用,”
我认为,树上的苹果向下落了几千年,牛顿才发现了万有引力;我们的单片机和发光二极管发展不过一个世纪,其潜在的价值还没有被充分地挖掘出来。
而且,即使是单片机这种实物载体即将过时,其所运用的原理和所体现出来的人类的探索创新的精神,是永远不会过时的。
参考文献和所用资源
参考书籍:
《Atmega16数据手册》
《74HC164数据手册》
《8×8LED点阵屏工作原理》
《AVR单片机嵌入式系统原理与应用实践》马潮北京航空航天大学出版社
《C程序设计》谭浩强清华大学出版社
相关网站:
所用资源:
ICCAVR集成开发环境
AVRStudio软件
AVR开发板及相关元器件
Protel99SE
DreamweaverMX
MicrosoftOffice
感谢老师的辛勤教导,感谢同学的帮助支持,也感谢组员之间的相互理解和信任。
文章中不当之处,还请各位读者指出修正。
谢谢~
补充:
由于我们作品的灵活性强,发展空间大,本组同学在课程设计项目顺利完成之后,又适当丰富了软硬件资源,在程序中添加了键盘扫描部分,实现了通过按键控制8×8LED点阵屏动态显示不同字符的功能。
鉴于时间有限,来不及再写一篇论文,重新制作网页,所以现在将新程序补充如下,相应的作品和视频材料请查看附件,关于新功能的材料准备的不是很充分,为此给读者带来的不便,我们深表歉意。
程序:
//ICC-AVRapplicationbuilder:
2009-5-1119:
36:
34
//Target:
M16
//Crystal:
4.0000Mhz
#include
#include
char
ixinyou[24]={0x7e,0x7e,0x18,0x18,0x18,0x18,0x7e,0x7e,0x00,0x66,0x99,0x99,0x42,0x24,0x18,0x00
0x00,0x66,0x66,0x66,0x66,0x24,0x18,0x00};
charhello[40]=
{0x00,0x66,0x66,0x7e,0x7e,0x66,0x66,0x00,0x7e,0x06,0x06,0x7e,0x7e,0x06,0x06,0x7e,0x00,0x06,0
x06,0x06,0x06,0x7e,0x7e,0x00,0x00,0x06,0x06,0x06,0x06,0x7e,0x7e,0x00,0x00,0x18,0x24,0x66,0x6
6,0x24,0x18,0x00};
charseeyou[32]=
{0x18,0x66,0x06,0x08,0x10,0x60,0x66,0x18,0x7e,0x06,0x06,0x7e,0x7e,0x06,0x06,0x7e,0x7e,0x06,0
x06,0x7e,0x7e,0x06,0x06,0x7e,0x00,0x66,0x66,0x66,0x66,0x24,0x18,0x00};
voidport_init(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;//m103outputonly
DDRC=0x00;
PORTD=0x07;
DDRD=0xF8;
}
//callthisroutinetoinitializeallperipherals
voidinit_devices(void){
//stoperrantinterruptsuntilsetup
CLI();//disableallinterrupts
port_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x00;//timerinterruptsources
SEI();//re-enableinterrupts
//allperipheralsarenowinitialized
}
voidsenddata(charb){
chari;
for(i=0;i<8;i++)
{
PORTB|=(~b<
PORTB|=BIT(0);
PORTB=0x00;
}
}
voidchange1(void)
{
chari,j;
j=ixinyou[0];
for(i=0;i<23;i++)
ixinyou[i]=ixinyou[i+1];
ixinyou[23]=j;
}
voidchange2(void)
{
chari,j;
j=hello[0];
for(i=0;i<39;i++)
hello[i]=hello[i+1];
hello[39]=j;}
voidchange3(void){
chari,j;
j=seeyou[0];
for(i=0;i<31;i++)
seeyou[i]=seeyou[i+1];
seeyou[31]=j;}
voiddisplay(char*b){
inti,j,k;
for(i=0;i<8;i++)
{senddata(b[i]);
PORTA=(0x01<
delay
(1);
PORTA=0x00;
}
}
//延时子程序voiddelay(intn){
intj;
while(n-->0)
for(j=0;j<125;j++);}
//是否有键按下子程序charpressed(void){
if(PIND!
=0x07)return1;
return0;
}
//键盘扫描子程序charkeyscan(void){
charkeycode;
if(pressed())delay(20);
keycode=PIND;
while(pressed());
delay(20);
returnkeycode;}
voidmain(void)
{
charj,code=0;
init_devices();
while
(1)
{
code=keyscan();
switch(code)
{
case6:
while(pressed()==0)
{for(j=0;j<10;j++)
display(ixinyou);
change1();
}
break;
case5:
while(pressed()==0)
{for(j=0;j<10;j++)
display(hello);
change2();
}
break;
case3:
while(pressed()==0)
{for(j=0;j<10;j++)
display(seeyou);
change3();
}
break;
}
}
}