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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1836|回復: 2
收起左側

發愁單片機計算器功能 在將操作數輸出到顯示器和+-*/運算的地方卡住了 求大神

[復制鏈接]
ID:265478 發表于 2017-12-22 21:31 | 顯示全部樓層 |閱讀模式
怎么才能實現簡單計算器功能 在將操作數輸出到顯示器和+-*/運算的地方卡住了
回復

使用道具 舉報

ID:265567 發表于 2017-12-23 11:57 | 顯示全部樓層
#在這里快速回復#/*  S16 S12 S8 S4分別是123+         S15 S11 S7 S3分別是456-         S14 S10 S6 S2分別是789*         S13 S9 S5 S1分別是0 CLR = / */  /* 實現兩個數的運算,每個數的位數至少可以八位  */ #include<reg52.h>                         typedef unsigned char uint8; typedef unsigned int uint16;  sbit rw=P1^2; sbit rs=P1^1; sbit e=P1^0; sbit led=P3^5;  sbit beep=P3^7; uint8 key,num; uint8 fuhao;//定義具體的那個符號,是加減還是乘除。 uint8 flag;        //定義有沒有按下符號鍵,這個是統稱 long a,b,c,d;        //定義運算數據的第一個和第二個及等于的數變量 uint8 k; //定義小數點后面顯示的位數 uint8 biao;  uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存顯示的數據  void delay(uint16 i)     //延時函數 {         while(i--); } void lcdwrc(uint8 c) {         delay(1000);         rs=0;               //數據命令選擇端         rw=0;               //讀寫選擇端         e=0;                //使能端         P0=c;                        e=1;         delay(1000);         e=0; } void lcdwrd(uint8 dat)//將要寫的命令發送到數據總線上 {         delay(1000);         rs=1;         rw=0;         e=0;         P0=dat;               //位置                        e=1;                //使能下降沿輸入數據         delay(1000);            e=0;         rs=0; }  void lcdinit()          //初始化函數 {         delay(1500);         lcdwrc(0x38);        //設置16*2,5*7八位數據接口         delay(500);         lcdwrc(0x38);         delay(500);         lcdwrc(0x38);         delay(500);         lcdwrc(0x38);                  lcdwrc(0x08);        //開液晶顯示                 lcdwrc(0x01);        //顯示清零,指針清零         lcdwrc(0x06);        //寫一個字符后指針和地址加一         lcdwrc(0x0c);        //設置開顯示,不開光標         key=0;         num=0;         flag=0;         fuhao=0;         a=0;         b=0;         c=0;         d=0;         biao=0;         led=0;  }  void keyscan() {         P2=0xfe;   //令第一行為0,然后判斷是哪一列按下         if(P2!=0xfe)         {                 delay(1000);                 if(P2!=0xfe)                 {                         key=P2&0xf0;      //按位0大                         switch(key)                         {                                 case 0xe0: num=0;break;          //1                                 case 0xd0: num=1;break;          //2                                 case 0xb0: num=2;break;          //3                                 case 0x70: num=3;break;          //加                         }                 }                 while(P2!=0xfe);                 if(num==0||num==1||num==2)         //確認第一行的數1,2,3                 {                         if(flag==0)         //沒有按下符號鍵                         {                                 //led=1;                                 a=a*10+dat1[num];                //輸入                         }                         else                         {                                 //led=1;                                 b=b*10+dat1[num];                         }                                  }                 if(num==3)                 {                         //led=0;                         flag=1;                         fuhao=1;     //加號+                         }                 lcdwrd(0x30+dat1[num]);   //加0x30轉ACSII         }           P2=0xfd;                                    //令第二行為0,判斷是哪一列按下         if(P2!=0xfd)         {                 delay(1000);                 if(P2!=0xfd)                 {                         key=P2&0xf0;                         switch(key)                         {                                 case 0xe0: num=4;break;          //4                                 case 0xd0: num=5;break;          //5                                 case 0xb0: num=6;break;          //6                                 case 0x70: num=7;break;          //減—                         }                         }                 while(P2!=0xfd);                 if(num==4||num==5||num==6)                 {                         if(flag==0)         //沒有按下符號鍵                         {                                 //led=1;                                 a=a*10+dat1[num];                                 }                         else                         {                                 //led=1;                                 b=b*10+dat1[num];                         }                                         }                 else                 {                         flag=1;                         fuhao=2;//帶表減號                 }                 lcdwrd(0x30+dat1[num]);        //位置在函數末端,輸出函數         }           P2=0xfb;                 //令第三行為0,判斷哪一列按下         if(P2!=0xfb)         {                 delay(1000);                 if(P2!=0xfb)                 {                         key=P2&0xf0;                         switch(key)                         {                                 case 0xe0: num=8;break;          //7                                 case 0xd0: num=9;break;          //8                                 case 0xb0: num=10;break;  //9                                 case 0x70: num=11;break;  //乘*                         }                         }                 while(P2!=0xfb);                 if(num==8||num==9||num==10)                 {                         if(flag==0)         //沒有按下符號鍵                         {                                 //led=1;                                 a=a*10+dat1[num];                                 }                         else                         {                                 //led=1;                                 b=b*10+dat1[num];                         }                                         }                 else                 {                         flag=1;                         fuhao=3;//帶表乘號*                 }                 lcdwrd(0x30+dat1[num]);         }           P2=0xf7;                 //令第四行為0,判斷哪一列按下         if(P2!=0xf7)         {                 delay(1000);                 if(P2!=0xf7)                 {                         key=P2&0xf0;                         switch(key)                         {                                 case 0xe0: num=12;break;  //0                                 case 0xd0: num=13;break;  //清除rst                                 case 0xb0: num=14;break;  //等號=                                 case 0x70: num=15;break;  //除/                         }                         }                 while(P2!=0xf7);                 switch(num)                 {                         case 12:                                          if(flag==0)         //沒有按下符號鍵                                         {                                                 //led=1;                                                 a=a*10+dat1[num];                                                 lcdwrd(0x30);                                                 }                                         else                                         {                                                 //led=1;                                                 b=b*10+dat1[num];                                                 lcdwrd(0x30);                                         }                                         break;                                                  case 13:                                          lcdwrc(0x01);        //清屏指令                                                                 a=0;                                         b=0;                                         flag=0;                                         fuhao=0;                                         break;                          case 15:                                                                  flag=1;                                         fuhao=4;                                         lcdwrd(0x2f);//除號/                                         break;                                                                  case 14:                                          if(fuhao==1)//加                                         {                                                 lcdwrc(0x4f+0x80);    //地址                                                   lcdwrc(0x04);    //設置光標左移,屏幕不移動                                                 c=a+b;           //輸出的數                                                 while(c!=0)             //一位一位顯示                                                 {                                                         lcdwrd(0x30+c%10); //顯示結果的最后一位在0x4f的位置                                                         c=c/10;            //取前面的結果數據                                                         }                                                 lcdwrd(0x3d);       //顯示等于號=                                                 a=0;                                                 b=0;                                                 flag=0;                                                 fuhao=0;        //全部清除為0                                         }                                         if(fuhao==2)   //減                                         {                                                 lcdwrc(0x4f+0x80);                                                 lcdwrc(0x04);   //設置光標左移,屏幕不移動                                                 if(a>b)                                                         c=a-b;                                                 else                                                         c=b-a;                                                                                                  while(c!=0)         //一位一位顯示                                                 {                                                         lcdwrd(0x30+c%10);//顯示結果的最后一位在0x4f的位置                                                         c=c/10;//取前面的結果數據                                                         }                                                 if(a<b)        lcdwrd(0x2d); //顯示-號                                                 lcdwrd(0x3d); //顯示等于號=                                                 a=0;                                                 b=0;                                                 flag=0;                                                 fuhao=0;//全部清除為0                                         }                                         if(fuhao==3)//乘法                                                         {                                                 lcdwrc(0x4f+0x80);                                                 lcdwrc(0x04); //設置光標左移,屏幕不移動                                                 c=a*b;                                                 while(c!=0)         //一位一位顯示                                                 {                                                         lcdwrd(0x30+c%10);//顯示結果的最后一位在0x4f的位置                                                         c=c/10;//取前面的結果數據                                                         }                                                 lcdwrd(0x3d); //顯示等于號=                                                 a=0;                                                 b=0;                                                 flag=0;                                                 fuhao=0;//全部清除為0                                                 }                                         if(fuhao==3)//乘法                                                         {                                                 lcdwrc(0x4f+0x80);                                                 lcdwrc(0x04);//設置光標左移,屏幕不移動                                                 c=a*b;                                                 while(c!=0)         //一位一位顯示                                                 {                                                         lcdwrd(0x30+c%10);//顯示結果的最后一位在0x4f的位置                                                         c=c/10;//取前面的結果數據                                                         }                                                 lcdwrd(0x3d); //顯示等于號=                                                 a=0;                                                 b=0;                                                 flag=0;                                                 fuhao=0;//全部清除為0                                                 }                                         if(fuhao==4)                                         {                                                 k=0;                                                 lcdwrc(0x4f+0x80);                                                 lcdwrc(0x04);//設置光標左移,屏幕不移動                                     c=(long)(((float)a/b)*1000);//強制轉換為long。                                                 while(c!=0)         //一位一位顯示                                                 {                                                         k++;                                                         lcdwrd(0x30+c%10);//顯示結果的最后一位在0x4f的位置                                                         c=c/10;//取前面的結果數據                                                         if(k==3)                                                         {                                                                 lcdwrd(0x2e);       //選擇停止模式                                                                 k=0;                                                         }                                                                 }                                                 if(a/b<1)          //如果a比b小的話那么除的結果最高位是0                                                 {                                                         lcdwrd(0x30);                                                         }                                                 lcdwrd(0x3d); //顯示等號                                                 a=0;                                                 b=0;                                                 flag=0;                                                 fuhao=0; //全部清除為0                                         }                                         break;                  }         }  }    void main() {         lcdinit();         while(1)         {                 keyscan();                 } }
回復

使用道具 舉報

ID:265567 發表于 2017-12-23 11:57 | 顯示全部樓層
這是我做的一個,你可以看一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品一区二 | 亚洲欧美视频一区 | 精品一区二区三区四区在线 | 亚洲成人毛片 | 精品国产免费一区二区三区演员表 | 欧美日韩国产在线观看 | 中文字幕免费视频 | 中文字幕第十一页 | 91在线网站 | 久久精品亚洲精品国产欧美 | 国产精品美女久久久av超清 | 91精品国产日韩91久久久久久 | 日韩免费1区二区电影 | 国产欧美日韩一区二区三区在线观看 | 亚洲欧美国产精品一区二区 | 久久最新精品视频 | 亚洲高清在线 | 中文字幕第5页 | 国产精品久久久久aaaa | 99精品视频免费观看 | 国产精品久久久久aaaa九色 | 国产aaaaav久久久一区二区 | 欧美a区| 欧美中文字幕在线 | 亚州无限乱码 | 欧美精品久久久久 | 91se在线 | 91精品国产综合久久婷婷香蕉 | 一级黄色生活视频 | 国产一区不卡 | 久久久一区二区三区 | 爱爱视频在线观看 | 天天色天天射天天干 | 一区二区三区在线 | 一区二区日韩 | 国产一区二区黑人欧美xxxx | 一区二区三区小视频 | 粉嫩粉嫩芽的虎白女18在线视频 | 日本成人在线观看网站 | 欧美中文字幕在线观看 | 一级毛片视频 |