简易计算器设计-msp430-C语言

合集下载

简易计算器C语言代码

简易计算器C语言代码

#include<stdio.h>#include<math.h>int main(void){int choice,t=1;printf("**********************计算器*****************************************\n"); printf(" 1.加法运算2.减法运算\n"); printf(" 3.乘法运算4.除法运算\n"); printf(" 5.平方运算6.开方运算\n"); printf(" 7.解一元二次方程By:_一念成殇、\n"); printf("**********************************************************************\n");printf("请选择您即将进行的运算方式(输入对应数字):");while(t==1){scanf("%d",&choice);if(choice>7) printf("请您输入正确的选项编号!\n");//加法if(choice==1){float addend_1,addend_2,sum;printf("请输入两个加数:\n");scanf("%f",&addend_1);scanf("%f",&addend_2);sum=addend_1+addend_2;printf("结果为:%.2f",sum);}//减法if(choice==2){float reduction,minuend,difference;printf("请输入被减数和减数:\n");scanf("%f",&reduction);scanf("%f",&minuend );difference=reduction-minuend ;printf("结果为:%.2f",difference);}//乘法if(choice==3){float multiplier_1,multiplier_2,product;printf("请输入两个乘数:\n");scanf("%f",&multiplier_1);scanf("%f",&multiplier_2);product= multiplier_1 * multiplier_2;printf("结果为:%.2f",product);}//除法if(choice==4){float dividend,divisor,conslut;printf("请输入被除数和除数:\n");scanf("%f",&dividend);scanf("%f",&divisor);conslut=dividend/divisor;printf("结果为:%.2f",conslut);}//平方if(choice==5){float base,power;printf("请输入底数:\n");scanf("%f",&base);power=base*base;printf("结果为:%.2f",power);}//开方if(choice==6){float power,base;printf("请输入需要开方的数:\n");scanf("%f",&power);base=sqrt(power);printf("结果为:%.2f",base);}//解一元二次方程if(choice==7){float a,b,c,delta,root_1,root_2;printf("方程一般形式:ax^2+bx+c=0,请输入其中常量a,b,c的值:\n"); scanf("%f",&a);if(a==0){printf("此方程不是一元二次方程!请重新输入!\n");}else{scanf("%f",&b);scanf("%f",&c);delta=(b*b)-(4*a*c);printf("△=%f\n",delta);if(delta<0){printf("此方程无实数根.\n");}else{root_1=(sqrt(delta)-b)/(2.0*a);root_2=((-b)-sqrt(delta))/(2.0*a);printf("解得:x1=%f x2=%f\n",root_1,root_2);}}}printf("\n\n\n\n请选择您即将进行的运算方式(输入对应数字):"); }return 0;}。

简易计算器C语言代码

简易计算器C语言代码

简易四则运算计算器计算机工具地历史而言,中国古代最早采用地一种计算工具叫筹策,又叫做算筹,这种算筹多用竹子制成,也有用木头,兽骨充当材料的,大约270枚一束,放在布袋里可随身携带。

直到今天仍在使用的住算盘,是中国古代计算工具领域中的另一项发明明代时的住算盘已经与现代的住算盘几乎相同。

17世纪初,西方国家的计算工具有了较大的发展。

英国数学家纳尔发现了“纳皮尔算筹”;英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘涂,乘方和开方运算,甚至可以计算三角函数,指数函数和对数函数。

这些计算工具不仅带动了计算的发展,也为现代计算器发展尊定了良好的基础,成为现代社会应用广泛的计算工具,如手机,操作系统上附带的多功能计算器。

项目设计目的掌握模块的划分;掌握结构体定义;掌握栈的操作;掌握函数的定义;掌握栈的基本操作;掌握VC的基本绘图库;掌握鼠标的响应操作;目设计内容设计一个含有界面的计算器,输入一个包含括号的表达式,使用栈数据类型实现整数的四则运算操作,开方运算。

项目设计要求根据分析,系统要求实现以下几点基本功能:可通过按钮输入数字、运算符;能通过按钮实现退格、清除功能;实现加、减、乘、除、开方运算功能;实现括号运算;显示运算结果;良好的交互界面。

项目详细设计功能模块图根据系统功能要求,主要含有四大模块,分别是计算器界面设计模块、计算器按键控制模块、四则混合运算模块、计算器记忆处理模块。

计算器界面设计模块:调用VC图形系统函数和字符函数画出计算器的界面,包括24个按钮和一个文本输入框。

计算机按键控制模块:计算器通过键盘按键值的判断,执行相应的操作,如接收数字输入等。

计算器计算处理模块。

计算处理模块主要完成可以包括括号的表达式运算,运算包括加,减,乘,除、开方。

计算处理模块在按键控制模块中被调用执行。

处理模块是通过栈来实现的,分别定义了两个顺序栈,一个用来存放操作符栈,一个用来存放操作数栈。

计算器记忆处理模块。

c语言制作简单的计算器

c语言制作简单的计算器

c语言制作简单的计算器在计算机编程领域中,C语言是一种广泛使用的编程语言之一。

它具有简单易学的特点,并且能够进行复杂的计算和逻辑处理。

今天,我们就来学习一下如何使用C语言来制作一个简单的计算器。

首先,我们需要明确我们计算器的功能和界面设计。

本次制作的计算器将具有基本的四则运算功能,即加法、减法、乘法和除法。

我们将在控制台中实现计算器的操作,并通过简单的用户界面进行交互。

接下来,我们需要创建一个C语言程序的框架。

首先,我们需要包含头文件,以便在程序中使用各种函数和变量。

我们可以使用"#include" 来引入头文件,例如:```c#include <stdio.h>```然后,我们需要定义主函数 `main()`。

在这个函数中,我们将编写计算器的逻辑代码。

让我们开始编写函数吧!首先,我们需要声明一些变量来存储用户输入的数字和运算符。

我们可以使用 `int` 来定义整数变量,并用 `char` 定义字符变量。

例如:```cint num1, num2, result;char operator;```接下来,我们需要提示用户输入要进行的运算,并读取用户输入的数字和运算符。

我们可以使用 `printf` 和 `scanf` 函数来完成这个任务,例如:```cprintf("请输入第一个数字: ");scanf("%d", &num1);printf("请输入运算符(+, -, *, /): ");scanf(" %c", &operator);printf("请输入第二个数字: ");scanf("%d", &num2);```注意,我们在读取运算符之前添加了空格,这是为了消除输入缓冲区中可能残留的换行符等字符。

接下来,我们需要编写代码来进行实际的计算操作。

MSP430单片机入门例程

MSP430单片机入门例程

MSP430单片机入门例程MSP430单片机是一款低功耗、高性能的16位单片机,广泛应用于各种嵌入式系统。

下面是一个简单的MSP430单片机入门例程,可以让大家初步了解MSP430单片机的基本使用方法。

所需材料:1、MSP430单片机开发板2、MSP430单片机编译器3、MSP430单片机调试器4、电脑和相关软件步骤:1、安装MSP430单片机编译器首先需要安装MSP430单片机的编译器,该编译器可以将C语言代码编译成MSP430单片机可以执行的机器码。

在安装编译器时,需要选择与您的单片机型号匹配的编译器。

2、编写程序下面是一个简单的MSP430单片机程序,可以让LED灯闪烁:c本文include <msp430.h>int main(void)本文P1DIR |= 0x01; //设置P1.0为输出while(1){P1OUT ^= 0x01; //反转P1.0的状态,LED闪烁__delay_cycles(); //延时一段时间,控制闪烁频率}本文上述程序中,首先定义了P1DIR寄存器,将P1.0设置为输出。

然后进入一个无限循环,在循环中反转P1.0的状态,使LED闪烁。

使用__delay_cycles()函数实现延时,控制LED闪烁频率。

3、编译程序使用MSP430单片机编译器将程序编译成机器码,生成可执行文件。

在编译时,需要注意选择正确的编译器选项和单片机型号。

4、调试程序使用MSP430单片机调试器将可执行文件下载到单片机中,并使用调试器进行调试。

在调试时,可以观察单片机的输出口状态和LED灯的闪烁情况,确保程序正常运行。

随着嵌入式系统的发展,MSP430单片机作为一种低功耗、高性能的微控制器,在各种应用领域中得到了广泛的应用。

为了更好地理解和应用MSP430单片机,我在学习过程中积累了一些经验,现在分享给大家。

MSP430单片机是一种超低功耗的微控制器,由德州仪器(Texas Instruments)推出。

计算器编程c语言

计算器编程c语言

计算器编程 c语言用C语言设计计算器程序源代码#include <dos.h> /*DOS接口函数*/#include <math.h> /*数学函数的定义*/#include <conio.h> /*屏幕操作函数*/函数*/#include <stdio.h> /*I/O#include <stdlib.h> /*库函数*/变量长度参数表*/#include <stdarg.h> /*图形函数*/#include <graphics.h> /*字符串函数*/#include <string.h> /*字符操作函数*/#include <ctype.h> /*#define UP 0x48 /*光标上移键*/#define DOWN 0x50 /*光标下移键*/#define LEFT 0x4b /*光标左移键*/#define RIGHT 0x4d /*光标右移键*/#define ENTER 0x0d /*回车键*/void *rar; /*全局变量,保存光标图象*/使用调色板信息*/struct palettetype palette; /*int GraphDriver; /* 图形设备驱动*/int GraphMode; /* 图形模式值*/int ErrorCode; /* 错误代码*/int MaxColors; /* 可用颜色的最大数值*/int MaxX, MaxY; /* 屏幕的最大分辨率*/double AspectRatio; /* 屏幕的像素比*/void drawboder(void); /*画边框函数*/初始化函数*/void initialize(void); /*计算器计算函数*/void computer(void); /*改变文本样式函数*/ void changetextstyle(int font, int direction, int charsize); /*窗口函数*/void mwindow(char *header); /*/*获取特殊键函数*/int specialkey(void) ;设置箭头光标函数*//*int arrow();/*主函数*/int main(){设置系统进入图形模式 */initialize();/*运行计算器 */computer(); /*系统关闭图形模式返回文本模式*/closegraph();/*/*结束程序*/return(0);}/* 设置系统进入图形模式 */void initialize(void){int xasp, yasp; /* 用于读x和y方向纵横比*/GraphDriver = DETECT; /* 自动检测显示器*/initgraph( &GraphDriver, &GraphMode, "" );/*初始化图形系统*/ErrorCode = graphresult(); /*读初始化结果*/如果初始化时出现错误*/if( ErrorCode != grOk ) /*{printf("Graphics System Error: %s\n",显示错误代码*/grapherrormsg( ErrorCode ) ); /*退出*/exit( 1 ); /*}getpalette( &palette ); /* 读面板信息*/MaxColors = getmaxcolor() + 1; /* 读取颜色的最大值*/MaxX = getmaxx(); /* 读屏幕尺寸 */MaxY = getmaxy(); /* 读屏幕尺寸 */getaspectratio( &xasp, &yasp ); /* 拷贝纵横比到变量中*/计算纵横比值*/ AspectRatio = (double)xasp/(double)yasp;/*}/*计算器函数*/void computer(void){定义视口类型变量*/struct viewporttype vp; /*int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;操作数和计算结果变量*/float num1=0,num2=0,result; /*char cnum[5],str2[20]={""},c,temp[20]={""};定义字符串在按钮图形上显示的符号 char str1[]="1230.456+-789*/Qc=^%";/**/mwindow( "Calculator" ); /*显示主窗口 */设置灰颜色值*//*color = 7;getviewsettings( &vp ); /* 读取当前窗口的大小*/width=(vp.right+1)/10; /* 设置按钮宽度 */设置按钮高度 */height=(vp.bottom-10)/10 ; /*/*设置x的坐标值*/x = width /2;设置y的坐标值*/y = height/2; /*setfillstyle(SOLID_FILL, color+3);bar( x+width*2, y, x+7*width, y+height );/*画一个二维矩形条显示运算数和结果*/setcolor( color+3 ); /*设置淡绿颜色边框线*/rectangle( x+width*2, y, x+7*width, y+height );/*画一个矩形边框线*/设置颜色为红色*/setcolor(RED); /*输出字符串"0."*/outtextxy(x+3*width,y+height/2,"0."); /*/*设置x的坐标值*/x =2*width-width/2;设置y的坐标值*/y =2*height+height/2; /*画按钮*/for( j=0 ; j<4 ; ++j ) /*{for( i=0 ; i<5 ; ++i ){setfillstyle(SOLID_FILL, color);setcolor(RED);bar( x, y, x+width, y+height ); /*画一个矩形条*/rectangle( x, y, x+width, y+height );sprintf(str2,"%c",str1[j*5+i]);/*将字符保存到str2中*/outtextxy( x+(width/2), y+height/2, str2);移动列坐标*/x =x+width+ (width / 2) ;/*}y +=(height/2)*3; /* 移动行坐标*/x =2*width-width/2; /*复位列坐标*/}x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y); /*移动光标到x,y位置*/显示光标*/arrow(); /*putimage(x,y,rar,XOR_PUT);m=0;n=0;设置str2为空串*/strcpy(str2,""); /*当压下Alt+x键结束程序,否则执行下面的循环while((v=specialkey())!=45) /**/{当压下键不是回车时*/while((v=specialkey())!=ENTER) /*{putimage(x,y,rar,XOR_PUT); /*显示光标图象*/if(v==RIGHT) /*右移箭头时新位置计算*/if(x>=x0+6*width)如果右移,移到尾,则移动到最左边字符位置*//*{x=x0;m=0;}else{x=x+width+width/2;m++;否则,右移到下一个字符位置*/} /*if(v==LEFT) /*左移箭头时新位置计算*/if(x<=x0){x=x0+6*width;m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/else{x=x-width-width/2;m--;} /*否则,左移到前一个字符位置*/if(v==UP) /*上移箭头时新位置计算*/if(y<=y0){y=y0+4*height+height/2;n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/else{y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/if(v==DOWN) /*下移箭头时新位置计算*/if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/else{y=y+height+height/2;n++;} /*否则,移到下边一个字符位置*/putimage(x,y,rar,XOR_PUT); /*在新的位置显示光标箭头*/ }将字符保存到变量c中*/c=str1[n*5+m]; /*判断是否是数字或小数点*/if(isdigit(c)||c=='.') /*{如果标志为-1,表明为负数*/if(flag==-1) /*{将负号连接到字符串中*/strcpy(str2,"-"); /*flag=1;} /*将标志值恢复为1*/将字符保存到字符串变量temp中*/ sprintf(temp,"%c",c); /*将temp中的字符串连接到str2中*/strcat(str2,temp); /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,str2); /*}if(c=='+'){将第一个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算加法标志值*/act=1; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='-'){如果str2为空,说明是负号,而不是减号*/ if(strcmp(str2,"")==0) /*设置负数标志*/flag=-1; /*else{将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*act=2; /*做计算减法标志值*/setfillstyle(SOLID_FILL,color+3);画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}}if(c=='*'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算乘法标志值*/act=3; /*setfillstyle(SOLID_FILL,color+3); bar(2*width+width/2,height/2,15*width /2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='/'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算除法标志值*/act=4; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,"0."); /*显示字符串*/}if(c=='^'){将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算乘方标志值*/act=5; /*设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='%'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算模运算乘方标志值*/act=6; /*setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='='){将第二个操作数转换为浮点数*/num2=atof(str2); /*根据运算符号计算*/switch(act) /*{case 1:result=num1+num2;break; /*做加法*/case 2:result=num1-num2;break; /*做减法*/case 3:result=num1*num2;break; /*做乘法*/case 4:result=num1/num2;break; /*做除法*/case 5:result=pow(num1,num2);break; /*做x的y次方*/case 6:result=fmod(num1,num2);break; /*做模运算*/ }设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*将结果保存到temp中*/sprintf(temp,"%f",result); /*outtextxy(5*width,height,temp); /*显示结果*/}if(c=='c'){num1=0; /*将两个操作数复位0,符号标志为1*/num2=0;flag=1;strcpy(str2,""); /*将str2清空*/设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}如果选择了q回车,结束计算程序*/if(c=='Q')exit(0); /*}putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/返回*/return; /*}/*窗口函数*/void mwindow( char *header ){int height;cleardevice(); /* 清除图形屏幕 */setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*//* 设置视口大小 */ setviewport( 20, 20, MaxX/2, MaxY/2, 1 );height = textheight( "H" ); /* 读取基本文本大小 */settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/输出标题*/outtextxy( MaxX/4, 2, header ); /*setviewport( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/ 画边框*/drawboder(); /*}画边框*/void drawboder(void) /*{定义视口类型变量*/struct viewporttype vp; /*setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/将当前视口信息装入vp所指的结构中*/getviewsettings( &vp );/*画矩形边框*/rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*}/*设计鼠标图形函数*/int arrow(){int size;定义多边形坐标*/int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*设置填充模式*/setfillstyle(SOLID_FILL,2); /*/*画出一光标箭头*/fillpoly(8,raw);测试图象大小*/size=imagesize(4,4,16,16); /*分配内存区域*/rar=malloc(size); /*存放光标箭头图象*/getimage(4,4,16,16,rar); /*putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/return 0;}/*按键函数*/int specialkey(void){int key;等待键盘输入*/while(bioskey(1)==0); /*key=bioskey(0); /*键盘输入*/只取特殊键的扫描值,其余为0*/ key=key&0xff? key&0xff:key>>8; /*return(key); /*返回键值*/}。

MSP430单片机C语言和汇编语言混合编程刍议

MSP430单片机C语言和汇编语言混合编程刍议
语言各 自的编程 优势与局 限性 ,进行计算机软件产品 的开发 设计过程中 , 可 以考虑将两种语言混合使用, 进行软件产品的 编程设计与开发实现。使用 C语言 与汇编语言混合编程的方
信 息都 是按照堆栈结构方式进行传递实现 ,并且堆栈结构形
成过程 中, 也是按照从右到左 的顺序形成的 。并且, 在堆栈传 递的过程 中,如果传递函数中最左 边的两个 函数是结构或者
关键 词: MS P 4 3 0 单片机 ; C语 言; 汇编语 言; 编程设计; 软件开发 ; 分析 中图分类号 : T G 8 4 文献标识码 : A 文章编号 ; 1 6 7 3 — 1 1 3 1 ( 2 0 1 3 ) 0 1 — 0 0 7 2 — 0 2
根据上文所 述的 C语言与汇编语 言混合编程方法 ,以及
1 C语言 和汇 编语 言 的特点 以及 混合编 程 方法
1 . 1 C语 言和 汇编 语言 编程 设计 的特 点
在进行计算机应用程序 以及软件系统程序的编写设计应
目前进行 MS P 4 3 0 单片机 芯片软件开发设计的常用 L A R E m 。
b e d d e d Wo r k b e n c h软件系统 , 该系统在进行 MS P 4 3 0单片机
该 寄存器功能在进行 C语 言编译程序 的传递调用时不需要进 行保护 。此外 , L A R系统 中普通寄存器则主要是对 C语 言编 译器 的程序编译变量 以及编译过程进行 寄存保护实现 ,这组 寄存器 中的C语言编译信 息, 在进行混合编程 调用 时, 需要进
行保护 , 保护 功能由 C语言编译器 自动实现进行 。 在L AR系统 中, C语 言编译器 中的 C语言编译程序数据 参数在被调用过程 中, 没进行一次函数的调用, 就会建立一个

C语言实现简单的计算器(加、减、乘、除)

C语言实现简单的计算器(加、减、乘、除)

C语⾔实现简单的计算器(加、减、乘、除) 利⽤运算符做为swich case 语句条件,实现简单程序的编写;并且对输⼊的运算做判断,除数为零也需做判断;1 #include<stdio.h>23int add(int a, int b);4int sub(int a, int b);5int mul(int a, int b);6int div(int a, int b);789int main(int argc, const char *argv[])10 {11/*12 * 定义接收变量,运算字符;13*/14int a,b,d;15char ch;1617/*18 * 赋初值19*/20 a = 0;21 b = 0;22 ch = '0';232425/*26 * 控制台输⼊运算变量,运算符;27*/28 printf("请输⼊需要计算的数及运算符;格式如:'num1 +-x/ num2' \n");29 scanf("%d%c%d",&a,&ch,&b);3031/*32 * 输⼊数据判断33*/34while((ch != '+')&&(ch != '-')&&(ch != '*')&&(ch != '/'))35 {36//fflush(stdin);此种清空缓冲区⽆效37 setbuf(stdin,NULL);38 printf("输⼊运算符有误,请重新输⼊:\n");39 scanf("%c",&ch);40 }4142/*43 * 除数为0做判断44*/45if((ch == '/')&&(b==0))46 {47 setbuf(stdin,NULL);48 printf("除数不能为0,请重新输⼊:\n");49 scanf("%d",&b);50 }515253/*54 * 识别不同运算字符,做不同的运算;55*/56switch(ch)57 {58case'+':59 printf("%d+%d=%d\n",a,b,add(a,b));60break;61case'-':62 printf("%d-%d=%d\n",a,b,sub(a,b));63break;64case'*':65 printf("%d*%d=%d\n",a,b,mul(a,b));66break;67case'/':68 printf("%d/%d=%d\n",a,b,div(a,b));69break;70default:71 printf("Error\n");72 }7374return0;75 }7677/*78* 定义运算函数79*/80int add(int a, int b) 81 {82return a+b;83 }8485int sub(int a, int b) 86 {87return a-b;88 }8990int mul(int a, int b) 91 {92return a*b;93 }9495int div(int a, int b) 96 {97return a/b;98 }。

msp430的一些常用的C语言控制程序---ADC12(1)

msp430的一些常用的C语言控制程序---ADC12(1)

msp430的一些常用的C语言控制程序---ADC12(1)说说关于AD 的程序吧:就写一下最简单的单通道单次采集吧://查询方式获取AD 值#include //我们的系统板子是msp430f149,所以得用这个头文件~void ADC_Init(void);unsigned ADC_Result;void main(void){ WDTCTL = WDTPW + WDTHOLD; ADC_Init(); while(1){ ADC12CTL0 |= ADC12SC;//ADC12SC 是当SAMPCON 由采样定时器产生,ADC12SC 由0 改为1 启动转换while(ADC12CTL1 & BIT0 == 1);//当ADC12BUSY == 1 时等待ADC_Result = ADC12MEM0;//这块可单步运行时在IAR 中观察到,或者有LED,可能对它处理一下显示~ }}//void ADC_Init(void) //初始化时钟{ P6DIR &= ~BIT6;//设置p6.6为输入,这个口和板子上的接口有关.对了,149 内置的是12 位AD,精度足够一般用了P6SEL |= BIT6; //选择P6.6 的第二功能口ADC12CTL0 = ADC12ON + REFON + SHT0_6 ;//AD 电源打开、参考电压打开、采样时间分频设置,一般6 或8 ADC12CTL0 &= ~REF2_5V; //选择1.5V 参考电压,这个因为采集到的电压值变化有关ADC12CTL1 |= SHP + CONSEQ_0+ SHS_0; //使用采样时钟,单通道单次采样ADC12MCTL0 = SREF_1 + INCH_6; //选择AD 参考电压和输入通道ADC12CTL0 |= ENC; //ADC 转化使能,此处一定得放在后面,要不结果容易出错} 这就是最简单的AD 采集了,430 还有另外三种模式,原理都差不多,就是多寄存器中的各位操作,这里我没有用中断模式,另外的三中模式得用中断方式来获得数据tips:感谢大家的阅读,本文由我司收集整编。

C语言编程-简单的计算器

C语言编程-简单的计算器
double jieguo;
int i=0;
a[0]='$';
printf("请输入表达式,退出请输入q:\n\n");
scanf("%c",&x);
if(x=='q') break;
while(x!='\n')
{
a[++i]=x;
scanf("%c",&x);
}
a[i+1]='\0';
jieguo=jisuan(a);
}
j=j+1;
x=z;
if(a[j]=='.')
{
l=1;
i=j+1;
j=i+1;
while(a[j]>='0'&&a[j]<='9')
{j++;}
j--;
for(k=i;k<=j;k++)
{
n=pow(0.1,l);
l=l+1;
x=x+n*(a[k]-'0');
}
i=j+1;
}
else i=j;
shu.data[++shu.top].d1=x;
nibo[t1+1]='\0';
t2--;
}
zhan2[++t2]=a[i];
i++;
}
}
else if(a[i]=='*'||a[i]=='/')

MSP430单片机C语言编程

MSP430单片机C语言编程
CCR0 =32768; // 设置计数器CCR0初值
TACTL |= MC0; //设置定时器工作模式为加计数到CCR0初值
P3DIR = 0XFF; //P3口为输出
P4DIR = 0XFF; //P4口为输出
P5DIR = 0XFF; //P5口为输出
P3OUT = 0X7E; //P3口输出为0111 1110
void main (void)
{
WDTCTL= WDTPW + WDTTMSEL+WDTSSEL;
IE1|=WDTIE;
P3DIR |=BIT7;
_EINT();
while(1);
}
interrupt[WDT_VECTOR] void WDT_interrupt (void)
P3DIR |=BIT7; //将P3.7设置为输出
_EINT(); //调用C430编译器内部函数,使能中断
while(1); //无限次循环
}
interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A中断函数
{
P3OUT ^= BIT7; //P3.7位取反
右侧数码管与P4口相连,a~g,h对应P4.0~P4.7
(2)发光二极管
8 个发光二极管与P3 口连接
(3)按钮:
左侧8个按钮与P2口相连,引脚号标在按钮上方
右侧8个按钮与P1口相连,引脚号标在按钮上方
(4)P2.3引脚还是模拟比较器输入
(5)P6.0,P6.1引脚连接模拟量电位器,用于模拟量实验
//定义七段译码的共阳数码管显示数组
// hgfg dcba

C语言实现简单计算器程序

C语言实现简单计算器程序

C语⾔实现简单计算器程序这两天在看⼀个C语⾔写的计算器程序,做了不少的功夫,跟着作者⼀步步的进⾏完善,了解了许多细节性的东西,在此⾃⼰做个总结,加深⾃⼰对程序的印象,也算是梳理。

在该计算器程序,能进⾏加减乘除、sin、cos、exp等操作,同时能进⾏数值保存功能。

⽽该计算器使⽤逆波兰表⽰法。

即所有运算符都跟在操作数的后⾯,⽐如下列表达式:(1 - 2) * (4 + 5)采⽤逆波兰表⽰法表⽰为:1 2 - 4 5 + *逆波兰表达法中不需要圆括号,只要知道每个运算符需要⼏个操作数就不会引起歧义。

计算器程序实现很简单,具体原理如下:while(/* 下⼀个运算符或操作数不是⽂件结束指⽰符 */)if(/* 是数 */)/* 将该数压⼊到栈中 */else if (/* 是运算符 */)/* 弹出所需数⽬的操作数 *//* 执⾏运算 *//* 将结果压⼊到栈中 */else if (/* 是换⾏符 */)/* 弹出并打印栈顶的值 */else/* 出错 */在程序设计中,使⽤模块化思想,getop函数来进⾏读⼊,该函数返回⼀个标识,⽤来标识读⼊的是什么类型。

主循环体中根据该标识执⾏相应的动作。

以下是该程序:(我将所有函数和变量放在同⼀⽂件)#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXOP 100#define NUMBER '0' //标识读⼊的是数字#define NAME 'n' //标识读⼊的是字符串(函数名或⾮法字符串)#define ALPHA 26int getop(char []);void push (double); //压栈double pop(void); //出栈void clear(void); //清空栈void mathfnc(char []); //执⾏相应的数学函数sin、cos、exp等int main(void){int type;int i, var = 0;double op1, op2,v;char s[MAXOP];double variable[ALPHA];for (i = 0; i < ALPHA; i++) //初始化⽤于保存数值的变量数组variable[i] = 0.0;while ((type = getop(s)) != EOF) //读取输⼊{switch (type){case NUMBER:push (atof(s));break;case NAME:mathfnc(s);break;case '+':push (pop() + pop());break;case '*':push (pop() * pop());break;case '-':op2 = pop();push (pop() - op2);break;case '/':op2 = pop();if (op2 != 0.0)push (pop() / op2);elseprintf ("error: zero divisor\n");break;case '%':op2 = pop();if (op2 != 0.0)push (fmod(pop(), op2));elseprintf ("error: zero divisor\n");break;case '?': //打印栈顶元素op2 = pop();printf ("\t%.8g\n", op2);push (op2);break;case '=': //保存数值pop();if (var >= 'A' && var <= 'Z')variable[var - 'A'] = pop();elseprintf ("error: no variable name\n");break;case 'c':clear();break;case 'd': //复制栈顶元素op2 = pop();push(op2);push(op2);break;case 's': //交换栈元素op1 = pop();op2 = pop();push(op1);push(op2);case '\n':v = pop(); //v保存最后的⼀次结果printf ("\t%.8g\n", v);break;default:if (type >= 'A' && type <= 'Z')push(variable[type - 'A']);else if (type == '@') //输⼊的字符@表⽰最近⼀次结果值 push(v);elseprintf ("error: unknown command %s\n", s);break;}var = type;}return 0;}/* ----------------------------------------------------------- */#define MAXVAL 100int sp = 0; //标识栈顶double val[MAXVAL];void push(double f){if (sp < MAXVAL)val[sp++] = f;elseprintf ("error: stack full, can't push %g\n", f);}double pop(void){if (sp > 0)return val[--sp];else{printf ("error: statck empty\n");return 0.0;}}void clear(void){sp = 0;}void mathfnc (char s[]){double op2;if (strcmp (s, "sin") == 0)push(sin(pop()));else if(strcmp (s, "cos") == 0)push(cos(pop()));else if(strcmp (s, "exp") == 0)push(exp(pop()));else if(strcmp (s, "pow") == 0){op2 = pop();push (pow(pop(), op2));}elseprintf ("error: %s not supported\n", s);}/* ----------------------------------------------------------- */#include <ctype.h>int getch(void);void ungetch(int);int getop(char s[]){int i, c;while ((s[0] = c = getch()) == ' ' || c == '\t') //过滤开头的空⽩字符;s[1] = '\0';i = 0;if (islower(c)) //判断是否为⼩写字母,也即读取由⼩写字母组成的字符串 {while (islower(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);if (strlen (s) > 1)return NAME;elsereturn c;}if (!isdigit(c) && c != '.' && c != '-')return c;if (c == '-') //⽤于判断是负数还是减操作{if (isdigit(c = getch()) || c == '.')s[++i] = c;else{if (c != EOF)ungetch(c);return '-';}}if (isdigit(c)) //收集整数部分while (isdigit(s[++i] = c = getch()));if (c == '.') //收集⼩数部分while (isdigit(s[++i] = c = getch()));s[i] = '\0';if (c != EOF)ungetch(c);return NUMBER;}/* ----------------------------------------------------------- *//** 引⽤以下两个函数是因为:程序不能确定它已经读⼊的输⼊是否⾜够 ** 除⾮超前多读⼊⼀些输⼊,在本程序中,读⼊⼀些字符合成⼀个数字 ** 所以在看到第⼀个⾮数字字符之前,已经读⼊的数的完整性是不能确定的* 由于程序要超前读⼊⼀个字符,这样就导致最后⼜⼀个字符不属于当前所要读⼊的数*/#define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void){return (bufp > 0) ? buf[--bufp] : getchar();}void ungetch (int c){if (bufp >= BUFSIZE)printf ("ungetch: too many characters\n");elsebuf[bufp++] = c;}该程序虽然简单,但是还是存在⼀些⼩⼩的问题,⽐如没有数据时进⾏pop的话,会打印栈中⽆数据同时返回数值0.0,在循环体中许多执⾏操作会将该数值保存到栈中,之后打印该值,⽤户体验度⽐较差。

用c语言编写简易计算器

用c语言编写简易计算器

在c51中用c语言编写简易计算器#include<reg52.h>#define BYTE unsigned charint jh;int a;int b;int c; /*c是符号*//*按键的值*/sbit P11=P1^3;sbit P12=P1^2;sbit P13=P1^1;sbit P14=P1^0;BYTE disply[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(int ms) //延时函数{while(ms--){ int h;for( h=0;h<=250;h++){;}}}void get_jianzhi() //获取键盘值的函数{BYTE disi;BYTE gaosi;gaosi=P2;P2=0x0f;delay(10 );disi=P2;gaosi=gaosi+disi;switch(gaosi){case 0xee:{jh=0;break;}case 0xde:{jh=1;break;}case 0xbe:{jh=2;break;}case 0x7e:{jh=3;break;}case 0xed:{jh=4;break;}case 0xdd:{jh=5;break;}case 0xbd:{jh=6;break;}case 0x7d:{jh=7;break;}case 0xeb:{jh=8;break;}case 0xdb:{jh=9;break;}case 0xbb:{jh=10;break;}case 0x7b:{jh=11;break;}case 0xe7:{jh=12;break;}case 0xd7:{jh=13;break;}case 0xb7:{jh=14;break;}case 0x77:{jh=15;break;}}do{P2=0xf0;}while(P2!=0xf0);}void show() /*显示函数*/{BYTE m; /*千位*/BYTE h; /*百位*/BYTE j; /*十位*/BYTE i; /*个位*/P3=0xff;if(c==14){b=0;}else{ }while(P2==0xf0) /*有键按下则跳出循环函数*/{j=0;i=0;h=0;m=0;if(b!=0) /*b不为0则显示b并判断它有几位数*/{if(b>99) {h=b/100;j=(b-h*100)/10;i=b%10;}else{if(b>9){j=b/10;i=b%10;}else{i=b;}}}else{if(a>999){ m=a/1000;h=(a-m*1000)/100;j=(a-m*1000-h*100)/10;i=a%10;}else{if(a>99){h=a/100;j=(a-h*100)/10;i=a%10;}else{if(a>9){j=a/10;i=a%10;}else{i=a;}}}}if(m!=0){ P11=0; P0=disply[i]; delay(5);P0=0x00;P11=1;P12=0;P0=disply[j];delay(5);P0=0x00;P12=1;P13=0;P0=disply[h];delay(5);P0=0x00;P13=1;P14=0;P0=disply[m]; delay(5);P14=1;P0=0x00;}else { if(h!=0){P11=0; P0=disply[i]; delay(5);P0=0x00;P11=1;P12=0;P0=disply[j]; /*判断要显示的数字是几位数*/delay(5);P0=0x00;P12=1;P13=0;P0=disply[h]; delay(5);P0=0x00;P13=1;}else{if(j!=0){P11=0;P0=disply[i];delay(5);P0=0x00;P11=1;P12=0;P0=disply[j]; delay(5);P0=0x00;P12=1;}else{P11=0;P0= P0=disply[i];}}}}}void main(){BYTE k=0; /*用来判断是给a还是b赋值*/P2=0xf0;a=0; /*第一次按键值的初始化*/b=0; /*第二次按键值的初始化*/bat:show();delay(10 );get_jianzhi() ;P2=0xf0;if(jh==15) /*按了清除键的话,全部清零*/ {a=0;b=0;c=0;}else{if(jh>=0&&jh<=9) /*按了数字键*/{if(k==0) /*判断是给a还是b赋值*/{a=a*10+jh;}else{b=b*10+jh;}goto bat;}else{if(a==0&&b==0) /*在开始时只按功能键的话,返回*/{goto bat;}else{k=1;if(b==0){c=jh;}else{switch(c) /*运算法则*/{case 10: { a=a+b;break;}case 11: {a=a-b;break;}case 12: {a=a*b;break;}case 13: {a=a/b;break;}case 15:{ break; } /*按'='的话,不运算*/}c=jh;}goto bat;}}goto bat;}}。

C语言简易计算器的实现

C语言简易计算器的实现

C语言简易计算器的实现计算器是一个常见的应用程序,用于执行数学运算。

在C语言中,可以通过使用条件判断、循环和函数来实现一个简易计算器。

下面是一个实现四则运算的简易计算器的示例代码:```c#include <stdio.h>float add(float a, float b)return a + b;float subtract(float a, float b)return a - b;float multiply(float a, float b)return a * b;float divide(float a, float b)return a / b;int maifloat num1, num2;char operator;printf("请输入两个数:");scanf("%f %f", &num1, &num2);printf("请输入操作符:");scanf(" %c", &operator); // 注意空格,以防止读取上一个输入时的换行符float result;switch (operator)case '+':result = add(num1, num2);printf("结果为:%.2f\n", result);break;case '-':result = subtract(num1, num2);printf("结果为:%.2f\n", result);break;case '*':result = multiply(num1, num2);printf("结果为:%.2f\n", result);break;case '/':if (num2 == 0)printf("除数不能为0!\n");} elseresult = divide(num1, num2);printf("结果为:%.2f\n", result);}break;default:printf("操作符无效!\n");break;}return 0;```在这个简易计算器中,使用了四个函数来执行加法、减法、乘法和除法运算,这些函数分别返回运算结果。

IAR环境下的msp430c语言编程

IAR环境下的msp430c语言编程

IAR环境下的msp430c语言编程MSP430系列单片机实用C语言程序设计扩展的关键字1.asm也可以写成__asm。

功能是在C程序中直接嵌入汇编语言。

语法:asm(“string”);其中string必须是有效的汇编语句。

2.__interrupt放在函数前面,标志中断函数。

下面这段程序是异步串行口UART0的接收中断函数。

UART0RX_VECTOR为异步串行口UART0的接收中断向量。

举例:#pragma vector=UART0RX_VECTOR__interrupt void UART0_R(void) //UART0接收中断{TXBUF0=RXBUF0;}3.__monitor放在函数前面,功能是但这一函数执行的时候自动关闭中断。

应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。

4.__no_init放在全局变量前面,功能是使程序启动时不为变量赋初值。

5.__raw编译中断函数时,编译器会自动生成一段代码,首先保存当时所用到CPU内寄存器的内容,退出中断程序时再进行恢复。

将__raw放在中断函数前可以禁止保存CPU内寄存器的过程,当然退出时也不会恢复。

是否为中断函数使用此关键字要根据需要而定。

6.__regvar放在变量前面,作用是声明变量为寄存器变量。

可以用于整数、指针、32位浮点数以及只含有一个元素的结构和联合。

寄存器变量的地址只能为R4或者R5,也不能用指针指向这个寄存器变量,而且必须用__no_init禁止初始化。

如:__regvar __no_init unsigned char q0 @ __R4;其他不常用的关键字还有:__data16、__intrinsic、__noreturn、__root、__task、__word16。

内部函数本节将介绍内部函数的原型和功能。

1.__bcd_add_shortunsigned short __bcd_add_short(unsigned short, unsigned short);功能:两个16位BCD格式的数相加,返回和。

MSP430单片机课程设计-简单计算器设计

MSP430单片机课程设计-简单计算器设计
2
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简易计算器目录摘要…………………………………………………………………………………P3 关键字………………………………………………………………………………P3一、设计要求………………………………………………………………………P3二、方案论证与选择………………………………………………………………P32.1 单片机选择………………………………………………………………P32.2 LCD显示屏选择…………………………………………………………P32.3 键盘选择…………………………………………………………………P42.4 CPU工作方式选择………………………………………………………P4三、系统实现………………………………………………………………………P43.1 硬件设计…………………………………………………………………P43.1.1系统框图………………………………… …………………………P43.1.2 盘的电平设计以及与单片机的连接键……………………………P53.2.3单片机与显示器的连接…………………………………………… P53.2软件设计……………………………………………………………………P6四、作品性能测试与分析…………………………………………………………P104.1试性能概览………………………………………………………………P104.2误差分析…………………………………………………………………P12五、参考文献………………………………………………………………………P12六、附录……………………………………………………………………………P136.1计算器功能介绍…………………………………………………………P136.2仿真电路图………………………………………………………………P136.3元件清单…………………………………………………………………P136.4原程序代码………………………………………………………………P14摘要:本设计以低功耗单片机MSP430V136T、1602字符型液晶屏和4*4简易键盘为主要器件,来实现加、减、乘、除、开根号、平方、求倒数等运算。

设计中分别采用P1口低4位和P2口低4位与键盘的行列线相连,用于采集中断信号并分析键值;键盘规格为4*4,由于所需的功能键数大于16,因此需要进行按键复用;单片机的P3口连接显示器的D0~D7端,用于输出显示数据或控制命令;选用P4口中的3、4和5口用于实现显示屏的控制功能:使能、控制/数据选择端、读/写。

本设计的软件部分采用中断方式获取键值,空闲时单片机处于休眠状态,极大地减小了单片机的功耗。

关键字:计算器、MSP430F2274单片机、LCD1602显示屏、键盘一、设计要求基本功能要求:输入两个2位十进制数,完成 +、-、*、/、开方运算;扩展功能要求:可在完成基本功能的基础上参照实际计算器完成,功能不限。

二、方案论证与选择2.1 单片机选择本设计采用的是MSP430F2274单片机。

MSP430 是德州公司新开发的一类具有16 位总线的带FLASH 的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16 位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器.具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16 位定时器、一个14 路的12 位的模数转换器、一个看门狗、4路P 口、16个外部中断、两路USART 通信端口、一个比较器、一个DCO 内部振荡器和两个外部时钟,支持8M 的时钟.由于为FLASH 型,则可以在线对单片机进行调试和下载,且JTAG 口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作,对环境和人体的辐射小,测量结果为100mw 左右的功耗(电流为14mA 左右),可靠性能好,加强电干扰运行不受影响。

在软件方面,MSP430单片机适合C语言开发,具有如下优点:1、可以大大提高软件开发的工作效率;2、可以提高所设计的程序代码的可靠性、可读性和可移植性;3、设计者可以将注意力更多地集中在充分发挥MSP430的功能上。

2.2 LCD显示屏选择本设计采用的是1602液晶显示屏。

在单片机系统中应用晶液显示器作为输出器件有以下几个优点:1显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

2 数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

3 体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

4 功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

2.3 键盘选择本设计只需实现+、-、*、/、开根号等基本功能,所以使用4*4的简易键盘即可,对于附加功能,通过简单点的按键复用,即可实现。

2.4 CPU工作方式选择查询方式:在这种工作方式下,当CPU执行完初始化程序后,便通过不断地查询端口值来判断是否有键按下,若有则跳转去执行相关的键值分析或数值计算及显示程序。

执行完毕,继续回到主程序继续不断查询。

中断方式:在此工作方式下,CPU无需查询,在执行完中断程序后,通过一条指令使得单片机进入休眠状态。

当有键按下时,则跳转去执行中断程序,执行完毕,继续回到主程序休眠。

本设计选择中断方式。

由于本设计为单任务,中断方式的高效性未能体现,但是通过中断方式,我们可以让单片机在空闲的时候进入休眠状态,这样可以极大地减少其消耗。

三、系统实现3.1硬件设计3.1.1系统框图系统的逻辑框图如下图所示。

3.2.2 键盘的电平设计以及与单片机的连接键盘的每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件,查出该键的功能。

键盘的8个口分别与430单片机的P1和P2口的第四位相连,且P1口输入,P2口输出,二者结合,采用行扫描法确定按键。

其与单片机的具体连接方式如下图所示。

3.2.3单片机与显示器的连接1602液晶显示屏有16个接口,各口的符号及功能如下表。

在本设计中1号、3号和16号引脚并联后接地,2号和15号脚并联接+5V 电平,3号、4号和5号三个控制端口分别与单片机的P4.4、P4.5和P4.3相接,分别实现上表中对应的功能,7号~14号口和单片机的P3.0~P3.7口,以实现数据和命令的传输。

具体连接入下图所示。

3.2软件设计本设计的软件部分由多个模块组成:主程序、中断程序、键盘分析程序、单片机初始化程序、LCD初始化程序、延时程序、测试LCD是否忙碌、写入指令数据到LCD、设定显示位置、写入字符显示数据到LCD等。

下面将对这些模块的功能一一讲解,并将画出主要模块的流程图。

主程序:主程序首先调用一些子程序来完成单片机初始化、显示器初始化、显示器清屏、显示器显示方式的设置、确定起始显示位置等,接着显示‘Welcome’,延时一段时间后清屏,然后打开中断,最后进入休眠状态,等待按键中断。

整个过程的流程图如下图所示。

中断程序:中断程序的架构如流程图所示,其中运算和显示功能由于篇幅限制,没有在图上给出。

由于本设计中共有7种运算,我们在检测到运算符时用FLAG对其进行标志,在接下来的运算中,即根据标志进行相关计算;显示分为整数显示和实数显示,其中加、减、乘、平方中只涉及整数,而除、开方和求倒数结果为实数,我们的程序将这两类结果分开显示,其中整数显示较简单,这里不再叙述;对于实数的显示我们又分为两类:开方、除法(包含求倒数)。

开方运算时,我们先用逼近法算出其值,然后进行显示:将结果乘以10000,设其为d,除以10000得整数部分显示,在显示小数点后,再用d对10000求余,将这个结果在小数点后显示;除法运算时则是先将操作数乘以10000,再进行除法运算,最后再运用上面的显示方法。

键盘分析:键盘分析程序是利用行扫描法来判断按键。

首先由读P1.0~P1.3的值来判断被按下的列,接着使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如果列值中有某位为低电平,则表明行列交点处的键被按下;否则扫描下一行,直到扫描完全部的行线为止,最后在确定所按键后返回键值。

整个过程的流程图如下。

单片机初始化程序(void inot() ):该子程序实现了关开门狗、设定DCO频率、设定各端口输入输出方向、清除中断标志、允许P1.0、P1.1、P1.2、P1.3中断并设置为上升沿中断。

LCD初始化程序(void lcd_init()):这段子程序主要实现三个功能。

首先是设置显示模式,即设置为16*2显示,5*7点阵,8位数据接口;接着进行显示开/关及光标设置,本程序中设置为开显示,不显示光标,当读或写一个字符后地址指针加一,且光标加一,写一个字符后整屏显示不移动;最后清除LCD显示的内容。

测试LCD是否忙碌(int lcd_bz()):该子程序的功能是测试LCD数据端时候忙碌。

首先使得P3口切换成输入模式,然后对P3口的数据进行运算判断P3.7是否为高来确定是否忙碌,最后返回判定值。

写入指令数据到LCD(void lcd_wcmd(uchar cmd)):该程序在被调用时首先检测LCD是否忙碌,若不忙则设定LCD的控制方式,即将其设定为写命令的方式,然后将要写的命令输出,再使能端E口输出一个正电平脉冲,即可完成输出。

设定显示位置(void lcd_pos(uchar pos)):该程序中调用lcd_wcmd子程序写入数据的起始显示位置。

写入字符显示数据到LCD(void lcd_wdat(uchar dat) ):和上面写指令数据到LCD类似,这里只是将控制方式改成写数据的方式。

四、作品性能测试与分析4.1测试性能概览我们分别测试了系统具备的7中计算功能:加、减、乘、除、开方、平方、求倒数。

测试结果如下图所示。

加法减法乘法除法开方平方求倒数4.2 误差分析根据测试结果,开根号的运算产生了误差,在本设计中320.71319.713≠=。

经分析发现,这源于程序的算法问题,程序中采用逼近法进行开方计算,并设定比较精度为0.0001,当计算结果逼近至1.7319时,即满足要求。

相关文档
最新文档