msp430计算器设计_第1页
msp430计算器设计_第2页
msp430计算器设计_第3页
msp430计算器设计_第4页
msp430计算器设计_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、#include msp430x14x.h#include double r;#include duoxiangshi.h#define RS_1 P3OUT|=BIT0#define RS_0 P3OUT&=BIT0#define RW_1 P3OUT|=BIT1#define RW_0 P3OUT&=BIT1#define E_1 P3OUT|=BIT2#define E_0 P3OUT&=BIT2#define DATA P4OUT#define data_dir P4DIR#define KEYDIR P5DIR#define KEYOUT P5OUT#define KEYIN P5I

2、N#define led P2OUT#define LED1 P2DIR=0XFF;#define uchar unsigned char#define uint unsigned intchar table116=1;char table216= ;char flag;int flag1;/*延时*/void delay(void) unsigned int i,j; for(i=0;i50;i+) for(j=0;j10;j+) ; /*消抖延时*/void delay_key(void) int i,j; for(i=0;i500;i+) for(j=0;j100;j+) ; void

3、delayms(uchar ms) int i,j; for(i=0;ims;i+) for(j=0;j157;j+);int key_column_scan() int a; P5DIR = 0xff; P5OUT = 0x0f; P5DIR = 0X00; a = P5IN; switch(a) case 0x8f:return 4; case 0x4f:return 3; case 0x2f:return 2; case 0x1f:return 1; int key_line_scan() int a,column,key=-1,line; P5DIR = 0xff; P5OUT = 0

4、xf0; P5DIR = 0X00; a = P5IN; if(a!=0xf0) column = key_column_scan(); switch(a) case 0xf8:line=4;break; case 0xf4:line=3;break; case 0xf2:line=2;break; case 0xf1:line=1;break; key=(line-1)*4+column; delay_key(); /延时消抖 for(;) P5DIR = 0xff; /软件消抖 P5OUT = 0xf0; P5DIR = 0X00; a = P5IN; if(a=0xf0) break;

5、return key;/给LCD1602写命令void write_com(uchar com) RS_0; RW_0; E_0; DATA=com; E_1; delayms(5); E_0; /给LCD1602写数据void write_data(uchar data) RS_1; RW_0; E_0; DATA=data; E_1; delayms(5); E_0; /初始化LCD1602void lcd_init() data_dir=0xff; P3DIR|=BIT0+BIT1+BIT2; write_com(0x38); /设置16*2显示,双行,5*7点阵 write_com(0

6、x01); /清屏 write_com(0x06); /字符进入模式;屏幕不动,字符后移 write_com(0x0f); /显示开,光标开,光标闪烁 write_com(0x80); /在指定位置显示字符串void lcd_string(uchar r,uchar c,uchar *str) /r表示行数,C表示在R行的第几位,*str表示输入的字符串 uchar i=0; uchar DDRAM=0x80,0xc0; /LCD1602两行的起始地址 write_com(DDRAMr|c); /设置显示的起始位置 for(i=0;stri&i16;i+) /输出字符串 write_data(

7、stri); for(;i16;i+) write_data( ); /一行不足时用空格填充int main( void ) / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; int key,m,i=0; flag=0; flag1=0; lcd_init(); while(1) key=key_line_scan(); if(key!=-1) switch(key) case 1:write_data(7);table1+i=7;break; case 2:write_data(8);table

8、1+i=8;break; case 3:write_data(9);table1+i=9;break; case 4: write_data(+);write_com(0x80+i); while(1) key=key_line_scan(); if(key!=-1) if(key=4) flag1+; if(flag1%4=0) write_data(+);write_com(0x80+i); else if(flag1%4=1) write_data(-);write_com(0x80+i); else if(flag1%4=2) write_data(*);write_com(0x80+

9、i); else if(flag1%4=3) write_data(/);write_com(0x80+i); else if(key!=4) if(flag1%4=0) write_data(+);table1+i=+;flag1=0; else if(flag1%4=1)write_data(-);table1+i=-;flag1=0; else if(flag1%4=2) write_data(*);table1+i=*;flag1=0; else if(flag1%4=3) write_data(/);table1+i=/;flag1=0; switch(key) case 1:wri

10、te_data(7);table1+i=7;break; case 2:write_data(8);table1+i=8;break; case 3:write_data(9);table1+i=9;break; case 5:write_data(4);table1+i=4;break; case 6:write_data(5);table1+i=5;break; case 7:write_data(6);table1+i=6;break; case 8: if(flag=0)write_data(#);table1+i=#;break; else write_data();table1+i

11、=;break; case 9:write_data(1);table1+i=1;break; case 10:write_data(2);table1+i=2;break; case 11:write_data(3);table1+i=3;break; case 12: if(flag=0)lcd_string(1,0,shift );flag=1;write_com(0x80+i);break; else lcd_string(1,0,);flag=0;write_com(0x80+i);break; case 13: if(flag=0)write_data(0);table1+i=0;

12、break; else write_data();table1+i=(;break; case 14: if(flag=0)write_data(.);table1+i=.;break; else write_data();table1+i=);break; case 15:write_data(=);table1+i=;break; case 16: if(flag=0)write_com(0x80+i-1);i-; else WDTCTL=0X00; if(table1i=) cal(table1); sprintf(table2,%lf,r); lcd_string(1,6,table2

13、); break; break; case 5:write_data(4);table1+i=4;break; case 6:write_data(5);table1+i=5;break; case 7:write_data(6);table1+i=6;break; case 8: if(flag=0)write_data(#);table1+i=#;break; else write_data();table1+i=;break; case 9:write_data(1);table1+i=1;break; case 10:write_data(2);table1+i=2;break; ca

14、se 11:write_data(3);table1+i=3;break; case 12: if(flag=0)lcd_string(1,0,shift );flag=1;write_com(0x80+i);break; else lcd_string(1,0,);write_com(0x80+i);flag=0;break; case 13: if(flag=0)write_data(0);table1+i=0;break; else write_data();table1+i=(;break; case 14: if(flag=0)write_data(.);table1+i=.;bre

15、ak; else write_data();table1+i=);break; case 15:write_data(=);table1+i=;break; case 16: if(flag=0)write_com(0x80+i-1);i-; else WDTCTL=0X00; if(table1i=) cal(table1); sprintf(table2,%g,r); lcd_string(1,6,table2); duoxiangshi.h/*=*函数名:多项式运算*函数功能描述:实现多项式运算*参数:char型数组*返回值:double结果=*/#include#include#inc

16、ludevoid cal(char a) int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0; char nibo20=0,zhan215=0;/存放运算符 double x,n,l,z=0,zhan315=0,0;/暂存结果 typedef struct double d1; int d2; dd; typedef struct dd data20; int top; zhan1;/存储数据 zhan1 *num; num=(zhan1 *)malloc(sizeof(zhan1); num-top=0; while(ai!=) if(ai=0)&(ai=0&aj=9) j

17、+; j-; for(k=i;k=0&aj=9) j+;/转出小数点后的连续数字 j-; for(k=i;kdata+num-top.d1=x;/将x保存在zhan1里的结构体组中,根据zhan1里的top值决定结构体组中的哪一个,保存在结构体的d1里,top+1 num-datanum-top.d2=+cnt;/根据栈中的top值,将datatop中的d2赋值cnt,cnt加1cnt决定为第几个数 nibo+t1=0+num-datanum-top.d2; nibot1+1=0; /如果是数字那么就保存到结构体里 的dd数组里的 第二个成员里 else if(ai=() zhan2+t2=a

18、i;/存储( i+;/读下一个字符 else if(ai=) j=t2;/j位于当前。栈2中未存储运算符的位置 while(zhan2j!=()/查找前半个括号 nibo+t1=zhan2j;/记录()之间所有的运算符 nibot1+1=0; j-; t2=j-1;/t2位于前半个括号的前一个位置 i+; else if(ai=+) while(t20&zhan2t2!=()/将+前的运算符存入nibo nibo+t1=zhan2t2; nibot1+1=0; t2-; zhan2+t2=ai; i+; else if(ai=-) if(ai-1=$) a0=0; i=0; else if(a

19、i-1=() ai-1=0; ai-2=(; i=i-2; t2-; else while(t20&zhan2t2!=() nibo+t1=zhan2t2; nibot1+1=0; t2-; zhan2+t2=ai; i+; else if(ai=*|ai=/) while(zhan2t2=*|zhan2t2=/|zhan2t2=|zhan2t2=#) nibo+t1=zhan2t2; nibot1+1=0; t2-; zhan2+t2=ai; i+; else if(ai=|ai=#) while(zhan2t2=|zhan2t2=#) nibo+t1=zhan2t2; nibot1+1=0

20、; t2-; zhan2+t2=ai; i+; /开始计算 while(t20) /将栈2中所有的运算符存入nibo中 nibo+t1=zhan2t2; nibot1+1=0; t2-; j=1;t3=0; while(j=0&niboj!=&niboj!=#)/ for(i=1;itop;i+) if(int)(niboj-0)=num-datai.d2) m=i; break; zhan3+t3=num-datam.d1; else if(niboj=+) zhan3t3-1=zhan3t3-1+zhan3t3; t3-; else if(niboj=-) zhan3t3-1=zhan3t

21、3-1-zhan3t3; t3-; else if(niboj=*) zhan3t3-1=zhan3t3-1*zhan3t3; t3-; else if(niboj=/) zhan3t3-1=zhan3t3-1/zhan3t3; t3-; else if(niboj=) zhan3t3-1=pow(zhan3t3-1,zhan3t3); t3-; else if(niboj=#) zhan3t3=sqrt(zhan3t3); j+; r=zhan3t3; malloc.h/*alloc.hmemory management functions and variables.Copyright (

22、c) Borland International 1987,1988All Rights Reserved.*/#if _STDC_#define _Cdecl#else#define _Cdeclcdecl#endif#ifndef _STDDEF#define _STDDEF#ifndef _PTRDIFF_T#define _PTRDIFF_T#ifdefined(_LARGE_) | defined(_HUGE_) | defined(_COMPACT_)typedef longptrdiff_t;#elsetypedef intptrdiff_t;#endif#endif#ifndef _SIZE_T#define _SIZE_Ttypedef unsigned size_t;#endif#endif#if

温馨提示

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

评论

0/150

提交评论