硬件综合实习 |
您所在的位置:网站首页 › 电子计算器中不能进行有括号的运算 › 硬件综合实习 |
中国石油大学(北京)
课程设计报告
课程名: 硬件综合实践
姓 名 许恺
学 号 2014011329
班 级 计算机14-1班
设计时间 2018年1月5日
一、 设计内容 在51单片机上编写烧录十进制四则运算计算机程序,使之具有计算、纠错、显示、括号运算(甚至浮点数运算)的功能。 二、 设计思路 根据实习设计要求,经过分析可得整个实验可以分为两个部分,软件和硬件,要明白硬件结合软件的方式以及LCD液晶屏的工作方式和51芯片的编码方式以及按钮的电路连接方式;软件要明白多位数四则运算的代码算法和C的语法。 设计思路可以分为三部分。第一,键盘按钮的扫描;第二,芯片内部的运算;第三,LCD液晶的显示;其中第二部分最为复杂重要。 三、 设计解释 3.1、设计环境介绍 51单片机,keil uv3开发软件,烧写软件PZISP自动下载软件.exe,SMC1602A LCM液晶显示屏。 3.2、程序解释(可含硬件部分)连线:JP8连JP4 JP9连JP5 J8断开 J2断开 JP165断开 把1602液晶插入
代码: /* 计算器硬件综合实验 */ #include //此文件中定义了51的一些特殊功能寄存器 #include #define uchar unsigned char sbit EN=P2^7; //LCD的使能引脚 sbit RS=P2^6; //LCD数据命令选择端 sbit RW=P2^5; //LCD的读写选择端 sbit K1=P3^0; //*号 sbit K2=P3^1; // /号 sbit K3=P3^2; //(号 sbit K4=P3^3; // )号 sbit K5=P3^4; // =号 //这里连接了线并且将每位都对应上 code uchar KEY_CODE[]={ 0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77, //3X4矩阵键盘键值表 0x7f,0xbf,0xdf,0xef,0xf7}; //2*4键盘键值表 //定义字符键值表,均为字符对应的ASCII码的十六进制 code uchar CHAR_TABLE[]={0x30,0x31,0x32,0x33,//这四个会在液晶显示器中显示0 1 2 3 0x34,0x35,0x36,0x37,//这四个会显示4 5 6 7 0x38,0x39,0x2b,0x2d,//这个四个会显示8 9 + - 0x2a,0x2f,0x28,0x29,//这四个会显示 * / ( ) 0x3d}; //这个会显示 =
//定义优先级矩阵,分为四种情况,当前的比上一个 0优先级高、2优先级低、1左括号遇到右括号、3发生错误 code uchar yxj[6][7]={ // + - * / ( ) = 2,2,0,0,0,2,2, // + 2,2,0,0,0,2,2, // - 2,2,2,2,0,2,2, // * 2,2,2,2,0,2,2, // / 0,0,0,0,0,1,3, // ( 2,2,2,2,3,2,2, // ) }; uchar str[40];//定义一个队列,用来放整个运算式 void scan(uchar *var);//从矩阵键盘中获取值 void print(int i,int j,uchar *outStr);//打印字符串 void delay5MS();//短延时函数 void delay100MS();//较长延时函数 void writeCMD(uchar com);//写命令子程序 void showOneChar(uchar dat);//写数据子程序 void init();//初始化子程序,初始化液晶显示屏 void clear();//清除显示屏上的显示 int calculate(uchar *arr);//计算函数,输入运算式,返回最终得数 int Precede(char a,char b);//优先级比较函数,输入两个符号,返回0123哪种情况 int Operate(int num1,uchar theta,int num2);//计算函数,输入两个数一个符号,返回运算结果
void main() { uchar new=0xff; //new是用来放当前扫描到的字符 int i=0,j=0,flag=0;//flag用来确认括号是否匹配,遇到左括号++,右括号-- int finvalue;//存放最后的得数 uchar text[16]; uchar text1[16]; //在最后用作字符串逆序 delay100MS(); //这是必要的,根据1602显示屏的说明书,使用前必须进行初始化 init(); //使用前清屏 clear(); while(1) { flag=0; while(1) { scan(&new); clear(); //加入出错判断机制,整个出错判断机制主要是选出所有正确的,不正确的根本不会被加到运算式的字符串中,在显示屏上就是按了不显示。如果有浮点数的话就加上小数点的情况 if(new=='='&&flag==0) //如果new输入=且括号没有问题 { str[i++]=new; str[i]='\0'; } else if(new'9') //若现在输入是符号 { if(i==0&&new=='(') //如果第一个要输入( { flag++; str[i++]=new; } else if(i!=0&&(str[i-1]=='+'||str[i-1]=='-'||str[i-1]=='*'||str[i-1]=='/'||str[i-1]=='(')&&new=='(') //前一个是符号时对现在的进行限制 { flag++; str[i++]=new; } else if(i!=0&&str[i-1]==')') //前一个符号是)的时候 { if(new!='('&&new!=')') //现在的不是()的时候可以加进去 str[i++]=new; else if(new==')'&&flag>0) //需要)的时候)后面可以是) { flag--; str[i++]=new; } } if(i!=0&&(str[i-1]>='0'&&str[i-1]0) //如果需要)数字后面可以加) { flag--; str[i++]=new; } if(new!=')') //否则数字后面加什么都行 str[i++]=new; } } else //若现在输入是数字 { if(i==0) //第一位可以是数字 str[i++]=new; else { if(str[i-1]!=')') //只要前一位不是),就可以接数字 { if(str[i-1]!='/'||new!='0') //排除/后面接0的可能 str[i++]=new; } } } //出错判断机制结束,下面把内容显示到显示屏上 print(0,0,&str); if(new=='='&&flag==0) //如果现在的符号是=且括号对应正确就直接跳出去进行下一次计算,不过前面出错判断机制规定如果括号不对根本就输不出来=,所以不会括号不对应 { break; } } finvalue=calculate(&str); //根据运算式计算得出最终得数 if(finvalue |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |