《单片机计算器c语言程序.doc》由会员分享,可在线阅读,更多相关《单片机计算器c语言程序.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、/*89C51单片机【计算器】C语言程序*/* P2位选 P0段选时钟 12MHZ */#include /*包含的头文件 */#define uchar unsigned char /* 宏定义 */#define uint unsigned intuchar Led17 = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00; /* 数码管段选 */long float Number=0,0,0,0; /* 数码管显示位控制寄存器 */ uc
2、har A=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;long int D = 0,0,0,0,0,0,0,0; /数码管显示内容寄存器uchar code C = 0x0, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F; /* 数码管位选 */ /* 列扫描控制 LED 1位 2位 3位 4位 5位 6位 7位 8位 */ uchar k=16; /* 按键对外控制*/uchar b; /* 按键【+】【-】【*】【/】对外的控制 */long float Out_put; /* 定义变量【Out_put】
3、作为结果 */uchar e=0; /* 数字的位存储递进的控制 */ uchar g=0; /* 运算方式的控制变量 */uchar L=0; /* 运算方式的控制变量 */uchar g1=0; /* 运算方式的控制变量 */uchar g2=0; /* 运算方式的控制变量 */uchar g3=0; /* 运算方式的控制变量 */uchar g4=0; /* 运算方式的控制变量 */char j=-1; /* 与Number数组连用 */uchar m=0; /* 按键【=】的控制变量 */uchar n=0; /* 按键【.】的控制变量 */uchar x=0; /* 小数点个数的记录
4、变量 */uchar xo=0; /* 控制开始计数小数点的变量 */longint result;void Delay(uint o) /* 延时函数 delay() 的定义 */uinti,j;for(i = 0; i o; i+) for(j = 0; j 121; j+) ; void show(long float Out_put) uchar r;uchar k;longintq,p;uchar s=0;uchar i;longint temp;temp=Out_put ;if( (Out_put-temp)!=0) result=Out_put*10000; r=4;else r
5、esult=Out_put; r=0; p=result; if(m=1) if(result0) result=-result; p=result; q=result; for(i=1;i=0&k=11&k=15&b=1) switch(k) case 11: g1+;g+;if(g2=1) L=1; if(g3=1) L=2; if(g4=1) L=3;break; / + case 12: g2+;g+;if(g1=1) L=4; if(g3=1) L=5; if(g4=1) L=6;break; / - case 13: g3+;g+;if(g1=1) L=7; if(g2=1) L=
6、8; if(g4=1) L=9;break; / * case 14: g4+;g+;if(g1=1) L=10;if(g2=1) L=11;if(g3=1) L=12;break; / / j+; Numberj=*D7+*D6+*D5+10000*D4+1000*D3+100*D2+10*D1+D0;for(i=1;i=x;i+) Numberj=(float)Numberj/10; x=0; for(i=0;i=7;i+) / 数据存储器清零 Di=0; for(i=0;i=8;i+) / 数据显示清零 Ai=0x00; b=0;e=0;xo=0; void Key_scan() / 键
7、盘扫描函数Key_scan() unsigned char X,Y,Z; P3 = 0xff; P3 = 0x0f; /先对P2置数行扫描if(P3!=0x0f) /判断是否有键按下 Delay(20); /延时10ms,软件去干扰if(P3!=0x0f) /确认按键按下; X=P3; /保存行扫描时有键按下时状态 P3=0xf0; /列扫描 Y=P3; /保存列扫描时有键按下时状态 Z=X|Y; /取出键值while(P3!=0xf0); / 按键防止抖动 switch ( Z ) /判断键值(那一个键按下) case 0xe7: k=0; e+; In_put(); break; /数字【
8、0】 case 0xd7: k=1; e+; In_put(); break; /数字【1】 case 0xdb: k=2; e+; In_put(); break; /数字【2】 case 0xdd: k=3; e+; In_put(); break; /数字【3】 case 0xb7: k=4; e+; In_put(); break; /数字【4】 case 0xbb: k=5; e+; In_put(); break; /数字【5】 case 0xbd: k=6; e+; In_put(); break; /数字【6】 case 0x77: k=7; e+; In_put(); bre
9、ak; /数字【7】 case 0x7b: k=8; e+; In_put(); break; /数字【8】 case 0x7d: k=9; e+; In_put(); break; /数字【9】 case 0xeb: n=1; In_put(); break; /小数点【 .】 case 0x7e: k=11;b=1; In_put(); break; /字符【B +】 case 0xbe: k=12;b=1; In_put(); break; /字符【C -】 case 0xde: k=13;b=1; In_put(); break; /字符【D *】 case 0xee: k=14;b=
10、1; In_put(); break; /字符【E /】 case 0xed: k=15;m=1;b=1;In_put();break; /字符【F =】 voidYun_suan()if(g1=1&g=1) Out_put=Number0+Number1; if(g2=1&g=1) Out_put=Number0-Number1; if(g3=1&g=1) Out_put=Number0*Number1; if(g4=1&g=1) Out_put=Number0/Number1;if(g1=2&g=2) Out_put=Number0+Number1+Number2;if(g2=2&g=2)
11、 Out_put=Number0-Number1-Number2;if(g3=2&g=2) Out_put=Number0*Number1*Number2;if(g4=2&g=2) Out_put=Number0/Number1/Number2;if(L=1) Out_put=Number0-Number1+Number2;if(L=2) Out_put=Number0*Number1+Number2;if(L=3) Out_put=Number0/Number1+Number2;if(L=4) Out_put=Number0+Number1-Number2;if(L=5) Out_put=N
12、umber0*Number1-Number2;if(L=6) Out_put=Number0/Number1-Number2;if(L=7) Out_put=Number0+Number1*Number2;if(L=8) Out_put=Number0-Number1*Number2;if(L=9) Out_put=Number0/Number1*Number2;if(L=10) Out_put=Number0+Number1/Number2;if(L=11) Out_put=Number0-Number1/Number2;if(L=12) Out_put=Number0*Number1/Nu
13、mber2; voidXian_shi()if(m!=1) Key_scan(); /* 显示函数与Ai有关 */ P0=A0; P2=C8;Delay(1); P0=A1; P2=C7;Delay(1); P0=A2; P2=C6;Delay(1); P0=A3; P2=C5;Delay(1); P0=A4; P2=C4;Delay(1); P0=A5; P2=C3;Delay(1); P0=A6; P2=C2;Delay(1); P0=A7; P2=C1;Delay(1); void main() while(1) Xian_shi();Yun_suan();show(Out_put ); /