找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2245|回复: 0
收起左侧

单片机计算器简单功能实现

[复制链接]
ID:857654 发表于 2020-12-20 21:04 | 显示全部楼层 |阅读模式
话不多说直接上图

计算器

计算器



主函数代码
  1. #include <config.h>
  2. #include <1602.h>
  3. #include <keypad4_4.h>        

  4. u8 equation[17]; // 算式缓冲区
  5. u8 n=0;//当前字符在缓冲区的下标

  6. void delay_ms(u16 x)//毫秒延时函数
  7. {u16 i,j;
  8. for(i=0;i<x;i++)
  9.     for(j=0;j<115;j++);
  10. }   

  11. void disch(u8 ch)//若算式长度超过一行,则左移一位再显示,否则在当前位置显示
  12. {
  13.   u8 i;
  14.   if(n==16){ //若算式长度超过一行,则左移一位
  15.                        for(i=0;i<17;i++)
  16.                           equation[i]=equation[i+1];
  17.                        equation[15]=ch;//将数字存入算式缓冲区尾部                          
  18.                            equation[16]='\0';//给算式缓冲区尾部加结束标记
  19.                            LCD1602_disstr(equation,0,0); //显示算式
  20.                    }
  21.   
  22.   else     {        //若算式长度未超过一行
  23.                    equation[n++]=ch;//将运算符存入算式缓冲区尾部
  24.                            equation[n]='\0';//给算式缓冲区尾部加结束标记
  25.                            LCD1602_disch(ch);//在当前位置显示
  26.                    }
  27. }
  28.                         
  29. void main()        //主函数
  30. {

  31.   u8 key;//按键编码
  32.   u8 ch;//输入的字符
  33.   u8 flag=0; //        状态标记
  34.   u8 ac;//第一行光标当前位置
  35.   u32 num1=0;        // 数1
  36.   u32 num2=0;        // 数2
  37.   u8 op1;//运算符1
  38.   u8 op2;//运算符2
  39.   u32 result=0; //        运算结果

  40.   
  41.   LCD1602_Init( );//1602初始化
  42.   while(1)
  43.   {
  44.           key=keypad4_4();  //扫描按键
  45.           if(key!=16)              //如果有键按下
  46.           {        
  47.             ch=keyval4_4[key]; //获取用户输入的字符
  48.                   if(ch=='c') {        //输入cancel,回到初始状态,所有数据清空,清屏
  49.                                                  flag=0;//转到初始状态
  50.                                                 num1=0;num2=0;//将数1、数2清空
  51.                                                 equation[0]='\0';n=0;//清空算式缓冲区
  52.                                                 LCD1602_clear( ); //清屏
  53.                                         }  
  54.                 else
  55.                 {
  56.                         if(ch<'0'||ch>'9')
  57.                           {          //输入运算符时,切换状态
  58.                                 if(flag==1)        flag=2;         //数1输入状态下输入运算符1,进入运算符1输入状态
  59.                                 if(flag==3)        flag=4;        //数2输入状态下输入运算符2,进入计算状态
  60.                                 if(flag==5)        {        //运算结束状态下,若继续输入运算符则继续运算
  61.                                                                 if(ch=='=')          flag=5;          //再次输入'='无效
  62.                                                      else                 {        //输入运算符则继续运算
  63.                                                                                                 flag=2;//转到运算符1输入状态
  64.                                                                                                 num1=result;//将上次结果保存到数1
  65.                                                                                                 num2=0;//清除数2
  66.                                                                                         }
  67.                                                         }
  68.                         }
  69.                         else
  70.                         {          //输入数字时,切换状态
  71.                                   if(flag==0)                flag=1;//初始状态下输入数字,进入数1输入状态
  72.                                 if(flag==2)                flag=3;        //运算符1输入状态下输入数字,进入数2输入状态
  73.                                 if(flag==5)        {        //运算结束状态下,若继续输入数字则重新开始运算
  74.                                                                 flag=1;        //转到数1输入状态
  75.                                                                 num1=0;num2=0;//将数1、数2清空
  76.                                                                 equation[0]='\0';n=0; //清空算式缓冲区
  77.                                                                 LCD1602_clear( ); //清屏
  78.                                                         }
  79.                         }
  80.                         
  81.                         if(flag==1) {   //数1输入状态,存入数1,若算式长度超过一行,则左移一位显示,否则在当前位置显示
  82.                                                         num1=num1*10+(ch-'0'); //将数字存入数1
  83.                                                         disch(ch);//若算式长度超过一行,则左移一位再显示,否则在当前位置显示
  84.                                                 }
  85.                         
  86.                         if(flag==2)        {        //运算符1输入状态,输入'='无效,若输入其他运算符则保存,若算式长度超过一行,则左移一位显示,否则在当前位置显示
  87.                                                         if(ch!='=') {
  88.                                                                                         op1=ch;        //保存运算符1                                                                                       
  89.                                                                                     disch(ch);//若算式长度超过一行,则左移一位再显示,否则在当前位置显示                                                                                
  90.                                                                                 }
  91.                                                 }
  92.                         
  93.                         if(flag==3)        {  //数2输入状态,存入数2,若算式长度超过一行,则左移一位显示,否则在当前位置显示
  94.                                                         num2=num2*10+(ch-'0'); //将数字存入数2
  95.                                                         disch(ch);//若算式长度超过一行,则左移一位再显示,否则在当前位置显示
  96.                                                 }                        
  97.                         
  98.                         if(flag==4)        {  //根据运算符1开始计算                                       
  99.                                                    switch(op1)
  100.                                        {
  101.                                                                    case '+':result= num1+num2;break;
  102.                                                                 case '-':result= num1-num2;break;
  103.                                                                 case '*':result= num1*num2;break;
  104.                                                                 case '/':result= num1/num2;break;
  105.                                                    }
  106.                                                    ac=RdACAdr( );//读取第一行当前光标地址
  107.                                                    LCD1602_disnum(result,1,0);//从第二行行首开始显示结果
  108.                            retACAdr(ac);//恢复到第一行光标地址
  109.                                                    op2=ch; //保存运算符2
  110.                                                    if(op2=='=')          flag=5;         //若运算符2为'=',转到运算结束状态(需要进一步判断是重新开始运算,还是继续运算?)
  111.                                                    else         {        
  112.                                                                                            flag=2;        //若运算符2不为'=',则继续运算,进入运算符1输入状态
  113.                                                                                         num1=result; //将上次结果保存到数1
  114.                                                                                         num2=0;//清除数2
  115.                                                                                         op1=op2;//更新运算符1                                                                                             
  116.                                                                                         disch(ch);//若算式长度超过一行,则左移一位再显示,否则在当前位置显示
  117.                                                                                 }
  118.                                                 }   
  119.                 }
  120.         }
  121.   }         
  122. }
复制代码



shiyan06.zip

108.11 KB, 下载次数: 8, 下载积分: 黑币 -5

计算器

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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