protues仿真:
QQ截圖20180722160832.png (202.38 KB, 下載次數: 39)
下載附件
原理圖
2018-7-22 16:17 上傳
2359.png (199.68 KB, 下載次數: 36)
下載附件
被加數
2018-7-22 16:17 上傳
.png (194.34 KB, 下載次數: 34)
下載附件
加號
2018-7-22 16:17 上傳
9999.png (198.4 KB, 下載次數: 42)
下載附件
加數
2018-7-22 16:17 上傳
12358.png (200.07 KB, 下載次數: 40)
下載附件
結果
2018-7-22 16:18 上傳
IMG_0205.JPG (1.87 MB, 下載次數: 36)
下載附件
2018-7-22 16:24 上傳
IMG_0206.JPG (2.19 MB, 下載次數: 44)
下載附件
2018-7-22 16:25 上傳
IMG_0208.JPG (2.26 MB, 下載次數: 32)
下載附件
2018-7-22 16:25 上傳
- /*******************************************************************************
- * 標題: 矩陣鍵盤實現簡易計算器 *
- * 時間 2018年7月22日15:53:57 *
- * *
- * 實驗說明:用矩陣鍵盤實現簡易計算器,可以進行四位數的加減乘除,數字顯示在動態*
- 數碼管,+、-、*、/顯示在靜態數碼管上,每次必須輸入四個數字數碼管才會亮,例如, *
- 要計算 6+7,那么第一步是輸入0006,才會在數碼管上顯示0006,第二步是+,靜態數碼管 *
- 上就會出現一個類似+的符號,接著輸入0007,步驟同上,最后按=,得出結果 *
- ********************************************************************************
- * 實驗心得:做這個簡易計算器一共做了快四天,碰到了許多問題,時間浪費最多的是在 *
- 數組定義那里,如果定義成unsigned int code[].那么該數組就不能進行值的改變,所以 *
- 需要 *
- 定義成unsigned int[]。還有一個問題就是很奇怪的一個,就是把xianshi()這個函數放在*
- while(1) *
- { *
- Two(); *
- if(KeyScan()==8) *
- { *
- KeyValue=12; *
- RES(); *
- First[0]=16; *
- First[1]=16; *
- First[2]=16; *
- First[3]=16; *
- KeyValue=8; *
- break; *
- }這個里面,就輸出不了結果,很奇怪???現在還不知道為什么會這樣,如果有*
- 知道 *
- 的,評論啊。 *
- 最后一個就是protues仿真那里,keypad的線怎么接???,一直不行 *
- ********************************************************************************/
- #include <reg52.h>
- #include <math.h>
- unsigned int result,m,n;//result為計算結果,m為被X數,n為X數
- unsigned int KeyValue=-1;//相當于一個flag的作用
- unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
- 0x7F, 0x6F, 0x70, 0x40, 0x76, 0x49,0x09};//數碼管上顯示編碼(0~9,+、-、*、/、=)
- unsigned int code change[17]={0x3F,0x06,0x66,0x07,0x3F,0x5B,0x6D,0x7F,0x09,0x4F,0x7D,0x6F,0x70,0x40,0x76,0x49,0x00};
- unsigned int code changenumber[16]={0,1,4,7,0,2,5,8,14,3,6,9,10,11,12,13};
- unsigned int First[4];//定義一個有4個單元的數組,如果定義成 unsigned int code First[4],這個數組就不能修改值
- unsigned int Second[4];
- unsigned int value[8];//給計算出來的result存放值
- #define GPIO_SHOW P0
- #define GPIO_KEY P1
- #define GPIO_DIG P2
- sbit LSA = P3^0;
- sbit LSB = P3^1;
- sbit LSC = P3^2;
- void RES();//返回計算結果函數
- void xianshi(); //顯示最終的計算結果
- void caculate();//計算第一個數和最后一數
- void Rejudge();//判斷第二個數的函數
- void judge();//判斷第一個數的函數
- int KeyScan(void);//按鍵掃描函數
- void Delay10ms(unsigned int c);//延遲函數
- void One();//被X數
- void Two();//X數
- void main()
- {
- while(1)
- {
- judge();
- while(1)
- {
- One();
-
- if(KeyValue==8)
- {
- GPIO_DIG=change[8];
- xianshi();
- if(KeyScan()==0)
- break;
-
- }
- if(KeyScan()==0)
- {
- GPIO_SHOW=0x00;
- KeyValue=-1;
- break;
- }
-
- else if(KeyScan()==12)
- {
-
- GPIO_DIG=change[12];
- KeyValue=-1;
- Rejudge();
- while(1)
- {
- Two();
- if(KeyScan()==8)
- {
- KeyValue=12;
- RES();
- First[0]=16;
- First[1]=16;
- First[2]=16;
- First[3]=16;
- KeyValue=8;
- break;
- }
-
- }
-
- }
-
- else if(KeyScan()==13)
- {
- GPIO_DIG=change[13];
- KeyValue=-1;
- Rejudge();
- while(1)
- {
- Two();
- if(KeyScan()==8)
- {
- KeyValue=13;
- RES();
- First[0]=16;
- First[1]=16;
- First[2]=16;
- First[3]=16;
- KeyValue=8;
- break;
- }
- }
- }
- else if(KeyScan()==14)
- {
- GPIO_DIG=change[14];
- KeyValue=-1;
- Rejudge();
- while(1)
- {
- Two();
- if(KeyScan()==8)
- {
- KeyValue=14;
- RES();
- First[0]=16;
- First[1]=16;
- First[2]=16;
- First[3]=16;
- KeyValue=8;
- break;
- }
- }
-
- }
- else if(KeyScan()==15)
- {
- GPIO_DIG=change[15];
- KeyValue=-1;
- Rejudge();
- while(1)
- {
- Two();
- if(KeyScan()==8)
- {
- KeyValue=15;
- RES();
- First[0]=16;
- First[1]=16;
- First[2]=16;
- First[3]=16;
- KeyValue=8;
- break;
- }
- }
-
- }
- }
- }
- }
- void One ()
- {
- unsigned char j;
- unsigned char i;
- for(i=0;i<4;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=1;
- break;//顯示第4位
- case(1):
- LSA=1;LSB=0;LSC=1;
- break;//顯示第5位
- case(2):
- LSA=0;LSB=1;LSC=1;
- break;//顯示第6位
- case(3):
- LSA=1;LSB=1;LSC=1;
- break;//顯示第7位
- }
- GPIO_SHOW=change[First[i]];
- j=10; //掃描間隔時間設定
- while(j--);
- GPIO_SHOW=0x00;//消隱
- }
- }
- void judge()
- {
- unsigned int i;
- for(i=0;i<4;i++)
- {
- do
- {
- KeyScan();
- First[i]=KeyScan();
- }while(KeyValue==-1);
- KeyValue=-1;
-
-
- }
- m = 1000*changenumber[First[0]]+100*changenumber[First[1]]+10*changenumber[First[2]]+changenumber[First[3]]; //;m為被X數
- }
- void Two()
- {
- unsigned char j;
- unsigned char i;
- for(i=0;i<4;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=1;
- break;//顯示第4位
- case(1):
- LSA=1;LSB=0;LSC=1;
- break;//顯示第5位
- case(2):
- LSA=0;LSB=1;LSC=1;
- break;//顯示第6位
- case(3):
- LSA=1;LSB=1;LSC=1;
- break;//顯示第7位
- }
- GPIO_SHOW=change[Second[i]];
- j=10; //掃描間隔時間設定
- while(j--);
- GPIO_SHOW=0x00;//消隱
- }
- }
- void Rejudge()
- {
- unsigned int i;
- for(i=0;i<4;i++)
- {
- do
- {
- KeyScan();
- Second[i]=KeyScan();
- }while(KeyValue==-1);
- KeyValue=-1;
-
-
- }
- n = 1000*changenumber[Second[0]]+100*changenumber[Second[1]]+10*changenumber[Second[2]]+changenumber[Second[3]]; //;n為X數
- }
- void RES()
- {
- if(KeyValue==12)
- {
- result=m+n;
- caculate();
- }
- else if(KeyValue==13)
- {
- result=m-n;
- caculate();
- }
- else if(KeyValue==14)
- {
- result=m*n;
- caculate();
- }
- else if(KeyValue==15)
- {
- result=m/n;
- caculate();
- }
-
- }
- void caculate()
- {
- // unsigned int i;
- // for(i=0;i<8;i++)
- // {
- // value[i]=(result%(int)(pow(10,(8-i))))/((int)pow(10,(7-i)));
- // }
- value[0]=result/10000000;
- value[1]=(result%10000000)/1000000;
- value[2]=(result%1000000)/100000;
- value[3]=(result%100000)/10000;
- value[4]=(result%10000)/1000;
- value[5]=(result%1000)/100;
- value[6]=(result%100)/10;
- value[7]=(result%10);
-
- }
- void xianshi()
- {
- unsigned char j;
- unsigned char i;
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
- }
- GPIO_SHOW=DIG_CODE[value[i]];
- j=10; //掃描間隔時間設定
- while(j--);
- GPIO_SHOW=0x00;//消隱
- }
-
- }
- int KeyScan(void) //測試行(row)的時候就是線是豎著的的那一列為1,測試列(col)的時候就是線是橫著的那幾行為1
- {
- char a = 0;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
- {
- Delay10ms(1);//延時10ms進行消抖
- if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
- {
- //測試列
- GPIO_KEY=0X0F;
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=4;break;
- case(0X0d): KeyValue=8;break;
- case(0X0e): KeyValue=12;break;
- }
- //測試行
- GPIO_KEY=0XF0;
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue+3;break;
- case(0Xb0): KeyValue=KeyValue+2;break;
- case(0Xd0): KeyValue=KeyValue+1;break;
- case(0Xe0): KeyValue=KeyValue;break;
- }
- while((a<50) && (GPIO_KEY!=0xf0)) //檢測按鍵松手檢測
- {
- Delay10ms(1);
- a++;
- }
-
- }
- }
- return KeyValue;//這一步的return值很重要,需要等KeyValue值準確的出來后,才能返回,不用return的話就是一個中途的KeyValue值(剛行掃描完就賦值給數組)。
-
- }
- void Delay10ms(unsigned int c) //誤差 0us
- {
- unsigned char a, b;
- //--c已經在傳遞過來的時候已經賦值了,所以在for語句第一句就不用賦值了--//
- for (;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
- }
- }
復制代碼
0.png (13.34 KB, 下載次數: 43)
下載附件
2018-7-23 02:18 上傳
全部資料51hei下載地址:
protues版.rar
(73.05 KB, 下載次數: 38)
2018-7-22 16:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|