单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 107|回复: 1
收起左侧

AVR单片机简单计算器的Proteus仿真实现+源码

[复制链接]
曹文涛 发表于 2018-12-24 11:26 | 显示全部楼层 |阅读模式
AVR单片机简单计算器的实现仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include "mega16.h"
  2. #include "1602.h"
  3. #include "key.h"


  4. float k1,k2;              //记录最终输入运算的两个数

  5. uint one,two,three,four;   //记录每次输入的数字

  6. uint flag;                //计数标志位

  7. uint flag1,flag2;   //第一个数   第二个数 完成标志位

  8. uint flag3;//记录加减乘除标志位

  9. long Result;     //最后运算的结果


  10. void main()
  11. {
  12.      init();  //液晶初始化
  13.     // write_com(0x80+15);
  14.     // write_date('0');
  15.      Init_Keypad();   //键盘初始化
  16.      flag1 = 1;
  17.      while(1)
  18.     {
  19.         Key_Event();  //扫描键盘
  20.    
  21.         if(key_Flag == 1)
  22.         {
  23.             key_Flag = 0;
  24.             if(key_val <= 10)   //小于10  则为需要的数字
  25.             {
  26.             
  27.               if(flag1)       //flag1为1  表示正在输入第一个数字
  28.               {
  29.                 switch(flag)
  30.                 {
  31.                     case 0:
  32.                      flag = 1;
  33.                      one = key_val%10;
  34.                      write_com(0x80+6);
  35.                      write_date(tab[key_val]);
  36.                      k1 = (float)one;
  37.                      break;
  38.                     case 1:
  39.                        flag = 2;
  40.                        two = key_val%10;
  41.                        write_com(0x80+7);
  42.                        write_date(tab[key_val]);
  43.                        k1 = (float)(one*10 + two);
  44.                      break;
  45.                  case 2:
  46.                       flag = 3;
  47.                          three = key_val%10;
  48.                        write_com(0x80+8);
  49.                        write_date(tab[key_val]);
  50.                       k1 = (float)(one*100 + two * 10 + three);
  51.                       break;
  52.                  case 3:
  53.                      flag = 4;
  54.                         four = key_val%10;
  55.                      write_com(0x80+9);
  56.                      write_date(tab[key_val]);
  57.                         k1 = (float)(one*1000 + two * 100 + three*10 + four);
  58.                      break;
  59.                    case 4:
  60.                       flag = 0;
  61.                       break;   
  62.                  }
  63.                 }
  64.                
  65.                
  66.                
  67.                
  68.                
  69.                 if(flag2)        //flag2为1  表示正在输入第2个数字
  70.               {
  71.                 switch(flag)
  72.                 {
  73.                     case 0:
  74.                      flag = 1;
  75.                      one = key_val%10;
  76.                      write_com(0x80+12);
  77.                      write_date(tab[key_val]);
  78.                      k2 = (float)one;
  79.                      break;
  80.                     case 1:
  81.                        flag = 2;
  82.                        two = key_val%10;
  83.                        write_com(0x80+13);
  84.                        write_date(tab[key_val]);
  85.                        k2 = (float)(one*10 + two);
  86.                      break;
  87.                  case 2:
  88.                       flag = 3;
  89.                          three = key_val%10;
  90.                        write_com(0x80+14);
  91.                        write_date(tab[key_val]);
  92.                       k2 = (float)(one*100 + two * 10 + three);
  93.                       break;
  94.                  case 3:
  95.                      flag = 4;
  96.                         four = key_val%10;
  97.                      write_com(0x80+15);
  98.                      write_date(tab[key_val]);
  99.                         k2 = (float)(one*1000 + two * 100 + three*10 + four);
  100.                      break;
  101.                    case 4:
  102.                       flag = 0;
  103.                       break;   
  104.                  }
  105.                 }
  106.                
  107.                
  108.             }
  109.             
  110.             
  111.             
  112.             else if(key_val>=13 || key_val <= 16)  //判断运算符
  113.             {
  114.                 flag1 = 0;
  115.                 flag2 = 1;
  116.                 flag = 0;
  117.                 switch(key_val)
  118.                 {
  119.                     case 13:
  120.                       write_com(0x80+11);
  121.                       write_date('+');
  122.                       flag3 = 1;
  123.                       break;
  124.                     case 14:
  125.                       write_com(0x80+11);
  126.                       write_date('-');
  127.                       flag3 = 2;
  128.                       break;
  129.                     case 15:
  130.                       write_com(0x80+11);
  131.                       write_date('*');
  132.                       flag3 = 3;
  133.                       break;
  134.                     case 16:
  135.                       write_com(0x80+11);
  136.                       write_date('/');
  137.                       flag3 = 4;
  138.                       break;   
  139.                 }
  140.             }
  141.             
  142.             
  143.             if(key_val == 12)           //等于
  144.             {
  145.                  switch(flag3)
  146.                 {
  147.                     case 1:
  148.                      
  149.                       Result = k1 + k2;
  150.                       write_com(0xc0);
  151.                       write_date(tab[Result/100000]);
  152.                       write_date(tab[Result%100000/10000]);
  153.                       write_date(tab[Result%10000/1000]);
  154.                       write_date(tab[Result%1000/100]);
  155.                       write_date(tab[Result%100/10]);
  156.                       write_date(tab[Result%10]);
  157.                       break;
  158.                     case 2:
  159.                        Result = k1 - k2;
  160.                        write_com(0xc0);
  161.                        if(Result < 0)
  162.                        {
  163.                             write_date('-');
  164.                             Result = 0 - Result;
  165.                            
  166.                        }
  167.                       write_date(tab[Result/100000]);
  168.                       write_date(tab[Result%100000/10000]);
  169.                       write_date(tab[Result%10000/1000]);
  170.                       write_date(tab[Result%1000/100]);
  171.                       write_date(tab[Result%100/10]);
  172.                       write_date(tab[Result%10]);
  173.                      
  174.                       break;
  175.                     case 3:
  176.                      
  177.                       Result = k1 * k2;
  178.                       write_com(0xc0);
  179.                       write_date(tab[Result/100000]);
  180.                       write_date(tab[Result%100000/10000]);
  181.                       write_date(tab[Result%10000/1000]);
  182.                       write_date(tab[Result%1000/100]);
  183.                       write_date(tab[Result%100/10]);
  184.                       write_date(tab[Result%10]);
  185.                       break;
  186.                     case 4:
  187.                       //write_com(0x80+11);
  188.                       //write_date('/');
  189.                       Result = k1*100 / k2;
  190.                       write_com(0xc0);
  191.                       //write_date(tab[Result/100000]);
  192.                       //write_date(tab[Result%100000/10000]);
  193.                       write_date(tab[Result%10000/1000]);
  194.                       write_date(tab[Result%1000/100]);
  195.                       write_date('.');
  196.                       write_date(tab[Result%100/10]);
  197. ……………………

  198. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
mega16 计算器.zip (135.42 KB, 下载次数: 2)

评分

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

查看全部评分

回复

使用道具 举报

 楼主| 曹文涛 发表于 2018-12-24 11:30 | 显示全部楼层
在做课设的时候一个小的参考资料
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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