久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6318|回復: 4
收起左側

AVR單片機簡單計算器的Proteus仿真實現+源碼

[復制鏈接]
ID:443364 發表于 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, 下載次數: 78)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:443364 發表于 2018-12-24 11:30 | 顯示全部樓層
在做課設的時候一個小的參考資料
回復

使用道具 舉報

ID:373720 發表于 2019-6-14 17:35 | 顯示全部樓層
謝謝分享。正需要
回復

使用道具 舉報

ID:470504 發表于 2020-5-14 14:46 | 顯示全部樓層
對課程設計太友好了!
回復

使用道具 舉報

ID:859873 發表于 2020-12-21 08:09 來自手機 | 顯示全部樓層
樓主可以加小數點嘛
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区在线视频 | 欧美日韩亚洲视频 | 天堂久 | 成人黄色电影在线播放 | 欧美中文字幕一区 | 国产精品91网站 | 国产玖玖 | 在线婷婷 | 亚洲一区中文字幕在线观看 | 免费国产精品久久久久久 | 婷婷久久久久 | 亚洲一区国产 | 久久小视频| 久久国产精品一区二区 | 精品毛片 | 亚洲成人一区二区在线 | 欧美在线观看一区二区 | 五月婷婷激情 | 欧美高清视频一区 | 日干夜干 | 艹逼网| 国产精品久久久久久久久久久久 | 国产一区二区a | 在线视频a | 欧美日韩不卡合集视频 | 国产午夜精品一区二区三区嫩草 | 成人九色 | 国产精品久久久久久婷婷天堂 | 欧美一级淫片007 | 久久久妇女国产精品影视 | 亚洲国产精品第一区二区 | 国产激情在线观看 | 欧美综合视频 | 欧美日韩免费在线 | 国产一级电影在线观看 | 欧美jizzhd精品欧美巨大免费 | 成人三级在线播放 | 一区二区av | 免费成人高清在线视频 | 亚洲成人99 | 中文字幕在线观 |