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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5465|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)矩陣鍵盤(pán)的簡(jiǎn)易計(jì)算器制作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
1. 運(yùn)算過(guò)程、符號(hào)公式實(shí)時(shí)顯示在顯示屏上(I2C 1602)。
2. 自帶三角函數(shù)、開(kāi)根號(hào)、平方運(yùn)算。
3. 計(jì)算得出的結(jié)果可設(shè)置保存并用以下一次計(jì)算。
4. 所有運(yùn)算結(jié)果精確到至少小數(shù)點(diǎn)后兩位。
5. 運(yùn)算結(jié)果可通過(guò)串口發(fā)送給上位機(jī)。
6. 當(dāng)斷電重啟時(shí),能存儲(chǔ)并顯示斷電前正在計(jì)算的任務(wù)。(AT24C02)
硬件連接圖如下:



實(shí)物圖如下:


單片機(jī)源程序如下:
  1. main.c
  2. #include <REGX52.H>                                                
  3. #include "Calculate.H"
  4. #include "Martixkey.h"
  5. #include "AT24C02.h"
  6. #include <stdio.h>
  7. #include "I2C.h"
  8. #include "1602.h"
  9. #include <string.h>
  10. #include "UART.h"
  11. long float number1=0,number2=0;
  12. long float result;//結(jié)果
  13. unsigned char i=0,x=0; //運(yùn)算符號(hào)標(biāo)志位
  14. unsigned char x1=1;//液晶屏第一行列標(biāo)志位x1
  15. unsigned char key;//矩陣鍵盤(pán)鍵值
  16. char strnum1[7]={'\0','\0','\0','\0','\0','\0','\0'};//數(shù)字1字符數(shù)組
  17. char strnum2[7]={'\0','\0','\0','\0','\0','\0','\0'};//數(shù)字2字符數(shù)組
  18. char strresult[14];//結(jié)果字符數(shù)組
  19. unsigned char   n=0,m=7;   //第1,2個(gè)數(shù)可以輸入6個(gè)有效數(shù)字
  20. void main()
  21. {

  22. init_lcd();//lcd初始化
  23. UART_Init();//串口初始化
  24. while(1)
  25. {  
  26. key=Martixkey();//矩陣鍵盤(pán)掃描按鍵
  27.         if(key==0) key=123;//返回鍵值為0時(shí)將key賦值為123
  28.         if(key==100) key=0;//返回鍵值為100時(shí)視為0
  29.         
  30. if(P0_0==0)//按鍵檢測(cè) 存儲(chǔ)正在計(jì)算的任務(wù)
  31. {
  32. for(i=0;i<7;i++)//循環(huán)寫(xiě)入數(shù)字1字符串
  33. {AT24C02_WriteByte(i,strnum1[i]);        Delay(5);}
  34. AT24C02_WriteByte(i,x);        Delay(5);//寫(xiě)入運(yùn)算符號(hào)
  35. for(i=8;i<15;i++)//循環(huán)寫(xiě)入數(shù)字2字符串
  36. {AT24C02_WriteByte(i,strnum2[i-8]);        Delay(5);}
  37. }


  38. if(P0_5==0)//按鍵檢測(cè) 讀取上一次斷電前計(jì)算的任務(wù)
  39. {ShowString(1,1,"                ");ShowString(2,1,"                "); //將液晶屏第一,二行清空
  40. for(i=0;i<7;i++)
  41.         strnum1[i]=AT24C02_ReadByte(i);
  42. x=AT24C02_ReadByte(7);
  43. for(i=8;i<15;i++)
  44.         strnum2[i-8]=AT24C02_ReadByte(i);
  45.         switch(x)
  46.         {case 1:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'+');ShowString(1,x1,strnum2);break;
  47.         case 2:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'-');ShowString(1,x1,strnum2);break;
  48.         case 3:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'*');ShowString(1,x1,strnum2);break;
  49.         case 4:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'/');ShowString(1,x1,strnum2);break;
  50.         case 5:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowChar(1,x1++,'%');ShowString(1,x1,strnum2);break;
  51.         case 6:ShowString(1,1,"Sin");ShowString(1,4,strnum1);x1=strlen(strnum1)+3;break;
  52.         case 7:ShowString(1,1,"Cos");ShowString(1,4,strnum1);x1=strlen(strnum1)+3;break;
  53.         case 8:ShowString(1,1,"Tan");ShowString(1,4,strnum1);x1=strlen(strnum1)+3;break;
  54.         case 9:ShowChar(1,1,'V');ShowString(1,2,strnum1);x1=strlen(strnum1)+1;break;
  55.         case 10:ShowString(1,1,strnum1);x1=strlen(strnum1)+1;ShowString(1,x1,"^2");break;}
  56. m=7;n=7;
  57. }

  58. if(key<=10)
  59. {         
  60. if(n<7){m=7;if(key==10) {strnum1[n]='.';ShowChar(1,x1++,strnum1[n]);}else {strnum1[n]='0'+key;ShowChar(1,x1++,strnum1[n]);}}n++;  //首先輸入第一個(gè)數(shù)
  61. if(m<7){n=7;if(key==10) {strnum2[m]='.';ShowChar(1,x1++,strnum2[m]);}else {strnum2[m]='0'+key;ShowChar(1,x1++,strnum2[m]);}}m++;  //必須按下運(yùn)算符號(hào)才能輸入第二個(gè)數(shù)
  62. }                           
  63.                              
  64. else
  65. { switch(key)                            //功能鍵選擇
  66.   {
  67.              case 17:n=7;m=0;x=1;ShowChar(1,x1++,'+');break; //加                                                                                                                           
  68.              case 18:n=7;m=0;x=2;ShowChar(1,x1++,'-');break; //減
  69.              case 19:n=7;m=0;x=3;ShowChar(1,x1++,'*');break; //乘
  70.              case 20:n=7;m=0;x=4;ShowChar(1,x1++,'/');break; //除
  71.                          case 21:n=7;m=0;x=5;ShowChar(1,x1++,'%');break; //求余
  72.        case 11:n=0;m=7;x=6;ShowString(1,x1,"Sin");x1+=3;break; //sin
  73.                    case 12:n=0;m=7;x=7;ShowString(1,x1,"Cos");x1+=3;break; //cos        
  74.                    case 13:n=0;m=7;x=8;ShowString(1,x1,"Tan");x1+=3;break; //tan
  75.                    case 14:n=0;m=7;x=9;ShowChar(1,x1++,'V');break; //開(kāi)根號(hào)
  76.                    case 15:n=0;m=7;x=10;ShowString(1,x1,"^2");x1+=2;break; //平方
  77.                      
  78.                 case 16:n=7;m=7;
  79.                 sscanf(strnum1,"%lf",&number1);
  80.                 sscanf(strnum2,"%lf",&number2);
  81.     Calculate(x,number1,number2,&result);//計(jì)算
  82.                 sprintf(strresult,"%g",result);//將結(jié)果轉(zhuǎn)換為字符串形式
  83.                 ShowChar(2,1,'=');
  84.                 ShowString(2,3,strresult);
  85.                
  86. for(i=0;strresult[i]!='\0';i++)                //通過(guò)串口發(fā)送結(jié)果
  87. UART_SendByte(strresult[i]);
  88. UART_SendByte(' ');
  89.     i=0;
  90.                 break;
  91.                
  92.                     case 22:n=7;m=7;number1=result;//將結(jié)果賦值給number1
  93.                                 ShowString(1,1,"                ");ShowString(2,1,"                "); //將液晶屏第一,二行清空
  94.                                 Delay(10);sprintf(strnum1,"%g",number1);
  95.                                 ShowString(1,1,strnum1); //在第一個(gè)數(shù)字位置顯示上一個(gè)結(jié)果
  96.                                 x1=strlen(strnum1)+1;number2=0;
  97.                                 for(i=0;i<7;i++)
  98.                                         strnum2[i]='\0';
  99.                                 i=0;
  100.                                 break;
  101.                          case 23:if(n<7) {strnum1[--n]='\0'; ShowChar(1,--x1,' ');}
  102.                                                                 if(m<7) {strnum2[--m]='\0';ShowChar(1,--x1,' ');}        
  103.                                                                 break;//         退位        
  104.    }
  105.            }           

  106. }
  107.         }
復(fù)制代碼
  1. Calculate.c
  2. #include "1602.h"
  3. #include <math.h>
  4. #define PI 3.1415926
  5. void Calculate(unsigned char x,long float number1,long float number2,long float *result)//運(yùn)算
  6. {           
  7.               switch(x)                            //功能鍵選擇
  8.               {  
  9.                 case 1:*result=number1+number2;break;                 //加                                                                                                                             
  10.                 case 2:if(number1>=number2){*result=number1-number2;} //減
  11.                        else{*result=number2-number1;ShowChar(2,2,'-');} break ;                //負(fù)數(shù)符號(hào)                                                                        
  12.                 case 3:*result=number1*number2;break;                 //乘
  13.                 case 4:if(number2==0){ShowString(1,1,"Error!");}
  14.                                            else{*result=number1/number2;}break;                   //除
  15.                                 case 5:*result=(int)number1%(int)number2;break; // 求余
  16.                                 case 6:*result=sin(number1*PI/180);break; //SIN        
  17.                                 case 7:*result=cos(number1*PI/180);break;        //COS
  18.                                 case 8:*result=tan(number1*PI/180);break;  //TAN
  19.                                 case 9:*result=sqrt(number1);break;         //開(kāi)根號(hào)
  20.                                 case 10:*result=number1*number1;break;         //平方運(yùn)算
  21.                 case 0:break;  
  22.                                           }   
  23. }
復(fù)制代碼
全部資料51hei下載地址:
簡(jiǎn)易計(jì)算器.7z (63.35 KB, 下載次數(shù): 52)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 涩爱av一区二区三区 | 一级午夜aaa免费看三区 | 夜夜精品浪潮av一区二区三区 | 国产欧美一区二区在线观看 | 完全免费在线视频 | 国产91中文| 一区二区三区视频在线免费观看 | 精品在线观看入口 | 国产精品区一区二 | 日韩视频一区二区在线 | 国产女人精品视频 | 操久久 | av一区二区三区四区 | 欧美日韩精品在线一区 | 国产精品欧美精品日韩精品 | 精品国产一区三区 | 中文字幕 在线观看 | 久久中文一区二区 | 亚洲成av人影片在线观看 | 免费视频一区二区 | 欧美无乱码久久久免费午夜一区 | 日韩电影免费在线观看中文字幕 | 免费一级片 | 国产日韩一区二区三区 | 91视视频在线观看入口直接观看 | 国产精品日韩欧美一区二区 | 久久人体 | 中文字幕在线观看国产 | 欧美日韩1区2区 | 精品久草 | 日韩在线综合 | 久久精品久久久 | 国产2区 | 日本成人片在线观看 | 99精品免费视频 | www.天天操.com| 久久久国产亚洲精品 | 国产精品福利视频 | 黄色精品 | 中文字幕的av | 超碰免费在线 |