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

標(biāo)題: 單片機(jī)矩陣鍵盤實(shí)現(xiàn)簡易計(jì)算器的仿真源碼與實(shí)物制作 [打印本頁]

作者: Vence    時(shí)間: 2018-7-22 16:26
標(biāo)題: 單片機(jī)矩陣鍵盤實(shí)現(xiàn)簡易計(jì)算器的仿真源碼與實(shí)物制作
protues仿真:



  1. /*******************************************************************************
  2. *  標(biāo)題:                     矩陣鍵盤實(shí)現(xiàn)簡易計(jì)算器                            *
  3. *  時(shí)間                      2018年7月22日15:53:57                                                   *
  4. *                                                                                                                                                           *
  5. *  實(shí)驗(yàn)說明:用矩陣鍵盤實(shí)現(xiàn)簡易計(jì)算器,可以進(jìn)行四位數(shù)的加減乘除,數(shù)字顯示在動(dòng)態(tài)*
  6. 數(shù)碼管,+、-、*、/顯示在靜態(tài)數(shù)碼管上,每次必須輸入四個(gè)數(shù)字?jǐn)?shù)碼管才會(huì)亮,例如, *
  7. 要計(jì)算 6+7,那么第一步是輸入0006,才會(huì)在數(shù)碼管上顯示0006,第二步是+,靜態(tài)數(shù)碼管 *
  8. 上就會(huì)出現(xiàn)一個(gè)類似+的符號(hào),接著輸入0007,步驟同上,最后按=,得出結(jié)果                       *                                                      
  9. ********************************************************************************
  10. * 實(shí)驗(yàn)心得:做這個(gè)簡易計(jì)算器一共做了快四天,碰到了許多問題,時(shí)間浪費(fèi)最多的是在 *
  11. 數(shù)組定義那里,如果定義成unsigned int code[].那么該數(shù)組就不能進(jìn)行值的改變,所以 *
  12. 需要                                                                                                                                               *
  13. 定義成unsigned int[]。還有一個(gè)問題就是很奇怪的一個(gè),就是把xianshi()這個(gè)函數(shù)放在*
  14. while(1)                                                                                                                                           *
  15.            {                                                                                                                                           *
  16.                    Two();                                                                                                                                   *
  17.                 if(KeyScan()==8)                                                                                                           *
  18.                 {                                                                                                                                       *
  19.                         KeyValue=12;                                                                                                           *
  20.                     RES();                                                                                                                           *
  21.                         First[0]=16;                                                                                                           *
  22.                         First[1]=16;                                                                                                           *
  23.                         First[2]=16;                                                                                                           *
  24.                         First[3]=16;                                                                                                           *
  25.                         KeyValue=8;                                                                                                                   *
  26.                     break;                                                                                                                           *
  27.                 }這個(gè)里面,就輸出不了結(jié)果,很奇怪???現(xiàn)在還不知道為什么會(huì)這樣,如果有*
  28.                 知道                                                                                                                                   *
  29. 的,評(píng)論啊。                                                                                                                                   *
  30. 最后一個(gè)就是protues仿真那里,keypad的線怎么接???,一直不行                  *
  31. ********************************************************************************/

  32. #include <reg52.h>
  33. #include <math.h>
  34. unsigned int result,m,n;//result為計(jì)算結(jié)果,m為被X數(shù),n為X數(shù)
  35. unsigned int KeyValue=-1;//相當(dāng)于一個(gè)flag的作用
  36. unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
  37.                                  0x7F, 0x6F, 0x70, 0x40, 0x76, 0x49,0x09};//數(shù)碼管上顯示編碼(0~9,+、-、*、/、=)
  38. unsigned int code change[17]={0x3F,0x06,0x66,0x07,0x3F,0x5B,0x6D,0x7F,0x09,0x4F,0x7D,0x6F,0x70,0x40,0x76,0x49,0x00};
  39. unsigned int code changenumber[16]={0,1,4,7,0,2,5,8,14,3,6,9,10,11,12,13};


  40. unsigned int First[4];//定義一個(gè)有4個(gè)單元的數(shù)組,如果定義成 unsigned int code First[4],這個(gè)數(shù)組就不能修改值
  41. unsigned int Second[4];
  42. unsigned int value[8];//給計(jì)算出來的result存放值

  43. #define GPIO_SHOW P0
  44. #define GPIO_KEY P1
  45. #define GPIO_DIG P2

  46. sbit LSA = P3^0;
  47. sbit LSB = P3^1;
  48. sbit LSC = P3^2;

  49. void RES();//返回計(jì)算結(jié)果函數(shù)
  50. void xianshi();        //顯示最終的計(jì)算結(jié)果
  51. void caculate();//計(jì)算第一個(gè)數(shù)和最后一數(shù)
  52. void Rejudge();//判斷第二個(gè)數(shù)的函數(shù)
  53. void judge();//判斷第一個(gè)數(shù)的函數(shù)
  54. int KeyScan(void);//按鍵掃描函數(shù)
  55. void Delay10ms(unsigned int c);//延遲函數(shù)
  56. void One();//被X數(shù)
  57. void Two();//X數(shù)

  58. void main()
  59. {
  60.         while(1)
  61.         {
  62.         judge();
  63.         while(1)
  64.         {
  65.           One();
  66.          
  67.           if(KeyValue==8)
  68.           {
  69.                  GPIO_DIG=change[8];
  70.                   xianshi();
  71.                 if(KeyScan()==0)
  72.                 break;
  73.            
  74.           }

  75.           if(KeyScan()==0)
  76.           {
  77.           GPIO_SHOW=0x00;
  78.           KeyValue=-1;
  79.           break;
  80.           }
  81.          
  82.           else if(KeyScan()==12)
  83.           {
  84.          
  85.            GPIO_DIG=change[12];
  86.            KeyValue=-1;
  87.            Rejudge();
  88.            while(1)
  89.            {
  90.                    Two();
  91.                 if(KeyScan()==8)
  92.                 {
  93.                         KeyValue=12;        
  94.                     RES();
  95.                         First[0]=16;
  96.                         First[1]=16;
  97.                         First[2]=16;
  98.                         First[3]=16;
  99.                         KeyValue=8;
  100.                     break;
  101.                 }
  102.         
  103.            }
  104.          
  105.            }
  106.                         

  107.           else if(KeyScan()==13)
  108.           {
  109.            GPIO_DIG=change[13];
  110.            KeyValue=-1;
  111.            Rejudge();
  112.            while(1)
  113.            {
  114.                    Two();

  115.                 if(KeyScan()==8)
  116.                 {
  117.                     KeyValue=13;        
  118.                     RES();
  119.                         First[0]=16;
  120.                         First[1]=16;
  121.                         First[2]=16;
  122.                         First[3]=16;
  123.                         KeyValue=8;
  124.                     break;
  125.                 }
  126.            }
  127.           }

  128.           else if(KeyScan()==14)
  129.           {
  130.            GPIO_DIG=change[14];
  131.            KeyValue=-1;
  132.            Rejudge();
  133.            while(1)
  134.            {
  135.             Two();
  136.             if(KeyScan()==8)
  137.                 {
  138.                     KeyValue=14;        
  139.                     RES();
  140.                         First[0]=16;
  141.                         First[1]=16;
  142.                         First[2]=16;
  143.                         First[3]=16;
  144.                         KeyValue=8;
  145.                     break;
  146.             }
  147.            }
  148.            
  149.           }

  150.           else if(KeyScan()==15)
  151.           {
  152.            GPIO_DIG=change[15];
  153.            KeyValue=-1;
  154.            Rejudge();
  155.            while(1)
  156.            {
  157.                    Two();
  158.                 if(KeyScan()==8)
  159.                 {
  160.                     KeyValue=15;        
  161.                     RES();
  162.                         First[0]=16;
  163.                         First[1]=16;
  164.                         First[2]=16;
  165.                         First[3]=16;
  166.                         KeyValue=8;
  167.                     break;
  168.                 }
  169.            }
  170.          
  171.           }
  172.         }
  173.         }
  174. }


  175. void One ()
  176. {
  177.     unsigned char j;
  178.         unsigned char i;
  179.         for(i=0;i<4;i++)
  180.         {
  181.                  switch(i)
  182.                 {
  183.             case(0):
  184.                         LSA=0;LSB=0;LSC=1;        
  185.                         break;//顯示第4位
  186.                 case(1):
  187.                         LSA=1;LSB=0;LSC=1;
  188.                     break;//顯示第5位
  189.                 case(2):
  190.                         LSA=0;LSB=1;LSC=1;
  191.                         break;//顯示第6位
  192.                 case(3):
  193.                         LSA=1;LSB=1;LSC=1;
  194.                         break;//顯示第7位
  195.                 }
  196.                 GPIO_SHOW=change[First[i]];
  197.                 j=10;                                                 //掃描間隔時(shí)間設(shè)定
  198.                 while(j--);        
  199.                 GPIO_SHOW=0x00;//消隱
  200.         }
  201. }

  202. void judge()
  203. {
  204.         unsigned int i;
  205.         for(i=0;i<4;i++)
  206.         {
  207.                 do
  208.                 {
  209.                         KeyScan();
  210.                         First[i]=KeyScan();
  211.                 }while(KeyValue==-1);
  212.                 KeyValue=-1;
  213.       
  214.         
  215.         }
  216.         m = 1000*changenumber[First[0]]+100*changenumber[First[1]]+10*changenumber[First[2]]+changenumber[First[3]]; //;m為被X數(shù)
  217. }

  218. void Two()
  219. {
  220.     unsigned char j;
  221.         unsigned char i;

  222.         for(i=0;i<4;i++)
  223.         {
  224.                  switch(i)
  225.                 {
  226.             case(0):
  227.                         LSA=0;LSB=0;LSC=1;        
  228.                         break;//顯示第4位
  229.                 case(1):
  230.                         LSA=1;LSB=0;LSC=1;
  231.                     break;//顯示第5位
  232.                 case(2):
  233.                         LSA=0;LSB=1;LSC=1;
  234.                         break;//顯示第6位
  235.                 case(3):
  236.                         LSA=1;LSB=1;LSC=1;
  237.                         break;//顯示第7位
  238.                 }
  239.                 GPIO_SHOW=change[Second[i]];
  240.                 j=10;                                                 //掃描間隔時(shí)間設(shè)定
  241.                 while(j--);        
  242.                 GPIO_SHOW=0x00;//消隱
  243.         }
  244. }

  245. void Rejudge()
  246. {
  247.     unsigned int i;
  248.         for(i=0;i<4;i++)
  249.         {
  250.                 do
  251.                 {
  252.                         KeyScan();
  253.                         Second[i]=KeyScan();
  254.                 }while(KeyValue==-1);
  255.                 KeyValue=-1;
  256.       
  257.         
  258.         }
  259.         n = 1000*changenumber[Second[0]]+100*changenumber[Second[1]]+10*changenumber[Second[2]]+changenumber[Second[3]]; //;n為X數(shù)        
  260. }

  261. void RES()
  262. {
  263.         if(KeyValue==12)
  264.                 {
  265.                 result=m+n;
  266.             caculate();
  267.                 }
  268.                 else if(KeyValue==13)
  269.                 {
  270.                 result=m-n;
  271.                 caculate();
  272.                 }
  273.                 else if(KeyValue==14)
  274.                 {
  275.                 result=m*n;
  276.                 caculate();
  277.                 }
  278.                 else if(KeyValue==15)
  279.                 {
  280.                 result=m/n;
  281.                 caculate();
  282.                 }
  283.         

  284. }

  285. void caculate()
  286. {
  287. //    unsigned int i;
  288. //        for(i=0;i<8;i++)
  289. //        {
  290. //                value[i]=(result%(int)(pow(10,(8-i))))/((int)pow(10,(7-i)));
  291. //        }

  292.     value[0]=result/10000000;
  293.         value[1]=(result%10000000)/1000000;
  294.         value[2]=(result%1000000)/100000;
  295.         value[3]=(result%100000)/10000;
  296.         value[4]=(result%10000)/1000;
  297.         value[5]=(result%1000)/100;
  298.         value[6]=(result%100)/10;
  299.         value[7]=(result%10);
  300.         
  301. }

  302. void xianshi()
  303. {
  304.     unsigned char j;
  305.         unsigned char i;
  306.         for(i=0;i<8;i++)
  307.         {
  308.                  switch(i)
  309.                 {
  310.         case(0):
  311.             LSA=0;LSB=0;LSC=0; break;//顯示第0位
  312.                 case(1):
  313.                         LSA=1;LSB=0;LSC=0; break;//顯示第1位
  314.                 case(2):
  315.                         LSA=0;LSB=1;LSC=0; break;//顯示第2位
  316.                 case(3):
  317.                         LSA=1;LSB=1;LSC=0; break;//顯示第3位
  318.                 case(4):
  319.                         LSA=0;LSB=0;LSC=1; break;//顯示第4位
  320.                 case(5):
  321.                         LSA=1;LSB=0;LSC=1; break;//顯示第5位
  322.                 case(6):
  323.                         LSA=0;LSB=1;LSC=1; break;//顯示第6位
  324.                 case(7):
  325.                         LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  326.                 }
  327.                 GPIO_SHOW=DIG_CODE[value[i]];
  328.                 j=10;                                                 //掃描間隔時(shí)間設(shè)定
  329.                 while(j--);        
  330.                 GPIO_SHOW=0x00;//消隱
  331.         }
  332.         
  333. }

  334. int KeyScan(void)          //測試行(row)的時(shí)候就是線是豎著的的那一列為1,測試列(col)的時(shí)候就是線是橫著的那幾行為1
  335. {
  336.         char a = 0;
  337.         GPIO_KEY=0x0f;
  338.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  339.         {
  340.                 Delay10ms(1);//延時(shí)10ms進(jìn)行消抖
  341.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  342.                 {
  343.                         //測試列
  344.                         GPIO_KEY=0X0F;
  345.                         switch(GPIO_KEY)
  346.                         {
  347.                                 case(0X07):        KeyValue=0;break;
  348.                                 case(0X0b):        KeyValue=4;break;
  349.                                 case(0X0d): KeyValue=8;break;
  350.                                 case(0X0e):        KeyValue=12;break;
  351.                         }
  352.                         //測試行
  353.                         GPIO_KEY=0XF0;
  354.                         switch(GPIO_KEY)
  355.                         {
  356.                                 case(0X70):        KeyValue=KeyValue+3;break;
  357.                                 case(0Xb0):        KeyValue=KeyValue+2;break;
  358.                                 case(0Xd0): KeyValue=KeyValue+1;break;
  359.                                 case(0Xe0):        KeyValue=KeyValue;break;
  360.                         }
  361.                         while((a<50) && (GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  362.                         {
  363.                                 Delay10ms(1);
  364.                                 a++;
  365.                         }
  366.                         
  367.                 }
  368.         }

  369.         return KeyValue;//這一步的return值很重要,需要等KeyValue值準(zhǔn)確的出來后,才能返回,不用return的話就是一個(gè)中途的KeyValue值(剛行掃描完就賦值給數(shù)組)。
  370.         
  371. }



  372. void Delay10ms(unsigned int c)   //誤差 0us
  373. {
  374.     unsigned char a, b;

  375.         //--c已經(jīng)在傳遞過來的時(shí)候已經(jīng)賦值了,所以在for語句第一句就不用賦值了--//
  376.     for (;c>0;c--)
  377.         {
  378.                 for (b=38;b>0;b--)
  379.                 {
  380.                         for (a=130;a>0;a--);
  381.                 }         
  382.         }      
  383. }
復(fù)制代碼



全部資料51hei下載地址:
protues版.rar (73.05 KB, 下載次數(shù): 38)



作者: admin    時(shí)間: 2018-7-23 02:20
好資料,51黑有你更精彩!!!
作者: Vence    時(shí)間: 2018-7-23 03:19
admin 發(fā)表于 2018-7-23 02:20
好資料,51黑有你更精彩!!!

哈哈,是51黑讓我變得更優(yōu)秀。所以,我也要呈現(xiàn)自己滿意的,學(xué)習(xí)過程中的項(xiàng)目給51黑。
作者: Ntrz    時(shí)間: 2019-5-14 16:25
兄弟 怎么接線的能發(fā)一下嗎




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲视频在线观看 | 精品日韩一区 | 成人在线网 | 久久久久国产一区二区 | 欧美成人一级视频 | 国产女人叫床高潮大片免费 | 91精产国品一二三区 | 日韩一区二区三区视频 | 91视频网址 | 亚洲天堂免费在线 | 亚洲免费一区二区 | 日韩国产精品一区二区三区 | 日韩在线不卡视频 | 免费观看成人av | 一级做a爰片性色毛片视频停止 | 成年人在线观看视频 | 亚洲二区视频 | 日韩在线免费视频 | 毛片在线免费 | 国内精品免费久久久久软件老师 | 午夜免费视频 | 在线观看第一区 | 日日综合 | 伊人狠狠操 | 精品无码久久久久久国产 | 亚洲综合色丁香婷婷六月图片 | 欧美久久久久久久久中文字幕 | 911网站大全在线观看 | 国产亚洲精品久久久久动 | 成年视频在线观看 | 欧美日韩高清在线一区 | 久久亚洲欧美日韩精品专区 | 国产一级电影在线 | 国产伦一区二区三区四区 | 精品毛片视频 | 91精品久久久久久久久中文字幕 | 国产精品久久久久久一区二区三区 | 国产激情一区二区三区 | 欧美极品少妇xxxxⅹ免费视频 | 亚洲视频中文 | 欧美高清视频一区 |