单片机计算器程序

  • 格式:doc
  • 大小:27.50 KB
  • 文档页数:10

文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 1 /***************89C51单片机【计算器】C语言程序******************/ /**************** P2位选 P0段选 时钟 12MHZ *********************/ #include /*包含的头文件 */ #define uchar unsigned char /* 宏定义 */ #define uint unsigned int uchar Led[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; /* 数码管段选 */ long float Number[]={0,0,0,0}; /* 数码管显示位控制寄存器 */ uchar 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】作为结果 */ uchar e=0; /* 数字的位存储递进的控制 */ uchar g=0; /* 运算方式的控制变量 */ 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 2 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; /* 小数点个数的记录变量 */ uchar xo=0; /* 控制开始计数小数点的变量 */ long int result; void Delay(uint o) /* 延时函数 delay() 的定义 */ { uint i,j; for(i = 0; i < o; i++) { for(j = 0; j < 121; j++) {;} } } void show(long float Out_put) { uchar r; uchar k; 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 3 long int q,p; uchar s=0; uchar i; long int temp; temp=Out_put ; if( (Out_put-temp)!=0) {result=Out_put*10000; r=4;} else { result=Out_put; r=0; } p=result; if(m==1) { if(result<0) { result=-result; p=result; q=result; for(i=1;i<=8;i++) { q=q/10; if(q==0) {k=i;i=9; } } P0=0x40; P2=C[8-k];Delay(1); } //负号的显示 P0=0x80; P2=C[r]; Delay(1); P0=0x00; result=p; P0=Led[result%10]; P2=C[8]; result=result/10; Delay(1);

if( (result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0)&&(result%100000==0)&&(result%1000000==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[7]; result=result/10; Delay(1);}

if( (result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 4 000==0)&&(result%100000==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[6]; result=result/10; Delay(1);}

if( (result%10==0)&&(result%100==0)&&(result%1000==0)&&(result%10000==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[5]; result=result/10; Delay(1);} if( (result%10==0)&&(result%100==0)&&(result%1000==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[4]; result=result/10; Delay(1);} if( (result%10==0)&&(result%100==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[3]; result=result/10; Delay(1);} if( (result%10==0) ) {P0=0x00;} else {P0=Led[result%10]; P2=C[2]; result=result/10; Delay(1);} if(result==0) {P0=0x00;} else {P0=Led[result%10]; P2=C[1]; result=result/10; Delay(1);} } } void In_put() // 输入函数 输入小数 加小数点 { uchar i; if(k>=0&&k<=9) switch(e) 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 5 { case 8: D[7]=D[6];A[7]=A[6]; //用来存放数值 case 7: D[6]=D[5];A[6]=A[5]; case 6: D[5]=D[4];A[5]=A[4]; case 5: D[4]=D[3];A[4]=A[3]; case 4: D[3]=D[2];A[3]=A[2]; case 3: D[2]=D[1];A[2]=A[1]; case 2: D[1]=D[0];A[1]=A[0]; case 1: if(n==0) { D[0]=k; A[0]=Led[k]; if(xo==1) x++; } if(n==1) { A[0]=Led[k]|0x80; xo=1; n=0;} } if(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=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; // / 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 6 } j++;

Number[j]=*D[7]+1000000*D[6]+100000*D[5]+10000*D[4]+1000*D[3]+100*D[2]+10*D[1]+D[0]; for(i=1;i<=x;i++) {Number[j]=(float)Number[j]/10;} x=0; for(i=0;i<=7;i++) // 数据存储器清零 D[i]=0; for(i=0;i<=8;i++) // 数据显示清零 {A[i]=0x00;} b=0;e=0;xo=0; } } void Key_scan() // 键盘扫描函数 Key_scan() { unsigned char X,Y,Z; P3 = 0xff; P3 = 0x0f; //先对P2置数 行扫描 if(P3!=0x0f) //判断是否有键按下 { Delay(20); //延时10ms,软件去干扰