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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3058|回復: 0
打印 上一主題 下一主題
收起左側

單片機計算器簡單功能實現

[復制鏈接]
跳轉到指定樓層
樓主
話不多說直接上圖



主函數代碼
  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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久美女 | 国产精品精品视频一区二区三区 | 九九亚洲| 国产精品不卡 | 欧美精品网| 亚洲精品区 | 羞羞视频免费在线 | 日韩免费视频一区二区 | 欧美精品乱码久久久久久按摩 | 黄色免费网 | 日韩色在线 | 国产欧美综合在线 | 日韩一区二区在线免费观看 | 国产精品美女久久久久久久网站 | 成人在线观看免费观看 | 日本天天色 | 免费的色网站 | 欧美日韩在线免费观看 | 成人av免费在线观看 | 国产一区二区三区 | 亚洲综合视频 | 久热精品在线 | 久久久久国产精品www | 欧美日韩高清在线一区 | 久久精品女人天堂av | 亚洲一区二区三区观看 | 求个av网址 | 亚洲视频一 | 日韩欧美视频在线 | 国产一区中文字幕 | 日韩激情免费 | 亚洲一区二区综合 | 亚洲国产精品成人无久久精品 | aaa精品 | 丁香五月网久久综合 | 久久久久国产一区二区三区四区 | 欧美女优在线观看 | 久久久精品国产 | 中文亚洲视频 | avhd101在线成人播放 | 亚洲精精品 |