標(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)告
|
專業(yè):計(jì)算機(jī)應(yīng)用技術(shù)(嵌入式) | |
| |
一、 設(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ù)碼管:
1.001.jpg (34.11 KB, 下載次數(shù): 50)
下載附件
2016-10-11 16:12 上傳
1.002.jpg (33.03 KB, 下載次數(shù): 49)
下載附件
2016-10-11 16:12 上傳
LED燈:
1.003.jpg (19.96 KB, 下載次數(shù): 48)
下載附件
2016-10-11 16:12 上傳
直入鍵盤(pán):
1.004.jpg (26.08 KB, 下載次數(shù): 48)
下載附件
2016-10-11 16:12 上傳
矩陣鍵盤(pán):
1.005.jpg (31.59 KB, 下載次數(shù): 58)
下載附件
2016-10-11 16:12 上傳
四、 軟件主要模塊流程圖
1.006.jpg (71.32 KB, 下載次數(shù): 53)
下載附件
2016-10-11 16:12 上傳
1.007.jpg (39.4 KB, 下載次數(shù): 45)
下載附件
2016-10-11 16:12 上傳
1.008.jpg (59.43 KB, 下載次數(shù): 46)
下載附件
2016-10-11 16:12 上傳
1.009.jpg (70.26 KB, 下載次數(shù): 55)
下載附件
2016-10-11 16:12 上傳
緊接上面的加減乘除、等于、清零鍵的流程圖:
1.010.jpg (72.02 KB, 下載次數(shù): 49)
下載附件
2016-10-11 16:12 上傳
五、 問(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:
1.011.jpg (40.14 KB, 下載次數(shù): 50)
下載附件
2016-10-11 16:12 上傳
步驟2:
1.012.jpg (48.44 KB, 下載次數(shù): 54)
下載附件
2016-10-11 16:12 上傳
步驟3:
1.013.jpg (51.41 KB, 下載次數(shù): 48)
下載附件
2016-10-11 16:12 上傳
步驟4:
1.014.jpg (47.43 KB, 下載次數(shù): 55)
下載附件
2016-10-11 16:12 上傳
步驟5:
1.015.jpg (45.76 KB, 下載次數(shù): 48)
下載附件
2016-10-11 16:12 上傳
如果以上的設(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)了,在這里就不羅嗦了。
- /******************************************************
- *
- *項(xiàng)目名稱:簡(jiǎn)易計(jì)算器
- *
- *函 數(shù):cal.c
- *
- *作 用:按鍵處理,主函數(shù)
- *
- *有待改進(jìn):本程序還可以進(jìn)一步的完善,其一就有如按下1+2,
- * 再按下+號(hào)的時(shí)候,就直接計(jì)算出結(jié)果并顯示。
- * 希望有興趣的朋友能夠加以改進(jìn)。
- *
- *制 作 人:沐雨青林
- *
- *******************************************************/
- #include "led_8.h"
- #define uchar unsigned char
- #define usint unsigned short int
- #define uint unsigned int
- extern void Led8_disp(int num);
- extern const uchar key_source_code[];
- extern void init_key(void);
- #define key_add '+'
- #define key_de '-'
- #define key_mul '*'
- #define key_mol '/'
- #define key_canal 'C'
- #define key_means '='
- const uchar key_code[] ={ 1, 2, 3, key_add, // +
- 4, 5, 6, key_de, // -
- 7, 8, 9, key_mul, // *
- key_canal, 0x00, key_means, key_mol};// /
- int firstnum=0;//存放第1個(gè)數(shù)
- int secondnum=0;//存放第2個(gè)數(shù)
- uchar operation='\0';//運(yùn)算符號(hào)
- uchar mean_sign=0;//等號(hào)標(biāo)志位 1為開(kāi),0位關(guān)
- uint optimes=0;//運(yùn)算符號(hào)計(jì)數(shù)位
- //以運(yùn)算符+、-、*、/為標(biāo)志,當(dāng)這些標(biāo)志出現(xiàn)后,則輸入的數(shù)字存放到
- //secondnum中
- //變量初始化
- void init_clear(void)
- {
- firstnum = 0;
- secondnum = 0;
- operation = '\0';
- optimes = 0;
- LED_CS4 = 0xff;
- Led8_disp(0);
- return;
- }
- //計(jì)算多位數(shù),num為新輸入的一位數(shù)
- //算好的多位數(shù)存放在snum,snum為原來(lái)存放有數(shù)的變量
- int duoweishu(int snum, int num)
- {
- snum = num + snum*10;
- return snum;
- }
- //直入式鍵盤(pán)處理
- void op_disdir(usint key_d)
- {
- uint i;
- for(i=0; i<4; i++)
- {
- if(key_d == key_source_code[i])
- {
- if(i == 3)// ‘+’ 按鍵處理
- {
- LED_CS4 = 0x7f;
- optimes++;
- operation = key_code[i];//operation 為‘+’
- }
- else
- {
- //在沒(méi)有按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到firstnum
- if(operation == '\0')
- {
- firstnum = duoweishu(firstnum,key_code[i]);
- Led8_disp(firstnum);
- }
- else//按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到secondnum
- {
- if(mean_sign == 1)//等號(hào)標(biāo)志位
- {
- secondnum = 0;
- mean_sign = 0;//清等號(hào)標(biāo)志位
- }
-
- if(operation == '-' && optimes == 1)//負(fù)數(shù)輸入
- {
- firstnum = duoweishu(firstnum,-key_code[i]);
- Led8_disp(firstnum);
- }
- else
- {
- secondnum = duoweishu(secondnum, key_code[i]);
- Led8_disp(secondnum);
- }
- }
- }
- }
- }
- }
- //矩陣鍵盤(pán)處理
- void op_dismatrix(usint key_d)
- {
- uint i;
- for(i=4; i<16; i++)
- {
- if(key_d == key_source_code[i])
- {
- if(i == 7) // ‘-’ 鍵處理
- {
- LED_CS4 = 0xbf;
- if(operation == '\0' && firstnum == 0)
- optimes = 1;
- else
- optimes += 2;
-
- operation = key_code[i];
- }
- else if(i == 11) // ‘*’ 鍵處理
- {
- LED_CS4 = 0xdf;
- optimes++;
- operation = key_code[i];
- }
- else if(i == 12) // ‘C’ 鍵處理
- {
- init_clear();//變量初始化
- break;
- }
- else if(i == 14) // ‘=’ 鍵處理
- {
- mean_sign=1;//等號(hào)標(biāo)志位
- if(operation == '+')
- firstnum = firstnum + secondnum;
- else if(operation == '-')
- firstnum = firstnum - secondnum;
- else if(operation == '*')
- firstnum = firstnum * secondnum;
- else if(operation == '/')
- {
- if(secondnum == 0)//被除數(shù)為0,結(jié)果為無(wú)窮大
- firstnum = 88888;
- else
- firstnum = firstnum / secondnum*1.0;
- }
-
- //secondnum = 0;
- Led8_disp( firstnum);//顯示和
- }
- else if(i == 15)// ‘/‘ 鍵處理
- {
- LED_CS4 = 0xef;
- optimes++;
- operation = key_code[i];
- }
- else // 數(shù)字鍵輸入
- {
- //在沒(méi)有按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到firstnum
- if(operation == '\0')
- {
- firstnum = duoweishu(firstnum,key_code[i]);
- Led8_disp(firstnum);
- }
- else//按下運(yùn)算符的時(shí)候,把按鍵對(duì)應(yīng)的鍵值存到secondnum
- {
- if(mean_sign == 1)//等號(hào)標(biāo)志位
- {
- secondnum = 0;
- mean_sign = 0;//清等號(hào)標(biāo)志位
- }
-
- if(operation == '-' && optimes == 1)//負(fù)數(shù)輸入
- {
- firstnum = duoweishu(firstnum,-key_code[i]);
- Led8_disp(firstnum);
- }
- else
- {
- secondnum = duoweishu(secondnum, key_code[i]);
- Led8_disp(secondnum);
- }
- }
- }
- }
- }
- }
- void Main(void)
- {
- LED_CS4 = 0xff;
- //Led8_disp(0);
- init_clear();//變量初始化
- init_key();
- while (1)
- {
- }
- }
復(fù)制代碼- /******************************************************
- *
- *項(xiàng)目名稱:簡(jiǎn)易計(jì)算器
- *
- *函 數(shù):key.c
- *
- *作 用:按鍵GPIO定義及其相關(guān)定義,按鍵中斷函數(shù),按鍵
- * 初始化函數(shù)
- *
- *有待改進(jìn):本程序還可以進(jìn)一步的完善,其一就有如按下1+2,
- * 再按下+號(hào)的時(shí)候,就直接計(jì)算出結(jié)果并顯示。
- * 希望有興趣的朋友能夠加以改進(jìn)。
- *
- *制 作 人:沐雨青林
- *
- *******************************************************/
- #define uchar unsigned char
- #define usint unsigned short int
- #define uint unsigned int
- #define KPC (*((volatile uint *)(0x41500000)))
- #define KPDK (*((volatile uint *)(0x41500008)))
- #define KPREC (*((volatile uint *)(0x41500010)))
- #define KPMK (*((volatile uint *)(0x41500018)))
- #define KPAS (*((volatile uint *)(0x41500020)))
- #define KPKDI (*((volatile uint *)(0x41500048)))
- #define GPSR2 (*((volatile uint *)(0x40E00020)))
- #define GPCR2 (*((volatile uint *)(0x40E0002C)))
- #define GPDR2 (*((volatile uint *)(0x40E00014)))
- #define GPSR3 (*((volatile uint *)(0x40E00118)))
- #define GPCR3 (*((volatile uint *)(0x40E00124)))
- #define GPDR3 (*((volatile uint *)(0x40E0010C)))
- #define GAFR3_L (*((volatile uint *)(0x40E0006C)))
- #define GAFR2_U (*((volatile uint *)(0x40E00068)))
- #define ICMR (*((volatile uint *)(0x40D00004)))
- #define ICLR (*((volatile uint *)(0x40D00008)))
- #define CKEN (*((volatile uint *)(0x41300004)))
- extern void op_disdir(usint key_d);
- extern void op_dismatrix(usint key_d);
- const uchar key_source_code[] ={ 0x40, 0x02, 0x04, 0x20,
- 0x00, 0x01, 0x02, 0x05,
- 0x10, 0x11, 0x12, 0x15,
- 0x20, 0x21, 0x22, 0x25 };
- void Delay(uint x)
- {
- uint i, j, k;
- for (i =0; i <=x; i++)
- for (j = 0; j <0xff; j++)
- for (k = 0; k <0xff; k++);
- }
- #define key_down 1
- #define key_up 0
- volatile uchar key_f;
- void init_key(void)
- {
- CKEN |= (1 << 19);
-
- //----gpio-----
- //dirkey
- //94-->KP_DKIN1(01)
- GAFR2_U |= (1<<28);
- GAFR2_U &=~(1<<29);
- //95-->KP_DKIN2(01)
- GAFR2_U |= (1<<30);
- GAFR2_U &=~(1ul<<31);
- //98-->KP_DKIN5(01)
- GAFR3_L |= (1<<4);
- GAFR3_L &= ~(1<<5);
- //99-->KP_DKIN6(01)
- GAFR3_L |= (1<<6);
- GAFR3_L &= ~(1<<7);
-
- //matrixkey
- //in
- //100
- GAFR3_L |= (1<<8);
- GAFR3_L &= ~(1<<9);
- GPDR3 &= ~(1<<4);
- //101
- GAFR3_L |= (1<<10);
- GAFR3_L &= ~(1<<11);
- GPDR3 &= ~(1<<5);
- //102
- GAFR3_L |= (1<<12);
- GAFR3_L &= ~(1<<13);
- GPDR3 &= ~(1<<6);
- //out
- //108-->KP_MKOUT5(10)
- GAFR3_L &= ~(1<<24);
- GAFR3_L |= (1<<25);
- GPDR3 |= (1<<12);
- //107-->KP_MKOUT4(10)
- GAFR3_L &= ~(1<<22);
- GAFR3_L |= (1<<23);
- GPDR3 |= (1<<11);
- //106-->KP_MKOUT3(10)
- GAFR3_L &= ~(1<<20);
- GAFR3_L |= (1<<21);
- GPDR3 |= (1<<10);
- //105-->KP_MKOUT2(10)
- GAFR3_L &= ~(1<<18);
- GAFR3_L |= (1<<19);
- GPDR3 |= (1<<9);
- //104-->KP_MKOUT1(10)
- GAFR3_L &= ~(1<<16);
- GAFR3_L |= (1<<17);
- GPDR3 |= (1<<8);
- //103-->KP_MKOUT0(10)
- GAFR3_L &= ~(1<<14);
- GAFR3_L |= (1<<15);
- GPDR3 |= (1<<7);
-
- //--------
- KPC = 0x3fbff3c2;
- KPC |= 0x01 ;
- KPC |= (1<<11);
- KPKDI = 0x6464;
-
- //interrupt
- ICMR |= (1<<4);
- ICLR &= ~(1<<4);
-
- //key_up
- key_f = key_up;
- }
- //key_interrupt
- void key_del()
- {
-
- ICMR &= ~(1<<4);
- key_f = !key_f;
- if(key_f == key_down)
- {
- usint key_d;
- uint kpc_tmp;
- kpc_tmp = KPC;
- if(kpc_tmp & (1<<5))
- {
- key_d = KPDK & 0xff;
-
- op_disdir(key_d);//直入式鍵盤(pán)處理
- //LED8_CS2 = LED_VALUE(10 , 10);
- }
- if(kpc_tmp & (1<<22))
- {
- key_d = KPAS & 0xff;
- op_dismatrix(key_d);//矩陣鍵盤(pán)處理
- //LED8_CS2 = LED_VALUE(10 , 10);
-
- }
- }
- KPC = KPC;
- ICMR |= (1<<4);
- }
- void key_dismatrix()
- {
- usint key_d;
- key_d = KPAS & 0xff;
-
- // LED8_CS3 = LED_VALUE((key_d & 0xf0) >> 4 ,key_d & 0xf);
- }
- void key_disdir()
- {
- usint key_d;
- while(key_d = KPDK & 0xff, key_d == 0x00);
- // LED8_CS3 = LED_VALUE((key_d & 0xf0) >> 4 ,key_d & 0xf);
- }
復(fù)制代碼
0.png (70.76 KB, 下載次數(shù): 50)
下載附件
2016-10-11 16:13 上傳
所有資料下載地址:
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精品久久久久久狂牛
|
欧美一区二区三区在线观看视频
|