yezhubenyue 发表于 2010-4-21 13:12:20

花了两天写的51简易计算器

能实现加减乘除(如果是整数的话可以进行两次运算(1+1*1)或者(1+1) 如果不是整数的话只能一次运算(1.1+1.1))。(1/3=0.333)能精确到小数点三位吧。
5*5矩阵。能进行简单的COS(x),sin(x),tan(x)。还有返回BACK键跳出上次的值。
弱弱的问下这个拿去参加学校的比赛是不是太简单了点啊,也没什么创新。上面有很多的课题,不过都不大会,,也没时间,所以选了做个计算器。不过自己也尽力了。。
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs = P1^0;
sbit rw = P1^1;
sbit ep = P1^2;
uchar x=0;
uchar w=0;
uchar number;
uchar idata i,j4,j9,j14,j19,j22,j23,j,j24,j22;
uchar idata den1,jian1,jia1,cheng1,chu1,jia,dian;
float idata data2=0,data1=0,data3=0,data5,data8,data7,data9,data10;
float idata data4,data6;
uint alldata=0,xiaoshu;
uint dato;
uchar chu2;
uchar cos2=0,sin2=0,tan2=0,gen2=0,jia2=0,jian2=0,cheng2=0;
uchar prekeyno=25,keyno=25;
void delay(uchar x) //矩阵键盘的延迟
{
uchar t;
while(x--)for(t=0;t<120;t++);
}
void keyscan()       //矩阵键盘扫描
{
uchar temp;
P2=0X00;
P3=0xff;
delay(1);
if(P3!=0xFF){        //是否有键按下去       
P2=0XFF;P3=0X00;
delay(1);
temp=P2;
switch(temp)        //扫描按键在哪列
{
case 0xfe:keyno=0;break;
case 0xfd:keyno=1;break;
case 0xfb:keyno=2;break;
case 0xf7:keyno=3;break;
case 0xef:keyno=4;break;
}
P2=0x00;P3=0xff; //扫描按键在哪行
delay(1);
temp=P3;
switch(temp)
{
case 0xfe:keyno+=0;break;
case 0xfd:keyno+=5;break;
case 0xfb:keyno+=10;break;
case 0xf7:keyno+=15;break;
case 0xef:keyno+=20;break;
}
}
}
uchar lcd_bz()
{                   // 测试LCD忙碌状态
uchar result;
rs = 0;rw = 1;ep = 1;
_nop_();_nop_();_nop_();_nop_();
result = (P0 & 0x80);
ep = 0;
return result;
}

lcd_wcmd(uchar c)
{       // 写入指令数据到LCD
while(lcd_bz());
rs = 0;rw = 0;ep = 0;
_nop_();_nop_();
P0 = c;
_nop_();_nop_();_nop_();_nop_();
ep = 1;
_nop_();_nop_();_nop_();_nop_();
ep = 0;
}

lcd_pos(uchar pos)
{       //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(uchar d)
{       //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;rw = 0;ep = 0;
P0 = d;
_nop_();_nop_();_nop_();
_nop_();
ep = 1;_nop_();_nop_();_nop_();_nop_();
ep = 0;
}

lcd_init()
{       //LCD初始化设定
lcd_wcmd(0x38);   //
delay(2);
lcd_wcmd(0x38);   //
delay(2);
lcd_wcmd(0x38);   //
delay(2);
lcd_wcmd(0x08);   //
delay(2);
lcd_wcmd(0x01);   //
delay(2);
lcd_wcmd(0x06);   //
delay(2);
lcd_wcmd(0x0c);
delay(2);
}
uint shi(uchar k)
{
int m=1;
while(k!=0)
{
m=m*10;
k--;
}
return(m);
}
void jiajianchenchu()
{
uchar k;
if((jia!=0)&&(jia==0)&&(dian==0)){for(k=1;k<jia;k++){data1=data1+dato*shi(jia-1-k);}}
if((jia!=0)&&(jia==0)&&(dian!=0)){for(k=1;k<dian;k++){data1=data1+dato*shi(dian-1-k);}
for(k=dian+1;k<jia;k++){data9=data9+dato*shi(jia-1-k);}data1=data9/(pow(10,jia-dian-1))+data1;}//按了一次逻辑运算符号
if((jia!=0)){for(k=jia+1;k<jia;k++){data2=data2+dato*shi(jia-1-k);}}//按了两次逻辑运算符号

}                                                          
void zhengfu()
{
if(data5<0){lcd_pos(0x40);lcd_wdat('-');}
}
void deng()
{
uchar k;
if((jia==0)&&(den1!=0)&&(dian==0)&&dian==0){for(k=jia+1;k<den1;k++){data2=data2+dato*shi(den1-1-k);}}//算术中就只有一个运算符号
if((jia==0)&&(den1!=0)&&(dian>jia)&&(dian==0)){for(k=jia+1;k<dian;k++){data2=data2+dato*shi(dian-1-k);}
for(k=dian+1;k<den1;k++){data10=data10+dato*shi(den1-1-k);}data2=data10/(pow(10,den1-dian-1))+data2;;}
if((jia==0)&&(den1!=0)&&(dian!=0)&&(dian<jia)&&(dian==0)){for(k=jia+1;k<den1;k++){data2=data2+dato*shi(den1-1-k);}}
if((jia==0)&&(den1!=0)&&(dian!=0)&&dian!=0){for(k=jia+1;k<dian;k++){data2=data2+dato*shi(dian-1-k);}
for(k=dian+1;k<den1;k++){data10=data10+dato*shi(den1-1-k);}data2=data10/(pow(10,den1-dian-1))+data2;}
if(jia!=0&&den1!=0){for(k=jia+1;k<den1;k++){data3=data3+dato*shi(den1-1-k);}}
if(cos2!=0){for(k=2;k<den1;k++){data1=data1+dato*shi(den1-1-k);}
alldata=(int)cos(data1*3.14/180 );data4=fabs(cos(data1*3.14/180 ))-alldata;data5=cos(data1*3.15/180);}
if(sin2!=0){for(k=2;k<den1;k++){data1=data1+dato*shi(den1-1-k);}
alldata=(int)sin(data1*3.14/180 );data4=fabs(sin(data1*3.14/180 ))-alldata;data5=sin(data1*3.15/180);}
if(tan2!=0){for(k=2;k<den1;k++){data1=data1+dato*shi(den1-1-k);}
alldata=(int)tan(data1*3.14/180 );data4=fabs(tan(data1*3.14/180 ))-alldata;data5=tan(data1*3.15/180);}
}//算术中有两个运算符号

void huanyuan()       //取数字
{
number=(alldata/10000);
number=(alldata% 10000)/1000;
number=(alldata% 1000)/100;
number=(alldata% 100)/10;
number= alldata% 10;
if(data4!=0){xiaoshu=(int)(data4*1000);number=(xiaoshu/100);number=(xiaoshu%100)/10;number=xiaoshu%10;}
}
void xianshi()        //显示数字
{uchar k;
uchar mm;
uchar n=1,j=0,i=0;
zhengfu();
if(alldata!=0){for(k=0;k<5;k++){if(number!=0){mm=k;}} j=mm;
for(j;j<5;j++){lcd_pos(0x40+n);lcd_wdat(number+0x30);n++;delay(10);}
if(data4!=0){lcd_pos(0x40+n);n=n+1;lcd_wdat(0xa5);for(k=5;k<8;k++){lcd_pos(0x40+n);lcd_wdat(number+0x30);n++;delay(10);}}}
if((alldata==0)&&(data4!=0)){lcd_pos(0x41);lcd_wdat('0');delay(10);lcd_wdat(0xa5);n=3;for(k=5;k<8;k++){lcd_pos(0x40+n);lcd_wdat(number+0x30);n++;delay(10);}}
}   
void dataall()
{
if(jia2==2){alldata=(data1+data2+data3);}//两
if(jian2==2){alldata=fabs(data1-data2-data3);data5=data1-data2-data3;}//两个减号
if(cheng2==2){alldata=(data1*data2*data3);}//两个乘号
if(chu2==2){alldata=((data1/data2)/data3);data4=(data1/data2/data3-alldata);}//两个除号
if((jia2==1)&&(jia==0)){alldata=(int)(data1+data2);data4=(data2+data1)-alldata;}//一个加号
if((jian2==1)&&(jia2==0)&&(cheng2==0)&&(chu2==0)){alldata=fabs(data1-data2);data5=data1-data2;data4=(fabs(data1-data2)-alldata);}//一个减号
if((cheng2==1)&&(jia2==0)&&(chu2==0)&&(jian2==0)){alldata=data1*data2;data4=((data1*data2)-alldata);}//一个乘号
if((chu2==1)&&(jia2==0)&&(cheng2==0)&&(jian2==0)){alldata=(int)(data1/data2);data4=((data1/data2)-(int)(data1/data2));}//一个除号
if((jia2==1)&&(jian2==1)){if(jia1>jian1){alldata=fabs(data1-data2+data3);data5=data1-data2+data3;}
                           if(jia1<jian1){alldata=fabs(data1+data2-data3);data5=(data1+data2-data3);}}//加减
if((jia2==1)&&(chu2==1)){if(chu1>jia1){alldata=(data1+data2/data3);data4=((data1+data2/data3)-alldata);}//加除
                        if(chu1<jia1){alldata=(data1/data2+data3);data4=((data1/data2+data3)-alldata);}}
if((jia2==1)&&(cheng2==1)){if(cheng1>jia1){alldata=(data1+data2*data3);}//加乘
                         if(cheng1<jia1){alldata=(data1*data2+data3);}}
if((cheng2==1)&&(chu2==1)){if(cheng1>chu1){alldata=data1/data2*data3;data4=((data1/data2*data3)-alldata);}
                            if(cheng1<chu1){alldata=(data1*data2/data3);data4=((data1*data2/data3)-alldata);}}//乘除
if((jian2==1)&&(chu2==1)){if(jian1>chu1){alldata=fabs(data1/data2-data3);data4=((data1/data2-data3)-alldata);data5=(data1/data2-data3);}
                           if(jian1<chu1){alldata=fabs(data1-data2/data3);data4=fabs((data1-data2/data3)-alldata);data5=(data1-data2/data3);}}//减除
if((jian2==1)&&(cheng2==1)){if(cheng1>jian1){alldata=fabs(data1-data2*data3);data4=(data1-data2*data3);}
                        if(cheng1<jian1){alldata=fabs(data1*data2-data3);data4=fabs(data1*data2-data3);}}//建成

huanyuan();xianshi();                                                                                                                                                                                                                   
}
void panduanjuzhen() //判断并显示矩阵案的键                                                         
{
if (prekeyno!=keyno)
{i++;x++;
lcd_pos(x);       
switch(keyno)
{
case 0:lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos2++;x=x+2;while(P3!=0XFF);break;
case 1:lcd_wdat('s');delay(10);lcd_wdat('i');delay(10);lcd_wdat('n');sin2++;x=x+2;while(P3!=0XFF);break;
case 2:lcd_wdat('t');delay(10);lcd_wdat('a');delay(10);lcd_wdat('n');tan2++;x=x+2;while(P3!=0XFF);break;
case 3:{lcd_init();delay(10);lcd_pos(0x01);lcd_wdat('0');data6=alldata;data7=data4;data8=data5;cos2=0;i=0;data1=0;data2=0;data3=0;data4=0;alldata=0;data5=0;x=0;j=0;
chu2=0;cheng2=0;jia2=0;jian2=0;sin2=0;tan2=0;j9=0;j14=0;j19=0;j24=0;j23=0;j22=0;while(P3!=0XFF);den1=0;jia=0;jia=0;dian=0;dian=0;data9=0;data10=0;}break;
case 4:{alldata=data6;data4=data7;data5=data8;huanyuan();xianshi();alldata=0;data4=0;data5=0;x=0;}break;
case 5:{lcd_wdat('1');dato=1;while(P3!=0XFF);};break;
case 6:{lcd_wdat('2');dato=2;while(P3!=0XFF);};break;
case 7:{lcd_wdat('3');dato=3;while(P3!=0XFF);};break;
case 8:{j++;j9++;lcd_wdat('+');jia=i;jia1=i;jia2++;jiajianchenchu();while(P3!=0XFF);}break;
//case 9:{j1++;lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos1=i;cos2++;}break;
case 10:{lcd_wdat('4');dato=4;while(P3!=0XFF);};break;
case 11:{lcd_wdat('5');dato=5;while(P3!=0XFF);};break;
case 12:{lcd_wdat('6');dato=6;while(P3!=0XFF);};break;
case 13:{j++;j14++;lcd_wdat('-');jia=i;jian1=i;jian2++;jiajianchenchu();while(P3!=0XFF);}break;
//case 14:{j1++;lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos1=i;cos2++;}break;
case 15:{lcd_wdat('7');dato=7;while(P3!=0XFF);};break;
case 16:{lcd_wdat('8');dato=8;while(P3!=0XFF);};break;
case 17:{lcd_wdat('9');dato=9;while(P3!=0XFF);};break;
case 18:{j++;j19++;lcd_wdat('*');jia=i;cheng1=i;cheng2++;jiajianchenchu();while(P3!=0XFF);}break;
//case 19:{j1++;lcd_wdat('c');delay(10);lcd_wdat('o');delay(10);lcd_wdat('s');cos1=i;cos2++;}break;
case 20:{lcd_wdat('0');dato=0;while(P3!=0XFF);};break;
case 21:{j22++;lcd_wdat(0xa5);dian=i;while(P3!=0XFF);}break;
case 22:{lcd_wdat('=');den1=i;deng();dataall();while(P3!=0XFF);}break;
case 23:{j++;j24++;lcd_wdat('/');jia=i;chu1=i;chu2++;jiajianchenchu();while(P3!=0XFF);}break;
}
}
keyno=25;
}
   
void main()
{
uchar n=0,m=0;
lcd_init();
while(1){
keyscan();
panduanjuzhen();lcd_pos(0x40);// b=a-(int)a; /*小数部分 */c=(int)a; /* 整数部分 */

}}

点击此处下载 ourdev_547990.rar(文件大小:55K) (原文件名:计算器.rar)

LT1234567 发表于 2010-4-21 13:13:47

支持一下

zhangjinbo 发表于 2010-4-21 19:24:01

两天写的,够强的,学习了

wanglituan 发表于 2010-4-21 19:35:22

牛人

jrcsh 发表于 2010-4-22 12:20:33

8qaj

726bf 发表于 2010-4-22 13:24:17

牛人,我是花了一个星期才写完的

yezhubenyue 发表于 2010-4-22 14:20:14

~~~呵呵

yezhubenyue 发表于 2010-4-22 19:17:40

呵呵,一个星期啊,那肯定功能更多了。

zlq2000 发表于 2010-4-28 17:55:57

楼主是强人

yangshuo271 发表于 2010-5-8 13:55:21

不错 强啊

NingYun1314 发表于 2010-5-10 12:45:01

强人啊

leming1010 发表于 2010-5-10 15:43:11

学习了!

enjoyliwenhua 发表于 2010-8-20 10:40:42

待我啃啃,希望可以消化

ma_danver 发表于 2010-8-20 12:33:11

牛,说不定哪天用上了,mark一下

lpgyf 发表于 2010-8-20 13:25:08

mark

bluelool 发表于 2010-8-20 15:03:13

mark

fshunj 发表于 2010-8-20 15:44:54

竟然有这么牛的啊

devil_02 发表于 2010-8-20 16:24:05

mark

zidong_MCU 发表于 2010-8-20 16:33:47

强!!!mark!1

a331333835 发表于 2010-8-20 17:05:20

mark

qq20707 发表于 2010-8-20 19:12:27

不错 强人

aaa879771245 发表于 2010-8-21 11:19:25

MARK___C51实现计算器

amity 发表于 2010-8-21 11:57:39

牛,说不定哪天用上了

Hannah 发表于 2010-8-21 14:00:11

MARK

ccwhlg 发表于 2010-8-21 21:25:39

我真要写参考一下

gxglwy 发表于 2010-8-23 18:28:52

楼主很牛

yezhubenyue 发表于 2012-2-16 01:13:52

哎,那老师看都没看。。。。代码不规范,注释的也不清楚。。

zzz1367 发表于 2012-2-16 08:53:46

mark

zhaolong5 发表于 2012-2-16 09:24:44

switch(keyno)里面的case是多行应该加{};

luomo125 发表于 2012-2-17 15:10:52

qiang

lixupeng 发表于 2012-2-17 15:22:25

mark

huanghj8 发表于 2012-2-17 23:21:35

调试过了么

SiberianWolf 发表于 2012-2-18 10:47:34

mark

marshallemon 发表于 2012-2-18 10:56:08

51那点处理能力还是算了吧

leijiayou 发表于 2012-2-18 11:03:12

mark

garyluris 发表于 2012-2-18 17:34:39

楼主是好人!!

define 发表于 2012-2-20 10:56:02

我正在学1602的屏,看来楼主的程序我也想试试。谢谢楼主。

ywjj 发表于 2012-10-4 20:50:05

这个要收藏的

ubuntu1110 发表于 2012-10-4 21:33:03

收藏了,看看

zy0818 发表于 2012-10-8 03:20:59

这个工顶~~

wfbaaa 发表于 2012-10-8 06:33:54

可以,不简单

zhuangchao12 发表于 2012-10-9 00:49:47

确实是牛人

cycle 发表于 2013-7-14 21:29:37

{:smile:} 很好啊

snomom 发表于 2013-7-17 07:58:59

外行问问怎么样用?

WM_CH 发表于 2013-7-17 21:39:56

程序犹如行云流水阿....哈哈

AIHHLI 发表于 2013-7-17 21:53:43

代码真够乱的,函数变量名不建议用拼音。

unnormal 发表于 2013-7-18 11:18:34

能计算的最大位数以及最多多少个数据计算?支持一下
页: [1]
查看完整版本: 花了两天写的51简易计算器