单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:5590|回复:4
打印上一主题下一主题

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

[复制链接]
跳转到指定楼层
楼主
ID:443364发表于 2018-12-24 11:26|只看该作者|只看大图回帖奖励
AVR单片机简单计算器的实现仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  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, 下载次数: 77)



评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:443364发表于 2018-12-24 11:30|只看该作者
在做课设的时候一个小的参考资料
板凳
ID:373720发表于 2019-6-14 17:35|只看该作者
谢谢分享。正需要
地板
ID:470504发表于 2020-5-14 14:46|只看该作者
对课程设计太友好了!
5#
ID:859873发表于 2020-12-21 08:09来自手机|只看该作者
楼主可以加小数点嘛

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

Powered by 单片机教程网