freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c語言學(xué)習(xí)心得(編輯修改稿)

2024-11-15 23:33 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 //LED計(jì)數(shù)器 static uint8 g_u8LedState = 0。//LED狀態(tài)標(biāo)志, 0表示亮,1表示熄滅define LED P0 //定義LED接口define LED_ON()LED = 0x00。//所有LED亮 define LED_OFF()LED = 0xff。//所有LED熄滅void LedProcess(void){ if(0 == g_u8LedState)//如果LED的狀態(tài)為亮,則點(diǎn)亮LED { LED_ON()。} else //否則熄滅LED { LED_OFF()。} }void LedStateChange(void){ if(g_bSystemTime1Ms)//系統(tǒng)1MS時(shí)標(biāo)到 { g_bSystemTime1Ms = 0。g_u16LedTimeCount++。//LED計(jì)數(shù)器加一if(g_u16LedTimeCount = 500)//計(jì)數(shù)達(dá)到500,即500MS到了,改變LED的狀態(tài)。{ g_u16LedTimeCount = 0。g_u8LedState =!g_u8LedState。} } }這個(gè)模塊對(duì)外的借口只有兩個(gè)函數(shù), 中需要作相應(yīng)的聲明。 內(nèi)容: ifndef _LED_H_ define _LED_H_extern void LedProcess(void)。extern void LedStateChange(void)。endif這兩個(gè)模塊完成后,我們將其C文件添加到工程中。然后開始編寫主函數(shù)里的代碼。如下所示:include include “” include “” include “”sbit LED_SEG = P1^4。//數(shù)碼管段選 sbit LED_DIG = P1^5。//數(shù)碼管位選 sbit LED_CS11 = P1^6。//led控制位void main(void){ LED_CS11 = 1。//74HC595輸出允許LED_SEG = 0。//數(shù)碼管段選和位選禁止(因?yàn)樗鼈兒蚅ED共用P0口)LED_DIG = 0。Timer0Init()。EA = 1。while(1){ LedProcess()。LedStateChange()。} }整個(gè)工程截圖如下:至此,第三章到此結(jié)束。一起來總結(jié)一下我們需要注意的地方吧[color=FF0000](*.c)的作用是什么 (*.h)的作用是什么 的作用 (多文件)的工程“從單片機(jī)初學(xué)者邁向單片機(jī)工程師”之KEY主題討論按鍵程序編寫的基礎(chǔ)從這一章開始,我們步入按鍵程序設(shè)計(jì)的殿堂。在基于單片機(jī)為核心構(gòu)成的應(yīng)用系統(tǒng)中,用戶輸入是必不可少的一部分。輸入可以分很多種情況,譬如有的系統(tǒng)支持PS2鍵盤的接口,有的系統(tǒng)輸入是基于編碼器,有的系統(tǒng)輸入是基于串口或者USB或者其它輸入通道等等。在各種輸入途徑中,更常見的是,基于單個(gè)按鍵或者由單個(gè)鍵盤按照一定排列構(gòu)成的矩陣鍵盤(行列鍵盤)。我們這一篇章主要討論的對(duì)象就是基于單個(gè)按鍵的程序設(shè)計(jì),以及矩陣鍵盤的程序編寫?!虬存I檢測(cè)的原理常見的獨(dú)立按鍵的外觀如下,相信大家并不陌生,各種常見的開發(fā)板學(xué)習(xí)板上隨處可以看到他們的身影。(原文件名:)引用圖片總共有四個(gè)引腳,一般情況下,處于同一邊的兩個(gè)引腳內(nèi)部是連接在一起的,如何分辨兩個(gè)引腳是否處在同一邊呢?可以將按鍵翻轉(zhuǎn)過來,處于同一邊的兩個(gè)引腳,有一條突起的線將他們連接一起,以標(biāo)示它們倆是相連的。如果無法觀察得到,用數(shù)字萬用表的二極管擋位檢測(cè)一下即可。搞清楚這點(diǎn)非常重要,對(duì)于我們畫PCB的時(shí)候的封裝很有益。它們和我們的單片機(jī)系統(tǒng)的I/O口連接一般如下:(原文件名:)引用圖片對(duì)于單片機(jī)I/O內(nèi)部有上拉電阻的微控制器而言,還可以省掉外部的那個(gè)上拉電阻。簡(jiǎn)單分析一下按鍵檢測(cè)的原理。當(dāng)按鍵沒有按下的時(shí)候,單片機(jī)I/O通過上拉電阻R接到VCC,我們?cè)诔绦蛑凶x取該I/O的電平的時(shí)候,其值為1(高電平)。當(dāng)按鍵S按下的時(shí)候,該I/O被短接到GND,在程序中讀取該I/O的電平的時(shí)候,其值為0(低電平)。這樣,按鍵的按下與否,就和與該按鍵相連的I/O的電平的變化相對(duì)應(yīng)起來。結(jié)論:我們?cè)诔绦蛑型ㄟ^檢測(cè)到該I/O口電平的變化與否,即可以知道按鍵是否被按下,從而做出相應(yīng)的響應(yīng)。一切看起來很美好,是這樣的嗎?◎現(xiàn)實(shí)并非理想在我們通過上面的按鍵檢測(cè)原理得出上述的結(jié)論的時(shí)候,其實(shí)忽略了一個(gè)重要的問題,那就是現(xiàn)實(shí)中按鍵按下時(shí)候的電平變化狀態(tài)。我們的結(jié)論是基于理想的情況得出來的,就如同下面這幅按鍵按下時(shí)候?qū)?yīng)電平變化的波形圖一樣:(原文件名:)引用圖片而實(shí)際中,由于按鍵的彈片接觸的時(shí)候,并不是一接觸就緊緊的閉合,它還存在一定的抖動(dòng),盡管這個(gè)時(shí)間非常的短暫,但是對(duì)于我們執(zhí)行時(shí)間以u(píng)s為計(jì)算單位的微控制器來說,它太漫長(zhǎng)了。因而,實(shí)際的波形圖應(yīng)該如下面這幅示意圖一樣。(原文件名:)引用圖片這樣便存在這樣一個(gè)問題。假設(shè)我們的系統(tǒng)有這樣功能需求:在檢測(cè)到按鍵按下的時(shí)候,將某個(gè)I/O的狀態(tài)取反。由于這種抖動(dòng)的存在,使得我們的微控制器誤以為是多次按鍵的按下,從而將某個(gè)I/O的狀態(tài)不斷取反,這并不是我們想要的效果,假如該I/O控制著系統(tǒng)中某個(gè)重要的執(zhí)行的部件,那結(jié)果更不是我們所期待的。于是乎有人便提出了軟件消除抖動(dòng)的思想,道理很簡(jiǎn)單:抖動(dòng)的時(shí)間長(zhǎng)度是一定的,只要我們避開這段抖動(dòng)時(shí)期,檢測(cè)穩(wěn)定的時(shí)候的電平不久可以了嗎?聽起來確實(shí)不錯(cuò),而且實(shí)際應(yīng)用起來效果也還可以。于是,各種各樣的書籍中,在提到按鍵檢測(cè)的時(shí)候,總也不忘說道軟件消抖。就像下面的偽代碼所描述的一樣。(假設(shè)按鍵按下時(shí)候,低電平有效)If(0 == io_KeyEnter)//如果有鍵按下了 { Delayms(20)。//先延時(shí)20ms避開抖動(dòng)時(shí)期If(0 == io_KeyEnter)//然后再檢測(cè),如果還是檢測(cè)到有鍵按下 { return KeyValue。//是真的按下了,返回鍵值 } else { return KEY_NULL //是抖動(dòng),返回空的鍵值 } while(0 == io_KeyEnter)。//等待按鍵釋放 }所以合理的分配好微控制的處理時(shí)間,是編寫按鍵程序的基礎(chǔ)。J乍看上去,確實(shí)挺不錯(cuò),實(shí)際中呢?在實(shí)際的系統(tǒng)中,一般是不允許這么樣做的。為什么呢?首先,這里的Delayms(20), 讓微控制器在這里白白等待了20 ms 的時(shí)間,啥也沒干,考慮我在《學(xué)會(huì)釋放CPU》一章中所提及的幾點(diǎn),這是不可取的。其次while(0 == io_KeyEnter)。更是程序設(shè)計(jì)中的大忌(極少的特殊情況例外)。任何非極端情況下,都不要使用這樣語句來堵塞微控制器的執(zhí)行進(jìn)程。原本是等待按鍵釋放,結(jié)果CPU就一直死死的盯住該按鍵,其它事情都不管了,那其它事情不干了嗎?你同意別人可不會(huì)同意◎消除抖動(dòng)有必要嗎? 的確,軟件上的消抖確實(shí)可以保證按鍵的有效檢測(cè)。但是,這種消抖確實(shí)有必要嗎?有人提出了這樣的疑問。抖動(dòng)是按鍵按下的過程中產(chǎn)生的,如果按鍵沒有按下,抖動(dòng)會(huì)產(chǎn)生嗎?如果沒有按鍵按下,抖動(dòng)也會(huì)在I/O上出現(xiàn),我會(huì)立刻把這個(gè)微控制器錘了,永遠(yuǎn)不用這樣一款微控制器。所以抖動(dòng)的出現(xiàn)即意味著按鍵已經(jīng)按下,盡管這個(gè)電平還沒有穩(wěn)定。所以只要我們檢測(cè)到按鍵按下,即可以返回鍵值,問題的關(guān)鍵是,在你執(zhí)行完其它任務(wù)的時(shí)候,再次執(zhí)行我們的按鍵任務(wù)的時(shí)候,抖動(dòng)過程還沒有結(jié)束,這樣便有可能造成重復(fù)檢測(cè)。所以,如何在返回鍵值后,避免重復(fù)檢測(cè),或者在按鍵一按下就執(zhí)行功能函數(shù),當(dāng)功能函數(shù)的執(zhí)行時(shí)間小于抖動(dòng)時(shí)間時(shí)候,如何避免再次執(zhí)行功能函數(shù),就成為我們要考慮的問題了。這是一個(gè)仁者見仁,智者見智的問題,就留給大家去思考吧。所以消除抖動(dòng)的目的是:防止按鍵一次按下,多次響應(yīng)。“從單片機(jī)初學(xué)者邁向單片機(jī)工程師”之KEY主題討論基于狀態(tài)轉(zhuǎn)移的獨(dú)立按鍵程序設(shè)計(jì))的那種,有一個(gè)小液晶屏,還有四個(gè)按鍵,功能是時(shí)鐘,鬧鐘以及秒表。在調(diào)整時(shí)間的時(shí)候,短按+鍵每次調(diào)整值加一,長(zhǎng)按的時(shí)候調(diào)整值連續(xù)增加。小的時(shí)候很好奇,這樣的功能到底是如何實(shí)現(xiàn)的呢,今天就讓我們來剖析它的原理吧。J 本章所描述的按鍵程序要達(dá)到的目的:檢測(cè)按鍵按下,短按,長(zhǎng)按,釋放。即通過按鍵的返回值我們可以獲取到如下的信息:按鍵按下(短按),按鍵長(zhǎng)按,按鍵連_發(fā),按鍵釋放。不知道大家還記得小時(shí)候玩過的電子鐘沒有,就是外形類似于CALL 機(jī)(CALL 機(jī),好像是很古老的東西了 狀態(tài)在生活中隨處可見。譬如早上的時(shí)候,鬧鐘把你叫醒了,這個(gè)時(shí)候,你便處于清醒的狀態(tài),馬上你就穿衣起床洗漱吃早餐,這一系列事情就是你在這個(gè)狀態(tài)做的事情。做完這些后你會(huì)去等車或者開車去上班,這個(gè)時(shí)候你就處在上班途中的狀態(tài)?..中午下班時(shí)間到了,你就處于中午下班的狀態(tài),諸如此類等等,在每一個(gè)狀態(tài)我們都會(huì)做一些不同的事情,而總會(huì)有外界條件促使我們轉(zhuǎn)換到另外一種狀態(tài),譬如鬧鐘叫醒我們了,下班時(shí)間到了等等。對(duì)于狀態(tài)的定義出發(fā)點(diǎn)不同,考慮的方向不同,或者會(huì)有些許細(xì)節(jié)上面的差異,但是大的狀態(tài)總是相同的。生活中的事物同樣遵循同樣的規(guī)律,譬如,用一個(gè)智能充電器給你的手機(jī)電池充電,剛開始,它是處于快速充電狀態(tài),隨著電量的增加,電壓的升高,當(dāng)達(dá)到規(guī)定的電壓時(shí)候,它會(huì)轉(zhuǎn)換到恒壓充電。總而言之,細(xì)心觀察,你會(huì)發(fā)現(xiàn)生活中的總總都可以歸結(jié)為一個(gè)個(gè)的狀態(tài),而狀態(tài)的變換或者轉(zhuǎn)移總是由某些條件引起同時(shí)伴隨著一些動(dòng)作的發(fā)生。我們的按鍵亦遵循同樣的規(guī)律,下面讓我們來簡(jiǎn)單的描繪一下它的狀態(tài)流程轉(zhuǎn)移圖。(原文件名:)引用圖片下面對(duì)上面的流程圖進(jìn)行簡(jiǎn)要的分析。首先按鍵程序進(jìn)入初始狀態(tài)S1,在這個(gè)狀態(tài)下,檢測(cè)按鍵是否按下,如果有按下,則進(jìn)入按鍵消抖狀態(tài)2,在下一次執(zhí)行按鍵程序時(shí)候,直接由按鍵消抖狀態(tài)進(jìn)入按鍵按下狀態(tài)3,在此狀態(tài)下檢測(cè)按鍵是否按下,如果沒有按鍵按下,則返回初始狀態(tài)S1,如果有則可以返回鍵值,同時(shí)進(jìn)入長(zhǎng)按狀態(tài)S4,在長(zhǎng)按狀態(tài)下每次進(jìn)入按鍵程序時(shí)候?qū)Π存I時(shí)間計(jì)數(shù),當(dāng)計(jì)數(shù)值超過設(shè)定閾值時(shí)候,則表明長(zhǎng)按事件發(fā)生,同時(shí)進(jìn)入按鍵連_發(fā)狀態(tài)S5。如果按鍵鍵值為空鍵,則返回按鍵釋放狀態(tài)S6,否則繼續(xù)停留在本狀態(tài)。在按鍵連_發(fā)狀態(tài)下,如果按鍵鍵值為空鍵則返回按鍵釋放狀態(tài)S6,如果按鍵時(shí)間計(jì)數(shù)超過連_發(fā)閾值,則返回連_發(fā)按鍵值,清零時(shí)間計(jì)數(shù)后繼續(xù)停留在本狀態(tài)。看了這么多,也許你已經(jīng)有一個(gè)模糊的概念了,下面讓我們趁熱打鐵,一起來動(dòng)手編寫按鍵驅(qū)動(dòng)程序吧。下面是我使用的硬件的連接圖。(原文件名:)引用圖片硬件連接很簡(jiǎn)單,四個(gè)獨(dú)立按鍵分別接在P3^0P3^3四個(gè)I/O上面。因?yàn)?1單片機(jī)I/O口內(nèi)部結(jié)構(gòu)的限制,在讀取外部引腳狀態(tài)的時(shí)候,不需要進(jìn)行此操作也可以進(jìn)行讀取外部引腳的操作。因此,在按鍵的端口沒有復(fù)用的情況下,可以省略此步驟。而對(duì)于其它一些真正雙向I/O口的單片機(jī)來說,將引腳設(shè)置成輸入狀態(tài),是必不可少的一個(gè)步驟。下面的程序代碼初始化引腳為輸入。void KeyInit(void){ io_key_1 = 1。io_key_2 = 1。io_key_3 = 1。io_key_4 = 1。} 根據(jù)按鍵硬件連接定義按鍵鍵值define KEY_VALUE_1 0x0e define KEY_VALUE_2 0x0d define KEY_VALUE_3 0x0b define KEY_VALUE_4 0x07 define KEY_NULL 0x0f 下面我們來編寫按鍵的硬件驅(qū)動(dòng)程序。根據(jù)第一章所描述的按鍵檢測(cè)原理,我們可以很容易的得出如下的代碼: static uint8 KeyScan(void){ if(io_key_1 == 0)return KEY_VALUE_1。if(io_key_2 == 0)return KEY_VALUE_2。if(io_key_3 == 0)return KEY_VALUE_3。if(io_key_4 == 0)return KEY_VALUE_4。return KEY_NULL。} 其中io_key_1等是我們按鍵端口的定義,如下所示: sbit io_key_1 = P3^0。sbit io_key_2 = P3^1。sbit io_key_3 = P3^2。sbit io_key_4 = P3^3。KeyScan()作為底層按鍵的驅(qū)動(dòng)程序,為上層按鍵掃描提供一個(gè)接口,這樣我們編寫的上層按鍵掃描函數(shù)可以幾乎不用修改就可以拿到我們的其它程序中去使用,使得程序復(fù)用性大大提高。同時(shí),通過有意識(shí)的將與底層硬件連接緊密的程序和與硬件無關(guān)的代碼分開寫,使得程序結(jié)構(gòu)層次清晰,可移植性也更好。對(duì)于單片機(jī)類的程序而言,能夠做到函數(shù)級(jí)別的代碼重用已經(jīng)足夠了。在編寫我們的上層按鍵掃描函數(shù)之前,需要先完成一些宏定義。//定義長(zhǎng)按鍵的TICK數(shù),以及連_發(fā)間隔的TICK數(shù) define KEY_LONG_PERIOD 100 define KEY_CONTINUE_PERIOD 25//定義按鍵返回值狀態(tài)(按下,長(zhǎng)按,連_發(fā),釋放)define KEY_DOWN 0x80 define KEY_LONG 0x40 define KEY_CONTINUE 0x20 define KEY_UP 0x10//定義按鍵狀態(tài)define KEY_STATE_INIT 0 define KEY_STATE_WOBBLE 1 define KEY_STATE_PRESS 2 define KEY_STATE_LONG 3 define KEY_STATE_CONTINUE 4 define KEY_STATE_RELEASE 5接著我們開始編寫完整的上層按鍵掃描函數(shù),按鍵
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1