17
**首届电子创意设计竞赛
case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=11; break; case 0xeb: key=1; break; case 0xdb: key=2; break; case 0xbb: key=3; break; case 0x7b: key=12; break; case 0xe7: key=0; break; case 0xd7: key=15; break; case 0xb7: key=14; break; case 0x77: key=13; break; }
while(temp!=0x0f) { temp=P1; temp=temp&0x0f; } flag1=1; }
//flag=1标志按键检测完毕
} } }
/*计算结果并显示函数*/ void cal_show() { uchar i,j,n; long double s,temp2;
long int s1,s2,a1,b1,c1,temp1; a1=b1=1; s1=s2=0; s=0;
18
**首届电子创意设计竞赛
if(judge2!=0) {
for(j=0;j //存放第一操作数 { for(i=0;i s1=s1+a[j]*a1; a1=1; //判断输入的是几位数 } for(j=judge1+1;j s2=s2+a[j]*b1; b1=1; //存放第二操作数 //判断是几位数 } if(cal==10) {s=s1+s2; } if(cal==11) {s=s1-s2; } if(cal==12) { s=s1*s2; //判断是什么运算,并执行运算 } if(cal==13) { s=(s1*0.1)/(s2*0.1); //把s1,s2转化为小数形式 ? } Answer=s; } else s=Answer; //下面对结果进行四舍五入 19 **首届电子创意设计竞赛 c1=(long int)(s*1000); if(c1>5 || c1==5) s=s+0.01; //下面对数据进行处理 temp1=(long int)(s); //temp1 是答案的整数部分 temp2=s-temp1; n=0; while(temp1) { b[n]=temp1; temp1=temp1/10; n++; //整数部分放入数组 //temp2 是答案的小数部分 } b[n]=temp2*10; //把小数部分的第一位变成整数并放进数组 b[n+1]=(uchar)(temp2*100); //小数第二位......放进数组 //下面把得到的结果显示到液晶上面去 for(i=n;i>0;i--) { write_data(table[b[i-1]]);//输出整数部分 } write_data(table[15]);//输出小数点间隔整数部分和小数部分 write_data(table[b[n]]);//小数点后第一位 write_data(table[b[n+1]]);//小数点后第二位 } /******************************************************************** * 名称 : L1602_string(uchar hang,uchar lie,uchar *p) * 功能 : 1602写字符串函数 ***********************************************************************/ 20 **首届电子创意设计竞赛 void L1602_string(uchar hang,uchar lie,uchar *p) { } /******************************************************************** * 名称 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 1602写指令函数 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; wcmd(a); wdata(sign); uchar a,b=0; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; while(1) { } wcmd(a++); if((*p == '\\0')||(b==16)) break; b++; wdata(*p); p++; 21 **首届电子创意设计竞赛 } void main() { uchar k,i,j; sound=0; L1602_init(); for(k=5;k>0;k--) { L1602_string(1,1,\ L1602_string(2,1,\ L1602_char(2,16,k% 10 + 48); sound=1; Delay(400); sound=0; Delay(600); } sound=0; L1602_init(); write_com(0x01); write_com(0x80); key=15; i=flag1=0; while(1) { keyscan(); if(flag1==1) {if(key==15) //清零 //将液晶指针定位在第一行第一个单元 {write_com(0x01); i=0; for(j=0;j<20;j++) 22 **首届电子创意设计竞赛 a[j]=b[j]=0; judge1=judge2=0; } else if(key<10) //10以下是数字显示部分 //judge2=0,不会在液晶存放数据 { write_data(table[key]); a[i]=key; i++; } else if(key<14) //10~14属于运算符号 + { write_data(table[key]); judge1=i-1; cal=key; } else { L1602_string(2,1,\ write_data(table[key]); //输出等于号 if(i==0) judge2=0; else judge2=i-1; write_com(0x80+0x47); //将液晶指针定位在第二行第一个单元 cal_show(); } //键盘检测标志置0进行下一次检测 //调用计算并显示函数 // key=14时 为=号 flag1=0; } } }