单片机计算器设计.docx

上传人:b****8 文档编号:10067177 上传时间:2023-05-23 格式:DOCX 页数:15 大小:427.57KB
下载 相关 举报
单片机计算器设计.docx_第1页
第1页 / 共15页
单片机计算器设计.docx_第2页
第2页 / 共15页
单片机计算器设计.docx_第3页
第3页 / 共15页
单片机计算器设计.docx_第4页
第4页 / 共15页
单片机计算器设计.docx_第5页
第5页 / 共15页
单片机计算器设计.docx_第6页
第6页 / 共15页
单片机计算器设计.docx_第7页
第7页 / 共15页
单片机计算器设计.docx_第8页
第8页 / 共15页
单片机计算器设计.docx_第9页
第9页 / 共15页
单片机计算器设计.docx_第10页
第10页 / 共15页
单片机计算器设计.docx_第11页
第11页 / 共15页
单片机计算器设计.docx_第12页
第12页 / 共15页
单片机计算器设计.docx_第13页
第13页 / 共15页
单片机计算器设计.docx_第14页
第14页 / 共15页
单片机计算器设计.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机计算器设计.docx

《单片机计算器设计.docx》由会员分享,可在线阅读,更多相关《单片机计算器设计.docx(15页珍藏版)》请在冰点文库上搜索。

单片机计算器设计.docx

单片机计算器设计

单片机—简易计算器的设计

       这个周末本想去图书馆看书, 开始复习,但是偏偏这个时候感冒了,而且不是着凉引起的,而是上火引起的,注定这个周末要在宿舍度过。

周六头晕晕的,在宿舍睡了一天,出了一身的汗,吃了点药,好了些,周日感觉清醒了很多,对着电脑不知道干吗好,刚好看到最后一个单片机的设计性实验——简易计算器的设计,反正闲着也是闲着,就拿来做了一下,在网上找了一些资料,一天时间完全搞定,当然有参考网友的程序,有现成的程序干吗不拿来用呢?

毕竟创新都是从模仿开始的嘛!

  当然这个程序所实现的功能比实验中所要求的功能要多,程序不是很长,因为算法比较好,呵呵。

但是也有其不足之处,具体表现在除法运算中,一天结束,还没来得及完善,高手可以看一下,应该可以看的具体表现在哪里吧,望请多多指教。

 

仿真图:

 

 

 

 

程序源代码:

#include  

#defineucharunsignedchar

sbitlcden=P2^3;

sbitrs=P2^4;

sbitrw=P2^0;

sbitbusy=P0^7;

chari,j,temp,num;

longa,b,c;    //a,第一个数b,第二个数c,得数

ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

ucharcodetable[]={

7,8,9,0,

4,5,6,0,

1,2,3,0,

0,0,0,0};

ucharcodetable1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};       //按键显示编码表

voiddelay(ucharz)

{

 ucharx,y;

 for(x=z;x>0;x--)

   for(y=0;y<110;y++);

}

voidcheck()//判断忙或空闲

{

do

 {

   P0=0xff;

   rs=0;    

   rw=1;    //读

   lcden=0;    //禁止读写

   delay

(1);//等待,液晶显示器处理数据

   lcden=1;    //允许读写

 }

 while(busy==1);//判断是否为空闲,1为忙,0为空闲

}

voidwrite_com(ucharcom)//写指令函数

{

 P0=com;   //com指令付给P0口

 rs=0;

 rw=0;

 lcden=0;

 check();

 lcden=1;

}

voidwrite_date(uchardate)//写数据函数

{

 P0=date;

 rs=1;

 rw=0;

 lcden=0;

 check();

 lcden=1;

}

voidinit()//初始化

{

 num=-1;

 lcden=1;

 write_com(0x38);

 write_com(0x0c);

 write_com(0x06);

 write_com(0x80);//检测忙信号

 write_com(0x01);

 i=0;

 j=0;

 a=0;    //第一个参与运算的数

 b=0;    //第二个参与运算的数

 c=0;

 flag=0;//flag表示是否有符号键按下,

 fuhao=0;//fuhao表征按下的是哪个符号

}

voidkeyscan()//键盘扫描程序

{

 P3=0xfe;

 if(P3!

=0xfe)

  {

   delay(10);//延迟20ms

   if(P3!

=0xfe)

    {

     temp=P3&0xf0;

     switch(temp)

      {

      case0xe0:

num=0;

        break;

      case0xd0:

num=1;

        break;

      case0xb0:

num=2;

        break;

      case0x70:

num=3;

        break;

      }

      }

     while(P3!

=0xfe);

     if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

    {

       if(j==1)//确认一次计算完毕,清屏

        {

          write_com(0x01);

          j=0;

        }

       if(flag==0)//没有按过符号键

      {

       a=a*10+table[num];

        }

      else//如果按过符号键

      {

       b=b*10+table[num];

        }

    }

    else//如果按下的是'/'

    {

     flag=1;

     fuhao=4;//4表示除号已按

    }

  i=table1[num];

  write_date(0x30+i);

 }

 P3=0xfd;

 if(P3!

=0xfd)

 {

   delay(5);

   if(P3!

=0xfd)

   {

     temp=P3&0xf0;

     switch(temp)

      {

       case0xe0:

num=4;

           break;    

       case0xd0:

num=5;

           break;

       case0xb0:

num=6;

           break;

       case0x70:

num=7;

           break;

     }

   }

   while(P3!

=0xfd);

   if(num==4||num==5||num==6)//如果按下的是'4','5'或'6'

   {

     if(j==1)

        {

        write_com(0x01);

        j=0;

         } 

       if(flag==0)//没有按过符号键

     {

        a=a*10+table[num];

     }

     else//如果按过符号键

     {

       b=b*10+table[num];

     }

   }

  else//如果按下的是'X'

  {

    flag=1;

    fuhao=3;//3表示乘号已按

  }

  i=table1[num];

  write_date(0x30+i);

 }

 P3=0xfb;

 if(P3!

=0xfb)

 {

   delay(10);

   if(P3!

=0xfb)

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case0xe0:

num=8;

         break;

     case0xd0:

num=9;

         break;    

     case0xb0:

num=10;

         break;

   case0x70:

num=11;

         break;

    }

   }

  while(P3!

=0xfb);

  if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

  {

    if(j==1)

       {

         write_com(0x01);

         j=0;

        }

    if(flag==0)//没有按过符号键

     {

       a=a*10+table[num];

     }

    else//如果按过符号键

     {

       b=b*10+table[num];

     }

  }

  elseif(num==11)//如果按下的是'-'

   {

    flag=1;

    fuhao=2;//2表示减号已按

   }

  i=table1[num];

  write_date(0x30+i);

 }

 P3=0xf7;

 if(P3!

=0xf7)

 {

   delay(5);

   if(P3!

=0xf7)

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case0xe0:

num=12;

         break;

     case0xd0:

num=13;

         break;    

     case0xb0:

num=14;

         break;

     case0x70:

num=15;

         break;

    }

   }

  while(P3!

=0xf7);

 switch(num)

   {

     case12:

//按下的是"清零"

       {

         write_com(0x01);

      a=0;

      b=0;

      flag=0;

      fuhao=0;

         }

     break;

     case13:

//按下的是"0"

     {               

          if(flag==0)//没有按过符号键

          {

           a=a*10;

           write_date(0x30);

          }

          if(flag==1)//如果按过符号键

          {

           b=b*10;

           write_date(0x30);

           }

        }

     break;

     case14:

     {

      j=1; 

            if(fuhao==1)

       {

        write_com(0x80+0x4f);//按下加号键,光标前进至第二行最后一个显示处

              write_com(0x04);    //设置从后住前写数据

              c=a+b;

              while(c!

=0)

               {

                 write_date(0x30+c%10);

                 c=c/10;

               }

              write_date(0x3d);    //写"="

              a=0;b=0;flag=0;fuhao=0;

               }

         elseif(fuhao==2)

       {

        write_com(0x80+0x4f);//按下减号按键

              write_com(0x04);    //设置从后住前写数据

              if(a-b>0)

                c=a-b;

              else

                c=b-a;

              while(c!

=0)

               {

                write_date(0x30+c%10);

                c=c/10;

               }

               if(a-b<0)

                      write_date(0x2d);   //写负号"-"

                    write_date(0x3d);    //再写"="          

                    a=0;b=0;flag=0;fuhao=0;

                }

        elseif(fuhao==3)//按下乘号按键

      {

        write_com(0x80+0x4f);

              write_com(0x04);

               c=a*b;

               while(c!

=0)

                {

                write_date(0x30+c%10);

                c=c/10;

                }

               write_date(0x3d);    

            a=0;b=0;flag=0;fuhao=0;

           }

        elseif(fuhao==4)//按下除号按键

      {

       write_com(0x80+0x4f);

              write_com(0x04);

              i=0;

              c=(long)(((float)a/b)*1000);

             while(c!

=0)

               {

                  write_date(0x30+c%10);

                  c=c/10;

                  i++;

                  if(i==3)              //精确到小数点后三位

                   write_date(0x2e); //写小数点

               }

              if(a/b<=0)

                write_date(0x30);

              write_date(0x3d);                             

              a=0;b=0;flag=0;fuhao=0;

             }

       }

  break;

  case15:

     {

      write_date(0x30+table1[num]);flag=1;fuhao=1;

     }

  break;

  }

 }

}

main()

{

init();

while

(1)

{

  keyscan();

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2