找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11722|回复: 12
打印 上一主题 下一主题
收起左侧

单片机计算器程序

[复制链接]
跳转到指定楼层
楼主
ID:2355 发表于 2008-6-10 12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

高手老手们,谁能帮我完善一下这个单片机计算器程序呀c51!我这只能算了10以内的,要能算10以外的加算法该怎么办呀!帮下忙呀!



#include <reg52.h>
#include <intrins.h>
sbit RS=0xB0^6;
sbit RW=0xa0^5;
sbit E=0xa0^6;
#define LCM_RW  RW //定义引脚
#define LCM_RS  RS
#define LCM_E   E
#define LCM_Data  P0
#define Busy    0x80 //用于检测LCM状态字中的Busy标识
unsigned char n=0;
unsigned char one[17];
unsigned char two[17];
unsigned char code jianma[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char  *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void disp(void)
{
DisplayListChar(0,0,one);
}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
 ReadStatusLCM(); //检测忙
 LCM_Data = WDLCM;
 LCM_RS = 1;
 LCM_RW = 0;
 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 LCM_E = 0; //延时
 LCM_E = 1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) / ysC为0时忽略忙检测
{
 if (BuysC) ReadStatusLCM(); //根据需要检测忙
 LCM_Data = WCLCM;
 LCM_RS = 0;
 LCM_RW = 0;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
}

//读数据
unsigned char ReadDataLCM(void)
{
 LCM_RS = 1;
 LCM_RW = 1;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
 return(LCM_Data);
}

//读状态
unsigned char ReadStatusLCM(void)
{
 LCM_Data = 0xFF;
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 0;
 LCM_E = 0;
 LCM_E = 1;
 while (LCM_Data & Busy); //检测忙信号
 return(LCM_Data);
}

void LCMInit(void) //LCM初始化
{
 LCM_Data = 0;
 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 Delay5Ms();
 WriteCommandLCM(0x38,0);
 Delay5Ms();
 WriteCommandLCM(0x38,0);
 Delay5Ms();

 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 WriteCommandLCM(0x08,1); //关闭显示
 WriteCommandLCM(0x01,1); //显示清屏
 WriteCommandLCM(0x06,1); // 显示光标移动设置
 WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 X |= 0x80; //算出指令码
 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 WriteDataLCM(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char  *DData)
{
 unsigned char ListLength;

  ListLength = 0;
 Y &= 0x1;
 X &= 0xF; //限制X不能大于15,Y不能大于1
 while (DData[ListLength]!='\0') //若到达字串尾则退出
  {
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
  }
}

//5ms延时
void Delay5Ms(void)
{
 unsigned int TempCyc = 5552;
 while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
 unsigned char TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
 {
  TempCycB=7269;
  while(TempCycB--);
 };
}

void dlms(void)
{
unsigned int j;
for(j=500;j>0;j--)
{}
}
unsigned char kbscan(void)
{unsigned char sccode,recode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{ dlms();
if((P1&0xf0)!=0xf0)
{sccode=0xfe;
while((sccode&0x10)!=0)
{
P1=sccode;
if((P1&0xf0)!=0xf0)
 {recode=P1&0xf0;
 sccode=sccode&0x0f;
wait: P1=0xf0;
 if((P1&0xf0)!=0xf0)
 goto wait;
 else
 return(sccode+recode);
}
else
sccode=(sccode<<1)|0x01;
}
}

}
 return(0) ;

}

void delay (unsigned char m)   //控制频率延时,基本延时为1ms
{
 unsigned i=m;
 while(--i);
}

void delayms(unsigned char a)  //毫秒延时子程序
{
  while(--a);      //采用while(--a) 不要采用while(a--);
}
unsigned char panduanshuzi(unsigned char k)
{ unsigned char i;
  switch(k)
{case 0xee:
 i=1;break;
 case 0xde:
 i=2;break;
 case 0xbe:
 i=3;break;
 case 0x7e:
 i=4;break;
 case 0xed:
 i=5;break;
 case 0xdd:
 i=6;break;
 case 0xbd:
 i=7;break;
 case 0x7d:
 i=8;break;
 case 0xeb:
 i=9;break;
 case 0xd7:
 i=0;break;
 default:i=10;
 }
 return(i);
}
unsigned char panduanfuhao(unsigned char m)
{ unsigned char i;
  switch(m)
{case 0xdb:
 i='+';break;
 case 0xbb:
 i='-';break;
 case 0x7b:
 i='*';break;
 case 0xe7:
 i='/';break;
 default:i=0;
 }
 return(i);
}
main()
{unsigned char a,b,c,d,k,clr;
unsigned int a1,b1,c1,d1,e,e1,e2;
start: Delay400Ms(); //启动等待,等LCM进入工作状态
 LCMInit(); //LCM初始化
 Delay5Ms();
 a=0;
 b=0;
 c=0;
 d=0;
 e=0;
 a1=0;
 b1=0;
 c1=0;
 d1=0;
 e1=0;
 e2=0;
 k=0;
while(1)
{k=kbscan();
if(k!=0)
{a=k;
 a1=panduanshuzi(a);
 if(a1!=10)
 {
 one[0]=a1+0x30;
 one[1]='\0';
DisplayListChar(0,0,one);
};
fuhao: b=kbscan();
 if(b==0)
 goto fuhao;
 b1=panduanfuhao(b);
 if(b1!=0)
 {one[1]=b1;
 one[2]='\0';
DisplayListChar(0,0,one);
}
secdata: c=kbscan();
 if(c==0)
 goto secdata;
 c1=panduanshuzi(c);
 if(c1!=10)
 {one[2]=c1+0x30;
 one[3]='\0';
DisplayListChar(0,0,one); };
equ: d=kbscan();
if (d!=0xb7)
goto equ;
one[3]='=';
switch(b1)
{case '+':
{e=a1+c1;
one[4]=' ';}
break;
case '-':
{if(a1>=c1)
{e=a1-c1;
one[4]=' ';}
else {e=c1-a1;
one[4]='-';}};break;
case '*':
{
e=a1*c1;
one[4]=' ';}break;
case '/':
{
e=a1/c1;
one[4]=' ';}break;
default:e=0;}
e1=e/10;
e2=e%10;
e1=e1+0x30;
e2=e2+0x30;
one[5]=e1;
one[6]=e2;
one[7]='\0';
DisplayListChar(0,0,one);
clr1:clr=kbscan();
if(clr!=0x77)
goto clr1;
else
{ //启动等待,等LCM进入工作状态
 LCMInit(); //LCM初始化
 Delay5Ms();
 break;}
}
}
}

http://www.51hei.com 里面也有一个计算机程序好像也不大好用。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7 发表于 2008-6-10 12:42 | 只看该作者

相同位数的数相加取余为该位数字,除10为下一位数字

回复

使用道具 举报

板凳
ID:2002 发表于 2008-6-18 20:49 | 只看该作者
 好长看不懂
回复

使用道具 举报

地板
ID:4847 发表于 2008-9-3 09:25 | 只看该作者
有没有科学计算器的程序啊,谢谢
回复

使用道具 举报

5#
ID:4839 发表于 2008-9-3 23:37 | 只看该作者
大哥,都用上了C语言了,小弟还不会呀!
       佩服佩服!
教教小弟!
回复

使用道具 举报

6#
ID:4905 发表于 2008-9-4 10:40 | 只看该作者
不会啊
回复

使用道具 举报

7#
ID:5906 发表于 2008-10-14 22:23 | 只看该作者

很好 ,很强大 拷了。

回复

使用道具 举报

8#
ID:5906 发表于 2008-10-14 22:26 | 只看该作者

从网上找的没有实践过;

/*--------------------------------------
计算器源程序
Calculator progarm V1.0
MCU STC89C52RC  XAL 12MHz
Build by Gavin Hu, 2007.11.23
--------------------------------------*/
#include <reg51.h>
//
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long 

#define MAX_NUM 99999992.0
#define MIN_NUM -9999992.0 

sbit BUZZ=P3^7;
uchar dec_flag; 

void delay(uint);
void display(uchar*);
uchar key_scan(uint);
uchar add_number(uchar*,uchar);
float str2float(uchar*);
uchar float2str(uchar*,float);
float calcu(float,float,uchar);
void err_sound(void); 

/*--------------------------------------
  main function
--------------------------------------*/
void main(void)
{
uchar kk,mm,err,lk,d1ok,ec;
uchar dispram[9];
float d1,d2; 

err=0;
d1ok=0;
ec=0;
mm=0;
dec_flag=0;
d1=0.0;
d2=0.0;
float2str(dispram,d1);
BUZZ=0;
for (kk=10;kk;kk--) display(dispram);
BUZZ=1; 

while (!err)
    {
    display(dispram);
    kk=key_scan(((uint)(P3)<<8)|P1);
    if (kk!=0xff)
        {
        BUZZ=0;
        display(dispram);
        BUZZ=1;
        switch (kk)
            {
            case 0: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,7);
                    lk=0; ec=0; break;
            case 1: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,8);
                    lk=0; ec=0; break;
            case 2: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,9);
                    lk=0; ec=0; break;
            case 3: if (!d1ok) {d1=str2float(dispram); d1ok=1;}
                        else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
                    kk=float2str(dispram,d1);
                    if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
                    lk=1; mm=4; ec=0; break;
            case 4: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,4);
                    lk=0; ec=0; break;
            case 5: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,5);
                    lk=0; ec=0; break;
            case 6: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,6);
                    lk=0; ec=0; break;
            case 7: if (!d1ok) {d1=str2float(dispram); d1ok=1;}
                        else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
                    kk=float2str(dispram,d1);
                    if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
                    lk=1; mm=3; ec=0; break;
            case 8: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,1);
                    lk=0; ec=0; break;
            case 9: if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,2);
                    lk=0; ec=0; break;
            case 10:if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,3);
                    lk=0; ec=0; break;
            case 11:if (!d1ok) {d1=str2float(dispram); d1ok=1;}
                        else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
                    kk=float2str(dispram,d1);
                    if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
                    lk=1; mm=2; ec=0; break;
            case 12:if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,0);
                    lk=0; ec=0; break;
            case 13:if (lk) {float2str(dispram,0.0); dec_flag=0;}
                    add_number(dispram,10);
                    lk=0; ec=0; break;
            case 14:if (!d1ok) {d1=str2float(dispram); d1ok=1;}
                        else if (lk!=1) {d2=str2float(dispram); d1=calcu(d1,d2,mm);}
                    kk=float2str(dispram,d1);
                    if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
                    lk=1; mm=1; ec=0; break;
            case 15:if (ec==0)
                        {
                        if (!d1ok) d1=str2float(dispram);
                            else {d2=str2float(dispram); d1=calcu(d1,d2,mm); ec=1;}
                        }
                        else {d1=calcu(d1,d2,mm);}
                    kk=float2str(dispram,d1);
                    if ((d1==0xffffffff)||(kk==0xff)) {err=1; break;}
                    lk=2; d1ok=0; break;
            }
        while ((P1&P3)!=0xff) display(dispram);
        }
    }
dispram[0]=14;
for (kk=1;kk<8;kk++) dispram[kk]=17;
dispram[8]=255;
err_sound();
while (1)
    {
    display(dispram);
    kk=key_scan(((uint)(P3)<<8)|P1);
    if (kk!=0xff)
        {
        err_sound();
        while ((P1&P3)!=0xff) display(dispram);
        }
    }
} 

/*--------------------------------------
  Delay function
  Parameter: unsigned int dt
  Delay time=dt(ms)
--------------------------------------*/
void delay(unsigned int dt)
{
register unsigned char bt,ct;
for (; dt; dt--)
    for (ct=2;ct;ct--)
        for (bt=250; --bt; );
} 

/*--------------------------------------
  8 LED digital tubes display function
  Parameter: sting pointer to display
--------------------------------------*/
void display(uchar*disp_ram)
{
unsigned char i;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
for (i=0;i<8;i++)
    {
    if (disp_ram[8]==i) P0 =table[disp_ram]&0x7f;
        else P0 =table[disp_ram];
    P2 =0x01<<i;
    delay(2);
    P0 =0xff;
    P2 =0;
    }
} 

/*--------------------------------------
  Key scan function
  Parameter key port state word
  Return key number,255 no key press
--------------------------------------*/
uchar key_scan(uint key_port)
{
unsigned char i;
for (i=0;i<16;i++)
    {
    if (!(key_port&0x0001)) return i;
    key_port >>=1;
    key_port |=0x8000;
    }
return 0xff;
} 

/*--------------------------------------
  Add number (input figures) function
  Parameter:pointer for result,new number
  Retrun:0 fail,other ok
--------------------------------------*/
uchar add_number(uchar*ch,uchar num)
{
uchar i;
if (ch[0]!=17) return 0;
if (num==10)
    if (!dec_flag)
        {dec_flag=1;return 2;}
        else return 0;
if ((!dec_flag)&&(ch[7]==0)&&(ch[6]==17)) {ch[7]=num;return 1;}
for (i=0;i<7;i++) ch=ch[i+1];
ch[7]=num;
ch[8]-=dec_flag;
return 1;
} 

/*--------------------------------------
  String to float function
  Parameter:pointer of string
  Return result, 0xffffffff fail
--------------------------------------*/
float str2float(uchar*ch)
{
uchar i,ng;
float dt,ft;
ng=0;
dt=0.0;
ft=1.0;
i=ch[8];
do  {
    if (ch>9)
        {
        if (ch==16) ng=1;
        break;
        }
    dt+=ch*ft;
    ft*=10.0;
    } while (i--);
ft=0.1;
for (i=ch[8]+1;i<8;i++)
    {
    dt+=ch*ft;
    ft/=10.0;
    }
if (ng) dt*=-1.0;
if ((dt>MAX_NUM)||(dt<MIN_NUM)) return 0xffffffff;
    else return dt;
} 

接下一个
回复

使用道具 举报

9#
ID:5906 发表于 2008-10-14 22:26 | 只看该作者

由于太大只能分两次法了
/*--------------------------------------
  Float to string function
  Parameter:pointer for result,data to convert
  Retrun:0 ok,255 fail
--------------------------------------*/
uchar float2str(uchar*ch,float dt)
{
uchar i,ng;
float f;
if ((dt>MAX_NUM)||(dt<MIN_NUM)) return 0xff;
ng=0;
if (dt<0.0) {dt*=-1.0; ng=1;}
f=10000000.0;
for (i=0;i<7;i++)
    {
    if ((dt/f)>=1.0) break;
        else f/=10.0;
    }
for (i=0;i<8;i++)
    {
    ch=(uchar)(dt/f);
    dt -=f*ch;
    if (f==1.0) {ch[8]=i;}
    f/=10.0;
    }
if (ch[0]>9) return 0xff;
if (ng)
    {
    for (i=7;i;i--) ch=ch[i-1];
    ch[0]=16;
    ch[8]++;
    }
while ((ch[7]==0)&&(ch[8]<7))
    {
    for (i=7;i;i--)
        {
        ch=ch[i-1];
        }
    ch[0]=17;
    ch[8]++;
    }
if ((ch[6]==16)&&(ch[7]==0)) ch[6]=17;
return 0;
} 

/*--------------------------------------
  Calculate function
  Parameter:data1,data2,mathod
  Return result
--------------------------------------*/
float calcu(float a,float b,uchar m)
{
float dt;
switch (m)
    {
    case 1: dt=a+b; break;
    case 2: dt=a-b; break;
    case 3: dt=a*b; break;
    case 4: if (b==0.0) return 0xffffffff;
                else dt=a/b; break;
    }
if ((dt>MAX_NUM)||(dt<MIN_NUM)) return 0xffffffff;
    else return dt;
} 

/*--------------------------------------
  Err sound function
--------------------------------------*/
void err_sound(void)
{
uchar i;
BUZZ=0;
delay(500);
for (i=0;i<5;i++)
    {
    BUZZ=!BUZZ;
    delay(100);
    }
} 

回复

使用道具 举报

10#
ID:14302 发表于 2009-6-15 20:52 | 只看该作者
真的是看不懂啊,怎么没有原理图啊
回复

使用道具 举报

11#
ID:15822 发表于 2009-8-2 18:15 | 只看该作者

没电路图啊。。。。

回复

使用道具 举报

12#
ID:108699 发表于 2016-6-8 22:50 | 只看该作者
这个应该行#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit rs=P2^2; sbit rw=P2^1; sbit e=P2^0; void write_dat(uchar dat);  void write_com(uchar com); void process(void); void keyscan();  /*按键功能*/ uchar code table1[]= { 1,2,3,0x2b-0x30,                       // 1,   2,   3,    + 4,5,6,0x2d-0x30,                                   // 4,   5,   6,    - 7,8,9,0x2a-0x30,                                   // 7,   8,   9,    x 0,0x3d-0x30,0x01-0x30,0x2f-0x30           // 0,   =,   清零, / };  uchar k=0,flag=0,num,fuhao[6],i,temp1=0,flag1=0;  long a,b,c,d;   void delay(uint z) {     uint x,y;     for(x=z;x>0;x--)         for(y=110;y>0;y--); } /********按键处理***********/ void keyscan() {     uchar temp;     P3=0xfe;     temp=P3;     temp=temp&0xf0;     while(temp!=0xf0)     {        delay(5);        temp=P3;        temp=temp&0xf0;        while(temp!=0xf0)        {            temp=P3;            switch(temp)            {               case 0xee:num=0;                 break;                                       case 0xde:num=1;                     break;               case 0xbe:num=2;                     break;               case 0x7e:num=3;                     break;             }                                      while(temp!=0xf0)                 // 松手检测                 { temp=P3;                   temp=temp&0xf0;                          }            }        if(num==0||num==1||num==2)        {                          if(flag==0)                a=a*10+table1[num]; //如果没有按符号键,符号前的数值为a             else if(flag==1)                b=b*10+table1[num];  //如果按了符号键,符号后的数值为b                                           else if(temp1>=2&&flag1==1)                    {                      flag=1;                          flag1=0;                                process();                                                           a=c;                          b=table1[num];                            }                                                                                                            if(k==1)                          {                     k=0;                 write_com(0x01);                        }             }                 else if(num==3)                    {              flag++;                          flag1=1;                          temp1++;                    fuhao[temp1-1]=1;                                          }                                                                                            i=table1[num];    //显示按下的键       write_dat(0x30+i);         }     P3=0xfd;     temp=P3;     temp=temp&0xf0;     while(temp!=0xf0)     {        delay(5);        temp=P3;        temp=temp&0xf0;        while(temp!=0xf0)        {            temp=P3;            switch(temp)            {               case 0xed:num=4;                 break;                                       case 0xdd:num=5;                     break;               case 0xbd:num=6;                     break;               case 0x7d:num=7;                     break;             }                                      while(temp!=0xf0)                 { temp=P3;                  temp=temp&0xf0;                          }            }          if(num==4||num==5||num==6)               {                  if(k==1)                            {                         k=0;                     write_com(0x01);                            }              if(flag==0)                 a=a*10+table1[num];              else if(flag==1)                 b=b*10+table1[num];                          else if(temp1>=2&&flag1==1)                            {                              flag=1;                                  flag1=0;                              process();                                                                        a=c;                                  b=table1[num];                                    }                                                                                                   }          else if(num==7)              {              flag++;                          temp1++;                          flag1=1;                          fuhao[temp1-1]=2;                                                               }          i=table1[num];              write_dat(0x30+i);                    }     P3=0xfb;     temp=P3;     temp=temp&0xf0;     while(temp!=0xf0)     {        delay(5);        temp=P3;        temp=temp&0xf0;        while(temp!=0xf0)        {            temp=P3;            switch(temp)                            {               case 0xeb:num=8;                 break;                                       case 0xdb:num=9;                              break;               case 0xbb:num=10;                     break;                case 0x7b:num=11;                 break;                                        }                                      while(temp!=0xf0)                 { temp=P3;                  temp=temp&0xf0;                          }            }            if(num==8||num==9||num==10)              {                if(k==1)                            {                         k=0;                     write_com(0x01);                            }                if(flag==0)                   a=a*10+table1[num];                else if(flag==1)                   b=b*10+table1[num];                            else if(temp1>=2&&flag1==1)                            {                              flag=1;                                  flag1=0;                              process();                                                                        a=c;                                  b=table1[num];                                    }                                                                   }            else if(num==11)               {                 flag++;                     temp1++;                                 flag1=1;                                 fuhao[temp1-1]=3;                                                                              }                                                                        i=table1[num];            write_dat(0x30+i);                }        P3=0xf7;     temp=P3;     temp=temp&0xf0;     while(temp!=0xf0)     {        delay(5);        temp=P3;        temp=temp&0xf0;        while(temp!=0xf0)        {            temp=P3;            switch(temp)            {               case 0xe7:num=12;    // 0键                 break;                                       case 0xd7:num=13;     // '='                     break;               case 0xb7:num=14;         //清零键                     break;                case 0x77:num=15;                //除号键                 break;                                        }                                      while(temp!=0xf0)                 { temp=P3;                  temp=temp&0xf0;                       }                                            }           switch(num)           {              case 12:                      {                   if(k==1)                            {                         k=0;                     write_com(0x01);                            }                  if(flag==0)                    a=a*10;                  else if(flag==1)                     b=b*10;                                  else if(temp1>=2&&flag1==1)                            {                              flag=1;                                  flag1=0;                              process();                                                                        a=c;                                  b=table1[num];                                    }                                                                write_dat(0x30);                            }                    break;              case 13:                        {                   k=1;                                   if(temp1>=2)                                      fuhao[0]=fuhao[temp1-1];                  if(fuhao[0]==1)                             {                                                write_com(0x80+0x4f);                      write_com(0x04);                              c=a+b;                                          d=c;                      while(c!=0)                                                                          {                         write_dat(0x30+c%10);                                 c=c/10;                                                                                                           }                     write_dat(0x3d);                          fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;                     a=0;b=0;flag=0;flag1=0;temp1=0;                                     }                  if(fuhao[0]==2)                          {                     write_com(0x80+0x4f);                     write_com(0x04);                          if(a>=b)                                 {                            c=a-b;                                           d=c;                       while(c!=0)                                   {                          write_dat(0x30+c%10);                                  c=c/10;                       }                                                                                                                                                        }                     else if(a<b)                                 {                            c=b-a;                                            d=c;                        while(c!=0)                                {                            write_dat(0x30+c%10);                                    c=c/10;                                }                       write_dat(0x2d);                                 }                                               write_dat(0x3d);                     fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;                     a=0;b=0;flag=0;flag1=0;temp1=0;                                                    }                  if(fuhao[0]==3)                            {                     write_com(0x80+0x4f);                     write_com(0x04);                     c=a*b;                                         d=c;                         while(c!=0)                                 {                        write_dat(0x30+c%10);                            c=c/10;                                 }                     write_dat(0x3d);                                                                                                     fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;                     a=0;b=0;flag=0;flag1=0;temp1=0;                                                    }                  if(fuhao[0]==4)                                {                               i=0;                      write_com(0x80+0x4f);                      write_com(0x04);                     c=(long)(((float)a/b)*1000000);                         d=c;                                         while(c!=0)                                 {                        write_dat(0x30+c%10);                            c=c/10;                                i++;                             if(i==6)                                             write_dat(0x2e);                                                                         }                         if(a/b<=0)                      write_dat(0x30);                      write_dat(0x3d);                      fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;                                         fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;                     a=0;b=0;flag=0;flag1=0;temp1=0;                          }                          }               break;                                 case 14:                 { write_com(0x01);                  a=0;b=0;flag=0;temp1=0;flag1=0;                                  fuhao[0]=0;fuhao[1]=0;fuhao[2]=0;                                  fuhao[3]=0;fuhao[4]=0;fuhao[5]=0;                            }                  break;               case 15:                   {                     flag++;                         temp1++;                                         flag1=1;                                     fuhao[temp1-1]=4;                                                  write_dat(0x30+table1[num]);                                        }                    break;                       }                             }                 } /*******led1602显示*******/ void write_com(uchar com) {    rs=0;    rw=0;    P0=com;    e=1;    delay(5);    e=0; } void write_dat(uchar dat) {    rs=1;    rw=0;    P0=dat;    e=1;    delay(5);    e=0; }  void process(void) {               if(fuhao[temp1-2]==1)    //如果符号键是+,执行加法运算                  {                     c=a+b;                    b=0;                    }                                            // 如果符号键是-,执行减法运算          if(fuhao[temp1-2]==2)                   {                     c=a-b;                         b=0;                    }                                                                                                                       if(fuhao[temp1-2]==3)   //如果符号键是*执行乘法运算                   {                             c=a*b;                         b=0;                     }           if(fuhao[temp1-2]==4)      //如果符号键是/ 执行除法运算                                  {                      c=(long)((float)a/b);                                 b=0;                                                                                                                                                                                                                  }                                      }  /*液晶的初始化*/ void init()  //初始化 {    delay(15);    write_com(0x38);    delay(6);    write_com(0x38);    delay(6);    write_com(0x38);    write_com(0x38);    write_com(0x0c);  //开显示,关光标    write_com(0x06);  //光标移动    write_com(0x01);  //清屏   }                                     void main() {             init();     while(1)     {            keyscan();                  } }
回复

使用道具 举报

13#
ID:126028 发表于 2016-6-9 22:58 | 只看该作者
很好很强大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表