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

標(biāo)題: PXA270電子計(jì)算器實(shí)訓(xùn)報(bào)告 附程序 [打印本頁(yè)]

作者: 51hei學(xué)習(xí)技術(shù)中    時(shí)間: 2016-10-11 16:19
標(biāo)題: PXA270電子計(jì)算器實(shí)訓(xùn)報(bào)告 附程序
廣東科學(xué)技術(shù)職業(yè)學(xué)院廣州學(xué)院
實(shí)訓(xùn)報(bào)告

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

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

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

LED燈:
直入鍵盤(pán):
矩陣鍵盤(pán):


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

六、 實(shí)驗(yàn)體會(huì)
心得體會(huì):在剛接觸到這個(gè)項(xiàng)目的時(shí)候,大概想了一下挺簡(jiǎn)單的。但是在實(shí)踐寫(xiě)程序的時(shí)候總是會(huì)出現(xiàn)各種各樣的原因,現(xiàn)實(shí)往往和自己想的不一樣。就像我自己按照自己的思路寫(xiě)好的程序,在上硬件調(diào)試的時(shí)候會(huì)發(fā)現(xiàn)有很多情況自己都沒(méi)有考慮到。通過(guò)這個(gè)項(xiàng)目,使得自己對(duì)PXA270的這一部分硬件了解了很多,在寫(xiě)程序方面也有點(diǎn)點(diǎn)的長(zhǎng)進(jìn)。在試驗(yàn)中遇到的比較常見(jiàn)的情況都寫(xiě)出來(lái)了,在這里就不羅嗦了。
  1. /******************************************************
  2. *
  3. *項(xiàng)目名稱:簡(jiǎn)易計(jì)算器
  4. *
  5. *函    數(shù):cal.c
  6. *
  7. *作    用:按鍵處理,主函數(shù)
  8. *
  9. *有待改進(jìn):本程序還可以進(jìn)一步的完善,其一就有如按下1+2,
  10. *                   再按下+號(hào)的時(shí)候,就直接計(jì)算出結(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個(gè)數(shù)
  34. int                secondnum=0;//存放第2個(gè)數(shù)
  35. uchar        operation='\0';//運(yùn)算符號(hào)
  36. uchar        mean_sign=0;//等號(hào)標(biāo)志位        1為開(kāi),0位關(guān)
  37. uint        optimes=0;//運(yùn)算符號(hào)計(jì)數(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. //計(jì)算多位數(shù),num為新輸入的一位數(shù)
  52. //算好的多位數(shù)存放在snum,snum為原來(lái)存放有數(shù)的變量
  53. int duoweishu(int snum, int num)
  54. {
  55.         snum = num + snum*10;
  56.         return snum;
  57. }


  58. //直入式鍵盤(pán)處理
  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.                                 //在沒(méi)有按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到firstnum
  75.                                 if(operation == '\0')
  76.                                 {
  77.                                         firstnum = duoweishu(firstnum,key_code[i]);
  78.                                         Led8_disp(firstnum);
  79.                                 }
  80.                                 else//按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到secondnum
  81.                                 {
  82.                                         if(mean_sign == 1)//等號(hào)標(biāo)志位
  83.                                         {
  84.                                                 secondnum = 0;
  85.                                                 mean_sign = 0;//清等號(hào)標(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. //矩陣鍵盤(pán)處理
  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;//等號(hào)標(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é)果為無(wú)窮大
  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.                                 //在沒(méi)有按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到firstnum
  161.                                 if(operation == '\0')
  162.                                 {
  163.                                         firstnum = duoweishu(firstnum,key_code[i]);
  164.                                         Led8_disp(firstnum);
  165.                                 }
  166.                                 else//按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到secondnum
  167.                                 {
  168.                                         if(mean_sign == 1)//等號(hào)標(biāo)志位
  169.                                         {
  170.                                                 secondnum = 0;
  171.                                                 mean_sign = 0;//清等號(hào)標(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. *項(xiàng)目名稱:簡(jiǎn)易計(jì)算器
  4. *
  5. *函    數(shù):key.c
  6. *
  7. *作    用:按鍵GPIO定義及其相關(guān)定義,按鍵中斷函數(shù),按鍵
  8. *                   初始化函數(shù)
  9. *
  10. *有待改進(jìn):本程序還可以進(jìn)一步的完善,其一就有如按下1+2,
  11. *                   再按下+號(hào)的時(shí)候,就直接計(jì)算出結(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);//直入式鍵盤(pán)處理
  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);//矩陣鍵盤(pán)處理
  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.zg4o1577.cn/bbs/dpj-4740-1.html





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久影院 | 欧美影院| 欧美激情在线观看一区二区三区 | 久久精品色欧美aⅴ一区二区 | 亚洲3级| h片在线看 | 精品久久久久久 | 在线欧美视频 | 婷婷久久综合 | 亚洲高清免费视频 | 人人插人人| 欧美日韩亚洲视频 | 狠狠色狠狠色综合系列 | 国产精品免费一区二区 | 日韩欧美在线视频 | 国产精品我不卡 | 一级黄色生活视频 | 91精品国产一区二区三区 | 日本国产一区二区 | 黑色丝袜三级在线播放 | 国产9999精品 | 日韩精品一区二区三区中文在线 | 日韩无 | 2020国产在线 | av中文字幕在线 | 午夜无码国产理论在线 | a在线观看 | 成人免费视频一区二区 | 在线观看中文字幕 | 天天干com | 亚洲人的av | 国产日韩欧美精品一区二区 | 在线视频亚洲 | 在线色网址| 日韩成人免费视频 | 午夜午夜精品一区二区三区文 | 97色在线观看免费视频 | 最新免费视频 | 中文字幕成人av | 久久99精品久久久久久狂牛 | 欧美一区二区三区在线观看视频 |