找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PXA270電子計算器實(shí)訓(xùn)報告 附程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140725 發(fā)表于 2016-10-11 16:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
廣東科學(xué)技術(shù)職業(yè)學(xué)院廣州學(xué)院
實(shí)訓(xùn)報告

簡易電子計算器
專業(yè):計算機(jī)應(yīng)用技術(shù)(嵌入式)
班級:08計應(yīng)1班
學(xué)生姓名:XXXXXX
學(xué)號:0801080105

一、 設(shè)計任務(wù)與要求
設(shè)計16鍵盤簡易計算器,實(shí)現(xiàn)以下功能。
1、4*4鍵盤輸入,用按鍵輸入數(shù)和運(yùn)算符號。
1              2              3              +
4              5              6              -
7              8              9              *
C              0              =              ∕
2、數(shù)碼管顯示運(yùn)算過程和結(jié)果(十進(jìn)制數(shù)),負(fù)號用一個LED燈顯示。
3、具有清零和復(fù)位功能。
4、具有連續(xù)運(yùn)算功能。
5、具有簡易報錯和提示功能。

二、 總體方案與說明
利用PXA270的16個鍵盤,通過中斷輸入。16個按鍵分為10個數(shù)字鍵(0-9),
+、-、*、/、=、清零等功能。整個計算器實(shí)現(xiàn)在結(jié)果為-9999到9999范圍內(nèi)的加
減乘除運(yùn)算。負(fù)數(shù)的時候通過LED1亮表示,加減乘除被按下后,對應(yīng)得LED
燈會亮,在輸入數(shù)字后自動滅掉提示輸入運(yùn)算符號的LED燈。按下C鍵具有
清零的效果(清除數(shù)碼管顯示,和相關(guān)變量初始化,以及LED燈初始化等)
!=”的功能是:若沒有輸入數(shù),則還是顯示0;若輸入了一個數(shù)(正數(shù)或
負(fù)數(shù))則直接顯示這個數(shù)(負(fù)數(shù)顯示的時候,要LED1亮);具有連續(xù)運(yùn)算的
功能(即具有記憶最近輸入的運(yùn)算符和操作數(shù)的功能,如:剛輸入了1+5=,
顯示6之后,再按下“=”,則執(zhí)行6+5=的操作,以此類推)。當(dāng)操作數(shù)大于
-9999到9999的范圍后,顯示Eoor和亮所有LED燈報錯,當(dāng)按下清零鍵后
,清除報錯。同樣,在運(yùn)算中,若被除數(shù)為0,則報錯。
聲明:本程序不具備多級運(yùn)算,如:1+15-45=這種一次運(yùn)算超過一個運(yùn)算
符的運(yùn)算。若按下了多次運(yùn)算符,則取最后按下的為有效。
由于本人使用的硬件是4個直入鍵盤和12個矩陣鍵盤,所以程序分開處理。
三、 電路原理圖
數(shù)碼管:

LED燈:
直入鍵盤:
矩陣鍵盤:


四、 軟件主要模塊流程圖
緊接上面的加減乘除、等于、清零鍵的流程圖:
五、 問題分析與解決方案
問題1:如何做到連續(xù)運(yùn)算功能?
答:首先,你要知道你在數(shù)學(xué)中是如何運(yùn)算的。如:我要做(25+3-4)*2/3的運(yùn)算,那么我的計算步驟為:25+3=28,28-4=24,24*2=48,48/3=16。其次,由數(shù)學(xué)運(yùn)算推導(dǎo)出一個規(guī)律。(以剛才的舉例為例)從剛才的運(yùn)算可以看出,我們在做完一次運(yùn)算后,其結(jié)果都作為了下一次運(yùn)算的一個成員。那么我們不妨把這個結(jié)果放到一個變量如:firstnum中,同時我們第一個運(yùn)算數(shù)25也可以放到變量firstnum中。然后,我們在把要運(yùn)算的數(shù),即在運(yùn)算符號后面的數(shù)存放到另一個變量secondnum中。這時,我們就可以把運(yùn)算表達(dá)式寫為:firstnum = fisrtnum + secondnum;(在程序中,結(jié)果都是在=號左邊的。)之后的幾個表達(dá)式分別為:firstnum = firstnum – secondnum; firstnum = firstnum * secondnum; firstnum = firstnum / (secondnum*1.0);(在程序中除號運(yùn)算的結(jié)果為整數(shù),要做到真正的除法運(yùn)算,就要運(yùn)算數(shù)中至少一個為小數(shù)即可。)
最后,從這幾個表達(dá)式我們可以看出其基本規(guī)律是:firstnum = firstnum 運(yùn)算符 secondnum; 這樣只要我們把第一個輸入的數(shù)和第二個輸入的數(shù)分開來存,就可以做到連續(xù)運(yùn)算的效果。
問題2:如何正確的把一個表達(dá)式中的第一個運(yùn)算數(shù)保存到firstnum中,第二個運(yùn)算數(shù)保存到secondnum中?
答:根據(jù)問題1中的運(yùn)算表達(dá)式,我們可以看出,在沒有到運(yùn)算符之前的是firstnum,在運(yùn)算符后面的是secondnum。這樣我們就可以根據(jù)有沒有輸入運(yùn)算符來把輸入的數(shù)存放到相應(yīng)的變量中。當(dāng)然,由于你的firstnum是可以作為下一個運(yùn)算的一個運(yùn)算數(shù)的,所以這里要把firstnum定義為全局變量。
問題3:如何實(shí)現(xiàn)大于10而小于9999的數(shù)顯示?
答:由于我的硬件為4個數(shù)碼管,所以這里僅以我的硬件為例解釋。在我們的實(shí)驗箱上面,都有兩組兩個的靜態(tài)數(shù)碼管,它們的控制端從左到右為:LED_CS2,LED_CS3。一個“CS”就控制兩個數(shù)碼管。從這里我們就可以知都CS2是顯示千位和百位的,CS3是顯示十位和個位的。由于舊版的PXA270實(shí)驗箱的硬件時把要控制小數(shù)點(diǎn)端口用來控制數(shù)碼管的開與關(guān),所以整個程序不考慮小數(shù),只考慮整數(shù)的運(yùn)算。
回到正題,在這里我們用一個數(shù)碼管顯示一個數(shù)字。如:我們要顯示14這個數(shù),那么我們就要把這個兩位數(shù)分開來分別送到CS3的兩個數(shù)碼管顯示。如何分開這兩個數(shù)?在程序中,我們可以通過這兩個表達(dá)式獲取這個數(shù)(用num表示)的十位(用swei表示)和各位(用gwei表示):swei = num/10%10;  gwei = num%10;在這里有必要解釋一下num/10和num%10的意思。num/10是表示num除以10,但這不是數(shù)學(xué)上的除法運(yùn)算,而是把num除以10之后,取其能夠整除的部分,即可以理解為整數(shù)部分。而num%10剛好和num/10相反,它是把num除以10后,不能整除的部分,即余數(shù)部分取出來的意思。這樣,我們?nèi)〉绞缓蛡位后,就可以把這兩個數(shù)分別送到數(shù)碼管CS3中顯示就可以了。同樣的道理,要顯示百位(用bwei表示)和千位(用qwei表示),可以通過這兩個表達(dá)式獲得:bwei = num /100%10;  qwei = num /1000%10;之后再把千位和百位送到數(shù)碼管CS2中顯示就可以了。
問題4:如何做到輸入幾位數(shù)(在-9999到9999之間)的效果?
答:要做到輸入幾位數(shù)的效果,我們不妨把整個效果想一下。在硬件上,我們是一個按鍵一個按鍵的按的,也就是說我們?nèi)绻斎?23的話,就要分別按下1鍵、2鍵、3鍵。而每按下一個鍵,我們的程序就會記錄剛按下的這個鍵。再考慮一下在硬件上按下123的效果:首先,我們按下1的時候,數(shù)碼管就顯示1;再按下2的時候,數(shù)碼管要顯示12,才能達(dá)到我們要的結(jié)果;再次按下3的時候,數(shù)碼管就要顯示123。那么從這里我們可以找出一個數(shù)學(xué)規(guī)律,那就是:1=1;12=1*10+2;123=12*10+3;這個規(guī)律就是第二個按下的鍵要顯示的結(jié)果就是第一個按下的數(shù)字乘以10,再加上第二個按下的數(shù)字;而第三個按下的鍵的結(jié)果就是第二個按下的結(jié)果乘以10,再加上第三個按下的數(shù)字。用程序的表達(dá)式可以寫成:firstnum = firstnum*10 +justnum;(justnum為最近按下的鍵)這個表達(dá)式就解決了硬件上實(shí)現(xiàn)輸入多位數(shù)的問題。如果你不相信這個表達(dá)式可以實(shí)現(xiàn)的話,那我們再來驗證一下,比如說你要輸入5,那么這個表達(dá)式就應(yīng)該為firstnum = 0*10 +5;最后結(jié)果為5(這里要說明一點(diǎn),firstnum的初始值為0)。又比如說,你要輸入的數(shù)為5678:那么每輸入一個數(shù)字的對應(yīng)表達(dá)式分別為:firstnum = 0*10 + 5;即firstnum此時為5;輸入6的時候,firstnum = 5*10 +6;此時firstnum = 56;輸入7,firstnum = 56*10 +7;此時firstnum = 567;最后按下8的時候,firstnum = 567*10 + 8;最后firstnum = 5678;這就說明我們這個表達(dá)式是正確的。
問題5:為何實(shí)現(xiàn)了操作數(shù)為多位數(shù)運(yùn)算,卻不能做到連續(xù)運(yùn)算?
答:在解釋這個問題前,先說明一點(diǎn):由于我們的按鍵都是中斷按鍵,所以每按一下按鍵就會重新進(jìn)入一次鍵盤處理函數(shù)。在進(jìn)行運(yùn)算的時候,我們把第一個操作數(shù)和第二個操作數(shù)都定義為了全局變量。當(dāng)我們進(jìn)行完第一次運(yùn)算,由于沒有清零,所以再按下運(yùn)算符繼續(xù)運(yùn)算的時候,你會發(fā)現(xiàn)數(shù)碼管是接著第一次運(yùn)算的結(jié)果為上一次的輸入乘以10再加上你剛按下鍵顯示出來的。比如說:你進(jìn)行完的第一次運(yùn)算為56+64=120;然后你再按下+1的時候,數(shù)碼管卻顯示了641。這是為什么??如何解決這個問題?出現(xiàn)這個問題的原因是:在進(jìn)行完第一次運(yùn)算后,firstnum的值變了,而secondnum中的值還是64,而且由于你判斷把第二個操作數(shù)存放到secondnum中的條件是有沒有輸入運(yùn)算符。這就導(dǎo)致你再輸入一次運(yùn)算符的時候,它還是滿足條件,而直接進(jìn)入到表達(dá)式:secondnum = secondnum*10 + justnum;其中的secondnum還保存到上一次輸入的值64,現(xiàn)在再按下一個數(shù)字1,程序重新進(jìn)入到這個函數(shù)就執(zhí)行了secondnum = 64*10 + 1;的表達(dá)式,這就是問題出現(xiàn)的原因。那如何解決這個問題?在我看來,因為你運(yùn)算完一次運(yùn)算后,都會有一次=號被按下的機(jī)會。我們可以給等號定義一個標(biāo)志位,這樣就可以通過在輸入第二個操作數(shù)之前判斷這個等號是否被按下,按下就把secondnum清零,同時把等號標(biāo)志位也清掉。這樣就可以避免上述情況的發(fā)生。
問題6:為何在硬件上調(diào)試的時候,會經(jīng)常出現(xiàn)卡死的情況(就是數(shù)碼管顯示一個東西不變,按任何鍵都沒反應(yīng))?
答:開始我的程序出現(xiàn)這種情況的時候,檢測程序好幾遍都沒發(fā)現(xiàn)程序上有啥錯,也不關(guān)硬件的事。后來才知道原來是在boot.s里面把MDMRS配置成0x2800,MDMRS配置成這個的時候,會經(jīng)常產(chǎn)生沖突,只要把其配置成0x320032就OK了。如:
原來是:
;MDMRS
              ldr                            r1, =0x2800
              str                            r1,[r11]
              mov                            pc,r14
更改后:
;MDMRS
                 ldr                            r1,  =0x320032
                 str               r1, [r11]
              mov               pc,r14
問題7:為何下載鏡像文件到實(shí)驗箱的時候老是提示失?
答:出現(xiàn)這類情況的原因有多種,這里只介紹軟件設(shè)置錯誤的解決方法。軟件上到底是哪設(shè)置的問題會導(dǎo)致這種情況呢?這個地方的設(shè)置很容易被人忽視。下面以截圖說明:
步驟1:
步驟2:
步驟3:
步驟4:
步驟5:
如果以上的設(shè)置都沒錯,但下載還是總是失敗的話,那就要看你的bootloader配置了。

六、 實(shí)驗體會
心得體會:在剛接觸到這個項目的時候,大概想了一下挺簡單的。但是在實(shí)踐寫程序的時候總是會出現(xiàn)各種各樣的原因,現(xiàn)實(shí)往往和自己想的不一樣。就像我自己按照自己的思路寫好的程序,在上硬件調(diào)試的時候會發(fā)現(xiàn)有很多情況自己都沒有考慮到。通過這個項目,使得自己對PXA270的這一部分硬件了解了很多,在寫程序方面也有點(diǎn)點(diǎn)的長進(jìn)。在試驗中遇到的比較常見的情況都寫出來了,在這里就不羅嗦了。
  1. /******************************************************
  2. *
  3. *項目名稱:簡易計算器
  4. *
  5. *函    數(shù):cal.c
  6. *
  7. *作    用:按鍵處理,主函數(shù)
  8. *
  9. *有待改進(jìn):本程序還可以進(jìn)一步的完善,其一就有如按下1+2,
  10. *                   再按下+號的時候,就直接計算出結(jié)果并顯示。
  11. *                   希望有興趣的朋友能夠加以改進(jìn)。
  12. *
  13. *制 作 人:沐雨青林
  14. *
  15. *******************************************************/

  16. #include "led_8.h"

  17. #define                uchar        unsigned        char
  18. #define                usint        unsigned         short int
  19. #define                uint        unsigned         int

  20. extern void Led8_disp(int num);
  21. extern const uchar key_source_code[];
  22. extern void init_key(void);

  23. #define                key_add                '+'
  24. #define                key_de                '-'
  25. #define                key_mul                '*'
  26. #define                key_mol                '/'
  27. #define                key_canal        'C'
  28. #define                key_means        '='



  29. const uchar key_code[] ={ 1, 2, 3, key_add,        // +
  30.                                                   4, 5, 6, key_de,                // -
  31.                                                   7, 8, 9, key_mul,        // *
  32.                                                   key_canal, 0x00, key_means, key_mol};// /
  33. int                firstnum=0;//存放第1個數(shù)
  34. int                secondnum=0;//存放第2個數(shù)
  35. uchar        operation='\0';//運(yùn)算符號
  36. uchar        mean_sign=0;//等號標(biāo)志位        1為開,0位關(guān)
  37. uint        optimes=0;//運(yùn)算符號計數(shù)位

  38. //以運(yùn)算符+、-、*、/為標(biāo)志,當(dāng)這些標(biāo)志出現(xiàn)后,則輸入的數(shù)字存放到
  39. //secondnum中

  40. //變量初始化
  41. void init_clear(void)
  42. {
  43.         firstnum = 0;
  44.         secondnum = 0;
  45.         operation = '\0';
  46.         optimes = 0;
  47.         LED_CS4 = 0xff;
  48.         Led8_disp(0);
  49.         return;
  50. }

  51. //計算多位數(shù),num為新輸入的一位數(shù)
  52. //算好的多位數(shù)存放在snum,snum為原來存放有數(shù)的變量
  53. int duoweishu(int snum, int num)
  54. {
  55.         snum = num + snum*10;
  56.         return snum;
  57. }


  58. //直入式鍵盤處理
  59. void op_disdir(usint key_d)
  60. {
  61.         uint i;
  62.         for(i=0; i<4; i++)
  63.         {
  64.                 if(key_d == key_source_code[i])
  65.                 {
  66.                         if(i == 3)// ‘+’ 按鍵處理
  67.                         {
  68.                                 LED_CS4 = 0x7f;
  69.                                 optimes++;
  70.                                 operation = key_code[i];//operation 為‘+’
  71.                         }
  72.                         else
  73.                         {        
  74.                                 //在沒有按下運(yùn)算符的時候,把按鍵對應(yīng)的鍵值存到firstnum
  75.                                 if(operation == '\0')
  76.                                 {
  77.                                         firstnum = duoweishu(firstnum,key_code[i]);
  78.                                         Led8_disp(firstnum);
  79.                                 }
  80.                                 else//按下運(yùn)算符的時候,把按鍵對應(yīng)的鍵值存到secondnum
  81.                                 {
  82.                                         if(mean_sign == 1)//等號標(biāo)志位
  83.                                         {
  84.                                                 secondnum = 0;
  85.                                                 mean_sign = 0;//清等號標(biāo)志位        
  86.                                         }
  87.                                        
  88.                                         if(operation == '-' && optimes == 1)//負(fù)數(shù)輸入
  89.                                         {
  90.                                                 firstnum = duoweishu(firstnum,-key_code[i]);
  91.                                                 Led8_disp(firstnum);
  92.                                         }
  93.                                         else
  94.                                         {
  95.                                                 secondnum = duoweishu(secondnum, key_code[i]);
  96.                                                 Led8_disp(secondnum);
  97.                                         }
  98.                                 }
  99.                         }        
  100.                 }
  101.         }
  102. }
  103. //矩陣鍵盤處理
  104. void op_dismatrix(usint key_d)
  105. {
  106.         uint i;
  107.         for(i=4; i<16; i++)
  108.         {
  109.                 if(key_d == key_source_code[i])
  110.                 {        
  111.                         if(i == 7)        // ‘-’ 鍵處理
  112.                         {
  113.                                 LED_CS4 = 0xbf;        
  114.                                 if(operation == '\0' && firstnum == 0)
  115.                                         optimes = 1;
  116.                                 else
  117.                                         optimes += 2;
  118.                                        
  119.                                 operation = key_code[i];        
  120.                         }
  121.                         else if(i == 11)        // ‘*’ 鍵處理
  122.                         {
  123.                                 LED_CS4 = 0xdf;        
  124.                                 optimes++;
  125.                                 operation = key_code[i];        
  126.                         }
  127.                         else if(i == 12)        // ‘C’ 鍵處理
  128.                         {
  129.                                 init_clear();//變量初始化
  130.                                 break;
  131.                         }
  132.                         else if(i == 14)        // ‘=’ 鍵處理
  133.                         {
  134.                                 mean_sign=1;//等號標(biāo)志位
  135.                                 if(operation == '+')
  136.                                         firstnum = firstnum + secondnum;
  137.                                 else if(operation == '-')
  138.                                         firstnum = firstnum - secondnum;
  139.                                 else if(operation == '*')
  140.                                         firstnum = firstnum * secondnum;
  141.                                 else if(operation == '/')
  142.                                 {
  143.                                         if(secondnum == 0)//被除數(shù)為0,結(jié)果為無窮大
  144.                                                 firstnum = 88888;
  145.                                         else        
  146.                                                 firstnum = firstnum / secondnum*1.0;
  147.                                 }
  148.                                 
  149.                                 //secondnum = 0;
  150.                                 Led8_disp( firstnum);//顯示和
  151.                         }
  152.                         else if(i == 15)// ‘/‘ 鍵處理
  153.                         {
  154.                                 LED_CS4 = 0xef;
  155.                                 optimes++;
  156.                                 operation = key_code[i];
  157.                         }
  158.                         else // 數(shù)字鍵輸入
  159.                         {        
  160.                                 //在沒有按下運(yùn)算符的時候,把按鍵對應(yīng)的鍵值存到firstnum
  161.                                 if(operation == '\0')
  162.                                 {
  163.                                         firstnum = duoweishu(firstnum,key_code[i]);
  164.                                         Led8_disp(firstnum);
  165.                                 }
  166.                                 else//按下運(yùn)算符的時候,把按鍵對應(yīng)的鍵值存到secondnum
  167.                                 {
  168.                                         if(mean_sign == 1)//等號標(biāo)志位
  169.                                         {
  170.                                                 secondnum = 0;
  171.                                                 mean_sign = 0;//清等號標(biāo)志位        
  172.                                         }
  173.                                        
  174.                                         if(operation == '-' && optimes == 1)//負(fù)數(shù)輸入
  175.                                         {
  176.                                                 firstnum = duoweishu(firstnum,-key_code[i]);
  177.                                                 Led8_disp(firstnum);
  178.                                         }
  179.                                         else
  180.                                         {
  181.                                                 secondnum = duoweishu(secondnum, key_code[i]);
  182.                                                 Led8_disp(secondnum);
  183.                                         }
  184.                                 }
  185.                         }
  186.                 }
  187.         }
  188. }


  189. void Main(void)
  190. {        
  191.         LED_CS4 = 0xff;
  192.         //Led8_disp(0);
  193.         init_clear();//變量初始化
  194.         init_key();
  195.         while (1)
  196.         {        
  197.         }

  198. }
復(fù)制代碼
  1. /******************************************************
  2. *
  3. *項目名稱:簡易計算器
  4. *
  5. *函    數(shù):key.c
  6. *
  7. *作    用:按鍵GPIO定義及其相關(guān)定義,按鍵中斷函數(shù),按鍵
  8. *                   初始化函數(shù)
  9. *
  10. *有待改進(jìn):本程序還可以進(jìn)一步的完善,其一就有如按下1+2,
  11. *                   再按下+號的時候,就直接計算出結(jié)果并顯示。
  12. *                   希望有興趣的朋友能夠加以改進(jìn)。
  13. *
  14. *制 作 人:沐雨青林
  15. *
  16. *******************************************************/


  17. #define                uchar        unsigned        char
  18. #define                usint        unsigned         short int
  19. #define                uint        unsigned         int


  20. #define         KPC                                (*((volatile uint *)(0x41500000)))
  21. #define         KPDK                        (*((volatile uint *)(0x41500008)))
  22. #define         KPREC                        (*((volatile uint *)(0x41500010)))
  23. #define         KPMK                        (*((volatile uint *)(0x41500018)))
  24. #define         KPAS                        (*((volatile uint *)(0x41500020)))
  25. #define         KPKDI                        (*((volatile uint *)(0x41500048)))

  26. #define         GPSR2                        (*((volatile uint *)(0x40E00020)))
  27. #define         GPCR2                        (*((volatile uint *)(0x40E0002C)))
  28. #define         GPDR2                        (*((volatile uint *)(0x40E00014)))
  29. #define         GPSR3                        (*((volatile uint *)(0x40E00118)))
  30. #define         GPCR3                        (*((volatile uint *)(0x40E00124)))
  31. #define         GPDR3                        (*((volatile uint *)(0x40E0010C)))
  32. #define         GAFR3_L                        (*((volatile uint *)(0x40E0006C)))
  33. #define         GAFR2_U                        (*((volatile uint *)(0x40E00068)))


  34. #define         ICMR                        (*((volatile uint *)(0x40D00004)))
  35. #define         ICLR                        (*((volatile uint *)(0x40D00008)))

  36. #define         CKEN                        (*((volatile uint *)(0x41300004)))

  37. extern void op_disdir(usint key_d);
  38. extern void op_dismatrix(usint key_d);


  39. const uchar key_source_code[] ={ 0x40, 0x02, 0x04, 0x20,
  40.                                                                  0x00, 0x01, 0x02, 0x05,
  41.                                                                  0x10, 0x11, 0x12, 0x15,
  42.                                                                  0x20, 0x21, 0x22, 0x25 };

  43. void Delay(uint x)
  44. {
  45.         uint i, j, k;
  46.         for (i =0; i <=x; i++)
  47.                 for (j = 0; j <0xff; j++)
  48.                         for (k = 0; k <0xff; k++);
  49. }

  50. #define                key_down        1
  51. #define                key_up                0
  52. volatile uchar key_f;


  53. void init_key(void)
  54. {
  55.         CKEN |= (1 << 19);
  56.         
  57.         //----gpio-----
  58.         //dirkey
  59.         //94-->KP_DKIN1(01)
  60.         GAFR2_U |= (1<<28);
  61.         GAFR2_U &=~(1<<29);
  62.         //95-->KP_DKIN2(01)
  63.         GAFR2_U |= (1<<30);
  64.         GAFR2_U &=~(1ul<<31);
  65.         //98-->KP_DKIN5(01)
  66.         GAFR3_L |= (1<<4);
  67.         GAFR3_L &= ~(1<<5);
  68.         //99-->KP_DKIN6(01)
  69.         GAFR3_L |= (1<<6);
  70.         GAFR3_L &= ~(1<<7);
  71.         
  72.         //matrixkey
  73.         //in
  74.         //100
  75.         GAFR3_L |= (1<<8);
  76.         GAFR3_L &= ~(1<<9);
  77.         GPDR3 &= ~(1<<4);
  78.         //101
  79.         GAFR3_L |= (1<<10);
  80.         GAFR3_L &= ~(1<<11);
  81.         GPDR3 &= ~(1<<5);        
  82.         //102
  83.         GAFR3_L |= (1<<12);
  84.         GAFR3_L &= ~(1<<13);
  85.         GPDR3 &= ~(1<<6);
  86.         //out
  87.         //108-->KP_MKOUT5(10)
  88.         GAFR3_L &= ~(1<<24);
  89.         GAFR3_L |= (1<<25);
  90.         GPDR3 |= (1<<12);
  91.         //107-->KP_MKOUT4(10)
  92.         GAFR3_L &= ~(1<<22);
  93.         GAFR3_L |= (1<<23);
  94.         GPDR3 |= (1<<11);
  95.         //106-->KP_MKOUT3(10)
  96.         GAFR3_L &= ~(1<<20);
  97.         GAFR3_L |= (1<<21);
  98.         GPDR3 |= (1<<10);
  99.         //105-->KP_MKOUT2(10)
  100.         GAFR3_L &= ~(1<<18);
  101.         GAFR3_L |= (1<<19);
  102.         GPDR3 |= (1<<9);
  103.         //104-->KP_MKOUT1(10)
  104.         GAFR3_L &= ~(1<<16);
  105.         GAFR3_L |= (1<<17);
  106.         GPDR3 |= (1<<8);
  107.         //103-->KP_MKOUT0(10)
  108.         GAFR3_L &= ~(1<<14);
  109.         GAFR3_L |= (1<<15);
  110.         GPDR3 |= (1<<7);
  111.         
  112.         //--------
  113.         KPC = 0x3fbff3c2;
  114.         KPC |= 0x01 ;
  115.         KPC |= (1<<11);
  116.         KPKDI = 0x6464;
  117.         
  118.         //interrupt
  119.         ICMR |= (1<<4);
  120.         ICLR &= ~(1<<4);
  121.                
  122.         //key_up
  123.         key_f = key_up;

  124. }

  125. //key_interrupt
  126. void key_del()
  127. {

  128.         
  129.         ICMR &= ~(1<<4);
  130.         key_f = !key_f;
  131.         if(key_f == key_down)
  132.         {
  133.                 usint key_d;
  134.                 uint kpc_tmp;
  135.                 kpc_tmp = KPC;
  136.                 if(kpc_tmp & (1<<5))
  137.                 {
  138.                         key_d = KPDK & 0xff;
  139.                         
  140.                         op_disdir(key_d);//直入式鍵盤處理
  141.                         //LED8_CS2 = LED_VALUE(10 , 10);
  142.                 }
  143.                 if(kpc_tmp & (1<<22))
  144.                 {
  145.                         key_d = KPAS & 0xff;
  146.                         op_dismatrix(key_d);//矩陣鍵盤處理
  147.                         //LED8_CS2 = LED_VALUE(10 , 10);
  148.                         
  149.                 }
  150.         }        
  151.         KPC = KPC;
  152.         ICMR |= (1<<4);
  153. }

  154. void key_dismatrix()
  155. {
  156.         usint key_d;
  157.         key_d = KPAS & 0xff;
  158.         
  159. //        LED8_CS3 = LED_VALUE((key_d & 0xf0) >> 4 ,key_d & 0xf);
  160. }

  161. void key_disdir()
  162. {
  163.         usint key_d;
  164.         while(key_d = KPDK & 0xff, key_d == 0x00);
  165. //        LED8_CS3 = LED_VALUE((key_d & 0xf0) >> 4 ,key_d & 0xf);               
  166. }
復(fù)制代碼



所有資料下載地址:
http://www.torrancerestoration.com/bbs/dpj-4740-1.html
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表