评分:_________SHANGHAIUNIVERSITY课程报告COURSEPAPER题目:嵌入式电子词典的实现课程名:《嵌入式(ARM)系统》学院机电工程与自动化学院专业电气工程及其自动化学号1212****学生姓名指导教师一、项目要求:1、在实验板上设计实现一个无操作系统的简易电子词典2、设计友好的人机交互界面3、设计电子词典的基本功能:字符输入、功能选择、英汉翻译。4、二、电子词典系统实现具体功能:1、能够通过键盘输入英文。键盘作为本系统中最主要的输入设备,需要完成26个英文字母的输入,并且需要上翻页,下翻页,上一行,下一行,翻译,退格等功能。要求键盘至少要有16个按键,每个按键都可以被处理器及时,准确地读入。具体布局设计如图所示。键盘布局图按键分别具有如下功能:a~j:实现字母输入;up/down:显示上/下一个被查询过的单词;delete:删除一个字母Enter:翻译,将当前单词与词库中内如相比较,若一致则显示其内容,否则给出提示;Back:退格,删除单词最末尾的字母并将光标前移一位。请输入查询单词UPDOWNDELETEENTERBACK嵌入式电子词典每日一句:Beyourself.Theworldworshipstheoriginal.2、提供友好的人机界面,将输入的内容和翻译的结果显示在LCD的相应区域内。LCD显示窗口布局如图1-2所示:add_addvi.增加,计算Abillthatdidn'taddupLCD显示窗口布局图最上面输入框内为单词输入区,中间区域为翻译区,左边6个方框是触摸屏按键区。单词输入过程中,翻译区会有相近单词显示,按下翻译键后会在此区域内显示翻译内容。3.对输入的单词即时翻译。4.可以记忆3个已经查询过的的单词。三、程序设计可将电子词典的软件设计分为如下几个主要模块:键值处理、翻译、词库设计和LCD显示。1、键值处理电子词典的输入设备为键盘和触摸屏,要完成的功能为:(1)键盘:10个英文字母和6个功能键输入(以a为例)case'1'://aGlib_FilledRectangle(115,122,200,439,0xffff);//先清罗列单词区letter=1;//1表示输入字母为1Glib_disp_hzk16(125+wei*20,70,a,0xf00);//显示界面显示aprev[wei]=1;//存放disp();//显示单词区的单词wei++;//下一个放字母位置if(wei=6){Glib_disp_hzk16(300,180,超出范围,0xff);//单词字母小于等于四delay(1000);Glib_disp_hzk16(300,180,超出范围,0xffff);//清掉“已经满了”};//超出错误,只能查四位break;(2)触摸屏:5个功能键的输入(以up为例)if((Ptx[5]300&&Ptx[5]700)&&(Pty[5]700&&Pty[5]800))//up{Glib_FilledRectangle(10,80,110,120,0x55);//输入up后,触摸屏上相应的up区域变为蓝色Glib_disp_hzk16(15,85,up,0x0000);Glib_FilledRectangle(10,140,110,180,0xffff);//downGlib_disp_hzk16(15,145,down,0x0000);Glib_FilledRectangle(10,200,110,240,0xffff);//DelGlib_disp_hzk16(15,205,delete,0x0000);Glib_FilledRectangle(10,260,110,300,0xffff);//EnterGlib_disp_hzk16(15,265,enter,0x0000);Glib_FilledRectangle(10,320,110,360,0xffff);//backGlib_disp_hzk16(15,325,back,0x0000);flag--;//实现同键盘相同的up功能if(flag=0&&flag=3){Cursor(flag);CursorCl(flag+1);}elseflag=0;}2、翻译:voidtranslate(intnum){//显示单词选项3个Glib_disp_hzk16(250,300,vocab[num].e,0x0);}3、词库设计翻译功能中通过将输入单词和词库中相应的单词进行比较得到要显示的翻译结果,因此,词库可采用结构体实现,此结构中包括3项:输入的键值、查询的单词、单词的意思。typedefstruct{intw;//单词对应的值into;intr;intd;charc[50];//单词chare[100];//单词的翻译}str_word;str_wordvocab[16]={{1,0,0,0,a,不定冠词},{1,4,4,0,add,增加,计算},{1,7,5,0,age,年龄;时代},{1,9,4,0,aid,救援,资助,援助},//四位数字表示的是按下的按键{2,1,4,0,bad,坏的},{2,1,7,0,bag,手提包}};4、LCD显示功能翻页、选行及翻页结果的输出都可以归到LCD显示功能中,这些功能都可以通过调用LCD实验中的相关函数完成。四、遇到的问题1、在编辑英文字母到LCD显示屏上显示的时候,总是会出现乱码。解决方法:开始的时候老师说要改变中英文输入方式,在中文方式下输入英文就可以显示了,但是发现不行。后来才知道我们理解错了老师的意思,将输入法的半角改成全角,然后就可以在屏幕上显示字母了。2、LCD的显示屏上的坐标定位不知道怎么更改。解决方法:因为在写画框画线的程序的时候,我们采用的坐标是以正对显示屏左下角为坐标原点的,而等到触屏定坐标的时候,我们发现,将触摸屏顺时针旋转九十度,才是以左下角为坐标原点的。基于此,两次编程的坐标不能选用同一套坐标系统。通过DNW软件一次次测试,我们才将需要定位的范围坐标一个个测试出来,实现了触屏的功能。3、触屏中断和键盘无法做到同时使用。解决方法:对于触屏中断,首先是因为才开始接触,不太理解touch例程中的一些语句,其次是whiel(1)这一句要不要注释。通过一次次失败,我们终于理解了整个程序的意思,将键盘程序加入到触屏中断当中,触屏中断采用while(1)即可。能够达到键盘和触屏同步使用。五、心得体会1、我不相信学习有什么捷径,如果觉得自己没有那么聪明,那么就只能一次次调试,一次次失败,一次次总结,即使结果不好,在过程中也能收获很多,当然,结果通常是和付出成正比的。2、团队合作很重要。我记得有一个小组分工特别明确,三个人分别做翻页、触屏、框架,然后做的时间就相对比较少了。虽然说我们这次的项目涉及到的东西并不是很多,但是他么能够明确分工,这种工作方式就是很值得借鉴的。总是喜欢单打独斗的话,花费的时间和精力毕竟太多。附录:基本程序(对于功能相似,程序架构类似的部分,只保留代表性的内容)/*包含文件*/#includedef.h#include2410lib.h#includeoption.h#include2410addr.h#includeinterrupt.h#includelcdlib.h//#defineSTN_LCD#defineTFT_8_0voidLcd_Disp_Char(void);voidLcd_Disp_Grap(void);voidDraw_back(void);//设置背景框架voidsearch_dip(void);//查询时显示voidKeycontrol(void);voidCursor(intflag);//光标voidCursorCl(intflag);voiddelay(intcount);voiddisp();voidtranslate(intnum);voidTs_Sep(void);#defineTS_JUSTIFY_LEFTTOP1#defineTS_JUSTIFY_RIGHTBOT2#defineTS_START3voidDraw_back(void);voidAdc_or_TsSep()__attribute__((interrupt(IRQ)));staticintx=0,y=0,letter=0,flag=0,wei=0,prev[7],i,j,turnpage=1;//intwhich[20];//此时满足罗列单词/******************************************词库设计************************/typedefstruct{intw;//单词对应的值into;intr;intd;charc[50];//单词chare[100];//单词的翻译}str_word;str_wordvocab[16]={{1,0,0,0,a,不定冠词},{1,4,4,0,add,增加,计算},{1,7,5,0,age,年龄;时代},{1,9,4,0,aid,救援,资助,援助},//四位数字表示的是按下的按键{2,1,4,0,bad,坏的},{2,1,7,0,bag,手提包}};//Description:JXARM9-2410触摸屏实验主程序voidMain(void){ChangeClockDivider(1,1);//1:2:4/*配置系统时钟*/ChangeMPllValue(0xa1,0x3,0x1);//FCLK=202.8MHzPort_Init();/*初始化端口*/Uart_Init(0,115200);/*初始化串口*/Uart_Select(0);Lcd_Port_Init();/*LCD初始化*/#ifdefSTN_LCDLcd_Init(MODE_CSTN_8BIT);Glib_Init(MODE_CSTN_8BIT);Lcd_CstnOnOff(1);Glib_ClearScr(0xff,MODE_CSTN_8BIT);#else#ifdefTFT_8_0rGPCCON&=~(38);rGPCCON|=(28);Lcd_Init(MODE_TFT_16BIT_640480);Glib_Init(MODE_TFT_16BIT_640480);Glib_ClearScr(0xffff,MODE_TFT_16BIT_640480);Lcd_PowerEnable(0,1);Lcd_EnvidOnOff(1);#elseLcd_Init(MODE_TFT_16BIT_240320);Glib_Init(MODE_TFT_16BIT_240320);Glib_ClearScr(0xffff,MODE_TFT_16BIT_240320);Lcd_PowerEnable(0,1);Lcd_EnvidOnOff(1);#endif#endif#defineLCD_DISP_CHAR#ifdefLCD_DISP_CHAR#elseLcd_Disp_Grap();#endifDraw_back();///////////////////////////////背景Ts_Sep();///////////////////////////////////触屏中断}voidDraw_back(){Glib_FilledRectangle(0,0,640,240,0xffff);//白底Glib_FilledRectangle(0,400,640,240,0x0f00);//绿色下底Glib_disp_hzk16(250,20,嵌入式电子词典,0xff);Glib_Rectangle(120,60,600,100,0x0000);//首字母框Glib_disp_hzk16(20,400,每日一句:,0x0);Glib_disp_hzk16(20,420,Beyourself.,0x0);Glib_disp_hzk16(20,440,