基于ARM的计算器系统设计嵌入式系统开发课程设计_第1页
基于ARM的计算器系统设计嵌入式系统开发课程设计_第2页
基于ARM的计算器系统设计嵌入式系统开发课程设计_第3页
基于ARM的计算器系统设计嵌入式系统开发课程设计_第4页
基于ARM的计算器系统设计嵌入式系统开发课程设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1 目的及意义- 3 -2 系统的基本原理及设计思想- 3 -2.1 基本原理- 3 -2.2 设计思想- 5 -3 核心程序设计- 7 -3.1 程序流程图- 7 -3.2 源代码- 8 -4 结果及分析- 14 -5 总结- 15 -参 考 文 献- 15 -1 目的及意义l 学习键盘接口的原理l 掌握通过输入输出端口扩展键盘的方法l 编写矩阵键盘的扫描程序,并将按键键值在数码管中显示,实现简单计算器的功能2 实验要求基于jxarm9-2410实验箱实现计算机器,要求可实现带括号以及优先级的计算器。可运算加减乘除等基本运算。3 系统的基本原理及设计思想3.1 基本原理l 键盘原理jxa

2、rm9-2410教学实验系统的键盘电路由一块74hc273锁存器和74lvch244缓冲器完成键盘识别。在没有按键的情况下,row0-row3通过上拉来保持高电平。检测时通过将col0-col3中的某一列输入低电平,如果该列没有键按下时,通过74lvch244读取到的行值应该为高电平,如果该列某行位置有键按下,那么该行读到的值应为低电平。因此,采用轮询方式检测键盘的方法为:循环往各列输入低电平,然后读取行值,如果为高电平,则判断下一列,否则,该行有键按下,此时已经读取到了该键的行值和列值,然后根据行值和列值得到键码。l led原理jxarm9-2410拥有六位7段共阳数码管。要在某位数码管上显

3、示一个段码表中的字符,需要使用地址空间0x10000006选择位码,并将待显示的数据存储在地址空间0x10000004中。jxarm9-2410教学实验系统段码表字符01234567段码0xc00xf90xa40xb00x990x920x820xf8字符89abcdef段码0x800x900x880x830xc60xa10x860x8ejxarm9-2410教学实验系统位码表位数123456位码0x3e0x3d0x3b0x370x2f0x1fjxarm9-2410教学实验系统地址空间分配地址空间说明数据宽度读/写(属性)0x10000004数码管数据寄存器8位w0x10000006数码管扫描控

4、制寄存器8位wl 计算原理定义一个操作数栈opnd,一个操作符栈optr 。思想是:置操作数栈为空,操作符栈压入元素"#"(它具有最高优先级),依次读入表达式中的每个字符ch,如果ch是操作数,则ch压入操作数栈,如果ch是操作符,那么将ch和操作符栈顶元素进行优先级比较(如×优先级高于)。如果优先级大于当前栈顶元素,那么将其压栈,如果其优先级小于当前栈顶元素,那么执行op=optr.pop();(取当前栈顶操作符),a=opnd.pop()(取当前栈顶操作数存入临时变量a);b=opnd.pop()(取当前栈顶操作数存入临时变量b);c=计算(a op b);

5、opnd.push(c);如果优先级相等,则当前操作符出栈。重复上述操作直到表达式处理完毕。最后操作数栈剩余的操作数就是计算的最终结果。3.2 设计思想l 系统结构框图小键盘模块处理模块显示模块键盘键值待显示数值l 系统设计思想小键盘模块:计算器的输入部分,用于得到用户输入的待的表达式,该模块调用系统提供的key_getkeypoll();函数,得到当前采集到的键值的ascii码。并将ascii码传递到处理模块。处理模块:计算器的核心部分,该模块接收小键盘模块传递的ascii码值,进行处理,将待显示数值的段码和位码传递到显示模块。显示模块:计算器的显示部分,用于显示计算机的中间数据和最终结果,

6、该模块接收处理模块待显示的数据,将有效数据显示在led上。完成计算机器的功能。l 设计方案小键盘模块和显示模块采用上述方法,处理模块采用上述双栈结构的表达式计算器思想。l 备选方案方案一:小键盘模块和显示模块采用上述方法,处理模块采用单栈结构的逆波兰式算法。方案二:小键盘模块和显示模块采用上述方法,处理模块采用运算符号触发。l 用户说明计算器键盘说明:123+456×789ce0()=系统采用jxarm9-2410教学实验箱提供的4×4键盘,布局如左图,由于数量限制,故只能进行加法和乘法两种运算。计算器led显示部分说明:系统采用jxarm9-2410教学实验箱提供的6位7

7、段数码管,布局如上图,计算时可显示999999999999之间的任何数。4 核心程序设计4.1 程序流程图num = (num*10)+(ch-'0');开始nnnnnnnyyyyyy调用ch=key_getkeypoll()函数ch>='0'&&ch<='9ch=65处理左括号push(sym,&symtop,'(');ch=66处理右括号push(num,&numtop,restmp);ch=67处理加号push(sym,&symtop,'+');ch=68ch=69

8、ch=70处理乘号push(sym,&symtop,'*');ce计算器清零numtop = 0; symtop = 0;计算calculate(pop(num,&numtop)显示当前数值display(num);y4.2 源代码/*-包含文件-*/#include "def.h"#include "2410lib.h"#include "option.h"#include "2410addr.h"#include "interrupt.h"#define se

9、g0 0x3e#define seg1 0x3d#define seg2 0x3b#define seg3 0x37#define seg4 0x2f#define seg5 0x1f/*-栈定义-*/#ifndef stack_size#define stack_size 64#endifint numstack_sizeint numtop=0;int symstack_size;int symtop=0;void push(int * stack,int * top,int val);int pop(int * stack,int * top);/*-声明-*/#define delay

10、time 1extern unsigned char seg7table16;void delay(int time);void display(int num);int calculate(int right,int left,int symbol);/*-主函数-*/void main(void)/*-配置系统时钟, 初始化端口, 初始化串口-*/ changeclockdivider(1,1); changempllvalue(0xa1,0x3,0x1); port_init(); uart_init(0,115200); uart_select(0);printf("n欢迎使

11、用计算器n");/* - */ char number255; char sign;int now=0;int num=0;int symtmp;int restmp;int flag = 0; while(1) unsigned char ch; ch=key_getkeypoll(); delay(1);delay(delaytime);if(ch>='0'&&ch<='9')num = (num*10)+(ch-'0');flag = 1; if(ch>=65&&ch<=70

12、) if(flag) push(num,&numtop,num); num = 0; flag = 0; switch(ch) case 65: /对(的处理(左括号) push(sym,&symtop,'('); break; case 66: /对)的处理(右括号)while(symtop!=0&&(symtmp=pop(sym,&symtop)!='(') restmp=calculate(pop(num,&numtop),pop(num,&numtop),symtmp); push(num,&

13、;numtop,restmp); break; case 67: / 对+(加号)的处理 if(symtop!=0 && symsymtop-1!='(') restmp=calculate(pop(num,&numtop),pop(num,&numtop),pop(sym,&symtop); push(num,&numtop,restmp); push(sym,&symtop,'+'); break; case 68: / 对*(乘号)的处理 if(symtop!=0&&symsymtop

14、-1!='('&&symsymtop-1!='+')restmp=calculate(pop(num,&numtop),pop(num,&numtop),pop(sym,&symtop); push(num,&numtop,restmp); push(sym,&symtop,'*'); break; case 69: / 对ce的处理 numtop = 0; symtop = 0; num = 0; break; case 70: / 对=号处理 if(symtop!=0) while(sy

15、mtop!=0&&(symtmp=pop(sym,&symtop)!='(' ) restmp=calculate(pop(num,&numtop),pop(num,&numtop),symtmp); push(num,&numtop,restmp); num = pop(num,&numtop); break; display(num); /*-计算-*/int calculate(int right,int left,int symbol)int result = 0;switch(symbol)case '+

16、':result = left+right;break;case '*':result = left*right;break;return result;/*-led显示-*/void display(int num)int i;int cur;int flag=0;if(num>999999)for(i=0;i<=5;i+)*(u8*) 0x10000006) = seg1;*(u8*) 0x10000004) = seg7table14;delay(delaytime);*(u8*) 0x10000006) = seg0;*(u8*) 0x1000000

17、4) = seg7table14;delay(delaytime);else for(i=0;i<=5;i+) flag=0;if(cur=(num/100000)%10)flag=1;*(u8*) 0x10000006) = seg5;*(u8*) 0x10000004) = seg7tablecur;delay(delaytime);if(cur=(num/10000)%10) | flag)flag=1;*(u8*) 0x10000006) = seg4;*(u8*) 0x10000004) = seg7tablecur;delay(delaytime);if(cur=(num/1

18、000)%10) | flag)flag=1;*(u8*) 0x10000006) = seg3;*(u8*) 0x10000004) = seg7tablecur;delay(delaytime);if(cur=(num/100)%10) | flag)flag=1;*(u8*) 0x10000006) = seg2;*(u8*) 0x10000004) = seg7tablecur;delay(delaytime);if(cur=(num/10)%10) | flag)flag=1;*(u8*) 0x10000006) = seg1;*(u8*) 0x10000004) = seg7tablecur;delay(delaytime);*(u8*) 0x10000006) = seg0;*(u8*) 0x10000004) = seg7tablenum%10;delay(delaytime);/*-栈处理-*/void push(int * stack,int * top,int val)if(stack=num)printf("push val %dn",val);else printf("push sym %cn",val);if(*top = stac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论