嵌入式课程报告解读.docx
《嵌入式课程报告解读.docx》由会员分享,可在线阅读,更多相关《嵌入式课程报告解读.docx(20页珍藏版)》请在冰豆网上搜索。
嵌入式课程报告解读
评分:
_________
SHANGHAIUNIVERSITY
课程报告
COURSEPAPER
题目:
嵌入式电子词典的实现
课程名:
《嵌入式(ARM)系统》
学院机电工程与自动化学院
专业电气工程及其自动化
学号1212****
学生姓名
指导教师
一、项目要求:
1、在实验板上设计实现一个无操作系统的简易电子词典
2、设计友好的人机交互界面
3、设计电子词典的基本功能:
字符输入、功能选择、英汉翻译。
4、
二、电子词典系统实现具体功能:
1、能够通过键盘输入英文。
键盘作为本系统中最主要的输入设备,需要完成26个英文字母的输入,并且需要上翻页,下翻页,上一行,下一行,翻译,退格等功能。
要求键盘至少要有16个按键,每个按键都可以被处理器及时,准确地读入。
具体布局设计如图所示。
键盘布局图
按键分别具有如下功能:
a~j:
实现字母输入;
up/down:
显示上/下一个被查询过的单词;
delete:
删除一个字母
Enter:
翻译,将当前单词与词库中内如相比较,若一致则显示其内容,否则给出提示;
Back:
退格,删除单词最末尾的字母并将光标前移一位。
2、提供友好的人机界面,将输入的内容和翻译的结果显示在LCD的相应区域内。
LCD显示窗口布局如图1-2所示:
add_
add
vi.
增加,计算
Abillthatdidn'taddup
LCD显示窗口布局图
最上面输入框内为单词输入区,中间区域为翻译区,左边6个方框是触摸屏按键区。
单词输入过程中,翻译区会有相近单词显示,按下翻译键后会在此区域内显示翻译内容。
3.对输入的单词即时翻译。
4.可以记忆3个已经查询过的的单词。
3、程序设计
可将电子词典的软件设计分为如下几个主要模块:
键值处理、翻译、词库设计和LCD显示。
1、键值处理
电子词典的输入设备为键盘和触摸屏,要完成的功能为:
(1)键盘:
10个英文字母和6个功能键输入(以a为例)
case'1':
//a
Glib_FilledRectangle(115,122,200,439,0xffff);//先清罗列单词区
letter=1;//1表示输入字母为1
Glib_disp_hzk16(125+wei*20,70,"a",0xf00);//显示界面显示a
prev[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);//down
Glib_disp_hzk16(15,145,"down",0x0000);
Glib_FilledRectangle(10,200,110,240,0xffff);//Del
Glib_disp_hzk16(15,205,"delete",0x0000);
Glib_FilledRectangle(10,260,110,300,0xffff);//Enter
Glib_disp_hzk16(15,265,"enter",0x0000);
Glib_FilledRectangle(10,320,110,360,0xffff);//back
Glib_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、团队合作很重要。
我记得有一个小组分工特别明确,三个人分别做翻页、触屏、框架,然后做的时间就相对比较少了。
虽然说我们这次的项目涉及到的东西并不是很多,但是他么能够明确分工,这种工作方式就是很值得借鉴的。
总是喜欢单打独斗的话,花费的时间和精力毕竟太多。
附录:
基本程序(对于功能相似,程序架构类似的部分,只保留代表性的内容)
/*包含文件*/
#include"def.h"
#include"2410lib.h"
#include"option.h"
#include"2410addr.h"
#include"interrupt.h"
#include"lcdlib.h"
//#defineSTN_LCD
#defineTFT_8_0
voidLcd_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_START3
voidDraw_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.8MHz
Port_Init();/*初始化端口*/
Uart_Init(0,115200);/*初始化串口*/
Uart_Select(0);
Lcd_Port_Init();/*LCD初始化*/
#ifdefSTN_LCD
Lcd_Init(MODE_CSTN_8BIT);
Glib_Init(MODE_CSTN_8BIT);
Lcd_CstnOnOff
(1);
Glib_ClearScr(0xff,MODE_CSTN_8BIT);
#else
#ifdefTFT_8_0
rGPCCON&=~(3<<8);
rGPCCON|=(2<<8);
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);
#else
Lcd_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
#else
Lcd_Disp_Grap();
#endif
Draw_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,"Be yourself.",0x0);
Glib_disp_hzk16(20,440,"The world worships the original.",0x0);
}
voidsearch_dip()
{
Glib_Rectangle(10,80,110,120,0x0000);//up
Glib_disp_hzk16(15,85,"up",0x0000);
Glib_Rectangle(10,140,110,180,0x0000);//down
Glib_disp_hzk16(15,145,"down",0x0000);
Glib_Rectangle(10,200,110,240,0x0000);//Del
Glib_disp_hzk16(15,205,"delete",0x0000);
Glib_Rectangle(10,260,110,300,0x0000);//Enter
Glib_disp_hzk16(15,265,"enter",0x0000);
Glib_Rectangle(10,320,110,360,0x0000);//back
Glib_disp_hzk16(15,325,"back",0x0000);
}
/****************************************触摸屏
voidTs_Sep(void)
{ts_status=TS_JUSTIFY_LEFTTOP;
rADCDLY=(50000);//ADCStartorIntervalDelay
rADCCON=(1<<14)|(ADCPRS<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
rADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
pISR_ADC=(unsigned)Adc_or_TsSep;
rINTMSK&=~(BIT_ADC);
rINTSUBMSK=~(BIT_SUB_TC);
search_dip();
Keycontrol();
rINTSUBMSK|=BIT_SUB_TC;
rINTMSK|=BIT_ADC;
}
voidAdc_or_TsSep(void)//触摸屏中断服务函数
{
inti;
U32Ptx[6],Pty[6];
rINTSUBMSK|=(BIT_SUB_ADC|BIT_SUB_TC);//Masksubinterrupt(ADCandTC)
if(rADCTSC&0x100)//TC(TouchscreenControl)Interrupt
{
PRINTF("\nStylusUp!
!
\n");
rADCTSC&=0xff;//Setstylusdowninterrupt
}
else
{
PRINTF("\nStylusDown!
!
\n");
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|
(1);
for(i=0;ifor(i=0;i<5;i++)
{
rADCCON|=0x1;//StartX-positionconversion
while(rADCCON&0x1);//CheckifEnable_startislow
while(!
(0x8000&rADCCON));//CheckECFLG
Ptx[i]=(0x3ff&rADCDAT0);
}
Ptx[5]=(Ptx[0]+Ptx[1]+Ptx[2]+Ptx[3]+Ptx[4])/5;
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|
(2);//
//Down,GND,Extvlt,Hi-Z,AIN7,PullupDis,Normal,Y-position
for(i=0;ifor(i=0;i<5;i++)
{
rADCCON|=0x1;//StartX-positionconversion
while(rADCCON&0x1);//CheckifEnable_startislow
while(!
(0x8000&rADCCON));//CheckECFLG
Pty[i]=(0x3ff&rADCDAT1);
}
Pty[5]=(Pty[0]+Pty[1]+Pty[2]+Pty[3]+Pty[4])/5;
rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
//Up,GND,AIN,Hi-z,AIN,PullupEn,Normal,Waitingmode
if((Ptx[5]>300&&Ptx[5]<700)&&(Pty[5]>700&&Pty[5]<800))//up
{
Glib_FilledRectangle(10,80,110,120,0x55);
Glib_disp_hzk16(15,85,"up",0x0000);
Glib_FilledRectangle(10,140,110,180,0xffff);//down
Glib_disp_hzk16(15,145,"down",0x0000);
Glib_FilledRectangle(10,200,110,240,0xffff);//Del
Glib_disp_hzk16(15,205,"delete",0x0000);
Glib_FilledRectangle(10,260,110,300,0xffff);//Enter
Glib_disp_hzk16(15,265,"enter",0x0000);
Glib_FilledRectangle(10,320,110,360,0xffff);//back
Glib_disp_hzk16(15,325,"back",0x0000);
flag--;
if(flag>=0&&flag<=3){
Cursor(flag);
CursorCl(flag+1);}
elseflag=0;
}
if((Ptx[5]>580&&Ptx[5]<660)&&(Pty[5]>770&&Pty[5]<900))//down
{}
if((Ptx[5]>500&&Ptx[5]<580)&&(Pty[5]>760&&Pty[5]<890))//delete
{}
if((Ptx[5]>400&&Ptx[5]<450)&&(Pty[5]>760&&Pty[5]<880))//enter
{}
if((Ptx[5]>280&&Ptx[5]<350)&&(Pty[5]>760&&Pty[5]<880))//back
{}
rSUBSRCPND|=BIT_SUB_TC;
rINTSUBMSK=~(BIT_SUB_TC);//Unmasksubinterrupt(TC)
ClearPending(BIT_ADC);
}
voiddisp(){
y=0;//初始单词显示位置
for(i=0;i<=20;i++)
{if((vocab[i].w==prev[0])&&(wei==0)){//第一个字母照正确
which[y]=i;//存放哪几个单词显示了
Glib_disp_hzk16(125,125+32*y,vocab[i].c,0x0);//显示单词
y++;//位置改变
}
if((vocab[i].w==prev[0])&&(vocab[i].o==prev[1])&&(wei==1)){}
if((vocab[i].w==prev[0])&&(vocab[i].o==prev[1])&&(vocab[i].r==prev[2])&&(wei==2))
{}
if((vocab[i].w==prev[0])&&(vocab[i].o==prev[1])&&(vocab[i].r==prev[2])&&(vocab[i].d==prev[3])&&(wei==3))
{}
}
}
voidtranslate(intnum){//显示单词选项3个
Glib_disp_hzk16(250,300,vocab[num].e,0x0);}
voidCursor(intflag)
{
//Glib_FilledRectangle(65,121+flag*32,75,153+flag*32,0x55);
Glib_FilledRectangle(120,121+flag*32,400,50+flag*32,0x0);
}
voidCursorCl(intflag)
{//Glib_FilledRectangle(65,121+flag*32,75,153+flag*32,0xffff);
Glib_FilledRectangle(120