
基于ARM的计算器系统设计嵌入式系统开发课程设计.docx
15页目录1目的及意义 2-2系统的基本原理及设计思想 2 -2. 1基本原理 2-2. 2设计思想 4 -3 核心程序设计 6 -3.1程序流程图 6-3.2源代码 7-4结果及分析 14 -5总结 15 -参考文献 15 -1目的及意义•学习键盘接口的原理•掌握通过输入输出端口扩展键盘的方法•编写矩阵键盘的扫描程序,并将按键键值在数码管中显示, 实现简单计算器的功能2实验要求基于JXARM9-2410实验箱实现计算机器,要求可实现带括号 以及优先级的计算器可运算加减乘除等基本运算3系统的基本原理及设计思想3. 1基本原理•键盘原理JXARM9-2410教学实验系统的键盘电路由一块74HC273锁 存器和74LVCH244缓冲器完成键盘识别在没有按键的情况 下,ROWO-ROW3通过上拉来保持高电平检测时通过将 COLO-COL3中的某一列输入低电平,如果该列没有键按下时, 通过74LVCH244读取到的行值应该为高电平,如果该列某行 位置有键按下,那么该行读到的值应为低电平因此,采用轮询方式检测键盘的方法为:循环往各列输入低电平,然后读取行值,如果为高电平,则 判断下一列,否则,该行有键按下,此时已经读取到了该键的 行值和列值,然后根据行值和列值得到键码。
• LED原理JXARM9-2410拥有六位7段共阳数码管要在某位数码管 上显示一个段码表中的字符,需要使用地址空间0x10000006 选择位码,并将待显示的数据存储在地址空间0x10000004中JXARM9-2410教学实验系统段码表字符01234567段码OxcO0xf90xa4OxbO0x990x920x820xf8字符89ABCDEF段码0x800x900x880x830xc6Oxal0x860x8eJXARM9-2410教学实验系统位码表位数123456位码0x3e0x3d0x3b0x370x2fOxlfJXARM9-2410教学实验系统地址空间分配地址空间说明数据宽度读/写(属性)0x10000004数码管数据寄存器8位W0x10000006数码管扫描控制寄存器8位W•计算原理定义一个操作数栈Opnd, —个操作符栈Optr思想是:置操作数栈为空,操作符栈压入元素"#"(它具有 最高优先级),依次读入表达式中的每个字符CH,如果CH是操 作数,则CH压入操作数栈,如果CH是操作符,那么将CH 和操作符栈顶元素进行优先级比较(如'X '优先级高于'+ ')如果优先级大于当前栈顶元素,那么将其压栈,如果其优先级小于当前栈顶元素,那么执行 op=optr.pop();(取当前栈顶操作符),a= opnd.pop()(取 当前栈顶操作数存入临时变量a) ;b= opnd.pop()(取当前栈 顶操作数存入临时变量b);c=计算(a op b); opnd.push(c);如果优先级相等,则当前操作符出栈。
重复上述操作直到表达式处理完毕最后操作数栈剩余的操作数就是计算的最终结果3.2设计思想•系统结构框图I I•系统设计思想小键盘模块:计算器的输入部分,用于得到用户输入的待的 表达式,该模块调用系统提供的Key_GetKeyPoll();函数,得到 当前采集到的键值的ASCII码并将ASCII码传递到处理模块处理模块:计算器的核心部分,该模块接收小键盘模块传递 的ASCII码值,进行处理,将待显示数值的段码和位码传递到 显示模块显示模块:计算器的显示部分,用于显示计算机的中间数据 和最终结果,该模块接收处理模块待显示的数据,将有效数据 显示在LED上完成计算机器的功能•设计方案小键盘模块和显示模块采用上述方法,处理模块采用上述双栈结构的表达式计算器思想•备选方案方案一:小键盘模块和显示模块采用上述方法,处理模块采 用单栈结构的逆波兰式算法方案二:小键盘模块和显示模块采用上述方法,处理模块采 用运算符号触发•用户说明计算器键盘说明:123+456X789CE0()二系统采用JXARM9-2410教学实验箱提供的4X4键盘,布 局如左图,由于数量限制,故只能进行加法和乘法两种运算计算器LED显示部分说明:系统采用JXARM9-2410教学实验箱提供的6位7段数码 管,布局如上图,计算时可显示一999999~+999999之间 的任何数。
4核心程序设计4. 1程序流程图4. 2源代码/* 包含文件 7#include "def.h"include H2410lib.hH#inelude "option.h"include H2410addr.h"#inelude ”interrupt.h"#define SEGO 0x3e#define SEG1 0x3d#define SEG2 0x3b#define SEG3 0x37#define SEG4 0x2f#define SEG5 0x1 f/* 栈定义― -7#ifndef STACK_SIZE#define STACK_SIZE 64#endifint Num[STACK_SIZE]int NumTop=0;int Sym[STACK_SIZE];int SymTop=0;void Push(int * stackjnt * top,int val);int Pop(int * stackjnt * top);/* 声明 7#define DELAYTIME 1extern unsigned char seg7table[16];void Delay(int time);void display(int num);int Calculate(int right,int left,int symbol);/* 主函数 */void Main(void){/* 配置系统时钟,初始化端口,初始化串口 */ChangeClockDivider(1,1);ChangeMPIIValue(0xa1,0x3,0x1);Port_lnit();Uart_lnit(0,115200);Uart_Select(O);PRINTF("\n欢迎使用计算器\n“);/* */char number[255];char sign;int now=0;int num=0;int SymTmp;int ResTmp;int Flag = 0;while(1){unsigned char ch;ch=Key_GetKeyPoll();Delay ⑴;Delay(DELAYTIME);if(ch>='0'&&chv=9){num = (num*10)+(ch-'0');Flag = 1 ;}if(ch>=65&&ch<=70)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))!='C){ResTmp=Calculate(Pop(Num,&NumTop))Pop(Num,&NumTop),SymTmp);Push(Num,&Num7bp,ResTmp);}break;case 67: //对'+ (加号)'的处理if(SymTop!=0 && Sym[SymTop-1 ]!='('){ResTmp=Calculate(Pop(Num,&NumTop))Pop( Num,&NumTop),Pop(Sym,&SymTop)); Push(Num,&Num_[bp,ResTmp);}Push(Sym,&SymTop,'+');break;case 68: //对'* (乘号)'的处理if(SymTop!=0&&Sym[SymTop-1 ]!='('&&Sym[SymT op-1 ]!='+')ResTmp=Calculate(Pop(Num,&NumTop),Pop(Num,&NumTop),Pop(Sym,&SymTop));Push(Num,&NumTDp,ResTmp);}Push(Sym,&SymTopr);break;case 69: //对CE的处理Numlbp = 0;SymTop = 0;num = 0;break;case 70: //对'二'号处理if(SymTop!=0){while(SymTop!=0&&(SymT mp=Pop(Sym ,&Sy mTop))!=r){ResTmp=Calculate(Pop(Num,&NumT op),Pop(Num,&NumTop),SymTmp);Push(Num,&NumTop,ResTmp);}}num = Pop(Num,&NumTop); break;}}display(num);}}/* 计算 7int Calculate(int right,int left,int symbol){int result = 0;switch(symbol)caseresult = left+right;break;caseresult = left*right;break;}return result;}/* —-“・一-—LED 显示 */void display(int num){inti;int cur;int flag=O;if(num>999999){for(i=0;i<=5;i++){*((U8*) 0x10000006) = SEG1;*((U8*) 0x10000004) = seg7table[14];Delay(DELAYTIME);*((U8*) 0x10000006) = SEGO;*((U8*) 0x10000004) = seg7table[14];Delay(DELAYTIME);}}else{for(i=0;iv=5;i++){flag=O;if((cur=(num/100000)%10))flag=1;*((U8*) 0x10000006) = SEG5;*((U8*) 0x10000004) = seg7table[cur];Delay(DELAYTIME);if((cur=(num/1 OOOO)%10) || flag)flag=1 ;*((U8*) 0x10000006) = SEG4;*((U8*) 0x10000004) = seg7table[cur];Delay(DELAYTIME);if((cur。
