Led 点阵大屏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Led 点阵大屏
组员:张大剑胡喜庆徐永邦
一.课程设计目的
1、实现LED点阵屏核心功能即字母的多样化显示。
2、通过本次课程设计加深对单片机课程的全面认识和掌握,对单片机课
程的应用进一步的了解。
3、掌握SPI串口进行数据传输的应用,并学会使用外部芯片辅助项目设
计。
4、锻炼通过自学与自己探索的方式解决问题的能力。
5、通过此次课程设计将单片机软硬件结合起来对程序进行编辑,校验,
锻炼实践能力和理论联系实际的能力。
6、锻炼团队分工合作与协调能力。
二.用途与功能
目前我国大部分的广场电视、高速公路、车站等的信息发布平台等公共信息发布系统均采用点阵显示的方式设计。
LED因其体积小,耗电量低,高亮度及环保等优点而被广泛应用于公共场所的大屏显示上,LED点阵大屏可应用于户外广告,交通导航,大厅公告,比赛的多媒体实时显示等领域。
本课程设计作品的用途正是在于实现大屏显示的核心功能,即字母的多样化显示,可实际应用于简单的显示系统中。
1 准确的显示英文字母
2 通过键盘可控制显示方式
3 可控的逐个显示字母
4 可控制显示字母的亮度
5 可控的滚动显示字母
6 滚动方向可控
7 滚动速度可控
三硬件设计思想及电路图:
通过键盘输入控制信号,由单片机进行处理,并将行列信号分别通过显示驱动输入点阵大屏,控制点阵的显示。
电路图如下:
1. 单片机:采用Atmega16单片机芯片作为中控,处理键盘信号并控制LED点阵显示。
2.控制信号输入:采用AVR开发板上自带的4*4矩阵键盘。
3.显示:考虑到显示的对象为英文字母,并不需要太大的显示屏,因此决定采用8x8LED点阵屏显示字母。
4.显示驱动:考虑到设计所需端口较多的问题,为减少资源占用,使用74HC164作为行驱动芯片,同时为保护芯片,我们又采用100欧电阻来进行限流。
在调试过程中发现我们自己制作的电路板可靠性不高而我们的设计可通过适当的变通完全依赖开发板,因此我们仅采用开发板作为我们的硬件电路。
四软件设计思想及软件流程
设计思想:
通过timer2的溢出中断程序实现基本的显示字母功能,使用全局变量控制将要显示的字母、字母的显示亮度、是否滚动显示、滚动显示的方向及速度,通过使用外部触发中断的键盘扫描刷新全局变量的值。
软件流程:
详细介绍:
1.全局变量的功能:
本程序使用了5个全局变量,名称及功能如下:
word_select:选择要显示的字母
light:选择显示字母的亮度
direction:设置滚动的方向
speed:设置是否滚动及滚动的速度
move:恢复字母的初相位
2.键盘扫描部分:采用INT2作为触发中断的行列翻转键盘扫描方式键值及功能如下:
case 0x00: break;
case 0xEE: word_select=0; 选择字母1
case 0xED: word_select=1; 选择字母2
case 0xEB: word_select=2; 选择字母3
case 0xE7: word_select=3; 选择字母4
case 0xDE: light=0; 字母亮度档1
case 0xDD: light=2; 字母亮度档2
case 0xDB: light=4; 字母亮度档3
case 0xD7: light=6; 字母亮度档4
case 0xBE: direction=0; 滚动方向1
case 0xBD: direction=1; 滚动方向2
case 0xBB: speed=0; 停止滚动档
case 0xB7: speed=1; 滚动速度档1
case 0x7E: speed=2; 滚动速度档2
case 0x7D: speed=3; 滚动速度档3
case 0x7B: speed=4; 滚动速度档4
case 0x77: move=0; 恢复字母的初相位
3.显示函数:
采用timer2的溢出中断服务程序来实现字母的显示。
每次timer2溢出时,触发中断,在中断服务程序中刷新点阵屏幕的驱动端口数
值,达到显示字母的目的。
具体程序如下:
//ICC-AVR application builder : 2008-05-31 15:39:17
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
flash char word[4][8]={{0x00,0x7c,0x04,0x04,0x7c,0x04,0x04,0x00},{0x00,0x7c,0x04 ,0x04,0x7c,0x04,0x04,0x7c},{0x00,0x3e,0x42,0x42,0x42,0x42,0x3e,0x00}, {0x00,0x3c,0x02,0x02,0x02,0x02,0x3c,0x00}};
volatile char row=0,light=0,light_load=0,move=0,speed=0,direction=0,word_select=0; volatile int n=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0xFF;
}
//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 1Hz
// actual value: Out of range
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x00 /*INVALID SETTING*/; //set count
OCR0 = 0x00 /*INVALID SETTING*/; //set compare
TCCR0 = 0x02; //start timer
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up CLI(); //disable all interrupts
port_init();
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //timer interrupt sources SEI(); //re-enable interrupts
//all peripherals are now initialized }
void delay_ms(char time)
{int x;
for(;time;time--)
{for(x=0;x<8000;x++);}
}
//键盘扫描函数//
unsigned char key_scan(void)
{unsigned char temp=0,key=0;
DDRB = 0xF0;
PORTB = 0x0F;
temp = PINB&0x0F;
if(temp==0x0F)
return 0;
else{delay_ms(1);
temp = PINB&0x0F;
if(temp==0x0F) return 0;
else key=temp;}
DDRB = 0x0F;
PORTB = 0xF0;
delay_ms(1);
temp = PINB&0xF0;
if(temp==0xF0)
{return 0; }
else
{ key |= temp; }
DDRB = 0x00;
PORTB = 0xFF;
return key;}
void get_key(void)
{unsigned char i=0;
i=key_scan();
switch (i)
{
case 0x00: break;
case 0xEE: word_select=0; break;
case 0xED: word_select=1; break;
case 0xEB: word_select=2; break;
case 0xE7: word_select=3; break;
case 0xDE: light=0; break;
case 0xDD: light=5; break;
case 0xDB: light=10; break;
case 0xD7: light=15; break;
case 0xBE: direction=0; break;
case 0xBD: direction=1; break;
case 0xBB: speed=0; break;
case 0xB7: speed=1; break;
case 0x7E: speed=2; break;
case 0x7D: speed=3; break;
case 0x7B: speed=4; break;
case 0x77: move=0; break;
default : break;}
}
//利用中断服务程序实现字母的显示//
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void)
{if(light_load--==0)
{CLI();
row++;
PORTC&=0xfd;
if(row==0) PORTC|=0x01;
if(0<row&&row<8) PORTC&=0xfe;
if(row>7) {row=0;PORTC|=0x01;}
if(direction==0)
{if(row<= 7-move)
PORTD=~word[word_select][row+move];
else PORTD=~word[word_select][row-8+move];}
else {if(row>=move)
PORTD=~word[word_select][row-move];
else PORTD=~word[word_select][row+8-move];}
if(n++==2000) {if (move<8) move+=speed;
else move=0;
n=0;}
PORTC|=0x02;
SEI();
light_load=light;
}
else PORTD=0xff;
}
//主函数//
void main (void)
{init_devices();
light_load=light;
while(1){key_scan();
get_key();}
}
四系统测试过程及分析
1.测试仪器:
AVR Studio软件、仿真器、开发板
2.测试与分析:
(1)测试点阵:系统上电后,全屏点亮时无暗点,表明点阵正常,可使用。
(2)测试键盘:直接连接键盘到单个可用LED发光二极管(这里采用实验板上发光二极管),按下每个按键看LED是否可亮,若亮,说明键盘可用。
(3)程序调试:通过AVR Studio下载程序到单片机上,逐步运行程序,并观察相关变量的值的改变,以确定各部分程序是否正常运行并可用,直到检测完毕。
(4)实时操作:运行已通过调试的程序.逐次按下键值,观察点阵屏幕的变化。
至此,调试彻底通过!
整个课程大体操作如上所述,但实际在细节上遇到较多问题,因为所设计的为点阵,相关实验数据没有,遇到的问题主要有仿真器无法与开发板连接,因程序问题而导致的字形走样。
详细实验遇到的问题及解决将在总结报告中指出。
五.课程设计素使用的资源
硬件资源:Atmega16实验开发板
软件资源:自己独立编写(键盘扫描函数参考课件)
参考书籍:
《Atmega16数据手册》
《AVR单片机嵌入式系统原理与应用实践》
相关网站:。