![3.2—保險(xiǎn)箱密碼鎖控制器ppt課件_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b1.gif)
![3.2—保險(xiǎn)箱密碼鎖控制器ppt課件_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b2.gif)
![3.2—保險(xiǎn)箱密碼鎖控制器ppt課件_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b3.gif)
![3.2—保險(xiǎn)箱密碼鎖控制器ppt課件_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b4.gif)
![3.2—保險(xiǎn)箱密碼鎖控制器ppt課件_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b/d0b3a4e6-1c88-421c-aaa2-dda0b34c5c7b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、7.4 接口定義 目 錄 引引 言言 7.4.1 密碼的輸出、存儲(chǔ)與顯示密碼的輸出、存儲(chǔ)與顯示 7.4.2 應(yīng)用層接口應(yīng)用層接口 7.4.3 虛擬設(shè)備層接口虛擬設(shè)備層接口 7.4.4 設(shè)備驅(qū)動(dòng)層接口設(shè)備驅(qū)動(dòng)層接口 引 言 “ “決策與決策與“模塊劃分側(cè)重于軟件,還未涉及到編程。當(dāng)軟件模塊劃模塊劃分側(cè)重于軟件,還未涉及到編程。當(dāng)軟件模塊劃分之后,接下來的工作就是定義歸一化的接口規(guī)范了,而最后的工作才是分之后,接下來的工作就是定義歸一化的接口規(guī)范了,而最后的工作才是編程。編程。 接口定義分為接口定義分為2 2部分:軟件對外的接口和軟件內(nèi)部模塊之間的接口。部分:軟件對外的接口和軟件內(nèi)部模塊之間的接口
2、。 注意:接口并不僅僅是接口函數(shù),還包括配置方法、相關(guān)的宏、變量、注意:接口并不僅僅是接口函數(shù),還包括配置方法、相關(guān)的宏、變量、數(shù)據(jù)結(jié)構(gòu)與使用方法。數(shù)據(jù)結(jié)構(gòu)與使用方法。 目 錄 引引 言言7.4.1 密碼的輸出、存儲(chǔ)與顯示密碼的輸出、存儲(chǔ)與顯示 7.4.2 應(yīng)用層接口應(yīng)用層接口 7.4.3 虛擬設(shè)備層接口虛擬設(shè)備層接口 7.4.4 設(shè)備驅(qū)動(dòng)層接口設(shè)備驅(qū)動(dòng)層接口 7.4.1 密碼的輸出、存儲(chǔ)與顯示密碼的輸出、存儲(chǔ)與顯示都使用密碼的輸出、存儲(chǔ)與顯示都使用ASC碼表示,當(dāng)存儲(chǔ)密碼時(shí),則使碼表示,當(dāng)存儲(chǔ)密碼時(shí),則使用用#表示密碼已經(jīng)結(jié)束。表示密碼已經(jīng)結(jié)束。 目 錄 引引 言言 7.4.1 密碼的輸出、
3、存儲(chǔ)與顯示密碼的輸出、存儲(chǔ)與顯示 7.4.2 應(yīng)用層接口應(yīng)用層接口 7.4.3 虛擬設(shè)備層接口虛擬設(shè)備層接口 7.4.4 設(shè)備驅(qū)動(dòng)層接口設(shè)備驅(qū)動(dòng)層接口 7.4.2 應(yīng)用層接口 應(yīng)用層僅包含一個(gè)人機(jī)交互程序,應(yīng)用層僅包含一個(gè)人機(jī)交互程序,主要用于實(shí)現(xiàn)如圖所示的狀態(tài)機(jī)。主要用于實(shí)現(xiàn)如圖所示的狀態(tài)機(jī)。1. 提供給上層的接口提供給上層的接口因?yàn)槿藱C(jī)交互程序內(nèi)聚性很強(qiáng),因?yàn)槿藱C(jī)交互程序內(nèi)聚性很強(qiáng),所以將它規(guī)劃為任務(wù)。所以將它規(guī)劃為任務(wù)。 人機(jī)交互函數(shù):人機(jī)交互函數(shù):mainTask(),完成完成所有與人交互的工作。所有與人交互的工作。圖圖1 狀態(tài)轉(zhuǎn)換圖狀態(tài)轉(zhuǎn)換圖函數(shù)原型:void mainTask(vo
4、id)輸入?yún)?shù)與返回值:無 2.使用的下層接口使用的下層接口應(yīng)用層實(shí)際上使用虛擬設(shè)備層操作實(shí)際的設(shè)備,則人機(jī)交互程序使用應(yīng)用層實(shí)際上使用虛擬設(shè)備層操作實(shí)際的設(shè)備,則人機(jī)交互程序使用 虛擬顯示器驅(qū)動(dòng)顯示信息虛擬顯示器驅(qū)動(dòng)顯示信息 虛擬鍵盤驅(qū)動(dòng)獲得用戶輸入的信息虛擬鍵盤驅(qū)動(dòng)獲得用戶輸入的信息 虛擬存儲(chǔ)器驅(qū)動(dòng)獲得和保存密碼虛擬存儲(chǔ)器驅(qū)動(dòng)獲得和保存密碼 虛擬鎖驅(qū)動(dòng)開鎖和關(guān)鎖虛擬鎖驅(qū)動(dòng)開鎖和關(guān)鎖虛擬蜂鳴器驅(qū)動(dòng)發(fā)出聲音虛擬蜂鳴器驅(qū)動(dòng)發(fā)出聲音3.其他注意點(diǎn)其他注意點(diǎn)人機(jī)交互程序堆棧數(shù)組名為人機(jī)交互程序堆棧數(shù)組名為GucMainTaskStk,人機(jī)交互程序?yàn)橄到y(tǒng)創(chuàng)建的人機(jī)交互程序?yàn)橄到y(tǒng)創(chuàng)建的第一個(gè)任務(wù)。第一個(gè)
5、任務(wù)。 7.4.2 應(yīng)用層接口 目 錄 引引 言言 7.4.1 密碼的輸出、存儲(chǔ)與顯示密碼的輸出、存儲(chǔ)與顯示 7.4.2 應(yīng)用層接口應(yīng)用層接口 7.4.3 虛擬設(shè)備層接口虛擬設(shè)備層接口 7.4.4 設(shè)備驅(qū)動(dòng)層接口設(shè)備驅(qū)動(dòng)層接口 7.4.3 虛擬設(shè)備層接口 虛擬驅(qū)動(dòng)用于屏蔽對象的控制細(xì)節(jié),應(yīng)用層就可以用統(tǒng)一的方法來實(shí)現(xiàn),虛擬驅(qū)動(dòng)用于屏蔽對象的控制細(xì)節(jié),應(yīng)用層就可以用統(tǒng)一的方法來實(shí)現(xiàn),而無須關(guān)心具體是怎樣實(shí)現(xiàn)的。當(dāng)控制方法不一樣時(shí),則不必重新編寫應(yīng)而無須關(guān)心具體是怎樣實(shí)現(xiàn)的。當(dāng)控制方法不一樣時(shí),則不必重新編寫應(yīng)用層的程序。用層的程序。 虛擬設(shè)備層包含虛擬鎖驅(qū)動(dòng),虛擬鍵盤驅(qū)動(dòng),虛擬顯示器驅(qū)動(dòng),虛擬蜂
6、虛擬設(shè)備層包含虛擬鎖驅(qū)動(dòng),虛擬鍵盤驅(qū)動(dòng),虛擬顯示器驅(qū)動(dòng),虛擬蜂鳴器驅(qū)動(dòng),虛擬存儲(chǔ)器驅(qū)動(dòng)。鳴器驅(qū)動(dòng),虛擬存儲(chǔ)器驅(qū)動(dòng)。1.虛擬鎖驅(qū)動(dòng)虛擬鎖驅(qū)動(dòng)(1提供給上層的接口提供給上層的接口 extern char virLockInit(unsigned char ucIndex) -虛擬鎖初始化 extern char virLockLock(unsigned char ucIndex) -關(guān)閉虛擬鎖 extern char virLockUnlock(unsigned char ucIndex) -打開虛擬鎖 (2使用的下層接口使用的下層接口 虛擬鎖驅(qū)動(dòng)使用鎖驅(qū)動(dòng)虛擬鎖驅(qū)動(dòng)使用鎖驅(qū)動(dòng)7.4.3 虛擬設(shè)備
7、層接口 2.虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng)(1提供給上層的接口提供給上層的接口需要注意的是,如果在給定時(shí)間內(nèi)沒有按鍵輸入,則設(shè)備可能進(jìn)入待機(jī)狀態(tài)。因而,讀按鍵的API(應(yīng)用程序編程接口)需要給定一個(gè)等待按鍵的時(shí)間。函數(shù)原型:char virKeyInit(void) /虛擬鍵盤模塊初始化返回值:0-勝利,-1-失敗 函數(shù)原型:char virKeyGet(unsigned int uiDly) /獲得按鍵的ASC碼輸入?yún)?shù):uiDly-以毫秒為單位,設(shè)定最大等待時(shí)間,0為無窮等待返回值:=0-鍵的ASC碼,-1-失?。?其它注意點(diǎn)其它注意點(diǎn) 虛擬鍵盤驅(qū)動(dòng)應(yīng)當(dāng)使用一個(gè)任務(wù)來實(shí)現(xiàn)虛擬鍵盤驅(qū)動(dòng)應(yīng)當(dāng)使用一個(gè)
8、任務(wù)來實(shí)現(xiàn)(2使用的下層接口使用的下層接口 虛擬鍵盤驅(qū)動(dòng)使用鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng)使用鍵盤驅(qū)動(dòng) 7.4.3 虛擬設(shè)備層接口3.虛擬顯示器驅(qū)動(dòng)虛擬顯示器驅(qū)動(dòng)(2使用的下層接口使用的下層接口(1提供給上層的接口提供給上層的接口 extern char virMemInit(void) -虛擬存儲(chǔ)器驅(qū)動(dòng)初始化 extern unsigned char viMemRead(unsigned int uiAddr, char *pcData, unsigned char ucLen) -獲得存儲(chǔ)中的數(shù)據(jù)虛擬顯示器驅(qū)動(dòng)使用的是顯示器驅(qū)動(dòng)虛擬顯示器驅(qū)動(dòng)使用的是顯示器驅(qū)動(dòng)4.虛擬存儲(chǔ)器驅(qū)動(dòng)虛擬存儲(chǔ)器驅(qū)動(dòng)(1提供
9、給上層的接口提供給上層的接口 extern char virShowInit(void) -虛擬顯示器模塊初始化 extern char virShowPuts(char *pcStr) -虛擬顯示器輸出字符串 extern char virShowClr(void) -虛擬顯示器清屏 7.4.3 虛擬設(shè)備層接口(2使用的下層接口使用的下層接口 虛擬存儲(chǔ)器驅(qū)動(dòng)使用的是虛擬存儲(chǔ)器驅(qū)動(dòng)使用的是CAT1024驅(qū)動(dòng)驅(qū)動(dòng)輸入?yún)?shù):: uiAddr -存儲(chǔ)位置 ucLen-數(shù)據(jù)長度輸出參數(shù): piData-讀到的數(shù)據(jù)返回值: 讀到的數(shù)據(jù)數(shù)目 extern char viMemWrite(unsigned
10、int uiAddr, char *pcData, unsigned char ucLen) -保存數(shù)據(jù)到存儲(chǔ)器中輸入?yún)?shù):: uiAddr -存儲(chǔ)位置 ucLen-數(shù)據(jù)長度 piData-存儲(chǔ)的數(shù)據(jù)輸出參數(shù): 無輸出參數(shù) 返回值: 寫入的數(shù)據(jù)數(shù)目 7.4.3 虛擬設(shè)備層接口5.虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng)(1提供給上層的接口提供給上層的接口(2使用的下層接口使用的下層接口 虛擬蜂鳴器驅(qū)動(dòng)使用蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng)使用蜂鳴器驅(qū)動(dòng)函數(shù)原型:char virBuzzerInit(void) /虛擬蜂鳴器初始化返回值:0-勝利,-1-失敗 函數(shù)原型:char virBuzzerTweet(unsi
11、gned char unMod) /控制蜂鳴器鳴叫輸入?yún)?shù):ucMod-鳴叫方式 VIR_BUZZER_STOP-停止鳴叫 VIR_BUZZER_SHORT-1聲短鳴叫 VIR_BUZZER_TWO_SHORT-2聲短鳴叫 VIR_BUZZER_LONg-1聲長鳴叫返回值:0-勝利,-1-失敗(3其它注意點(diǎn)其它注意點(diǎn) 虛擬蜂鳴器驅(qū)動(dòng)應(yīng)當(dāng)使用一個(gè)任務(wù)來實(shí)現(xiàn)虛擬蜂鳴器驅(qū)動(dòng)應(yīng)當(dāng)使用一個(gè)任務(wù)來實(shí)現(xiàn) 目 錄 引引 言言 7.4.1 密碼的輸出、存儲(chǔ)與顯示密碼的輸出、存儲(chǔ)與顯示 7.4.2 應(yīng)用層接口應(yīng)用層接口 7.4.3 虛擬設(shè)備層接口虛擬設(shè)備層接口 7.4.4 設(shè)備驅(qū)動(dòng)層接口設(shè)備驅(qū)動(dòng)層接口 7.4.4
12、 設(shè)備驅(qū)動(dòng)層接口 設(shè)備驅(qū)動(dòng)層的驅(qū)動(dòng)用于直接控制相應(yīng)的物理設(shè)備,一般來說,設(shè)備設(shè)備設(shè)備驅(qū)動(dòng)層的驅(qū)動(dòng)用于直接控制相應(yīng)的物理設(shè)備,一般來說,設(shè)備設(shè)備驅(qū)動(dòng)層的驅(qū)動(dòng)只實(shí)現(xiàn)硬件的基本功能,其高級(jí)功能在虛擬設(shè)備層實(shí)現(xiàn)。驅(qū)動(dòng)層的驅(qū)動(dòng)只實(shí)現(xiàn)硬件的基本功能,其高級(jí)功能在虛擬設(shè)備層實(shí)現(xiàn)。 設(shè)備驅(qū)動(dòng)層分為:設(shè)備驅(qū)動(dòng)層分為: 鎖驅(qū)動(dòng)鎖驅(qū)動(dòng) 鍵盤驅(qū)動(dòng)鍵盤驅(qū)動(dòng) 顯示器驅(qū)動(dòng)顯示器驅(qū)動(dòng) 蜂鳴器驅(qū)動(dòng)蜂鳴器驅(qū)動(dòng) CAT1024驅(qū)動(dòng)驅(qū)動(dòng) I2C驅(qū)動(dòng)驅(qū)動(dòng)1.鎖驅(qū)動(dòng)接口鎖驅(qū)動(dòng)接口 extern char phyLockInit(void) -鎖初始化,返回值:0-勝利,-1-失敗 extern char phyLockLock(void
13、) -關(guān)鎖,返回值:0-勝利,-1-失敗 extern char phyLockUnlock(void) -開鎖 ,返回值:0-勝利,-1-失敗 7.4.4 設(shè)備驅(qū)動(dòng)層接口 2.鍵盤驅(qū)動(dòng)接口鍵盤驅(qū)動(dòng)接口 extern char zyKeyInit(void) -鍵盤模塊始化,返回值:0-勝利,-1-失敗 extern char zyKeyGet(void) -獲得瞬時(shí)按鍵狀態(tài)去抖前按鍵狀態(tài)),不支持組 合鍵,返回值:0-勝利,-1-失敗3.顯示器驅(qū)動(dòng)接口顯示器驅(qū)動(dòng)接口 extern char zyLedDisplayInit(void) -LED數(shù)碼管驅(qū)動(dòng)初始化,無輸入?yún)?shù),返回值:0-勝利,
14、-1-失敗 extern void zyLedDisplayScan(void) -LED數(shù)碼管掃描程序,=200HZ的頻率調(diào)用,無輸入?yún)?shù)和返回值 extern unsigned char GucZyLedDsipayShowBuf -顯示緩沖區(qū) 7.4.4 設(shè)備驅(qū)動(dòng)層接口 4. 蜂鳴器驅(qū)動(dòng)接口蜂鳴器驅(qū)動(dòng)接口 extern char phyBuzzerInit(void) -蜂鳴器初始化,無輸入?yún)?shù),返回值:0-勝利,-1-失敗 extern char phyBuzzerTweet(unsigned int uiFreq) -蜂鳴器鳴叫,uiFreq:聲音頻率,返回值:0-勝利,-1-失敗
15、extern char phyBuzzerStop(void) -蜂鳴器停止鳴叫,無輸入?yún)?shù),返回值:0-勝利,-1-失敗 extern void isrTimer(void)_interupt 3-Timer1中斷服務(wù)函數(shù),通過翻轉(zhuǎn)蜂鳴器管腳使蜂鳴器發(fā)聲5. CAT1024驅(qū)動(dòng)接口驅(qū)動(dòng)接口 extern char _zyCat1024Init(void) -CAT1024初始化,返回值:0-勝利,-1-失敗 extern unsigned char _zyCat1024Write(unsigned char ucAddr, unsigned *pucData, unsigned char u
16、cDataLen) -向CAT1024寫數(shù)據(jù)7.4.4 設(shè)備驅(qū)動(dòng)層接口輸入?yún)?shù): ucAddr -數(shù)據(jù)地址 ucDataLen-要寫的數(shù)據(jù)長度 pucData-要寫的數(shù)據(jù)返回值: 已發(fā)送的數(shù)據(jù)字節(jié)數(shù) extern unsigned char _zyCat1024Read(unsigned char ucAddr, unsigned *pucData, unsigned char ucDataLen) -從CAT1024中讀數(shù)據(jù)輸入?yún)?shù):: ucAddr -數(shù)據(jù)地址 ucDataLen-要讀的數(shù)據(jù)長度輸出參數(shù): pucData-讀到的數(shù)據(jù) 返回值: 已讀到的數(shù)據(jù)字節(jié)數(shù)6. I2C驅(qū)動(dòng)接口驅(qū)動(dòng)接口
17、 extern void _zyI2cInit(void) -初始化I2C為主模式,返回值:0-勝利,-1-失敗 extern unsigned char _zyI2cWrite(unsigned char ucAddr,unsigned int uiRegAddr, unsigned char _ucRegAddrLen, unsigned char *pucData, unsigned char ucDataLen) -將數(shù)據(jù)寫入I2C從器件7.4.4 設(shè)備驅(qū)動(dòng)層接口輸入?yún)?shù): ucAddr -從機(jī)地址 uiRegAddr-寄存器地址 uiRegAddrLen-寄存器地址長度單位為字節(jié))
18、ucDataLen-要寫入的數(shù)據(jù)長度 pucData-要寫入的數(shù)據(jù)返回值: 已寫入的數(shù)據(jù)字節(jié)數(shù) extern unsigned char zyI2cWrite(unsigned char ucAddr,unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, unsigned char ucDataLen) -從I2C從器件讀數(shù)據(jù)輸入?yún)?shù): ucAddr -從機(jī)地址 uiRegAddr-寄存器地址 uiRegAddrLen-寄存器地址長度單位為字節(jié)) ucDataLen-要讀的數(shù)據(jù)長度 輸出參數(shù): p
19、ucData-讀到的數(shù)據(jù)返回值: 已讀到的數(shù)據(jù)字節(jié)數(shù)7.4.4 設(shè)備驅(qū)動(dòng)層接口值得注意的是:值得注意的是:目前沒有發(fā)現(xiàn)寄存器地址超過目前沒有發(fā)現(xiàn)寄存器地址超過16位的器件,因而,寄存器地址可以用位的器件,因而,寄存器地址可以用unsigned int類型變量來保存;類型變量來保存;大多數(shù)大多數(shù)I2C從機(jī)寄存器地址為從機(jī)寄存器地址為8位一個(gè)字節(jié)),一部分位位一個(gè)字節(jié)),一部分位16位兩個(gè)字位兩個(gè)字節(jié)),節(jié)),I2C標(biāo)準(zhǔn)沒有規(guī)定寄存器地址的長度,因而,需要一個(gè)參數(shù)給標(biāo)準(zhǔn)沒有規(guī)定寄存器地址的長度,因而,需要一個(gè)參數(shù)給出寄存器地址的長度;出寄存器地址的長度;I2C支持支持7位地址模式和位地址模式和10
20、位地址模式,但目前還沒有發(fā)現(xiàn)僅支持位地址模式,但目前還沒有發(fā)現(xiàn)僅支持10位地位地址模式的器件,因而,規(guī)劃本驅(qū)動(dòng)僅支持址模式的器件,因而,規(guī)劃本驅(qū)動(dòng)僅支持7位的地址模式。位的地址模式。7.5 編寫代碼 目 錄 7.5.1 概述概述 7.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.8 主程序主程序 7.5.1 概述 1.簡述簡述 大多數(shù)開發(fā)人員將編寫代碼和調(diào)試放在第一步來做,在沒有經(jīng)驗(yàn)時(shí),摸著石頭過河也大多數(shù)開發(fā)人員將編
21、寫代碼和調(diào)試放在第一步來做,在沒有經(jīng)驗(yàn)時(shí),摸著石頭過河也是一種很好的選擇。是一種很好的選擇。 前面的步驟就是給過河指定一條路線,當(dāng)有了正確的路線之后,則過河就是一件容易前面的步驟就是給過河指定一條路線,當(dāng)有了正確的路線之后,則過河就是一件容易的事情了。同理,有了前面的步驟且結(jié)果正確的話,則編寫代碼與調(diào)試同樣也是一件輕的事情了。同理,有了前面的步驟且結(jié)果正確的話,則編寫代碼與調(diào)試同樣也是一件輕松的事了,其所花的時(shí)間往往不足整個(gè)開發(fā)過程的松的事了,其所花的時(shí)間往往不足整個(gè)開發(fā)過程的1/3。 2.步驟 每個(gè)模塊的開發(fā)其實(shí)也可以看作一個(gè)獨(dú)立模塊的嵌入式軟件的開發(fā),7.2節(jié)、7.3節(jié)和7.4節(jié)所制定的內(nèi)
22、容可以看作這個(gè)模塊的限制條件。因而,每個(gè)模塊的開發(fā)步驟可以遵循整個(gè)軟件的開發(fā)步驟,同樣按照決策、模塊劃分、接口定義、編寫代碼和測試驗(yàn)收5個(gè)步驟來進(jìn)行。 (1決策 7.2節(jié)是針對整個(gè)軟件的,不會(huì)將每個(gè)模塊的所有決策都囊括進(jìn)來。因而,一些遺漏的決策需要在編寫代碼之前決定好。 (2模塊劃分 如果這個(gè)模塊本身 比較復(fù)雜,則可以在模塊內(nèi)部劃分更小的模塊。如果模塊非常簡單的話,則不必再劃分模塊。因此是否需要細(xì)分模塊,由模塊負(fù)責(zé)人決定。 7.5.1 概述 (3接口定義接口定義 7.4 節(jié)已經(jīng)制定了模塊的外部接口,如果這個(gè)模塊不再劃分更小的模塊,則不需要再節(jié)已經(jīng)制定了模塊的外部接口,如果這個(gè)模塊不再劃分更小的
23、模塊,則不需要再制定接口定義。如果這個(gè)模塊內(nèi)部還有更小的模塊,則還需要制定內(nèi)部模塊之間的接口。制定接口定義。如果這個(gè)模塊內(nèi)部還有更小的模塊,則還需要制定內(nèi)部模塊之間的接口。 (4編寫代碼編寫代碼 這是一個(gè)遞歸的過程,只要這個(gè)模塊還需要?jiǎng)澐指〉哪K,則又要重復(fù)決策、模塊這是一個(gè)遞歸的過程,只要這個(gè)模塊還需要?jiǎng)澐指〉哪K,則又要重復(fù)決策、模塊劃分、接口定義、編寫代碼與測試驗(yàn)收劃分、接口定義、編寫代碼與測試驗(yàn)收5個(gè)步驟。如果通過決策認(rèn)為此模塊不再需要?jiǎng)澐謧€(gè)步驟。如果通過決策認(rèn)為此模塊不再需要?jiǎng)澐指〉哪K時(shí)那么可以真正的編寫代碼了。更小的模塊時(shí)那么可以真正的編寫代碼了。 (5決策驗(yàn)收決策驗(yàn)收 編
24、寫代碼完成后,需要確定其是否到達(dá)要求,這就需要測試驗(yàn)收了,測試驗(yàn)收一般由編寫代碼完成后,需要確定其是否到達(dá)要求,這就需要測試驗(yàn)收了,測試驗(yàn)收一般由更高一級(jí)的模塊負(fù)責(zé)人執(zhí)行。更高一級(jí)的模塊負(fù)責(zé)人執(zhí)行。 3. 關(guān)于調(diào)試關(guān)于調(diào)試 當(dāng)模塊劃分和接口設(shè)計(jì)工作完成后,實(shí)際上模塊的編程無先后關(guān)系。根據(jù)接口規(guī)范,當(dāng)模塊劃分和接口設(shè)計(jì)工作完成后,實(shí)際上模塊的編程無先后關(guān)系。根據(jù)接口規(guī)范,模塊可以分派給多人并行編寫,分別測試、最后組裝測試。模塊可以分派給多人并行編寫,分別測試、最后組裝測試。 比如,當(dāng)編寫完人機(jī)交互程序需要測試時(shí),則可以利用成熟的比如,當(dāng)編寫完人機(jī)交互程序需要測試時(shí),則可以利用成熟的UART驅(qū)動(dòng)模
25、擬大部分模驅(qū)動(dòng)模擬大部分模塊如鍵盤和顯示)。塊如鍵盤和顯示)。“保存密碼保存密碼”、“開鎖和開鎖和“關(guān)鎖的控制都可以通過串口輸出關(guān)鎖的控制都可以通過串口輸出信息來模擬,而信息來模擬,而“獲得密碼只需提供固定的數(shù)據(jù)即可,但是這樣會(huì)增加很多測試代碼。獲得密碼只需提供固定的數(shù)據(jù)即可,但是這樣會(huì)增加很多測試代碼。如果僅一個(gè)人編寫代碼,則可以采取自底向上的方法來編程,即先編寫驅(qū)動(dòng)層,再編寫如果僅一個(gè)人編寫代碼,則可以采取自底向上的方法來編程,即先編寫驅(qū)動(dòng)層,再編寫虛擬驅(qū)動(dòng)層,最后編寫應(yīng)用層,這樣測試代碼相對會(huì)小很多。虛擬驅(qū)動(dòng)層,最后編寫應(yīng)用層,這樣測試代碼相對會(huì)小很多。 目 錄 7.5.1 概述概述 7
26、.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.8 主程序主程序 7.5.2 可復(fù)用的驅(qū)動(dòng) 由于前后接口方式完全一樣,因此只需要由于前后接口方式完全一樣,因此只需要直接使用直接使用4.3.3小節(jié)的鍵盤驅(qū)動(dòng)、蜂鳴器驅(qū)動(dòng)小節(jié)的鍵盤驅(qū)動(dòng)、蜂鳴器驅(qū)動(dòng)和顯示器驅(qū)動(dòng)以及和顯示器驅(qū)動(dòng)以及4.3.2小節(jié)的鎖驅(qū)動(dòng)即可。小節(jié)的鎖驅(qū)動(dòng)即可。 目 錄 7.5.1 概述概述 7.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.
27、5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.8 主程序主程序 7.5.3 I2C驅(qū)動(dòng)I2C驅(qū)動(dòng)在驅(qū)動(dòng)在4.3.3小節(jié)小節(jié)I2C驅(qū)動(dòng)的基礎(chǔ)上,增加了用于互斥操作的信號(hào)量,其接口定義的使驅(qū)動(dòng)的基礎(chǔ)上,增加了用于互斥操作的信號(hào)量,其接口定義的使用用7.4小節(jié)的接口定義。相對小節(jié)的接口定義。相對4.3.3小節(jié)的小節(jié)的I2C驅(qū)動(dòng)增加以下代碼:驅(qū)動(dòng)增加以下代碼:static TN_OS_SEM _GosI2c; /定義信號(hào)量/*Descriptions: 初始化I2C為主模式*/char zy
28、I2cInit(void)tnOsSemCreate(&_GosI2c,1); /創(chuàng)建信號(hào)量return _zyI2cInit();7.5.3 I2C驅(qū)動(dòng)/*Descriptions: 將數(shù)據(jù)寫入I2C從器件*/unsigned char zyI2cWrite(unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData,unsigned char ucDataLen)unsigned char ucRt; /返回值tnOsSemPend(&_Go
29、sI2c,0); /等待信號(hào)量ucRt = _zyI2cWrite(ucAddr,uiRegAddr,ucRegAddrLen,pucData,ucDataLen); tnOsSemPost(&_GosI2c); /發(fā)送信號(hào)量return ucRt;7.5.3 I2C驅(qū)動(dòng)/*Descriptions: 從I2C從器件讀數(shù)據(jù)*/static unsigned char zyI2cRead(unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, uns
30、igned char ucDataLen) unsigned char ucRt; /返回值 tnOsSetPend(&_GosI2c,0); /等待信號(hào)量 ucRt = _zyI2cRead(ucAddr,uiRegAddr,ucRegAddrLen,pucData,ucDataLen); tnOsSemPost(&_GosI2c); /發(fā)送信號(hào)量 return ucRt; 目 錄 7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.1 概述概述 7.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴
31、器驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.8 主程序主程序 7.5.4 CAT1024驅(qū)動(dòng)CAT1024驅(qū)動(dòng)在驅(qū)動(dòng)在4.3.3小節(jié)的基礎(chǔ)上,增加了用于互斥操作的信號(hào)量,其接口定義使用小節(jié)的基礎(chǔ)上,增加了用于互斥操作的信號(hào)量,其接口定義使用7.4小節(jié)的接口定義。相對小節(jié)的接口定義。相對4.3.3小節(jié)的小節(jié)的CAT1024驅(qū)動(dòng)增加以下代碼:驅(qū)動(dòng)增加以下代碼:static TN_OS_SEM _GosCat1024; /定義信號(hào)量/*Descriptions: 初始化CAT1024*/char zyCat1024Init(void)tnOsSemCreate(&_GosCat10
32、24,1); /創(chuàng)建信號(hào)量return _zyCat1024Init();7.5.4 CAT1024驅(qū)動(dòng)/*Descriptions: 向CAT1024寫數(shù)據(jù)*/unsigned char zyCat1024Write(unsigned char ucAddr, unsigned char *pucData, unsigned char ucDataLen)unsigned char ucRt; /返回值tnOsSemPend(&_GosCat1024,0); /等待信號(hào)量ucRt = _zyCat1024Write(ucAddr,pucData,ucDataLen); tnOsSem
33、Post(&_GosCat1024); /發(fā)送信號(hào)量return ucRt;7.5.4 CAT1024驅(qū)動(dòng)/*Descriptions: 從CAT1024中讀數(shù)據(jù)*/static unsigned char zyCat1024Read(unsigned char ucAddr, unsigned char *pucData, unsigned char ucDataLen) unsigned char ucRt; /返回值tnOsSetPend(&_GosCat1024,0); /等待信號(hào)量ucRt = _zyCat1024Read(ucAddr,pucData,ucDataL
34、en);tnOsSemPost(&_GosCat1024); /發(fā)送信號(hào)量return ucRt; 目 錄 7.5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.5.1 概述概述 7.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.8 主程序主程序 7.5.5 虛擬鍵盤驅(qū)動(dòng) 1. 決策決策 由于物理鍵盤僅完成獲得鍵盤瞬時(shí)狀態(tài)的工作,獲得的也是鍵值而不是由于物理鍵盤僅完成獲得鍵盤瞬時(shí)狀態(tài)的工作,獲得的也是鍵值而不是ASC碼。碼。因而,虛擬鍵盤驅(qū)動(dòng)需要完成以下工作:
35、因而,虛擬鍵盤驅(qū)動(dòng)需要完成以下工作: (1鍵盤去抖;鍵盤去抖; (2鍵值與鍵值與ASC碼轉(zhuǎn)換。碼轉(zhuǎn)換。 鍵值與鍵值與ASC碼轉(zhuǎn)換可以直接用語句實(shí)現(xiàn),也可以通過查表實(shí)現(xiàn),這里使用查表實(shí)碼轉(zhuǎn)換可以直接用語句實(shí)現(xiàn),也可以通過查表實(shí)現(xiàn),這里使用查表實(shí)現(xiàn)。至于表格的建立,可以對比硬件推理出來,也可以用程序測試出來,具體使用哪現(xiàn)。至于表格的建立,可以對比硬件推理出來,也可以用程序測試出來,具體使用哪種方法,由編程者自己決定。而讀鍵不能采取種方法,由編程者自己決定。而讀鍵不能采取“長期等待的方法,必須給出一個(gè)最長期等待的方法,必須給出一個(gè)最長等待時(shí)間。因而,虛擬鍵盤驅(qū)動(dòng)使用任務(wù)掃描鍵盤,并通過消息信箱發(fā)送鍵
36、值。長等待時(shí)間。因而,虛擬鍵盤驅(qū)動(dòng)使用任務(wù)掃描鍵盤,并通過消息信箱發(fā)送鍵值。 2. 接口定義接口定義 (1使用使用7.4節(jié)指定的接口;節(jié)指定的接口; (2碼表定義為碼表定義為char類型全局?jǐn)?shù)組類型全局?jǐn)?shù)組_GetKeyTable; (3任務(wù)堆棧使用全局?jǐn)?shù)組任務(wù)堆棧使用全局?jǐn)?shù)組GucTaskStks; (4消息郵箱使用全局變量消息郵箱使用全局變量GomKeyMsg,虛擬鍵盤驅(qū)動(dòng)的全局變量定義詳見程,虛擬鍵盤驅(qū)動(dòng)的全局變量定義詳見程序清單序清單7.1。 (5鍵盤掃描任務(wù)使用全局函數(shù)鍵盤掃描任務(wù)使用全局函數(shù)_taskKey()詳見程序清單詳見程序清單7.2。7.5.5 虛擬鍵盤驅(qū)動(dòng)程序清單7.1
37、虛擬鍵盤全局變量定義vir_key.c)函數(shù)原型: static void_taskKey(void) /無參數(shù)與返回值 32 statia code char_GcKeyTable = 33 #,0,*,9,8,7,6,5,4,3,2,1,034 ;35 36 static idata unsigned char _GucTaskKeyStks44; /分配任務(wù)堆棧37 static TN_OS_MSG _GomKeyMsg; /定義消息郵箱 (6鍵盤掃描任務(wù)使用函數(shù)_taskKey(),其詳細(xì)說明如下: 3. 編寫代碼編寫代碼 虛擬鍵盤驅(qū)動(dòng)按照接口定義,需要編寫虛擬鍵盤驅(qū)動(dòng)按照接口定義,需
38、要編寫3個(gè)相關(guān)的函數(shù),即個(gè)相關(guān)的函數(shù),即_taskKey()、virKeyInit()和和virKeyGet(),詳見程序清單,詳見程序清單7.2。7.5.5 虛擬鍵盤驅(qū)動(dòng)/*Descriptions: 全局變量定義*/static code char _GcKeyTable = /按鍵轉(zhuǎn)換表 #,0,*,9,8,7,6,5,4,3,2,1,0 ;static idata unsigned char _GucTaskKeyStks44; /分配任務(wù)堆棧static TN_OS_MSG _GomKeyMsg; /定義消息郵箱 /*Descriptions: 虛擬鍵盤掃描任務(wù)函數(shù)*/static
39、void _taskKey(void)char cOldKeyState; /鍵盤歷史狀態(tài)char cTmp1,cTmp2;程序清單7.2 虛擬鍵盤驅(qū)動(dòng)源碼vir_key.c)7.5.5 虛擬鍵盤驅(qū)動(dòng)cOldKeyState = -1;while (1)/*等待按鍵狀態(tài)變化*/while (1)cTmp1 = zyKeyGet();if (cTmp1!=cOldKeyState)break;tnOsTimeDly(TICKS_PER_SEC/100);/*去抖*/tnOsTimeDly(TICKS_PER_SEC/100);cTmp2 = zyKeyGet();if (cTmp2=cTmp1)
40、cOldKeyState = cTmp1;/*有按鍵按下,發(fā)送消息*/if (cTmp1=0)7.5.5 虛擬鍵盤驅(qū)動(dòng)cTmp1 = _GcKeyTablecTmp1; /將鍵碼轉(zhuǎn)換為ASC碼tnOsMsgPost(&_GomKeyMsg,cTmp1);/發(fā)送ASC碼 /*Descriptions: 虛擬鍵盤驅(qū)動(dòng)初始化函數(shù)*/char virKeyInit(void)if (tnOsMsgCreate(&_GomKeyMsg,0) /創(chuàng)建消息郵箱return -1;if (tnOsTaskCreate(_taskKey,_GucTaskKeyStks)0) /創(chuàng)建任務(wù)retur
41、n -1;return zyKeyInit();7.5.5 虛擬鍵盤驅(qū)動(dòng)/*Descriptions: 虛擬鍵盤獲得按鍵函數(shù)*/char virKeyGet(unsigned int uiDly)unsigned int uiMsg; /獲得的消息/*獲得等待節(jié)拍數(shù)*/if (uiDly!=0)uiDly = uiDly/(1000/TICKS_PER_SEC);if (uiDly=0)uiDly = 1;uiMsg = tnOsMsgPend(&_GomKeyMsg,uiDly); /等待按鍵if (uiMsg=0)return -1;return (char)uiMsg; 目 錄
42、7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng) 7.5.1 概述概述 7.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.8 主程序主程序 7.5.6 虛擬蜂鳴器驅(qū)動(dòng) 1.決策決策 據(jù)前面為虛擬蜂鳴器驅(qū)動(dòng)給出的大部分信息,因而,只要再?zèng)Q定蜂鳴器頻率就可以據(jù)前面為虛擬蜂鳴器驅(qū)動(dòng)給出的大部分信息,因而,只要再?zèng)Q定蜂鳴器頻率就可以了,即蜂鳴器頻率為了,即蜂鳴器頻率為8000Hz,并可配置。,并可配置。 2.接口定義接口定義 虛擬蜂鳴器驅(qū)動(dòng)的接口定義如下:虛擬蜂鳴器驅(qū)動(dòng)的接口
43、定義如下: (1使用使用7.4節(jié)制定的接口;節(jié)制定的接口; (2定義一個(gè)用于配置蜂鳴器使用頻率的宏,詳見程序清單定義一個(gè)用于配置蜂鳴器使用頻率的宏,詳見程序清單7.3。程序清單7.3 虛擬蜂鳴器驅(qū)動(dòng)配置vir_buzzer_cfg.h)34 /*35 鳴叫頻率定義36 */ 37 #define _ZY_BUZZER_HZ 800 (3任務(wù)堆棧使用全局?jǐn)?shù)組任務(wù)堆棧使用全局?jǐn)?shù)組GucTaskKeyStks; (4消息郵箱使用全局變量消息郵箱使用全局變量GomBuzzerMsg,與虛擬蜂鳴器驅(qū)動(dòng)相關(guān)的全局變,與虛擬蜂鳴器驅(qū)動(dòng)相關(guān)的全局變量定義詳見程序清單量定義詳見程序清單7.4。7.5.6 虛擬蜂
44、鳴器驅(qū)動(dòng)程序清單7.4 虛擬蜂鳴器驅(qū)動(dòng)全局變量定義vir_buzzer.c)32 static idata unsigned char _GucTaskBuzzerStks44; /分配任務(wù)堆棧33 static TN_OS_MSG _GomBuzzerMsg; /定義消息郵箱 (5虛擬蜂鳴器任務(wù)函數(shù)名為_taskBuzzer(),其詳細(xì)說明如下:函數(shù)原型: static void_taskBuzzer(void) /無參數(shù)與返回值 3. 編寫代碼編寫代碼 虛擬蜂鳴器驅(qū)動(dòng)按照接口定義,需要編寫虛擬蜂鳴器驅(qū)動(dòng)按照接口定義,需要編寫3個(gè)相關(guān)的函數(shù),即個(gè)相關(guān)的函數(shù),即_taskBuzzer()、vi
45、rBuzzerInit()和和virBuzzerTweet(),詳見程序清單,詳見程序清單7.5。程序清單7.5 虛擬蜂鳴器驅(qū)動(dòng)代碼vir_buzzer.c)/*Descriptions: 全局變量定義*/static idata unsigned char _GucTaskBuzzerStks44; /分配任務(wù)堆棧static TN_OS_MSG _GomBuzzerMsg; /定義消息郵箱7.5.6 虛擬蜂鳴器驅(qū)動(dòng)/*Descriptions: 虛擬蜂鳴器驅(qū)動(dòng)任務(wù)函數(shù)*/static void _taskBuzzer(void)unsigned int uiMsg; /獲得的消息while
46、 (1)uiMsg = tnOsMsgPend(&_GomBuzzerMsg,0);switch (uiMsg)case VIR_BUZZER_STOP:phyBuzzerStop();break;case VIR_BUZZER_SHORT:phyBuzzerTweet(_ZY_BUZZER_HZ);tnOsTimeDly(TICKS_PER_SEC/10);7.5.6 虛擬蜂鳴器驅(qū)動(dòng)phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);break;case VIR_BUZZER_TWO_SHORT:phyBuzzerTweet(_ZY_BUZZE
47、R_HZ);tnOsTimeDly(TICKS_PER_SEC/10);phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);phyBuzzerTweet(_ZY_BUZZER_HZ);tnOsTimeDly(TICKS_PER_SEC/10);phyBuzzerStop();tnOsTimeDly(TICKS_PER_SEC/10);break;case VIR_BUZZER_LONG:phyBuzzerTweet(_ZY_BUZZER_HZ);tnOsTimeDly(TICKS_PER_SEC/2);7.5.6 虛擬蜂鳴器驅(qū)動(dòng)phyBuzzerStop
48、();tnOsTimeDly(TICKS_PER_SEC/10);break;default:break;/*Descriptions: 虛擬蜂鳴器驅(qū)動(dòng)初始化函數(shù)*/char virBuzzerInit(void)if (tnMsgCreat(&_GomBuzzerMsg,0)0) /創(chuàng)建消息郵箱return -1;7.5.6 虛擬蜂鳴器驅(qū)動(dòng)if (tnMsgCreat(_taskBuzzer,_GucTaskBuzzerStks)0) /創(chuàng)建任務(wù)return -1;return phyBuzzerInit();/*Descriptions: 虛擬蜂鳴器鳴叫函數(shù)*/char virBu
49、zzerTweet(unsigned char ucMod)tnOsMsgPost(&_GomBuzzerMsg,ucMod);return 0; 目 錄 7.5.1 概述概述 7.5.2 可復(fù)用的驅(qū)動(dòng)可復(fù)用的驅(qū)動(dòng) 7.5.7 人機(jī)交互程序人機(jī)交互程序 7.5.4 CAT1024驅(qū)動(dòng)驅(qū)動(dòng) 7.5.5 虛擬鍵盤驅(qū)動(dòng)虛擬鍵盤驅(qū)動(dòng) 7.5.6 虛擬蜂鳴器驅(qū)動(dòng)虛擬蜂鳴器驅(qū)動(dòng) 7.5.3 I2C驅(qū)動(dòng)驅(qū)動(dòng) 7.5.8 主程序主程序 7.5.7 人機(jī)交互程序 其實(shí),人交互程序與其實(shí),人交互程序與4.5小節(jié)的主程序非常相似,只是實(shí)現(xiàn)方法不同而已,其代碼詳小節(jié)的主程序非常相似,只是實(shí)現(xiàn)方法不同而已,其代
50、碼詳見程序清單見程序清單7.6,它與,它與4.5小節(jié)的程序清單小節(jié)的程序清單4.22的不同之處已經(jīng)作加粗傾斜處理。的不同之處已經(jīng)作加粗傾斜處理。程序清單7.6 人機(jī)交互程序/*Descriptions: 打開保險(xiǎn)箱*Returned value: 0-密碼輸入正確 1-超時(shí) -1-密碼輸入錯(cuò)誤*/static char _hmiBoxOpen(void)unsigned char i,j;char cTmp1; for(i=0;i3;i+)/*顯示初始畫面*/7.5.7 人機(jī)交互程序strcpy(_GcHmiBuf,-)virShowPuts(_GcHmiBuf);/*輸入密碼*/j = 0;
51、while(1)cTmp1 = virKeyGet(15*1000);if(cTmp10)j-;_GcHmiBuffj = -; 7.5.7 人機(jī)交互程序else_GcHmiBuffj = cTmp1; /保存輸入的字符j+;if(cTmp1=#) /密碼輸入完畢break;/*第7個(gè)字符必須為#*/if (j=7&cTmp!=#)j-;_GcHmiBuf6 = 0;continue;/*提示用戶字符輸入完成*/virShowPuts(_GcHmiBuf);virBuzzerTweet(VIR_BUZZER_SHORT);7.5.7 人機(jī)交互程序/*檢驗(yàn)密碼*/virMemRead(U
52、SER_PASSWORD_ADDR,_GcPassword,7);if (_GcPassword0=(char)0 xff) /CAT1024未保存密碼memcpy(_GcPassword,123456#,7); /默認(rèn)密碼為123456if (memcmp(_GcPassword,_GcHmiBuf,j)=0) /比較密碼/*開鎖*/virShowPuts(OPEN);virBuzzerTweet(VIR_BUZZER_LONG);virLockUnlock(0);return 0;/*密碼錯(cuò)誤*/if (i0)i-;_GcHmiBuffi = -;else_GcHmiBuffi = cTm
53、p1; /保存輸入的字符i+;7.5.7 人機(jī)交互程序if (cTmp1=#) /密碼輸入完畢if (i!=1)break;/*不允許輸入空密碼*/i-;continue;/*第7個(gè)字符必須為#*/if (j=7&cTmp!=#)i-;_GcHmiBuf6 = 0; continue;/*提示用戶字符輸入完成*/virShowPuts(_GcHmiBuf); virBuzzerTweet(VIR_BUZZER_SHORT); 7.5.7 人機(jī)交互程序 virMemWrite(USER_PASSWORD_ADDR,_GcPassword,7);/保存密碼 virBuzzerTweet(VIR_BUZZER_LONG); tnOsTimeDly(TICKS_PER_SEC*2);virShowPuts(OPEN);return 0;/*Descriptions: 人機(jī)交互程序*/void h
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代教育技術(shù)助力創(chuàng)新教學(xué)方法的推廣
- 現(xiàn)代辦公家具中的穩(wěn)固與美觀并存
- 現(xiàn)代遠(yuǎn)程教育在海外的發(fā)展趨勢分析
- 汽車行業(yè)的社交媒體廣告投放策略
- 溫控技術(shù)在綠色辦公樓宇的革新發(fā)展
- 現(xiàn)代建筑設(shè)計(jì)的情感化表達(dá)
- Unit 3 Animals Lesson 3(說課稿)-2024-2025人教版(新起點(diǎn))英語一年級(jí)上冊001
- 2023八年級(jí)數(shù)學(xué)下冊 第六章 平行四邊形1 平行四邊形的性質(zhì)第1課時(shí) 平行四邊形的邊角特征說課稿 (新版)北師大版
- 2024-2025學(xué)年高中歷史 專題五 走向世界的資本主義市場 5.3“蒸汽”的力量說課稿 人民版必修2
- 2024年學(xué)年九年級(jí)語文上冊 第三單元 走近魯迅 第12課 詩兩首《自題小像》說課稿 滬教版五四制
- 醫(yī)療器械質(zhì)量管理體系文件模板
- 秦始皇嬴政人物生平介紹PPT
- 在馬克思墓前的講話說課稿公開課一等獎(jiǎng)市賽課獲獎(jiǎng)?wù)n件
- 骨科無痛病房的建立
- 送養(yǎng)收養(yǎng)合同協(xié)議書
- 塑料成型模具設(shè)計(jì)(第2版)江昌勇課件0-導(dǎo)論
- 漢語拼音發(fā)音口型及配圖
- 五年級(jí)下冊《Lesson 11 Shopping in Beijing》教案冀教版三年級(jí)起點(diǎn)小學(xué)英語-五年級(jí)英語教案
- 績效考核管理醫(yī)院績效分配方案包括實(shí)施細(xì)則考核表
- 大學(xué)成績單(大專)
- 網(wǎng)絡(luò)設(shè)備安裝與調(diào)試(華為eNSP模擬器)整套教學(xué)課件
評論
0/150
提交評論