嵌入式课程设计电子词典硬件设计.docx
《嵌入式课程设计电子词典硬件设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计电子词典硬件设计.docx(46页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计电子词典硬件设计
嵌入式课程设计电子词典硬件设计
————————————————————————————————作者:
————————————————————————————————日期:
上海电力学院
嵌入式系统
课程设计报告
题 目:
电子词典的设计
姓名:
学号:
院 系:
专业年级:
同组成员:
年 月 日
一、实验内容及要求
在LCD屏幕左侧绘制出单词输入框和释义显示框以及一个搜索键,右侧绘制4*4键盘按钮,模拟出简易电子词典的功能,按钮操作用触摸屏或键盘实现均可。
实现功能:
(1)LCD屏幕上显示4*4键盘,显示单词及其翻译、例句。
(2)一个键可完成2个英文字母的输入,如左上角第一个键可实现输入a,b两个字母,第一次按下时为输入a,如果需输入b,只需连续快速按键两次即可。
(3)在输入完单词后,点击搜索键,即可在释义显示框中显示该单词的词性、中文解释、示例词组和句子等。
(4)当发现输入的单词在库中不存在时,可实现将该单词添加入库的操作。
二、设计思路
(1)通过LCD显示模块画出电子词典操作界面。
(2)对应界面中各键的位置设置键盘对应键值。
(3)设定功能键,实现以下3个功能:
①退格键:
删除最后一位字母;②搜索∕保存键:
对输入框的单词进行判断,若单词存在于词库中,则显示单词词性、词义、例句;若单词不存在则自动进行保存;③转换键:
按下后,字母键输出对应的第二个字母。
(4)按键后赋值并显示。
三、软件构架
四、模块分析
(1)键盘模块
流程图:
源代码:
/*********************************************************************************************
*File:
keyboard.c
*Author:
embest
*Desc:
keyboardsourcecode
*History:
*********************************************************************************************/
/*---includefiles---*/
#include"44b.h"
#include"44blib.h"
#include"def.h"
#include"keyboard.h"
#include"lcd.h"
#include"dict.h"
#ifndefKEY_INT
#defineKEY_INT
#endif
#ifndefBUT_INT
#defineBUT_INT
#endif
/*---globalvariables---*/
intinput_char,n=0;
charword[20];
intwordIndex=0;
intx=15;
intnum=0;
intcounter=0;
/*keyboardcontroladdress*/
volatileUCHAR*keyboard_base=(UCHAR*)0x06000000;
/*---functiondeclare---*/
voidinit_keyboard();
voidclose_keyboard();
voidKeyboardInt(void);//__attribute__((interrupt("IRQ")));
voidEint4567Isr(void);//__attribute__((interrupt("IRQ")));
/*---functioncode---*/
/*********************************************************************************************
*name:
Test_Keyboard
*func:
testkeyboard
*para:
none
*ret:
none
*modify:
*comment:
********************************************************************************************/
voidTest_Keyboard()
{
Uart_Printf("\nKeyboardTestExample\n");
Uart_Printf("\nPleasepressonekeyonkeyboardandlookatLED...\n");
//initkeyboard
init_keyboard();
while
(1);
//closekeyboard
//close_keyboard();
}
/*********************************************************************************************
*name:
init_keyboard
*func:
initkeyboardinterrupt
*para:
none
*ret:
none
*modify:
*comment:
********************************************************************************************/
externvoidisrEINT1(void);
externvoidisrEint4567(void);
voidinit_keyboard()
{
/*enableinterrupt*/
rINTMOD=0x0;
rINTCON=0x1;
/*setEINT1interrupthandler*/
rINTMSK=~(BIT_GLOBAL|BIT_EINT1|BIT_EINT4567);
pISR_EINT1=(int)isrEINT1;
pISR_EINT4567=(int)isrEint4567;
/*PORTG*/
rPCONG=0xffff;//EINT7~0
rPUPG=0x0;//pullupenable
rEXTINT=rEXTINT|0x20;//EINT1fallingedgemode
rI_ISPC=BIT_EINT1|BIT_EINT4567;//clearpendingbit
rEXTINTPND=0xf;//clearEXTINTPNDreg
}
/*********************************************************************************************
*name:
close_keyboard
*func:
closekeyboardinterrupt
*para:
none
*ret:
none
*modify:
*comment:
********************************************************************************************/
voidclose_keyboard()
{
pISR_EINT1=NULL;
pISR_EINT4567=NULL;
/*Maskinterrupt*/
rINTMSK=rINTMSK|BIT_EINT1|BIT_EINT4567;
}
/*********************************************************************************************
*name:
KeyboardInt
*func:
keyboardinterrupthandlerfunction
*para:
none
*ret:
none
*modify:
*comment:
********************************************************************************************/
voidKeyboardInt(void)
{
intnTemp,i,j,k,m=0;
charbbyte;
rI_ISPC=BIT_EINT1;//clearpendingbit
charpbyte[10];
nTemp=key_read();
if(nTemp>-1)
{
//Lcd_Draw_HLine(10,310,80,WHITE,50);
input_char=nTemp;
Lcd_DspAscII8x16(15,45,WHITE,word);
switch(input_char)
{
case0:
num=1;break;
case1:
num=2;break;
case2:
num=3;break;
case3:
num=4;break;
case4:
num=5;break;
case5:
num=6;break;
case6:
num=7;break;
case7:
num=8;break;
case8:
num=9;break;
case9:
counter=1;break;
case10:
counter=2;break;
case11:
counter=3;break;
case12:
m=1;
Lcd_Draw_HLine(15+n-10,15+n,45,WHITE,16);
n-=10;
word[wordIndex]='\0';
wordIndex--;
break;
/*if(n==0)
{
word[20]=0;
wordIndex=0;
Lcd_Draw_HLine(10,310,85,WHITE,160);
}break;*/
case13:
word[wordIndex]='\0';
wordIndex=0;
for(i=0;i<20;i++)
{
if(strcmp(word,vocab[i].c)==0)
{
j=0;
k=i;
break;
}
else
j=1;
}
if(j==0)
{
//#ifdefEng_v
Lcd_DspAscII8x16(15,40,BLUE,vocab[k].c);
Lcd_DspAscII8x16(15,60,BLUE,vocab[k].d);
Lcd_DspAscII8x16(15,80,BLUE,vocab[k].f);
//#else
Lcd_DspHz16(15,100,BLUE,vocab[k].e);
//#endif
}
else
{
Lcd_DspHz16(15,120,BLUE,"未找到相应的单词");
DelayMs(600);
Lcd_DspHz16(15,120,WHITE,"未找到相应的单词");
}
break;
case14:
word[wordIndex]='\0';
wordIndex=0;
for(i=0;i<20;i++)
{
if(strcmp(word,vocab[i].c)==0)
{
j=0;
k=i;
break;
}
else
j=1;
}
if(j==0)
{
//#ifdefEng_v
Lcd_DspAscII8x16(15,40,BLUE,vocab[k].c);
Lcd_DspAscII8x16(15,60,BLUE,vocab[k].d);
Lcd_DspAscII8x16(15,80,BLUE,vocab[k].f);
//#else
Lcd_DspHz16(15,100,BLUE,vocab[k].e);
//#endif
}
else
{
if(20>x>0)
{
for(i=0;i<20;i++)
vocab[x].c[i]=word[i];
word[i]='\0';
Lcd_DspAscII8x16(15,40,BLUE,vocab[x].c);
x++;
}
else
x=15;
//Lcd_DspAscII8x16(15,45,BLUE,word);
for(i=0;i<20;i++)
word[i]='\0';
}
break;
case15:
//Lcd_Draw_Box(10,40,310,80,GREEN);
break;
}
if(num!
=0&&counter!
=0)
{
switch(3*(num-1)+counter-1)
{
case0:
bbyte='a';break;
case1:
bbyte='b';break;
case2:
bbyte='c';break;
case3:
bbyte='d';break;
case4:
bbyte='e';break;
case5:
bbyte='f';break;
case6:
bbyte='g';break;
case7:
bbyte='h';break;
case8:
bbyte='i';break;
case9:
bbyte='j';break;
case10:
bbyte='k';break;
case11:
bbyte='l';break;
case12:
bbyte='m';break;
case13:
bbyte='n';break;
case14:
bbyte='o';break;
case15:
bbyte='p';break;
case16:
bbyte='q';break;
case17:
bbyte='r';break;
case18:
bbyte='s';break;
case19:
bbyte='t';break;
case20:
bbyte='u';break;
case21:
bbyte='v';break;
case22:
bbyte='w';break;
case23:
bbyte='x';break;
case24:
bbyte='y';break;
case25:
bbyte='z';break;
case26:
bbyte='y';break;
}
num=0;counter=0;
if(m==0)
{
word[wordIndex]=bbyte;
wordIndex++;
//n+=10;
}
}
Lcd_DspAscII8x16(15,210,BLUE,word);
//Uart_Printf("Keyis:
%x\r",input_char);
}
}
/*********************************************************************************************
*name:
key_read
*func:
readkeyvalue
*para:
none
*ret:
keyvalue,-1--error
*modify:
*comment:
********************************************************************************************/
inlineintkey_read()
{
intvalue;
chartemp;
/*readline1*/
temp=*(keyboard_base+0xfd);
/*not0xFmeankeydown*/
if((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)
{
if((temp&0x1)==0)
value=3;
elseif((temp&0x2)==0)
value=2;
elseif((temp&0x4)==0)
value=1;
elseif((temp&0x8)==0)
value=0;
while((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)//release
temp=*(keyboard_base+0xfd);
returnvalue;
}
/*readline2*/
temp=*(keyboard_base+0xfb);
/*not0xFmeankeydown*/
if((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)
{
if((temp&0x1)==0)
value=7;
elseif((temp&0x2)==0)
value=6;
elseif((temp&0x4)==0)
value=5;
elseif((temp&0x8)==0)
value=4;
while((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)//release
temp=*(keyboard_base+0xfb);
returnvalue;
}
/*readline3*/
temp=*(keyboard_base+0xf7);
/*not0xFmeankeydown*/
if((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)
{
if((temp&0x1)==0)
value=0xb;
elseif((temp&0x2)==0)
value=0xa;
elseif((temp&0x4)==0)
value=9;
elseif((temp&0x8)==0)
value=8;
while((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)//release
temp=*(keyboard_base+0xf7);
returnvalue;
}
/*readline4*/
temp=*(keyboard_base+0xef);
/*not0xFmeankeydown*/
if((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)
{
if((temp&0x1)==0)
value=0xf;
elseif((temp&0x2)==0)
value=0xe;
elseif((temp&0x4)==0)
value=0xd;
elseif((temp&0x8)==0)
value=0xc;
while((temp&KEY_VALUE_MASK)!
=KEY_VALUE_MASK)//release
temp=*(keyboard_base+0xef);
returnvalue;
}
return-1;
}
/*********************************************************************************************
*name:
Eint4567Isr
*func:
*para:
none
*ret:
none
*modify:
*comment:
*********************************************************************************************/
voidEint4567Isr(void)
{
unsignedcharwhich_int;
Uart_Printf("\nSB2orSB3hadpressedandlightLED.");
which_int=rEXTINTPND;
rEXTINTPND=0xf;//clearEXTINTPNDreg.
rI_ISPC=BIT_EINT4567;//clearpending_bit
if(which_int==4)//SB2
{
Led_Display(0x0)