嵌入式系统课程作业基于LPC2214的简易计算器设计.doc

上传人:仙人指路1688 文档编号:3926390 上传时间:2023-03-28 格式:DOC 页数:22 大小:164KB
返回 下载 相关 举报
嵌入式系统课程作业基于LPC2214的简易计算器设计.doc_第1页
第1页 / 共22页
嵌入式系统课程作业基于LPC2214的简易计算器设计.doc_第2页
第2页 / 共22页
嵌入式系统课程作业基于LPC2214的简易计算器设计.doc_第3页
第3页 / 共22页
嵌入式系统课程作业基于LPC2214的简易计算器设计.doc_第4页
第4页 / 共22页
嵌入式系统课程作业基于LPC2214的简易计算器设计.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《嵌入式系统课程作业基于LPC2214的简易计算器设计.doc》由会员分享,可在线阅读,更多相关《嵌入式系统课程作业基于LPC2214的简易计算器设计.doc(22页珍藏版)》请在三一办公上搜索。

1、题目: 嵌入式系统课程作业 学 号: 姓 名: 专 业: 课程名称:嵌入式系统原理与应用课程老师: 二零一一年十二月基于LPC2214的简易计算器设计一 设计任务及要求1.设计任务:利用LPC2214来控制液晶显示器和矩阵式键盘,实现了简易的计算器功能。2.设计要求:(1) 电路包括46键盘,能够通过按键编辑数据。(2) 显示部件使用LCD,显示内容不少于4个字符。(3) 能够完成4位以上十进制整数的加、减、乘、除功能。(4) 能完成小数的加、减、乘、除功能。(5) 能够连续进行运算。(6) 完整计算式选择。二 引言本设计利用LPC2214来控制液晶显示器和矩阵式键盘,实现了简易的计算器功能。

2、通过键盘输入需要计算的计算式子,该式子会显示在液晶的第一行,当键入等于号后,计算结果会显示在液晶的第二行。本设计中液晶选用1602字符型液晶显示器,键盘采用4*6矩阵式键盘。LPC2200系列MCU基于一个支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-S CPU,处理器时钟高达60M/75MHz,片内集成8KB、16KB、32KB、64KB、128KB、256KB和512KB的高速Flash存储器,128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。此外,片内集成大量外设:外部存储器控制器(EMC)、UART接口、CAN-bus接口、SPI接口、SSP接口、

3、I2C接口、ADC、DAC、USB 2.0接口、通用定时器、外部中断、PWM、实时时钟、LCD驱动器等等。通过外部存储器接口可以扩展64MB的异步静态存储器设备。近几年,随着大规模集成电路的发展,各种便携式嵌入式设备,具有十分广阔的市场前景。在嵌入式系统中,数据和命令通过网络接口或串行口经过ARM程序处理后,或显示在LCD上,或传输到远端PC上。本文通过周立功的LPC2214芯片完成的简易计算器,正式对嵌入式应用的学习和探索。三 硬件设计1.芯片介绍LPC2214是一款基于16/32位ARM7TDMI-S,并支持实时仿真和跟踪的CPU,并带有128/256 k字节(kB)嵌入的高速Flash存

4、储器。128位 宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码 规模降低超过30%,而性能的损失却很小。 LPC2214采用144脚封装、极低的功耗、多个32位定时器、8路10位ADC、PWM输出以及多达9个的外部中断,这款微控制器特别适合工业控制、医疗系统、收款机控制等应用领域。其可用GPIO范围为76脚(外部存储区)到112脚(单片).由于内置了宽范围的串行通信接口,它们也非常适合于通信网关、协议转换器、嵌入式软件调制解调器以及其它各种类型的应用。管脚图: 2. 完整电路仿真图如下:2.1键盘设计键盘的设计可

5、以有多种方案,相比之下,矩阵式键盘所需要的硬件资源少,控制灵活,操作简单。因此,本设计中采用矩阵式键盘来控制。键盘工作原理:特别说明:IO0口悬空时为低电平,故用高电平扫描。(1)判断键盘中有无键按下 将全部行线PO0-PO3置高电平,然后检测列的状态。只要有一列的电平为高,则表示键盘中有键被按下,而且闭合的键位于高电平线与4根行线相交叉的4个按键之中。若所有列线均为低电平,则键盘中无键按下。 (2)判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为高电平,即在置某根行线为高电平时,其它线为低电平。在确定某根行线位置为高电平后,再逐行检测各列线的电平

6、状态。若某列为高,则该列线与置为高电平的行线交叉处的按键就是闭合的按键。 2.2显示电路设计 选择理由:1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如A。总体来说,操作简单,价格便宜。四 软件设计4.1设计中的键盘、

7、显示等驱动函数:*键盘扫描程序 :uint8 KEYSCAN(void)*lcd初始化函数:lcd_init()*检查总线是否忙:void ChkBusy() *写命令函数:void LCD_WriteControl (uint8 dat) *写数据函数:void WrDat(uint8 dat)*显示文本函数:DisText()(驱动函数见附录)4.2整体设计流程图如下初始化时钟显示键盘扫描当前键为数字Lastkey=数字date_temp清零键值存入date_temp将键值存入date_tempCBM、HL、E、D=+清除前一位参考程序见附录。五 总结与体会:通过本次设计,我对ARM的C语

8、言编程方法有了很深刻的理解。通过自己亲自编程实践,我学会了控制1602字符型液晶及矩阵式键盘的方法。这次设计是对我们在课堂上所学知识的一次检验,虽然在理论课上学习了很多关于单片机的知识,但都没有经过具体的实践,很多东西都不能得到验证。这次设计使我体会到了实践的乐趣(虽然只是仿真)。由于是夸专业生,在这次设计碰到了不少困难;但都通过查阅相关资料,请教老师和同学,以及自己的努力把问题解决掉了。在这次的设计中,让我们发自内心的明白一些道理,我将好好地记录下这次设计的点点滴滴,我想,这不单是我的经历,更是我的一笔财富。千里之行,始于足下。这次学习,让我对ARM有了大概的了解,可以说,坐而言不如立而行,

9、对于这些编程设计还是应该自己动手实际操作才会有深刻理解。六 参考文献:1. ARM嵌入式系统基础教程周立功2. C语言程序设计3. MCS-51单片机应用系统设计4. 网上有关计算器方面的程序附录:结果仿真:四位以上带小数的加减乘除, 完整算式输出,右上角显示时钟。程序/* File: main.c* 功能: 计算器基本程序*/#include config.h#include stdlib.h#include string.h/memset hanshu#include math.h#define rs (113)#define rw (114)#define en (115)#define

10、 busy (10;dly-) for(i=0;i50000;i+);/* 名称:void port_init(void)* 功能:端口初始化*/void port_init(void) PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x00fff00F;IO0CLR=0x0000000F; /* 名称:cov(long int b,unsigned char *p)* 功能:数据拆分*/void cov(long int b,unsigned char *p)unsigned char j=8;while(-j) pj=b%10;b=b/10;

11、 pj=b;/* 名称:ChkBusy()* 功能:检查总线是否忙*/void ChkBusy()IO0DIR=0xf000;/700while(1)IO0CLR=rs;IO0SET=rw;IO0SET=en;if(!(IO0PIN & busy)break;IO0CLR=en;IO0DIR=0xfff000;/* 名称:WrOp()* 功能:写命令函数*/void LCD_WriteControl (uint8 dat) ChkBusy();IO0CLR=rs;/全部清零IO0CLR=rw;IO0CLR=0xff0000;/先清零IO0SET=dat16;/再送数IO0SET=en;IO0C

12、LR=en;/* 名称CD_Cursor ()* 功能:光标定位*/void LCD_Cursor (char row, char column)switch (row) case 1: LCD_WriteControl (0x80 + column - 1); break;case 2: LCD_WriteControl (0xc0 + column - 1); break;case 3: LCD_WriteControl (0x94 + column - 1); break;case 4: LCD_WriteControl (0xd4 + column - 1); break;defaul

13、t: break;/* 名称:WrDat()* 功能:写数据函数*/void WrDat(uint8 dat)ChkBusy();IO0SET=rs;IO0CLR=rw;IO0CLR=0xff0000;/先清零IO0SET=dat0;i-) BCDi-1=(uint8)(num%10+0x30); num/=10; i=0;while(BCDi =0x30 & i7) BCDi+= ; /NUM转换成数组存放,但还没有加上小数点DisText(addr,BCD);/* 名称timeshow(void)* 功能:时间显示程序*/void timeshow(void) uint8 i,j=0; u

14、int8 timebuff5=2,3,4,5,6; for (i=0;i5;i+) timebuffj+ = timei / 10; timebuffj+ = timei % 10; j+; for(i=0;i2;i+) LCD_Cursor(1,i+15); WrDat(timebuffi+0); LCD_Cursor(1,i+15); WrDat(0x3A);i+; for(i=3;i=60) time1=0; time0+;/xiaoshi if(time0=24) time0=0; VICVectAddr=0;T0IR=0x00000001; /* 名称ate_or_ope()* 功能

15、:判断是数值还是计算符*/int date_or_ope(char key)if (key = 0 & key = 9)|(key=.)return 1;return 0; /* 名称:main()* 功能:显示文本*/int main(void) uint8 keyvalue1,keyvalue2; uint8 flag;lcd_init();port_init(); timer0_init();/时钟初始化 DisText(0x80,txt0); while(1) timeshow(); keyvalue1=KEYSCAN(); if(keyvalue1!=0xff) /有键按下 doke

16、yvalue2=KEYSCAN(); while(keyvalue1=keyvalue2); /作按键释放检查 keypressed=KEYCODE1keyvalue1; else keypressed=0xff; /得到键符 /* if(keypressed!=0xff) flag = date_or_ope(keypressed); if (flag = 1) deal_date(); else deal_ope(); /while end /main 函数结束/* 名称:deal_date(void)* 功能:数值处理*/void deal_date(void)if (date_or_o

17、pe(last_keypres) = 1) /如果上一个键值是数字字符 *temp_pt+=keypressed; Else memset(date_temp,0,15); /用字符0填充date_temp的前15个字节temp_pt=date_temp; *temp_pt+=keypressed; last_keypres = keypressed; WrDat(keypressed);/显示字符可以在主函数中place+;return;/* 名称void deal_ope(void) * 功能:符号处理*/void deal_ope(void) /符号处理 double date_valu

18、e;double date_result; uint8 i;if (keypressed = C) memset(date_temp,0,15); last_keypres = =; date0=0; date1=0;date_pt=&date1; oper_pt=operater; operater0=N; LCD_WriteControl(0x01); LCD_Cursor(2,9);WrDat(0); place=1; return ; /返回什么? /else if else if (keypressed = B) /清除一位数或符号 if (date_or_ope(last_keyp

19、res) = 1) int j; j=strlen(date_temp); date_tempj-1=0; LCD_Cursor(1,place-1); WrDat( ); LCD_Cursor (1, place-); return ; else *oper_pt=0; oper_pt-; LCD_Cursor(1,place-1); WrDat( ); LCD_Cursor (1, place-); /else if end else if (keypressed=M|keypressed=H) switch (keypressed) case H: time0+; if(time0=24

20、) time0=0;break; case M: time1+; if(time1=60) time1=0;break; default:break; else if (keypressed = E|keypressed = D|keypressed = L) WrDat(keypressed);/显示 if (date_or_ope(last_keypres) = 0)return ;else date_result= calculate1(); re_temp1=(longint)(date_result); re_temp2=(longint)(date_result-re_temp1)

21、*100000000); if(date_result1) re_temp1=0; re_temp2=(longint)(date_result)*100000000); ShowInt(0xc1,re_temp1);/整数部分 LCD_Cursor(2,10); WrDat(.); cov(re_temp2,show); /小数部分显示 for(i=0;i2;i+) LCD_Cursor(2,i+11); WrDat(showi+0); last_keypres = =; /else if endelse if (keypressed = =) /如果是= WrDat(keypressed)

22、;/显示 date_value = atof(date_temp);/把date_temp中的数字字符转 数值*(+date_pt) = date_value;date_result=calculate(); re_temp1=(long int)(date_result); re_temp2=(long int)(date_result-re_temp1)*100000000); if(date_result1) re_temp1=0; re_temp2=(long int)(date_result)*100000000); ShowInt(0xc1,re_temp1);/整数部分 LCD_

23、Cursor(2,10); WrDat(.); cov(re_temp2,show); /小数部分显示 for(i=0;ires2) result=res1-res2; LCD_Cursor(2,1); WrDat( ); else result=res2-res1; LCD_Cursor(2,1); WrDat(-); break;case *:result = res1*res2; break;case /:result = res1/res2; break; *(+date_pt) = result;memset(date_temp,0,15);return result;/* 名称 KEYSCAN(void)* 功能:键盘扫描程序*/uint8 KEYSCAN(void) uint8 i,temp,temp2=0xff; PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x00fff00F;/低四位设置为输IO0CLR=0x0000000F; temp=(IO0PIN&0x000003F0)4; for(i=0;i4;i+) IO0SET=(1i)&0x0000000F; IO0CLR=(14; if(temp!=0x00) /若有键按下 delayNs(10

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号