430 单片机 计算器
计算器__msp430单片机原理与应用课程综合设计
计算器设计实验报告一、实验设计主要分工04009312 王国鹏:按键扫描,LCD显示。
04009320 文斌:算法设计,字符数据转换。
共同调试、完善设计。
二、程序设计实现功能效果(1)支持整数、小数基本加减乘除运算;(2)有优先级的判别计算。
优先级由高到低依次为括号运算、乘除运算、加减运算。
(3)支持键盘输入;(4)能够判断输入表达式的合法性。
程序开始运行后,定时扫描键盘。
输入键有0~9数字键、+-*/()运算符、del退格键、clear清屏键、shift复用切换键、enter'='键、‘.’小数点键。
键盘为3*4的矩阵键盘,键盘定义如下:开始运行程序后,LCD12864屏幕显示Calculator,等待键盘输入。
通过定时中断,定时扫描按键。
有按键按下时,判断为0~9数字键、+-*/()运算符则显示在LCD上。
按下shift键则键盘复用为上图红色字符。
按下'='号后,得出计算结果,结果显示于表达式的下一行。
若有除零错误或语法错误(如连续输入运算符,括号失配等)则显示“=error”。
按下backspace,则表达式退一个字符,同时显示去掉最后一位字符。
按下“reset”,则回到初始状态,屏幕表达式和结果被清除,等待输入新的表达式。
三、程序设计流程图四、程序算法实现1、计算算法将输入的0~9数字、+-*/()运算符的内容存储于一个全局变量str[i]中,表达为中缀表达式。
首先判断输入字符串的合法性,对不同的字符赋予不同的权值,str[i]中若为‘(’,则error[e]=1;若为‘)’,则error[e]=3;若为运算符或小数点,则error[e]=2;若为数字,则error[e]=0;根据数组error[e]序列判断输入字符串的正确性。
例如运算符连续输入error[j]=='2'&&error[j+1]=='2' 则errflag=1;若输入表达式字符串没有错误,则用void str2repol()函数,将输入字符串str[i]转换成逆波兰表达式并存于全局数组char repol[maxs]中。
单片机实现的计算器及仿真图
/**************************************************功能说明:计算器,可实现整数加减乘除的循环运算,除法精确到千分位接线说明:P3控制位选,P2控制段选,P1控制键盘作者:合工大LS**************************************************/#include<reg52.h>#define S P3unsignedintc,e,f;unsignedint temp,temp2,temp3,temp4,temp5,tempx;unsigned charm,yunsuanfu;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管unsigned char t[]={0xff,0xff,0xff,0xff}; //小数点//---------------------延时-----------------------------//void delay(unsigned intdelaytime){while(delaytime--);}//---------------------数码管显示-----------------------//void display(){if((temp/1000)!=0||t[3]==0x7f){ S=0x04;delay(5);P2=table[temp/1000]&t[3];delay(700); } //千位if(((temp/1000)!=0)||((temp/100%10)!=0)||t[2]==0x7f||t[3]==0x7f){S=0x08;delay(5);P2=table[temp/100%10]&t[2];delay(700);} //百位if(((temp/1000)!=0||(temp/100%10)!=0)||((temp/1000)==0&&(temp/100%10)==0&&(temp/10 %10)!=0)||t[1]==0x7f||t[2]==0x7f||t[3]==0x7f){S=0x10;delay(5);P2=table[temp/10%10]&t[1];delay(700);} //十位//if((temp/1000)!=0||(temp/100%10)!=0||(temp/10%10)!=0||(temp%10)!=0){S=0x20;delay(5);P2=table[temp%10]&t[0];delay(700);} // 个位}//----------------------键盘扫描------------------------//unsigned char keyscan(){unsigned char key;while(1){display();P1=0xfe; //检测第一行if((P1&0xf0)!=0xf0){ key=P1;while((P1&0xf0)!=0xf0);switch(key)case 0xee:return 7;break;case 0xde:return 8;break;case 0xbe:return 9;break;case 0x7e:return 10; //除号break;}}P1=0xfd; //检测第二行if((P1&0xf0)!=0xf0){ key=P1;while((P1&0xf0)!=0xf0);switch(key){case 0xed:return 4;break;case 0xdd:return 5;break;case 0xbd:return 6;break;case 0x7d:return 11; //乘号break;}}P1=0xfb; //检测第三行if((P1&0xf0)!=0xf0){key=P1;while((P1&0xf0)!=0xf0);switch(key){case 0xeb:return 1;break;case 0xdb:return 2;break;case 0xbb:return 3;break;case 0x7b:return 12;break;}}P1=0xf7; //检测第四行if((P1&0xf0)!=0xf0){key=P1;while((P1&0xf0)!=0xf0);switch(key){case 0xe7: return 13; //确认键ON/C break;case 0xd7:return 0;break;case 0xb7:return 14; //=号break;case 0x77: return 15; //+号break;}}}}void main(){while(1){if(m<2){yunsuanfu=c;}m=2;if(m==2){while(1){e=keyscan();if(e<10||e==13){if(e<10){f=f*10+e;temp=f;}if(e==13) //复位{e=0;f=0;temp=f;tempx=0;t[3]=0xff;t[2]=0xff;t[1]=0xff;t[0]=0xff;m=1;break; //break起到跳出while语句作用}}elsebreak;}}if(m==2){if(yunsuanfu==15)temp=tempx+f;if(yunsuanfu==12)temp=tempx-f;if(yunsuanfu==11)temp=tempx*f;if(yunsuanfu==10){if(tempx%f==0)temp=tempx/f;if(tempx%f!=0){temp2=tempx/f;temp3=tempx%f; //一位小数temp4=temp3*10%f; //两位小数temp5=temp4*10%f; //三位小数if(temp2/1000!=0)temp=temp2;if(temp2/1000==0&&temp2/100!=0) //一位小数{temp2=temp2*10;t[3]=0xff;t[2]=0xff;t[1]=0x7f;t[0]=0xff;temp3=temp3*10/f;temp=temp2+temp3;}if(temp2/100==0&&temp2/10!=0) //两位小数{temp2=temp2*100;t[3]=0xff;t[2]=0x7f;t[1]=0xff;t[0]=0xff;temp3=temp3*10/f;temp4=temp4*10/f;temp=temp2+temp3*10+temp4;}if(temp2<10) //三位小数{temp2=temp2*1000;t[3]=0x7f;t[2]=0xff;t[1]=0xff;t[0]=0xff;temp3=temp3*10/f;temp4=temp4*10/f;temp5=temp5*10/f;temp=temp2+temp3*100+temp4*10+temp5;}}}}yunsuanfu=e;tempx=temp; //储存当前结果e=0;f=0;}}。
单片机计算器
/*计算机简介:扩展外存,改变缓存数组下标,可计算任意位数字。
(现在改大了单片机放不下,够大了扩展计算sin,cos,平方立方很容易,摁键与内部数据接口函数都写好了)有运算优先级识别函数。
即先运算乘除,后运算加减。
(链表用的不太熟,内存也不够大,否则可识别加括号运算优先级)可通过改变源码确定精确度(小数点后显示几位数字,超出精确度数字随机)每次计算完摁“1”键即可复位再次计算。
摁其他键复位后无法正常运算各种刁钻古怪的算应该会让他死机····*/#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned charuchar code text[16]="123+456-789*0.=/";//显示ucharsta,i=0,j,in[20],in_num=0,yun[10],key2,numofnum=1,suani=1;//定义光标位置,循环变量,循环变量,摁键示值数组,运算符号标志数组,输入是否为等于号标志变量,数字的个数变量uchar work[10];//定义存放结果各个位数值floatfl[3]={0,},final;//欲计算输入数值整合真值数组.数组个数为可一次计算数值的个数与yun[]下标为该下标减一.即计算十个数有九个运算符号连接.定义最终结果sbitlcden=P2^6;sbitlcdrs=P2^7;void w_inst(ucharoder);//液晶显示输入命令函数void w_data(uchardat);//液晶显示输入数据函数void display(uchar x);//显示函数void delay(uint z);//延时函数void move(uint z);//光标移动函数intctoi(uchar z);//char to int摁键字符转数值各个位整型函数void itof(uchar *in);//int to float各个位整型整合成实际值函数void calcu();//计算最终值函数ucharftoi(uchar z);//float to int把结果各个位数值取出.z为该函数输出计算结果的精确度ucharitoc(uchar z);//int to char把各个位数值转化为带输出text顺序void init();//液晶初始化函数ucharkeyscan();//键盘扫描函数void main(){ucharwei;start:init();for(sta=2,j=0;;sta++,j++)//sta为光标的位置{key2=keyscan();display(key2);move(sta);//不加此函数光标正常一位一位移动.但若输入运算式过长则溢出屏幕in[j]=ctoi(key2);in_num++;if(key2==14)break;//判断是否输入等号,若输入则跳出取值循环开始计算}itof(in);//处理数据为真值,为计算做准备calcu();//计算最终结果wei=ftoi(10);//把最终结果转换为各个位的字符表达,并返回输出字符个数move(17);//把光标移动到第二行准备输出结果for(i=0;i<wei-6;i++)//因为ftoi中转换在最后几位有误差(float与int转化造成)所以显示时去掉(wei-6)display(itoc(work[i]));while(key2=keyscan())//若摁1键则跳出循环再次运算goto start;//回到函数首部}ucharitoc(uchar z)//int to char把work中的各个位结果转换为text中对应序号待输出{uchar in;switch(z){case 0:in=12;break;case 1:in=0;break;case 2:in=1;break;case 3:in=2;break;case 4:in=4;break;case 5:in=5;break;case 6:in=6;break;case 7:in=8;break;case 8:in=9;break;case 9:in=10;break;case 12:in=7;break;//-case 15:in=13;break;//.}return in;}ucharftoi(uchar z)//float to int把最终结果转换为各个位数字,待输出.z为精确度(输出小数点后位数){ucharii,trans,fu=0;if(final<0){final=-(final*pow(10,z));fu=1;}else final=final*pow(10,z);for(ii=0;final>1;ii++,final/=10)//循环取值存入workwork[ii]=(int)(final)%10;for(i=0;i<(ii/2);i++)//取的值为倒序,调整位置函数{trans=work[i];work[i]=work[ii-i-1];work[ii-i-1]=trans;}for(i=0;i<z-1;i++)//把小数点后的各位数字向后移一位,为插入小数点代表值准备work[ii-1-i]=work[ii-2-i];work[ii-z]=15;//插入小数点if(fu==1)//判断结果是否为负数{for(i=ii+1;i>0;i--)//若为负数则各个位向后移一位work[i]=work[i-1];work[0]=12;//在串首插入负号}return ii;void calcu()//计算最终值函数{uchar z;for(z=0,i=0;i<numofnum-1;i++,z++)//该大循环找出乘除计算优先运算{if((yun[i]==3)||(yun[i]==4)){if(yun[i]==3){fl[i]=fl[i]*fl[i+1];numofnum--;i=-1;//计算两数值并放入前一数值空间,需要计算数值减一,并从头判断.}else{fl[i]=fl[i]/fl[i+1];numofnum--;i=-1;}for(j=z;j+2<=numofnum;j++)//该循环.在计算后把计算的两数字后的数字和运算符都往前移一位成为不间断数组,为下次计算做准备{fl[j+1]=fl[j+2];yun[j]=yun[j+1];}}}for(z=0,i=0;i<numofnum-1;i++,z++)//该大循环计算加减{if(yun[i]==1){fl[i]=fl[i]+fl[i+1];numofnum--;i=-1;//类上循环解释}else{fl[i]=fl[i]-fl[i+1];numofnum--;i=-1;}for(j=z;j+2<=numofnum;j++)//类上循环解释{fl[j+1]=fl[j+2];yun[j]=yun[j+1];}}final=fl[numofnum-1];}voiditof(uchar *in)uchar z=0,j1=0;//定义各数值在数组中的下标和输入的数值的数目.定义运算符号标志数组及其下标uchar in1;//存放地址所指数值uchar *p_in=in;//指向in数组的指针ucharjia=0,jian=0,chen=0,chu=0,dian=0,den=0;//是否输入加减乘除的标志和运算方法标志for(j=0;j<in_num;j++,p_in++){in1=*p_in;//取一位数值计算并把指针指向下一数值switch(in1){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:if((chen==1)||(chu==1)||(jia==1)||(jian==1))//若当前数值为0-9则进行合并{z++;numofnum++;jia=0;jian=0;chen=0;chu=0;dian=0;suani=1;}else if(dian==1){fl[z]=fl[z]+in1*(1/pow(10,suani));suani++;break;}fl[z]=fl[z]*10+in1;break;case 11:jia=1;yun[j1++]=1;break;//+若当前字符为11-15,则标志运算变量并记录。
单片机的简易计算器毕业设计
单片机的简易计算器毕业设计简易计算器是一种基本、常见的电子设备,它能够对数字进行简单的加减乘除运算。
单片机作为一种小型、低功耗的微型计算机,非常适合用于设计和实现计算器的功能。
在本文中,我们将以单片机为基础,设计和实现一个简易计算器。
一、设计思路1.硬件设计:-使用单片机作为主控制器。
-接入键盘矩阵和显示器。
-使用LED灯作为指示灯,用于显示运算符和结果。
2.软件设计:-通过键盘输入数字和运算符。
-将输入的数字和运算符转换成相应的控制信号。
-进行运算,并将结果显示在屏幕上。
3.功能实现:-实现加法、减法、乘法和除法运算。
-提供清零、退格和等号等功能。
-支持小数和负数的输入和运算。
-提供错误提示功能,例如除数不能为零等。
二、具体实现1.硬件实现:-将键盘矩阵的行和列与单片机的IO口相连,通过扫描来检测按键的输入。
-将显示器与单片机的IO口相连,通过控制引脚来发送和接收数据。
-将LED灯与单片机的IO口相连,设置相应的引脚状态来显示不同的指示信号。
2.软件实现:-使用C语言编写程序,通过中断和轮询的方式,实现键盘输入的检测和数据的读取。
-将读取到的数据进行解析,并根据不同的按键进行相应的操作。
-根据输入的数字和运算符,进行相应的运算并输出结果。
3.功能实现:-加法、减法、乘法和除法运算可以通过相应的算法实现,例如加法可以通过循环和位运算来实现。
-清零功能可以将运算结果和输入的数字都清零,退格功能可以删除输入的最后一个数字或运算符。
-支持小数运算可以在运算过程中进行进位和进位操作,支持负数运算可以通过判断运算符来进行相应的处理。
-错误提示功能可以通过对输入的数据进行检查和判断来实现,例如判断除数是否为零。
三、总结通过上述的设计和实现,我们可以成功地设计和制作一个单片机的简易计算器。
通过这个计算器,用户可以进行简单的加减乘除运算,同时还具备清零、退格、小数和负数等功能。
这个计算器可以应用在日常生活中的计算场景,方便用户进行各种简单的运算操作。
单片机的简易计算器
单片机的简易计算器在现代科技的不断发展中,单片机已经成为了人们生活中不可或缺的一部分,其广泛应用于各个领域中。
其中,单片机作为计算器的应用是人们最为熟悉的,本文将介绍一个基于单片机的简易计算器。
1.引言计算器作为一种广泛使用的工具,早已融入人们的生活中。
随着电子技术的不断发展,计算器逐渐从机械式逐渐转变为电子式。
而单片机作为电子计算器中的核心,因其体积小、功耗低、成本低等优点,成为了电子计算器的首选之一2.原理介绍单片机简易计算器的原理是通过单片机对输入的数字和运算符进行解析,然后利用内部的算法进行计算,最后将结果显示在输出设备上。
该计算器主要包括输入模块、解析模块、计算模块以及显示模块四个部分。
3.输入模块输入模块主要包括键盘和显示屏。
键盘用于用户输入数字和运算符,显示屏用于显示输入和计算结果。
在单片机上,键盘和显示屏一般通过矩阵按键扫描和数码管显示等方式实现。
4.解析模块解析模块负责解析用户的输入,并将其转化为内部可以处理的格式。
例如,用户输入的数字和运算符将被解析为二进制码或其他表示形式。
解析模块一般通过状态机等方式实现。
5.计算模块计算模块是单片机简易计算器的核心部分,主要负责对输入的数字和运算符进行计算,并生成计算结果。
计算模块可以使用常见的算法,如加法、减法、乘法、除法,也可以实现特殊的运算功能,如开方、幂运算等。
6.显示模块显示模块负责将计算结果显示在输出设备上。
单片机简易计算器一般采用数码管显示,可以显示整数和小数。
在显示过程中,还需要考虑显示精度和位数等问题。
7.程序设计单片机简易计算器的程序设计需要考虑输入和输出的实时性和准确性。
需要设计相应的中断处理函数,实现按键的响应和显示的更新。
程序设计还需要考虑算法的优化和计算结果的溢出等问题。
8.功能扩展单片机简易计算器还可以进行功能的扩展,如添加转换功能、存储功能等。
例如,可以添加进制转换功能,实现十进制与二进制、八进制、十六进制之间的转换;还可以添加存储功能,实现计算结果的存储和读取。
单片机中用矩阵键盘实现计算器
num=num1/num2;
}
if(flag2==2&&flag1==2) //乘号和等号被按下
{
num=num1*num2;
}
if(flag2==3&&flag1==2) //减号和等号被按下
{
num=num1-num2;
}
if(flag2==4&&flag1==2) //加号和等号被按下
{
num=num1+num2;
display();//数据显示
}
}
void keyscan(void)
{
col_1=0;
col_2=0;
col_3=0;
col_4=0;
if ((P1&0x0f)!=0x0f) //判断行线是否全为1,不是则处理
{
col_1=0; //第一列输出'0'
col_2=1;
col_3=1;
col_4=1;
num2=7;
break;
case 2:if(flag==1)
num1=4;
if(flag==3)
num2=4;
break;
case 3:if(flag==1)
num1=1;
if(flag==3)
num2=1;
break;
case 5:if(flag==1)
num1=8;
if(flag==3)
num2=8;
case 15:
flag2=3;//“-”
break;
case 16:
flag2=4;//“+”
break;
}
keynum=0;//清除keynum的值
单片机(44按键与数码管制作的简易计算器,含原理图)
return (i+j*4);//返回键码
}
temp <<= 1;
}
}
}
#endif
#ifndef _wei_h_
#define_wei_h_
int mei;
int wei(int num1,int num2,int num3,int num4,int num5,int num6,int num7 )
if(P1 != 0xf0)//第三次判断有无按键按下
{
m = Keyscan();
if(0<=m && m<=9)
{
if(ch==1)
{Key_Value= Key_Value*10+m;}
else{Key_Value=m;ch=1;}
}
else
{
if(m==15)
{
Key_Value=0;n=0;l=0;
简易计算器(矩阵键盘+数码管)
#include <reg52.h>
#include <as.h>
#include<sd.h>
#include<math.h>
#include<df.h>
#define uint unsigned int
#define uchar unsigned char
long int Key_Value,n;
{mei=4;return mei;}
else
{
if(num6!=0)
{mei=3;return mei;}
else
{
if(num7!=0)
{mei=2;return mei;}
基于单片机的简易计算器
***********************************碎灵之痕**********************************基于单片机的简易计算器要下载原理图的请到/然后输入账号429755725@密码:f123456789希望大家不要修改密码,不要删除里面的文件,方便他人。
一、功能:1、可以实现结果不大于8位数的四则混合运算;2、运算符有:+、-、*、/、(、)、=;3、可以的到负数;4、具有退格(删除)功能;5、等号之后在按数字键会另外新建一个计算式;6、示例表达式:“78*(45-999)+86=”。
二、材料:1、液晶1602;-------------------------------------------------1块;2、单片机(STC89C52);------------------------------------1块;3、按键;---------------------------------------------------------21个;4、电位器(10K);--------------------------------------------1个;5、晶振(12M);----------------------------------------------1个;6、排阻(10K);------------------------------------------------1个;7、排座、排针;------------------------------------------------各一个;8、40脚单片机插座;-----------------------------------------1个;9、USB母口(供电用);--------------------------------------1个;10、电容、电阻;----------------------------------------------如图所示。
单片机课程设计——计算器
单片机综合课程设计——计算器一、实验目的1、学习使用单片机内部的I/O功能。
2、熟悉I/O与键盘矩阵和数码管的连接。
3、熟练掌握单片机I/O的编程。
二、实验分工三、功能实现1、采用键盘按键输入,数码管显示的模式。
2、实现计算器两位数以内的基本“+,-,*,/”运算功能。
3、扩展实现了计算器的乘方、阶乘、开平方根功能。
4、实现了计算器的退格功能,可以在运算过程中更改操作数,不影响运算继续进行。
5、数码管操作数显示两位以内,结果显示在四位数以内。
6、键盘各功能键分布如下:1 2 3 + or x a4 5 6 - or n!7 8 9 * orbackspace reset = /由于时间紧张,未来得及实现功能键的复用,只能将扩展功能与基本功能分开,用两个程序实现。
7、具体操作:开始运行程序后,数码管无显示,等待键盘输入。
通过定时中断,定时扫描按键。
有按键按下时,判断为1~9数字键,则显示在数码管上。
按下运算功能键屏幕清零,等待下一个操作数输入。
按下“=”号后,得出计算结果,结果显示于数码管上。
在操作数输入过程中,按下backspace,则数码管显示去掉最后一位数字,继续输入,不影响运算的进行。
按下“reset”,则回到初始状态,数码管显示和运算结果被清除,等待输入新的表达式。
四、实验原理1、通过MSP430 端口控制TM1638 芯片实现读取键盘状态(输入)和控制LED 数码管显示(输出)的功能。
2、键盘:键盘中A-F 分别对应KS1-KS6。
一旦有按键按下,TM1638 中相关的寄存器的值就会改变。
*注意:键盘用坐标形式表示,空白位表示本开发板暂未用到TM1638 最多可以读4个字节,不允许多读。
读数据字节只能按顺序从BYTE1-BYTE4 读取,不可跨字节读。
组合键只能是同一个KS,不同的K 引脚才能做组合键;同一个K 与不同的KS 引脚不可以做成组合键使用。
3、数码管:上图给出一个共阴数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1 为低电平的时候让SEG1,SEG2,SEG3,SEG4,SEG5,SEG6 为高电平,SEG7 为低电平,即在00H 地址单元里面写数据3FH 就可以让数码管显示“0”。
基于MSP430F135单片机的计算器设计
此我们选择 了液 晶显示屏 , 晶显示屏 的价格较 贵 , 减小系统 的功耗 , 液 但 人机界 面较好 , 以显示 中文菜单 , 可 图片等 , 是电子产品发展的趋势 。
22 3 设讣 思 路 ..
一 . —
苷 一 ■一
: 一
一
j 一_ - f 一 … _
系统 町划分为Βιβλιοθήκη 下几个模块 , 如 图 2—1设计思路图 ) ( :
计算器 , 也可 以利用专用 的计算器 芯片配以显 示电路 及其所需要 的外围 电路组成简易计算器 , 还可 以利用单 片机来设计 计算 器等等 。这些 方法 都各有特点 , 中, 其 利用单片机设计计算器具有编程灵 活 , 于计算 器功 便 能 的扩 充, 精确度高 等特 点。
2 系统 硬 件 部 分 设 计
2 】设 计 要 求 .
2 1 1基 本 要 求 : ..
图 1 设 计 思 路 图
( ) 本 的 四 则运 算 ;2 小 数 点 后 至 少 包 含 2位 ; 3 实 现 0到 1 1基 () () 之 间随 机 数 , 数 点 后 至 少 3位 ; 小 ( 计 算 响应 时 间 小 于 1 ;5 实 现 任 意 数 平 方 、 方 、 次 方 、 4) 秒 () 开 三 开
【 关键词 】 P 3 F 3 A m g8 L D显示屏 MS 4 0 15 T ea L C
D 1B 0 S 8 2
中 图分 类 号 : P 文 献 标 识 码 : 文 章 编 号 :0 9—4 6 (0 0)2—00 0 T3 A l0 072 1 0 1 9— 1
l前 言 计算 器的设计方 法有多种 , 例如 , 可用 中小规模集 成电路组 成简易
基于MSP430F2254单片机的计算器设计
基于MSP430F2254单片机的计算器设计[摘要] 本系统采用MSP430F2254单片机作为控制中心,由键盘输入实现加、减、乘、除、开方并通过键盘复用(shift)实现了清零、平方、取倒数等功能,经过单片机运算,并将运算式和结果显示在LCD上。
键盘输入采用中断方式,节省了CPU的资源,提高CPU的工作效率。
[关键词] MSP430 键盘LCD1602 计算器一、方案选择与论证1、系统组成[1]本系统由单片机控制模块、键盘输入模块、LCD显示模块三个基本模块组成,由各个模块组成的系统框图如图1所示。
图12、各模块方案选择与论证(1)单片机控制中心模块[2]单片机是整个系统中最主要的控制和运算模块,它就像是指挥中心指挥调度其他的两个模块。
方案一:采用8051单片机。
51单片机具有布尔处理功能,并且可以进行位操作,但是由于目前市场的发展趋势51单片机渐渐的被52系列单片机和MSP430单片机所替代。
方案二:采用MSP430单片机。
MSP430单片机具有低功耗、速度快、集成度高的特点,并且抗干扰能力强、保密性好、价格合理,430单片机的P1和P2口可以作为外部中断,这正好满足了系统采用键盘中断的要求。
MSP430单片机市场发展迅速,利于以后的学习和运用。
但是430单片机不能进行位操作。
进过比较后,根据要求,本系统选用方案二。
(2)键盘输入模块键盘输入模块是系统中的数据信息来源,将键值输入到单片机中进行处理。
方案一:采用扫描方式输入。
键盘扫描方式程序编写简单易懂,容易实现,但是它要求CPU不断的对键盘进行扫描,大大的占用了CPU的资源,使得系统的功耗增高,浪费了时间。
方案二:采用中断方式输入。
中断方式编写程序较为复杂,通过每按一次键产生一次中断,CPU相应中断,这种方式CPU只需要在有中断产生时再去相应键盘的输入程序即可,在没有中断时,CPU可以进行其它工作,也可以进入低功耗模式,很大程度上提高了CPU的利用率,节约了资源。
基于MSP430单片机的简易计算器设计概述
基于MSP430单片机的简易计算器设计概述作者:郭新伦吴仕驰王华豫杨坤来源:《科学与信息化》2019年第14期摘要本文介绍了一种基于MSP430单片机的简易电子计算器设计。
基于MSP430单片机的简易电子计算器设计具有体积小、便于携带、应用方便、组成元器件少、制造成本低等优点。
MSP430单片机具有的超低功耗、硬件浮点数运算等功能使得简易电子计算器设计简单、计算能力强,有着广阔的发展前景。
关键词 MSP430;简易电子计算器;超低功耗引言生活中常用的电子计算器具有结构简单、性能稳定的优点,在现代经济社会有着广泛的应用。
本次设计的基于MSP430单片机的简易电子计算器,在MSP430F6638单片机上,使用矩阵键盘输入数据,进行加、减、乘、除混合运算,并能根据运算符的优先级大小得出正确结果。
此次设计的计算器可精确到个位,基本实现计算器功能。
利用键盘选择数字;利用键盘选择加减乘除等功能最后将计算结果结果在LCD上显示,具有较强的使用价值[1]。
1 硬件系统的设计本次设计使用MSP430F6638单片机设计出一个简单的计算器。
使用矩阵键盘输入数字、字符,用LCD_TFT屏幕显示运算式子和结果。
硬件主要包括(MSP430F6638单片机),LCD_TFT屏幕液晶显示器、矩阵键盘。
其中,MSP430F系列单片机直接采用了德州仪器公司设计的MSP430F6638单片机评估开发板,在此基础上进行系统的设计和开发。
其中矩阵键盘隶属于TM1638电路,TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。
根据简易电子计算器的实际功能和任务要求,得出硬件系统设计方案,单片机硬件结构框图设计如图1所示[2]。
2 系统软件设计本次设计使用了MSP430F6638单片机为控制器,LCD_TFT液晶屏作为显示器,矩阵键盘作为输入设备,设计了一个基于MSP430F6638单片机的简易电子计算器,使用矩阵键盘的按键接收输入信息,完成了基于MSP430F6638单片机的简易电子计算器设计。
msp430单片机实现计算器功能
Msp430简易计算器设计设计任务:1.实现计算器基本“+,-,*,/”运算功能。
2.八个数码管,第一位显示符号位,第二位空置,剩余六位显示数字,结果溢出显示“EER”;3.有自己独立的运算特色设计目的:学习使用单片机内部的I/O功能,熟悉I/O与键盘矩阵和数码管的连接,熟练掌握单片机I/O的编程。
设计方案:使用数组储存和调用内部数据,利用子函数实现各种运算功能,另外添加阶乘factorial()函数。
程序代码:#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intunsigned char leddata[24] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8f,0xbf,0x89,0xb9 ,0xff,0x86,0xaf,0xcf};unsigned char time[8] = {20,20,0,0,0,0,0,0};//初始数码管unsigned char getkey(void);unsigned int qiushu();long factorial(long a);void qingping(void);void fenjie();void delay(unsigned int asdf){for(uint asd=0;asd<asdf;asd++);};/*************************主函数************************/ void main(void){uchar flag=0,i=9;WDTCTL = WDTPW + WDTHOLD; //关闭看门狗P5DIR|=BIT7;P5OUT&=~BIT7;P4DIR=0xff;P2DIR=0xff;P1DIR=0x0F;P1OUT=0xff;while(1){ long p,q,r;time[1]=20;i=getkey();if(i<10){time[2]=time[3];time[3]=time[4];time[4]=time[5];time[5]=time[6];time[6]=time[7];time[7]=i;}else {switch(i){case 12:time[0]=16;p=qiushu();qingping();flag=12;break;case 13:time[0]=17;p=qiushu();qingping();flag=13;break;case 14:time[0]=18;p=qiushu();qingping();flag=14;break;case 15:time[0]=19;p=qiushu();qingping();flag=15;break;case 10:time[0]=23;p=qiushu();qingping();flag=10;break;case 11:{q=qiushu(); //做相应的计算求值qingping();switch(flag){case 12:r=p+q;break;case 13:r=p-q;break;case 14:r=p*q;break;case 15:r=p/q;break;case 10:r=factorial(p);break;}if((r>999999)||(r<0)) {qingping();time[5]=21;time[6]=21;time[7]=22;}else fenjie(r);}break;}}for(uchar j=0;j<=7;j++) //显示{P4OUT=0x80>>j;P2OUT=leddata[time[j]];delay(200);}}}//end of mainunsigned int qiushu() //转化成相应的十进制整数{unsigned int y;y=time[2]*100000+time[3]*10000+time[4]*1000+time[5]*100+tim e[6]*10+time[7];return y;}void qingping(void) //清除屏幕{unsigned int a;for(a=7;a>1;a--)time[a]=0;}void fenjie(long r) //提取十进制整数各位数值,并显示{time[7]=r%10;time[6]=r/10%10;time[5]=r/100%10;time[4]=r/1000%10;time[3]=r/10000%10;time[2]=r/100000%10;}long factorial(long a){long x,i;x=a;for(i=1;i<a;i++){x=x*(a-i);}return(x);}uchar getkey(void) //获取键值{uchar z,x=16;P1OUT=0x00;if((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN& BIT4))){delay(10000);if((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN& BIT4))){for(z=0;z<=1;z++){P1OUT=~BIT0;if(!(P1IN&BIT7)){x=3;break;}P1OUT=~BIT0;if(!(P1IN&BIT6)){x=7;break;}P1OUT=~BIT0;if(!(P1IN&BIT5)){x=11;break;}P1OUT=~BIT0;if(!(P1IN&BIT4)){x=15;break;}//line 1P1OUT=~BIT1;if(!(P1IN&BIT7)){x=2;break;}P1OUT=~BIT1;if(!(P1IN&BIT6)){x=6;break;}P1OUT=~BIT1;if(!(P1IN&BIT5)){x=10;break;}if(!(P1IN&BIT4)){x=14;break;}//line3P1OUT=~BIT3;if(!(P1IN&BIT6)){x=4; break;}P1OUT=~BIT3;if(!(P1IN&BIT7)){x=0; break;}P1OUT=~BIT3;if(!(P1IN&BIT5)){x=8; break;}P1OUT=~BIT3;if(!(P1IN&BIT4)){x=12; break;}//line 2P1OUT=~BIT2;if(!(P1IN&BIT6)){x=5; break;}P1OUT=~BIT2;if(!(P1IN&BIT7)){x=1; break;}P1OUT=~BIT2;if(!(P1IN&BIT5)){x=9; break;}P1OUT=~BIT2;if(!(P1IN&BIT4)){x=13; break;}}while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1 IN&BIT4)))for(uchar j=0;j<=7;j++){P4OUT=0x80>>j;P2OUT=leddata[time[j]];delay(500);}delay(20000);while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1 IN&BIT4)))for(uchar j=0;j<=7;j++){P4OUT=0x80>>j;P2OUT=leddata[time[j]]; delay(500);}delay(20000);}}return (x);}。
利用单片机实现简单功能计算器设计
基于单片机的多功能计算器设计1.方案论证与选择1.1输入模块方案一:采用独立式按键作为输入模块,其特点:直接用I/O口构成单个按键电路,接口电路配置灵活、按键识别和软件结构简单,但是当键数较多时,占用I/O口较多,比较浪费资源;其原理图如图1所示:图1 独立的功能按键方案二:采用矩阵式键盘作为输入电路,其特点:电路和软件稍复杂,但相比之下,当键数越多时越节约I/O口,比较节省资源。
其原理图如图2所示:图2 矩阵键盘输入本设计使用键盘输入预置用于计算或计时,按键较多。
若采用独立按键,需频繁按键,为软件设计增加负担,且操作界面不友好。
若采用矩阵式按键,可以方便地输入一个数值,使操作界面更具人性化,节约了宝贵的I/O口资源。
通过对比,故采用方案二作为系统输入模块。
1.2显示模块:方案一:用LCD显示,要用LCD显示,需要学习其专用的驱动控制芯片,比如HD61203,软件实现较为复杂,且LCD的价格昂贵。
方案二:采用LED数码管串行静态显示,虽然其显示亮度高,但是如果显示器的位数较多,需要增加锁存器,故而静态显示占用I/O口线较多,CPU的开销较大。
方案三:采用LED数码管并行动态显示,显示亮度不及静态显示,但电路简单,适合于显示位数较多的情况。
表1 用LED显示器显示十六位进制数的字形代码在下图表示:综上所述,采用方案三并行动态显示是本设计最佳显示方案。
LED数码管显示器由6个发光二极管组成,因此也称之为6段LED显示器,其排列形状如上。
注:该设计电路中的6段LED数码显示器是共阳极的。
2.其他硬件电路模块功能介绍:2.1驱动模块该设计的驱动电路是由74LS245来驱动的。
74LS245是我们常用的芯片,用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
MSP430单片机课程设计-简单计算器设计
MSP430 单片机课程设计
unsigned char disbuff[8] = {20,20,0,0,0,0,0,0};//初始数码管 unsigned char getkey(void); unsigned int qiushu(); void clear(void); void zhuanhuan(); void delay(unsigned int j) { for(uint i=0;i<j;i++); } unsigned int qiushu() //转化成相应的十进制整数 {unsigned int y; y=disbuff[2]*100000+disbuff[3]*10000+disbuff[4]*1000+disbuff[5]*100 +disbuff[6]*10+disbuff[7]; return y; } void clear(void) {unsigned int a; for(a=7;a>1;a--) disbuff[a]=0; } //清除屏幕
实验二:猜数字游戏设计
一、目的
利用单片机芯片 MSP430x14x、四位八段共阴数码管,设计一个猜数字游戏, 并将游戏结果显示在数码管上。
二、功能
要求该设计能实现如下的功能:游戏开始后,先在程序内随即设定四个 0-9 之间的不同数,作为游戏数答案。然后用户给出 4 个数,该软件会将您提交的数 与它自动产生的数进行比较,结果在八段数码管上显示成"kAsB"。k 代表位置正 确数字也正确的字数,s 代表数字正确但位置不正确的字数。当 k=4 且 s=0 时, 则比较正确显示“GOOD” ,进行下一次比较。
4
MSP430 单片机课程设计
单片机简易计算器的设计
单片机简易计算器的设计引言:计算器是一种非常重要的工具,用于完成数学运算和简单的计算任务。
随着科技的不断发展,计算器已经得到了很大的改进,从最初的机械计算器到电子计算器,再到如今的智能手机应用程序。
本文将介绍一种基于单片机的简易计算器的设计。
一、设计要求1.实现基本的加、减、乘、除四则运算;2.具备清零、删除、退格等基本操作;3.显示输出结果;4.设计简洁,易于使用。
二、设计思路1.系统硬件设计本次设计使用了AT89C51单片机作为核心芯片。
将键盘、显示器、运算模块以及时钟模块等连接到单片机上。
键盘用于输入运算表达式,显示器用于显示结果,运算模块用于进行运算,时钟模块用于提供系统的时钟信号。
2.系统软件设计系统软件设计主要包括键盘输入的处理、运算过程的计算和结果的输出。
系统通过不断轮询键盘输入,并根据输入的字符进行相应操作。
运算过程通过运算模块实现,根据输入的表达式进行相应运算,并将结果输出到显示器上。
三、系统实现1.键盘输入的处理单片机通过轮询键盘输入,并将输入的字符存储在缓冲区中,然后根据不同的字符进行相应的操作。
比如,按下数字键后,将数字存储到缓冲区中;按下运算符号后,将缓冲区中的数字和上一次的运算符进行运算。
同时,系统还需要根据不同的操作进行错误处理,比如错误的输入表达式。
2.运算过程的计算系统通过运算模块实现运算过程的计算。
当用户按下等号键时,系统根据输入的表达式进行相应的运算。
比如,根据输入的加号进行加法运算,根据输入的减号进行减法运算,以此类推。
如果输入的表达式有错误,系统将进行错误处理并给出相应的提示。
3.结果的输出系统将计算得到的结果通过显示器输出。
利用显示模块将计算结果显示到显示屏上,并保持一定的显示格式,使结果更易于读取和理解。
四、系统测试在设计完成后,需要对系统进行测试,验证系统的正确性和稳定性。
可以通过输入一系列测试用例并观察系统的输出结果来进行测试。
如果测试的结果符合预期,说明系统设计成功。
基于MSP430单片机的计算器设计
基于MSP430单片机的计算器设计电信0804 高思宇u200812909
一、系统功能
本设计采用MSP430单片机作为系统输入、计算、显示、控制的核心。
采用4*4键盘作为输入设备,LCD作为输出设备。
进行运算时,用户通过键盘输入算式,经单片机处理,显示器就可以显示结果。
二、系统框图
亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。
先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。
侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。
先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。
后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
先帝知臣谨慎,故临崩寄臣以大事也。
受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。
今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。
此臣所以报先帝而忠陛下之职分也。
至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。
若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。
臣不胜受恩感激。
今当远离,临表涕零,不知所言。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <msp430x14x.h>
const unsigned char data[22] ={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,
0x8f,0xbf,0x89,0xb9,
0xff,0xaf};//0~9 a~f 符号
unsigned char segment[8] = {20,20,0,0,0,0,0,0};//初始数码管
unsigned char flag1=0;
void delay(unsigned int j)
{
unsigned int i;
for(i=0;i<j;i++);
}
unsigned int jisuan()
{unsigned int y;
y=segment[2]*100000+segment[3]*10000+segment[4]*1000+segment[5]*100+segment[6]*10+s egment[7];
return y;
}
void clear(void)
{unsigned int a;
for(a=7;a>1;a--)
segment[a]=0;
}
void zhuanhuan( unsigned long r)
{
segment[7]=r%10;
segment[6]=r/10%10;
segment[5]=r/100%10;
segment[4]=r/1000%10;
segment[3]=r/10000%10;
segment[2]=r/100000%10;
}
unsigned char getkey(void)
{
unsigned char m,n=16;
P1OUT=0x00;
if((!(P1IN&BIT4))||(!(P1IN&BIT5))||(!(P1IN&BIT6))||(!(P1IN&BIT7)))
{delay(10000);
if((!(P1IN&BIT4))||(!(P1IN&BIT5))||(!(P1IN&BIT6))||(!(P1IN&BIT7)))
{
flag1=1;
for(m=0;m<=2;m++)
{
P1OUT=~BIT0;
if(!(P1IN&BIT7)){n=3;break;}
if(!(P1IN&BIT6)){n=7;break;}
if(!(P1IN&BIT5)){n=11;break;}
if(!(P1IN&BIT4)){n=15;break;}
P1OUT=~BIT1;
if(!(P1IN&BIT7)){n=2;break;}
if(!(P1IN&BIT6)){n=6;break;}
if(!(P1IN&BIT4)){n=14;break;}
if(!(P1IN&BIT5)){n=10;break;}
P1OUT=~BIT2;
if(!(P1IN&BIT7)){n=1; break;}
if(!(P1IN&BIT6)){n=5; break;}
if(!(P1IN&BIT5)){n=9; break;}
if(!(P1IN&BIT4)){n=13; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT7)){n=0; break;}
if(!(P1IN&BIT6)){n=4; break;}
if(!(P1IN&BIT5)){n=8; break;}
if(!(P1IN&BIT4)){n=12; break;}
delay(20000);
while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN&BIT4)))
for(unsigned char j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=data[segment[j]];
delay(500);
}
delay(20000);
}
}
}
return (n);
}
void main(void)
{
unsigned char flag=0,i=9;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P5DIR|=BIT7;
P5OUT&=~BIT7;
P4DIR=0xff;
P2DIR=0xff;
P1DIR=0x0f;
P1OUT=0xff;
while(1)
{ unsigned long p,q,r;
unsigned long s=1;
segment[1]=20;
i=getkey();
if((i<10)&(flag1=1))
{
segment[2]=segment[3];
segment[3]=segment[4];
segment[4]=segment[5];
segment[5]=segment[6];
segment[6]=segment[7];
segment[7]=i;
flag1=0;
}
else {
switch(i)
{case 15:segment[0]=19;p=jisuan();clear();flag=15;break;
case 14:segment[0]=18;p=jisuan();clear();flag=14;break;
case 13:segment[0]=17;p=jisuan();clear();flag=13;break;
case 12:segment[0]=16;p=jisuan();clear();flag=12;break;
case 10:segment[0]=10;p=jisuan();clear();flag=10;break;
case 11:{q=jisuan(); clear();
switch(flag)
{case 12:r=p+q;break;
case 13:r=p-q;break;
case 14:r=p*q;break;
case 15:r=p/q;break;
case 10:for(unsigned i=q;i>0;i--)
{ s=p*s;}
r=s;break;
}
if(r>999999)
{clear();segment[5]=14;segment[6]=14;segment[7]=21; }
else
zhuanhuan(r);
}
break;
}
}
for(unsigned char j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=data[segment[j]];
delay(200);
}
}
}。