通信工程专业课程设计南理工.docx
《通信工程专业课程设计南理工.docx》由会员分享,可在线阅读,更多相关《通信工程专业课程设计南理工.docx(28页珍藏版)》请在冰豆网上搜索。
通信工程专业课程设计南理工
通信工程专业课程设计南理工
通信工程专业课程设计
实验报告
——带有LED指示的图片播放器
指导教师:
程风雷
完成日期:
.9.20
1、实验目的......................................3
2、实验原理......................................3
3、实验设备......................................3
4、设计思想与功能简介............................3
5、总体设计方案..................................4
6、主要模块实现方案..............................4
1.矩阵键盘模块.................................4
2.LCD显示模块.................................11
3.LED显示模块.................................16
7、整体效果图...................................20
8、实验结论.....................................23
9、实验总结.....................................23
10、参考文献.....................................24
一、实验目的
随着信息化技术的发展,嵌入式系统已经成为当前IT产业界一个非常热门的话题。
嵌入式系统主要由嵌入式处理器、相关支撑硬件和嵌入式软件系统组成,它是集软硬件于一体的可独立工作的“器件”。
总体看来,嵌入式系统具有便利灵活、性能价格比高、嵌入性强等特点,能够嵌入到现有任何信息家电和工业控制系统中。
从软件角度来看,嵌入式系统具有不可修改性、系统所需配置要求较低、系统专业性和实时性较强等特点。
为此我们开展基于SEP3203的通信工程专业课程设计以实现以下目的:
1、经过实验,接触目标开发板、集成开发环境的构建方式和作业方式;
2、经过实验,了解嵌入式系统的硬件和软件、JTAG调试方法,学会如何从头开始着手开发一个嵌入式系统;
3、增加交叉编译、目标板程序调试和加载的真知;积累嵌入式系统开
发流程、开发方法和开发技巧的经验。
经过整个实验流程最终增强实践能力,达到对所学知识的巩固,在实践中
加深对嵌入式软件开发的体会。
二、实验原理
1.经过键盘按键判断的工作原理和方法,利用UCB1400的控制方法,实现按键控制切换;
2.基于LCD的物理特性和工作原理及ARM7TDMI内核LCD控制器的工作原理,设计液晶显示文本及图形的方法与程序;
3.基于LED的工作原理和控制方法及74HC595移位寄存器的使用,实现键控与LED指示的结合;
4.掌握SEP3203GPIO口的配置和读写方法。
三、实验设备
1.硬件:
HOST机一台、调试器一台、ARM实验平台一套。
2.软件:
WIN98或操作系统、ADS或SDT开发环境、调试器驱动程序ICE、键控LCD与LED范例源程序。
四、设计思想与功能简介
设计思想的最初来源是对于图片和幻灯片的播放,而且利用LED动态的显示与图片匹配的日期或编号或其它信息。
经过对实验功能的整合,现取以下两个功能实例展示程序的功能:
1、经过键盘按键控制LCD液晶显示屏切换图片,实现播放。
2、达到播放同时在LED数码管上实时显示图片编号。
3、文字提示信息:
当播放成功时会同时显示LCD、LED功能实现成功,在信息提示框中同时显示按键号码、图片号码,当所按按键无图片时会提示“无图片”信息。
4、程序采用模块并列模式,易于扩展图片数量与LED指示,便于动态添加,这正是播放设备的基本需要。
五、总体设计方案
本系统基于SEP3203微处理器,ARM7TDMI内核,主要由矩阵键盘模块、LCD模块、LED模块等部分组成。
系统的总体框图如下:
六、主要模块实现方案
1.矩阵键盘模块
1.1按键位置的确定
本系统采用矩阵键盘,矩阵键盘有两种驱动方式,一种是行扫描法,另一种是高低电平翻转法。
本系统采用了行扫描法。
包括两个步骤:
判断键盘中是否有键按下:
将全部行线置为低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
判断闭合键所在的位置:
在确认有键按下后,即可进入确定具体闭合键的过程。
方法是:
依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
1.2键盘中断
键盘实验的主函数流程如下图所示:
上述的循环等待过程可由按键中断打断,执行相应的键盘中断函数。
键盘中断服务流程能够由下图表示:
1.3实验代码
实验代码主要由三个部分的函数组成:
顶层实现函数,硬件设置函数,中断服务函数。
1.3.1顶层实现函数
voidKeyBoardModule(void);
键盘实验的顶层函数,实现系统初始化及键盘初始化。
1.3.2硬件设置函数
voidkeyboardinit(void);
该函数实现了键盘的初始化。
主要调用InitAC97()和int15init(),完成UCB1400初始化及GPIO口的配置。
voidint15init(void);
GPIO口的配置函数。
voidInitAC97(void);
UCB1400的初始化配置函数。
voidwucb(U32addr,U32val);
经过向AC97CRC寄存器中写入,配置UCB1400的各寄存器值,该函数用来被查找按键函数调用。
U32rucb(U32addr);
经过读出AC97CRC寄存器值,获得UCB1400的各寄存器值,该函数用来被查找按键函数调用。
1.3.3中断服务函数
voidkeyhandler(void);
键盘中断处理函数,调用findkey()函数来查找并显示键号。
中断处理函数的流程如下图所示。
voidfindkey(void);
查找按键的函数,用于求出被按下按键的键号并打印出来,该函数被键盘处理中断调用。
1.4键盘中断相关代码如下:
voidkey_handler(void)
{
U32tmp_int_status;
U32i;
U8key;
char*s;
*(RP)INTC_IMSK=0xffffffff;
tmp_int_status=*(RP)INTC_ISTAT;
for(i=0;i<10000;i++);
if(tmp_int_status==0x20)
{//int4
/*************setY3,Y2,Y1={1,1,0},configGPIO*************/
*(RP)PORTE_DATA|=0x00e0;
*(RP)PORTE_INTRCLR=0xffff;
*(RP)PORTE_DATA&=0xffc3;
for(i=0;i<5000;i++);
if(*(RP)INTC_ISTAT==0x20)
{
key=1;
*(RP)PORTE_DATA&=0xff1f;
for(i=0;i<100;i++);
*(RP)PORTE_INTRCLR|=0x10;
*(RP)INTC_IMSK=0;
}
/*************setY3,Y2,Y1={1,0,1},configGPIO*************/
*(RP)PORTE_DATA|=0x00e0;
*(RP)PORTE_INTRCLR=0xffff;
*(RP)PORTE_DATA&=0xffa3;
for(i=0;i<5000;i++);
if(*(RP)INTC_ISTAT==0x20)
{
key=4;
*(RP)PORTE_DATA=0x0;
for(i=0;i<100;i++);
*(RP)PORTE_INTRCLR|=0x8;
*(RP)INTC_IMSK=0;
}
/*************setY3,Y2,Y1={0,1,1}},configGPIO*************/
*(RP)PORTE_DATA|=0x00e0;
*(RP)PORTE_INTRCLR=0xffff;
*(RP)PORTE_DATA&=0xff63;
for(i=0;i<5000;i++);
if(*(RP)INTC_ISTAT==0x20)
{
key=7;
*(RP)PORTE_DATA=0x0;
for(i=0;i<100;i++);
*(RP)PORTE_INTRCLR|=0x4;
*(RP)INTC_IMSK=0;
}
}
elseif(tmp_int_status==0x10)
{
/*************setY3,Y2,Y1={1,1,0},configGPIO*************/
*(RP)PORTE_DATA|=0xe0;
*(RP)PORTE_INTRCLR=0xffff;
*(RP)PORTE_DATA&=0xffc3;
for(i=0;i<5000;i++);
if(*(RP)INTC_ISTAT==0x10)
{
key=2;
*(RP)PORTE_DATA=0x0;
for(i=0;i<10000;i++);
*(RP)PORTE_INTRCLR|=0x10;
*(RP)INTC_IMSK=0;
}
/*************setY3,Y2,Y1={1,0,1},configGPIO*************/
*(RP)PORTE_DATA|=0x00e0;
*(RP)PORTE_INTRCLR=0xffff;
*(RP)PORTE_DATA&=0xffa3;
for(i=0;i<5000;i++);
if(*(RP)INTC_ISTAT==0x10)
{
key=5;
*(RP)PORTE_DATA=0x0;
for(i=0;i<100;i++);
*(RP)PORTE_INTRCLR|=0x8;
*(RP)INTC_IMSK=0;
}
/*************setY3,Y2,Y1={0,1,1}},configGPIO*************/
*(RP)PORTE_DATA|=0x00e0;
*(RP)PORTE_INTRCLR=0xffff;
*(RP)PORTE_DATA&=0xff63;
for(i=0;i<5000;i++