计算器.docx
- 文档编号:15111410
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:27
- 大小:21.91KB
计算器.docx
《计算器.docx》由会员分享,可在线阅读,更多相关《计算器.docx(27页珍藏版)》请在冰点文库上搜索。
计算器
#include
#include"intrins.h"
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/**************液晶引脚定义**************************/
sbitLCD_SCLK=P1^6;//pin2header5
sbitLCD_SDIN=P1^5;//pin3header4
sbitLCD_DC=P1^4;//pin4header3
sbitLCD_CE=P1^2;//pin5header2
sbitLCD_RST=P1^3;//pin9header1
sbitLCD_LED=P1^7;//pin9header6
/************实时时钟引脚***************/
sbitT_CLK=P3^2;/*实时时钟时钟线引脚*/
sbitT_IO=P3^3;/*实时时钟数据线引脚*/
sbitT_RST=P3^4;/*实时时钟复位线引脚*/
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitBELL=P3^5;//pin9header6
sbitKey3=P3^7;
/*************************计算器的标志位*******************************/
ucharnum=0;//记录下次输入的数据位置
ucharhang=0;//选择输入数据显示液晶时所属的行
ucharexpression=0;//表达式的长度
ucharExplength=0;//液晶上能够显示的表达式长度
longg_date=0;//记录输入的数据
ucharg_Length=0;//输入数据的长度
charg_count=0;//混合运算次数
charg_calculate=0;//避免连续按运算符出错
charg_Buffer[20];
charg_ExpBuffer[60]={'\0'};//表达式数组
longg_Expdata[20]={0};//表达式数据
longg_ExpBuf[30]={0};//校正后的表达式数组
charfirstcount=0;//防止第二个数据没输入而运行结果的错误操作
charg_boundary=0;//切换界面标志位
ucharOPRT[15]={'#',0};//操作符
longOPND[20]={0};//操作数据
ucharg_Error=0;//除数为0时的标志
ucharg_Input=0;//输入被除数为0时清楚,重新计算标志位
ucharg_RetValue=0;//返回上个界面标志符
ucharg_OPcount=0;//避免数据和ASCII值相等出错
longLastResult=0;//上次运算结果
codecharerror[]="Error:
inputexpressiontoolong!
";//输入数据超长
codecharerror1[]="Error:
inputdatatoolong!
";//没有选择算法
codeucharfont6x8[][6]={//ASCII码字模
{0x00,0x00,0x00,0x00,0x00,0x00},//sp
……};
codeucharshuzi[]={//0—9和(.:
)数字字模
0x00,0x3E,0x51,0x49,0x45,0x3E,//0
0x00,0x00,0x42,0x7F,0x40,0x00,//1
0x00,0x42,0x61,0x51,0x49,0x46,//2
0x00,0x21,0x41,0x45,0x4B,0x31,//3
0x00,0x18,0x14,0x12,0x7F,0x10,//4
0x00,0x27,0x45,0x45,0x45,0x39,//5
0x00,0x3C,0x4A,0x49,0x49,0x30,//6
0x00,0x01,0x71,0x09,0x05,0x03,//7
0x00,0x36,0x49,0x49,0x49,0x36,//8
0x00,0x06,0x49,0x49,0x29,0x1E,//9
0x00,0x00,0x60,0x60,0x00,0x00,//.
0x00,0x00,0x36,0x36,0x00,0x00,//:
};
codeucharmove_chinese_string[][24]={//阜阳师范学院A队,参赛队员:
张渝、李志明
/*--文字:
阜--*/
/*--宋体9;此字体下对应的点阵为:
宽x高=12x12--*/
/*--高度不是8的倍数,现调整为:
宽度x高度=12x16--*/
{0x00,0x00,0xFE,0xAA,0xAA,0xAB,0xAA,0xAA,0xEE,0x00,0x00,0x00,0x02,0x02,0x02,0x02,
0x02,0x07,0x02,0x02,0x02,0x02,0x02,0x00},
……};
codeucharwrite_chinese[][32]={//阜阳师范学院3队张渝李志明
/*--文字:
阜--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
{0x00,0x00,0x00,0xFC,0x54,0x54,0x56,0x55,0x54,0x54,0x54,0xDC,0x00,0x00,0x00,0x00,
0x08,0x08,0x08,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x00},
……};
codeucharBigDigit24[][12]={//数字0123456789
/*--文字:
0--*/
/*--宋体9;此字体下对应的点阵为:
宽x高=6x12--*/
/*--高度不是8的倍数,现调整为:
宽度x高度=6x16--*/
{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},
……};
codeucharBigDigit32[][16]={//数字0123456789
/*--文字:
0--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=8x16--*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},
……};
codeucharinterface[][32]=
{//1、计算器
/*--文字:
1--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=8x16--*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x08,0x18,0x30,0x00,0x00,0x00,0x00},
/*--文字:
计--*/
/*--宋体12;此字体下对应的点阵为:
宽x高=16x16--*/
{0x20,0x21,0x2E,0xE4,0x00,0x00,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
0x00,0x00,0x00,0x7F,0x20,0x10,0x08,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00},
};
/***************延时程序**************************/
voiddelay_1us(void){//1us延时函数
unsignedinti;for(i=0;i<1000;i++);
}
voiddelay_1ms(void){//1ms延时函数
unsignedinti;for(i=0;i<1140;i++);
}
voiddelay_nms(unsignedintn){//Nms延时函数
unsignedinti=0;for(i=0;i } /****************液晶程序**************************/ voidLCD_write_byte(unsignedchardat,unsignedcharcommand){ unsignedchari; LCD_CE=0; if(command==0)LCD_DC=0; elseLCD_DC=1; for(i=0;i<8;i++){ if(dat&0x80)LCD_SDIN=1; elseLCD_SDIN=0; LCD_SCLK=0;dat=dat<<1;LCD_SCLK=1; } LCD_CE=1; } /*----------------------------------------------------------------------- LCD_set_XY: 设置LCD坐标函数 -----------------------------------------------------------------------*/ voidLCD_set_XY(unsignedcharX,unsignedcharY){ LCD_write_byte(0x40|Y,0);//column LCD_write_byte(0x80|X,0);//row } /*----------------------------------------------------------------------- LCD_clear: LCD清屏函数 -----------------------------------------------------------------------*/ voidLCD_clear(void){ unsignedinti; LCD_write_byte(0x0c,0);LCD_write_byte(0x80,0); for(i=0;i<504;i++)LCD_write_byte(0,1); } /*****************指定位置删除***************************/ voidClearhang(ucharx,uchary,ucharlength){ unsignedinti;LCD_set_XY(x,y); for(i=0;i } /***************LCD_write_char: 显示英文字符****************/ voidLCD_write_char(unsignedcharc){ unsignedcharline; c-=32; for(line=0;line<6;line++)LCD_write_byte(font6x8[c][line],1); } voidBig_LCD_write_char32(unsignedcharx,unsignedy,unsignedcharc){ unsignedcharline; c-='0'; for(line=0;line<16;line++){ if(line==0)LCD_set_XY(x,y); elseif(line==8)LCD_set_XY(x,y+1); LCD_write_byte(BigDigit32[c][line],1); } } voidBig_LCD_write_char24(unsignedcharx,unsignedy,unsignedcharc){ unsignedcharline; c-='0'; for(line=0;line<12;line++){ if(line==0)LCD_set_XY(x,y); elseif(line==6)LCD_set_XY(x,y+1); LCD_write_byte(BigDigit24[c][line],1); } } /*************LCD_write_english_String: 英文字符串显示函数***************/ voidLCD_write_english_string(unsignedcharX,unsignedcharY,char*s){ LCD_set_XY(X,Y); while(*s){ LCD_write_char(*s);s++; } } voidBig_LCD_write_english_string(unsignedcharX,unsignedcharY,char*s,ucharflag){ while(*s){ if(flag==1)Big_LCD_write_char24(X,Y,*s); elseif(flag==2)Big_LCD_write_char32(X,Y,*s);s++;X=X+8; } } /*****************************液晶显示屏初始化***************************************/ voidLCD_init(void){ LCD_RST=0;delay_1us(); LCD_RST=1; LCD_CE=0;delay_1us(); LCD_CE=1;delay_1us(); LCD_write_byte(0x21,0);//使用扩展命令设置LCD模式 LCD_write_byte(0xc8,0);//设置偏置电压 LCD_write_byte(0x06,0);//温度校正 LCD_write_byte(0x13,0);//1: 48 LCD_write_byte(0x20,0);//使用基本命令 LCD_clear();//清屏 LCD_write_byte(0x0c,0);//设定显示模式,正常显示 LCD_CE=0; } /*********************************静态显示汉子******************************/ voidwrite_hanzi32(ucharx,uchary,ucharnum,ucharkuan,uchar(*p)[32]){ ucharn,i; LCD_set_XY(x,y); for(i=0;i for(n=0;n<2*kuan;n++){ if(n==kuan)LCD_set_XY(x+kuan*i,y+1);LCD_write_byte(*(*(p+i)+n),1); } LCD_set_XY(x+kuan*(i+1),y); } } //静态显示 voidwrite_hanzi24(ucharx,uchary,ucharnum,ucharkuan,uchar(*p)[24]){ ucharn,i; LCD_set_XY(x,y); for(i=0;i for(n=0;n<2*kuan;n++){ if(n==kuan)LCD_set_XY(x+kuan*i,y+1);LCD_write_byte(*(*(p+i)+n),1); } LCD_set_XY(x+kuan*(i+1),y); } } /*************************LCD_move_chinese_string: 汉字移动*******-*/ voidmove_hanzi(ucharx,uchary,uintt,ucharkuan,ucharnum){ charshang[85]={0}; charxia[85]={0},n; uinti; uintj=0; for(i=0;i<12*(1+num)+68;i++){ if(i<12*num){shang[84]=move_chinese_string[i/kuan][j]; xia[84]=move_chinese_string[i/kuan][j+kuan]; } else{shang[84]=0;xia[84]=0; } j++; if(j==kuan)j=0;LCD_set_XY(x,y); for(n=0;n<84;n++)LCD_write_byte(shang[n],1);LCD_set_XY(x,y+1); for(n=0;n<84;n++)LCD_write_byte(xia[n],1);delay_nms(t); for(n=0;n<84;n++){shang[n]=shang[n+1];xia[n]=xia[n+1]; } } } /*************计算字符串长度********************/ charstrlen(char*p){ charlength=0; while(*p){ length++; p++; }returnlength; } /**********写数字*******************/ voidwrite_shuzi(ucharx,uchary,ucharshu){ uchari; g_date=g_date*10+shu;LCD_set_XY(x*6,y); for(i=0;i<6;i++)LCD_write_byte(shuzi[shu*6+i],1); } /*****************清除buffer数组数据********************/ voideliminate(char*p){ uchari; for(i=0;i<20;i++)*(p+i)='\0'; } /************整数型转换为字符串型************************/ char*inttostr(longm,char*buf){ chartemp; longn; intindex=0,j; eliminate(buf);n=m; if(m<0){ m=-m;buf[index++]='-'; } if(m==0)buf[index++]='0'; while(m){ buf[index++]=m%10+'0';m=m/10; } buf[index]='\0'; if(n<0)for(j=1;j<(index+1)/2;j++){ temp=buf[j];buf[j]=buf[index-j];buf[index-j]=temp; } elsefor(j=0;j temp=buf[j];buf[j]=buf[index-j-1];buf[index-j-1]=temp; }returnbuf; } /*****************************向数据栈中压入数据***************************************/ voidPushOpnd(long*p,longdate){ *p=date; } /*******************************向操作符栈中压入数据***********************************/ voidPushOprt(char*p,charcharacter){ *p=character; } /********************判断操作字************************************************/ ucharIn(charOP){ if(g_OPcount==0){return1;} else{ switch(OP){ case'+': case'-': case'*': case'#': case'/': return0;break; } } } /*************************操作符优先级比较************************************************/ ucharPrecede(ucharx,uchary){ if(x=='+'||x=='-'){ switch(y){ case'+': case'-': case'#': return'>';break; default: return'<';break; } } elseif(x=='#'){ switch(y){ case'#': retu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器