单片机设计简易计算器.docx

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

单片机设计简易计算器.docx

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

单片机设计简易计算器.docx

单片机设计简易计算器

单片机设计简易计算器

2009-06-1014:

18

题目:

根据所学单片机知识,设计一简易计算器,要求至少用到键盘,LED数码管,LCD1602液晶,ADC0809,DA0832,串口,等中的两种,每个项目中至少包含定时器,总线,中断中的两种。

设计方案:

应用矩阵键盘,LCD1602,单片机,74HC21与门,总线,中断设计简易计算器。

实验内容:

             1、P0口接上拉电阻做液晶输出端口,连接图如实验原理图所示。

             2、键盘接在P1口上,如实验原理图所示,并用74HC21与门实现中断请求。

             3、程序设计,见文后。

实验原理图(如下):

键盘接口图:

74HC21与门接线图:

上拉电阻:

LCD1602液晶:

实验效果:

程序设计:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitlcden=P2^3;//定义引脚E使能

sbitrs=P2^4;

sbitrw=P2^0;

sbitbusy=P0^7;

sbitp33=P3^3;

chari,j,temp,num,num_1;

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,  //按键标值0x2f-0x30是将字符转化为数字,与后面的0x30+i抵消,得i值

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

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

                   0x01-0x30,0,0x3d-0x30,0x2b-0x30//0x01是清屏命令

                   };

voiddelay(ucharz)  //延迟函数

{

    uchary;

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

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

}

voidcheck()//判断忙或空闲

{

   do{

       P0=0xFF;

       rs=0;         

       rw=1;         //读rsrw值为01时,忙标志和地址计数器读出

       lcden=0;      //E=0,禁止读写

       delay

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

       lcden=1;      //E=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()//初始化

{

   lcden=1;        //使能信号为高电平

   write_com(0x38);//功能设置命令:

8位,2行DDRAM的地址

   write_com(0x0e);//显示开,光标开,不闪烁

   write_com(0x06);//增量方式不移位

   write_com(0x80);//设置访问地址

num_1=0;

   i=0;

   j=0;

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

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

   c=0;  //结果值

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

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

}

voidkeyscan(void)//键盘扫描程序

{

   voidint0();

  P1=0xfe;

  if(P1!

=0xfe)

  {

      delay(20);//20ms

      if(P1!

=0xfe)

      {

           temp=P1&0xf0;

           switch(temp)

              {

                case0xe0:

num=0;

                break;

                case0xd0:

num=1;

                break;

                case0xb0:

num=2;

                break;

                case0x70:

num=3;

                break;

              }

        }

        while(P1!

=0xfe);

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

        {

            if(j!

=0)

            {

                write_com(0x01);//清屏命令

                j=0;

            }

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

            {

                a=a*10+table[num];//a的初值为'0',结果为输入a值

            }

             else     //如果按过符号键

             {

               b=b*10+table[num];//b的初值为'0',结果为输入b值

             }

          }

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

         {

            flag=1;

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

          }

         i=table1[num];

         write_date(0x30+i);//将数字转化为字符,对应前面的table1中的i-0x30

       }   

       P1=0xfd;

      if(P1!

=0xfd)

      {

          delay(5);

          if(P1!

=0xfd)

          {

              temp=P1&0xf0;

              switch(temp)

              {

                case0xe0:

num=4;

                break;

     case0xd0:

num=5;

                break;

                case0xb0:

num=6;

                break;

                case0x70:

num=7;

                break;

               }

            }

            while(P1!

=0xfd);

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

            {

                if(j!

=0)

               {

                    write_com(0x01);//清屏命令

                    j=0;

                 }

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

                 {

                    a=a*10+table[num];   //输入a值

                 }

                  else//如果按过符号键

                 {

                      b=b*10+table[num];//输入b值

                  }

              }

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

             {

                 flag=1;

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

              }

              i=table1[num];

              write_date(0x30+i);

      

         }

         P1=0xfb;

         if(P1!

=0xfb)

         {

             delay(5);

             if(P1!

=0xfb)

             {

                temp=P1&0xf0;

                 switch(temp)

                {

                   case0xe0:

num=8;

                    break;

                   case0xd0:

num=9;

                   break;

                   case0xb0:

num=10;

                   break;

                   case0x70:

num=11;

                   break;

                  }

               }

               while(P1!

=0xfb);

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

               {

                    if(j!

=0)

                    {

                      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);

      

           }

   

          P1=0xf7;

          if(P1!

=0xf7)

          {

             delay(5);

             if(P1!

=0xf7)

             {

                 temp=P1&0xf0;

                 switch(temp)

                 {

                    case0xe0:

num=12;

                    break;

                    case0xd0:

num=13;

                    break;

                    case0xb0:

num=14;

                    break;

                    case0x70:

num=15;

                    break;

                   }

                }

               while(P1!

=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);

                    }

                   elseif(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;

              }

          }

    

       P1=0xf0;

}

voidmain()        //主函数

{

  init();

  EX1=1;

  EA=1;

  IT1=1;

  p33=1;

P1=0xf0;

  while

(1)

  {

  

  if(p33==0){

     keyscan();}

  }

}

voidint0()interrupt2using1   //中断

{

  

i

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

当前位置:首页 > PPT模板 > 节日庆典

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

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