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

正文內(nèi)容

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

2024-11-15 23:33 本頁面
 

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