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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Lcd1602計算器設計(薄膜鍵盤,連續計算)附單片機源碼

[復制鏈接]
跳轉到指定樓層
樓主
利用STC89C52RC單片機,LCD屏,薄膜式矩陣鍵盤,制作的計算器,可以連續計算,等號左邊的式子在第一行,等號右邊結果在第二行,清楚明了。


單片機源程序如下:
  1. #include <reg51.h>
  2. #include <math.h>
  3. #include <lcd.h>

  4. #define GPIO_KEY P1//薄膜按鍵所用I/O口,P1^0~P1^7

  5. unsigned char KeyValue=13;//矩陣鍵盤按鍵默認值
  6. unsigned int error=0;//非法運算標志
  7. unsigned int bei=0;//標志變量,若被加(減、乘、除)數未輸入,則bei為0
  8. unsigned char x=0;//儲存運算符
  9. unsigned int xf=0;//標志變量,若運算符剛被輸入,則置為1
  10. unsigned char dan;//儲存剛輸入的單個數位上的字符型數字
  11. unsigned int y=0;//標志變量,若要輸出運算結果則置為1
  12. unsigned char e[9]=" Error!!!";

  13. void LcdDisplay_1(long number);//用于在第一行輸出被加減乘除數
  14. void LcdDisplay_2(long number);//用于在第二行輸出結果
  15. void Delay_ms(unsigned int ms);
  16. //void UsartConfiguration();

  17. void main()
  18. {
  19. //        UsartConfiguration();
  20.         LcdInit();                         //初始化LCD1602
  21.         while(1)
  22.            {
  23.             static long key=0,result=0,temp=0,a=0,b=0,c=0,d=0;//設置靜態局部變量,可保留上一次運算的值
  24.             unsigned char i=0;

  25.             GPIO_KEY=0x0f;
  26.             if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  27.                 {
  28.                         Delay_ms(10);//延時消抖
  29.                         if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  30.                         {                       
  31.                                 //測試列
  32.                                 GPIO_KEY=0X0f;
  33.                                 switch(GPIO_KEY)
  34.                                 {
  35.                                         case(0X07):        KeyValue=0;break;
  36.                                         case(0X0b):        KeyValue=1;break;
  37.                                         case(0X0d): KeyValue=2;break;
  38.                                         case(0X0e):        KeyValue=3;break;
  39.                                 }
  40.                                 //測試行
  41.                                 GPIO_KEY=0Xf0;
  42.                                 switch(GPIO_KEY)
  43.                                 {
  44.                                         case(0X70):        KeyValue=KeyValue+0;break;
  45.                                         case(0Xb0):        KeyValue=KeyValue+4;break;
  46.                                         case(0Xd0): KeyValue=KeyValue+8;break;
  47.                                         case(0Xe0):        KeyValue=KeyValue+12;break;
  48.                                 }
  49.                                 while((i<60)&&(GPIO_KEY!=0xf0))         //松手檢測
  50.                                 {
  51.                                         Delay_ms(10);
  52.                                         i++;
  53.                                 }

  54.                                 switch (KeyValue)
  55.                                 {
  56.                                         //key計算最新鍵入的值,用temp存放被加(減、乘、除)數,result存放最新鍵入的值或計算結果
  57.                                         case  0:dan='1';key=key*10+1;result=key;break;//鍵入1,dan儲存剛輸入的單個數位上的數字
  58.                                            case  1:dan='2';key=key*10+2;result=key;break;//鍵入2
  59.                                          case  2:dan='3';key=key*10+3;result=key;break;//鍵入3
  60.                                         case  3:x='+';xf=1;temp=result;key=0;a=1;break;      //選擇加法,x儲存選擇的運算符,選擇后xf置為1
  61.                                         case  4:dan='4';key=key*10+4;result=key;break;//鍵入4
  62.                                          case  5:dan='5';key=key*10+5;result=key;break;//鍵入5
  63.                                         case  6:dan='6';key=key*10+6;result=key;break;//鍵入6
  64.                                         case  7:x='-';xf=1;temp=result;key=0;b=1;break;          //選擇減法,
  65.                                         case  8:dan='7';key=key*10+7;result=key;break;//鍵入7
  66.                                         case  9:dan='8';key=key*10+8;result=key;break;//鍵入8
  67.                                         case 10:dan='9';key=key*10+9;result=key;break;//鍵入9
  68.                                         case 11:x='*';xf=1;temp=result;key=0;c=1;break;          //選擇乘法
  69.                                         case 12:temp=key=result=0;a=b=c=d=0;x=dan=0;xf=y=bei=0;break;//所有清零
  70.                                         case 13:dan='0';key=key*10+0;result=key;break;//鍵入0
  71.                                         case 14:if(a==1) {result=temp+result;a=0;key=0;}          //計算運算結果
  72.                                                         if(b==1) {result=temp-result;b=0;key=0;}
  73.                                                         if(c==1) {result=temp*result;c=0;key=0;}
  74.                                                         if(d==1)
  75.                                                         {
  76.                                                                 if (result==0)         //若除數為0,運算非法,error置為1
  77.                                                                         {error=1;result=0;d=0;key=0;}
  78.                                                                 else
  79.                                                                         {result=temp/result;d=0;key=0;}                               
  80.                                                         }
  81.                                                         y=1;                                //將要輸出運算結果,則y置為1
  82.                                                         break;
  83.                                         case 15:x='/';xf=1;temp=result;key=0;d=1;break;           //選擇除法
  84.                                 }

  85.                                 //LCD顯示
  86.                                  if (y==0)//若y為0,則不是輸出結果,而是輸出等式的左邊       
  87.                                 {
  88.                                         if (KeyValue==12) LcdWriteCom(0x01);//清零則清屏
  89.                                         else if(x==0&&bei==0) bei=1,LcdWriteCom(0x01),LcdWriteData(dan);//若x和bei都為0,則當前正開始輸入被加(減、乘、除)數,要清屏再輸出,同時bei置為1
  90.                                          else if(x==0&&bei==1) LcdWriteData(dan);//若x為0,bei為1,則運算符未選擇,即當前仍然在輸入被加(減、乘、除)數,繼續逐位輸出顯示
  91.                                         else if(x!=0&&xf==1) xf=0,bei=0,LcdWriteCom(0x01),LcdDisplay_1(result),LcdWriteData(x);//若x和xf都不為0,則為剛選擇運算符,將運算符輸出且xf重新置為0,此時被加(減、乘、除)數已輸完,bei也要重新置為0
  92.                                         else if(x!=0&&xf==0) LcdWriteData(dan);//若運算符已選但不是剛選,則當前正輸入加(減、乘、除)數,逐位輸出顯示
  93.                                 }
  94.                                 else         //否則輸出結果
  95.                                 {
  96.                                         LcdDisplay_2(result);        //輸出結果
  97.                                         x=0;                                        //運算符已選,重新置為0
  98.                                         y=0;                                        //輸出結果后,重新置為0
  99.                                 }       
  100.                         }
  101.                 }
  102.         }
  103. }

  104. void LcdDisplay_1(long number)//在第一行輸出被加(減、乘、除)數
  105. {
  106.         int i,n[5]={0};                          //不能設成unsigned
  107.         if (number<0)
  108.                 LcdWriteData('-');
  109.         number=abs(number);                  //取絕對值
  110.         if (number-10000>=0) i=5; //判斷有效位數
  111.         else if (number-1000>=0) i=4;
  112.         else if (number-100>=0) i=3;
  113.         else if (number-10>=0) i=2;
  114.         else i=1;                       
  115.         n[4]=number/ 10000;                  //提取各位上的數
  116.         n[3]=number % 10000 / 1000;
  117.         n[2]=number % 1000 / 100;
  118.         n[1]=number % 100 / 10;
  119.         n[0]=number % 10;
  120.         for (i=i-1;i>=0;i--)          //若設成unsigned,此處形成死循環!!!
  121.         {
  122.                 LcdWriteData(n[i]+48);//輸出
  123.         }
  124. }

  125. void LcdDisplay_2(long number)//在第二行輸出結果
  126. {
  127.         int i,n[5];                                //不能設成unsigned
  128.         //判斷運算是否合法
  129.         if (error==1)                        //若error為1,則運算非法
  130.         {
  131.                 error=0;                        //error重新置為0
  132.                 LcdWriteCom(0x01);  //清屏
  133.                 LcdWriteCom(0x80);  //數據指針返回首位
  134.                 for (i=0;i<9;i++)        //輸出提示
  135.                         LcdWriteData(e[i]);
  136.                 Delay_ms(1500);
  137.                 LcdWriteCom(0x01);  //再次清屏
  138.         }
  139.         else                                        //合法則輸出結果
  140.         {
  141.                  LcdWriteData('=');        //先在第一行輸出'='
  142.                  LcdWriteCom(0xc0);        //數據指針設置在第二行首位
  143.                  if (number<0)                //負數則輸出負號
  144.                          LcdWriteData('-');
  145.                  number=abs(number);
  146.                  if (number-10000>=0) i=5; //判斷有效位數
  147.                  else if (number-1000>=0) i=4;
  148.                  else if (number-100>=0) i=3;
  149.                  else if (number-10>=0) i=2;
  150.                  else i=1;                       
  151.                  n[4]=number/10000;
  152.                  n[3]=number%10000/1000;
  153.                  n[2]=number%1000/100;
  154.                  n[1]=number%100/10;
  155.                  n[0]=number%10;
  156.                  for (i=i-1;i>=0;i--)           //若設成unsigned,此處形成死循環!!!
  157.                  {
  158.                         LcdWriteData(n[i]+48);
  159.                  }
  160.         }
  161. /*
  162.         SBUF = '0'+m;        //將接收到的數據放入到發送寄存器
  163.         while (!TI);        //等待發送數據完成
  164.         TI = 0;                        //發送完成標志位清零
  165. */
  166. }

  167. void Delay_ms(unsigned int ms)//延時函數,延時1ms
  168. {
  169.         int j;
  170.         for(;ms>0;ms--)
  171.           for(j=140;j>0;j--);
  172. }

  173. /*        //此函數適合數碼管顯示時使用
  174. unsigned int num(long num,unsigned int p)//提取各位上的數
  175. {
  176.     unsigned int i,t,n;
  177.     for(t=1,i=0;i<p;i++)
  178.         {
  179. ……………………

  180. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
Lcd計算器(Lcd適應版,薄膜鍵盤).zip (48.97 KB, 下載次數: 166)



評分

參與人數 2黑幣 +59 收起 理由
陽光的360zz + 9 很給力!成功試驗
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:425307 發表于 2018-11-12 21:38 | 只看該作者
正好需要 謝謝樓主開源
回復

使用道具 舉報

板凳
ID:594206 發表于 2019-8-2 16:40 | 只看該作者
正好需要 謝謝
回復

使用道具 舉報

地板
ID:633321 發表于 2019-12-5 15:15 | 只看該作者
很受用,感謝
回復

使用道具 舉報

5#
ID:787061 發表于 2020-6-22 22:42 | 只看該作者
很好 還不錯
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品国产自在现线小黄鸭 | 亚洲在线免费 | 中文字幕精品视频 | 亚洲 中文 欧美 日韩 在线观看 | 99re99| 欧美色图综合网 | 日韩色在线 | 成人免费在线视频 | 亚洲精品久久久久中文字幕欢迎你 | 美日韩免费视频 | 欧美一级片在线观看 | 欧美一区二区三区在线观看 | 日韩中文在线 | 中文字字幕一区二区三区四区五区 | 成人午夜免费在线视频 | 亚洲一区二区久久 | 成人午夜免费福利视频 | 成人在线中文字幕 | 99久久精品国产一区二区三区 | 久久久精品一区二区三区 | 亚洲国产精品视频一区 | 日韩精品一区二区三区第95 | 欧美二区在线 | 欧美成人激情 | 久久久久久九九九九九九 | 久久一视频 | 97免费在线观看视频 | 性精品| 久久精品一区二区三区四区 | 亚洲免费视频网址 | 国产99视频精品免费视频7 | 色婷婷综合久久久久中文一区二区 | 色综合av | 国产一在线观看 | 亚洲综合成人网 | 国产专区在线 | 日韩精品中文字幕一区二区三区 | 亚洲国产一区视频 | 精品国产91亚洲一区二区三区www | 久久视频免费观看 | 99re在线视频免费观看 |