首頁 > 文章中心 > 單片機程序設計

      單片機程序設計

      前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇單片機程序設計范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。

      單片機程序設計范文第1篇

      [關鍵詞]:紅外遙控 解碼 單片機

      1紅外遙控系統組成

      通用紅外遙控系統由發射和接收兩大部分組成,應用編/解碼專用集成電路芯片來進行控制操作,如圖1所示。發射部分包括鍵盤矩陣、編碼調制、LED紅外發送器;接收部分包括紅外接收器、光電轉換放大器、解調等。

      2紅外遙控發射和接收原理

      按下遙控器的某一個鍵,遙控器會發出一連串經過調制后的信號,這個信號經過紅外一體化模塊接收后,輸出解調后的數字脈沖,每個按鍵對應不同的脈沖,故識別出不同的脈沖就能識別出不同的按鍵。按鍵信息采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如圖2所示。

      上述“0”和“1”組成的32位二進制碼經38kHz的載頻進行二次調制以提高發射效率,達到降低電源功耗的目的,然后再通過紅外發射二極管產生紅外線向空間發射,如圖3所示。

      3單片機解碼程序設計

      紅外一體化接收頭輸出信號連接到單片機外中斷輸入引腳,設置為下降沿中斷方式。引導碼解碼過程只解碼帶數據的引導碼,不對連發碼引導碼進行解碼。這就要求使用過程中,長按操作不起作用。

      關鍵解碼流程設計如圖4所示。

      中斷解碼完成后,完成酥局夢弧V鞒絳蛑脅檠到完成標志,就對解碼數據進行反碼校驗并進行對應的處理。

      4效果與應用

      以上設計的單片機解碼程序,成功應用于萬年歷、計算器、電機控制、旋轉LED廣告燈燈各種單片機項目教學過程中,完全取代矩陣鍵盤進行操作,電路簡單,程序可靠。稍有不足的是要占用一個外中斷,并且在中斷解碼操作時,會占用CPU時間。

      對于時序有嚴格要求的項目應用,可以考慮“外中斷+定時器”的方式,在每個下降沿時進入中斷,對數據進行處理。兩次進中斷的時間間隔采用定時器來記錄,省略此前中斷解碼流程中設計的各種延時和等待操作,減少時間占用,提高CPU利用率。

      參考文獻:

      單片機程序設計范文第2篇

      [關鍵詞]USB ECP Driver Studio 設備驅動程序

      [中圖分類號]TP[文獻標識碼]A[文章編號]1007-9416(2010)02-0029-02

      1 引言

      由于現在大多數計算機沒有并行口而具有多個USB接口,因此很多并行口設備無法和計算機直接連接使用。利用基于單片機STC11F32XE的USB 轉 ECP 模式并行口可以連接其他ECP模式并口設備,以達到讓具有ECP接口的設備可以和沒有并口的PC進行數據通信的目的。并口采用的是IEEE 1284-A接口, USB 接口驅動芯片采用Philips 半導體公司的PDIUSBD12,該芯片的數據端口D0-D7接單片機的P0 口,引腳WR_N、RD_N、及A0 分別接單片機的P3.6、P3.7、P3.5 引腳。整個硬件電路圖如圖 1 所示。當 USB 設備硬件設計完成之后,接著就必須根據硬件特點和需要完成的功能,設計出合乎產品的USB驅動程序,否則,設備將無法被PC機識別,不能正常使用。

      2 WDM型的USB驅動程序結構

      USB設備的驅動程序是一種典型的WDM驅動程序。WDM驅動程序是分層的。對于USB設備驅動程序來說,其驅動程序包括兩個層次:設備(功能)驅動程序層和總線(底層)驅動程序層。USB底層驅動程序由操作系統提供,不要開發者自己編寫,它位于USB功能驅動程序的下面,負責與實際的USB硬件打交道,實現復雜而繁瑣的底層通信;USB功能驅動程序必須要由開發者編寫,它不與實際的USB硬件打交道,是把包含URB(USB Request Block,USB 請求塊)的IRP發送到USB底層驅動程序,來實現對USB設備信息的發送和接收。(圖2) 給出了USB 驅動程序的結構模型。

      3 USB驅動開發編程環境的建立

      開發一個WMD 驅動程序,必須要搭建合適的開發環境以此來減小開發難度。對于WDM 驅動的開發,一般必須使用的軟件是VC++6.0和DDk (Driver Development Kit,驅動程序開發工具包)。但為了進一步降低開發難度,選擇使用了第三方驅動開發工具--Driver Studio。它以類的方式對DDK 進行封裝,可以十分容易地利用它提供的向導來產生一個必需的驅動程序框架。

      一般首先安裝VC++6.0,接著安裝DDK,如果需要的話,還可以安裝Windows SDK 來輔助開發,最后安裝Driver Studio 3.2。因為Driver Studio的類庫要使用DDK庫函數,所以在安裝好Driver Studio 之后必須首先要編譯出一個庫文件,否則會提示找不到庫文件vdw_wdm.lib 等錯誤。編譯該庫文件的步驟如下:啟動VC++6.0,找到并打開Driver Studio3.2 安裝目錄下的vdwLibs.dsw工程文件,然后選擇DriverStudio->DDK Build Settings,在彈出的對話框中設置DDK的安裝路徑和運行的操作系統。然后選擇菜單Build->Batch Build,要根據驅動運行的平臺來選擇對應的工程文件,這里選擇了x86對應的工程,正確選擇之后,單擊Rebuild All 按鈕,開始編譯庫文件。這個類庫只需編譯一次,以后開發其他的驅動就不必再次編譯了。

      4 USB驅動創建方法及步驟

      該驅動程序的主要功能包括:端點0采用控制傳輸,可以保證傳輸過程中的數據的完整性和正確性,主要負責USB枚舉過程中的數據的讀寫。另外,又增加了端點1和端點2。端點1采用中斷傳輸,這種傳輸主要用在數據量不大,但對時間要求較嚴格的設備中。因此,模塊滿足了實時性的特點;端點2采用批量傳輸,該種傳輸通常用在數據量大、對數據的實時性要求不高的場合中,利用該方式可以完成大量數據的快速傳輸,可以與高速的ECP并行口相匹配,因此,模塊滿足了高速數據傳輸的要求。

      單擊VC菜單欄下的DriverStudio菜單項,選擇Driver Wizard菜單,會出現一個驅動向導對話框。單擊Start a new Driver Project 將創建一個新的驅動工程。然后按照向導生成該驅動程序的框架。具體步驟如下:①設置工程名和路徑。在彈出的對話框中,設置工程名為UsbToECP、路徑為D:\。②選擇驅動工程的類型。在對話框中選擇 WDM Driver,驅動框架選擇DriverWorks C++ Framework。③選擇WDM驅動類型。在彈出的對話框中選擇 WDM Function Driver。④選擇驅動總線的類型。在對話框中選擇為 USB 總線,然后在分別設定USB Vendor ID 和USB Product ID。 ⑤設置USB 的端點資源。單擊Add增加端點。這里增加 4 個端點,Pipe Name 分別是Ep1_In、Ep1_Out、Ep2_In和Ep2_Out。其中Ep1_In和Ep1_Out選擇中斷傳輸,端點地址均為1,傳輸方向分別為輸入和輸出,最大包長為8字節,最大傳輸大小為 4096字節。Ep2_In和Ep2_Out選擇批量傳輸,端點地址均為2,傳輸方向分別為輸入和輸出,最大包長為64字節,最大傳輸大小為 40960字節。⑥選擇需要處理請求類型。這里選擇IRP_MJ_DEVICE_CONTROL、IRP_MJ_READ和IRP_MJ_WRITE。它們分別與API函數 DeviceIoControl、ReadFile和WriteFile一一對應。⑦設備I/O操作方式。配置IRP_MJ_READ和IRP_MJ_WRITE的緩沖方式分別為Buffered。另外還需要增加4個IO Control 的控制代碼:EP1_READ、EP1_WRITE、EP2_READ、EP2_WRITE。打開方式選擇Interface。⑧添加注冊表項。可以根據自己需要增加,這里增加了一個設備名稱。⑨設置電源管理。選擇Device requires an inrush of power at startup,說明該設備啟動時需要大電流,這樣做的目的是防止相同的設備同時上電,減少對電源的沖擊。步驟10-13按默認配置即可。

      5 驅動的編程

      USB驅動程序的編程最主要的就是編寫端點1和端點2的數據處理函數,其中主要編寫的是UsbToECPDevice類成員函數Read()、Write()、及DeviceControl()中調用的4 個IoControl()函數。

      Read()函數對應著WIN32 API的ReadFile函數,其參數通過KIrp I傳遞過來。因為端點1指定的緩沖方式為Buffered 方式,所以調用KIrp類的成員函數I.BufferedReadDest()來獲取保存數據的緩沖區地址,調用I.ReadSize()來獲取讀到的數據長度。如果獲取到的緩沖區地址為NULL,則說明參數無效,則以USB_STATUS_INVALID_PARAMETER來完成該IRP,然后返回USB_STATUS_INVALID_PARAMETER。若讀取的字節數是0,就直接完成該IRP,不需要進行數據處理。接著創建一個URB來完成數據的處理。因為端點1采用的是中斷傳輸,所以必須創建一個中斷傳輸的 URB并提交它,端點管道KUsbPipe類提供一個創建中斷傳輸URB的函數BuildInterruptTransfer。這樣底層的USB 總線驅動程序就會負責從端點 1 讀取數據,當完成數據的讀取后,提交相應URB的函數就會返回。當URB創建成功后,利用KUsbPipe類的成員函數SubmitUrb()來提交這個URB,否則返回資源不足的錯誤信息。SubmitUrb()函數返回后,可以用URB的成員變量TransferBufferLength來獲取實際讀到的字節數,最后刪除創建的URB。

      本文為全文原貌 未安裝PDF瀏覽器用戶請先下載安裝 原版全文

      Write()函數的處理方法與Read()函數的方法非常相似,不同之處在于利用KIrp類I的成員函數 BufferedWriteSource()和WriteSize()來分別獲取緩沖區的地址和傳輸的字節數。另外,函數EP1_READ_Handler()和EP1_WRITE_Handler()的實現與Read()和Write()函數基本是一樣的,略有不同。

      端點2 的EP2_READ_Handler(KIrp I)和EP2_WRITE_Handler(KIrp I)與端點 1的EP1_READ_Handler(KIrp I)和EP1_WRITE_Handler(KIrp I)處理方式幾乎是一樣的,主要的不同是在創建URB時要用到創建批量傳輸URB 的函數BuildBulkTransfer(),其參數及意義與BuildInterruptTransfer()相同。

      6 驅動的安裝

      在對端點1和端點2編程完成之后,然后對其進行編譯,如果沒有錯誤,可以看到編譯報告中有一行“MODULE=.\objfre\i386\UsbToECP.sys”,這個就是所要的驅動文件,另外,在目錄下還產生一個inf文件,其也是安裝驅動時需要的一個重要的文件,它里面有一些重要的安裝信息,可以根據需要進行修改。一般主要是對inf的Stings 進行修改,表1給出了該驅動的Strings 段的幾個重要屬性的修改。

      將該設備與PC機連接,系統會提示安裝驅動,首先指定驅動安裝所要使用的inf文件所在的位置,該inf文件可以在驅動工程目錄的driver目錄下找到,是由向導自動生成的。然后選擇安裝驅動所需要的UsbToECP.sys文件,該文件在D:\ UsbToECP\driver\objfre\i386下。正確安裝驅動之后,打開計算機的設備管理器,將會看到該USB設備。如下圖3所示。打開圖3中的Class for BinBinUsb devices下的BinBinUsb Device屬性,選擇相應標簽,將會看到如下圖4的驅動信息。

      7 結語

      USB設備驅動的開發是設備開發過程中必不可少的一項任務。通過研究利用VC++、DDK和Driver Studio對USB驅動程序的設計方法,成功地設計了基于單片機的USB轉并口設備的驅動程序。通過測試,使用該驅動的USB轉并口設備運行穩定,達到了預期的效果。這種USB驅動的設計方法簡化了開發難度,開發的驅動穩定可靠,必將受到USB設備開發者的廣泛關注,同時也給其他的基于WDM驅動的開發提供一個新途徑。

      [參考文獻]

      [1] 榮佳波,常明志,井科偉,楊少勇.USB 設備的WDM驅動程序設計[J].應用科技,2004,31(3);39-41.

      單片機程序設計范文第3篇

      關鍵詞:工作過程;C語言程序設計;單片機課程;電子設計競賽

      在電子信息專業中,C語言主要服務于單片機應用,而單片機的運用對《C語言程序設計》的要求,從思維方式上講,培養學生的邏輯思維能力,分析問題、解決問題的能力等;從行為能力上講,培養學生利用C語言編程能力對單片機綜合項目進行控制設計。然而,在具體的教學過程中,由于課程本身的難度以及受學生基礎、教學內容、教學方法、教學條件等各方面的限制,其教學目標的培養大打折扣。為了學生能夠通過學習C語言從而獲得與單片機密切結合的綜合職業能力,并保證其相關的經驗、知識和技能在結構上的系統化,本文以“基于工作過程的學習方法”為核心,將“工作過程中單片機的運用學習”和“課堂上C語言知識的學習”整合為一個有機整體,[1]形成一套新的課程改革模式,從而提高教學質量,增強學生的職業技能,拓寬學生的求職渠道。

      一、C語言程序設計在電子類專業中的現狀

      (1)目前大部分高職電子類專業的人才培養方案中,仍沿用本科院校的課程體系,[2]其《C語言程序設計》教材仍采用本科院校計算機專業教師編寫,針對性不強,很難有效的服務于高職電子類專業課程的學習。(2)《C語言程序設計》的學習與專業課程單片機的學習脫鉤,使學生學習C語言的目標不明確,很難將C語言知識與專業核心課程單片機的學習有效結合,從而影響單片機教學的有效展開。(3)《C語言程序設計》課程本身的難度以及學生自身的底子薄,形成學生難學、厭學,進而逃課的惡性循環。

      二、基于工作過程的C語言課程與單片機課程總體設計

      本文提出了一種基于工作過程的C語言課程與單片機課程有效結合的課程改革模式,如下圖1所示。

      圖1 改革的課程體系

      從工作過程出發,將單片綜合項目的應用分解為C語言課程任務、C語言與單片機的結合、單片機課程任務三個部分,C語言課程任務和單片機課程任務兩者服務于C語言與單片機的結合;C語言課程任務主要面向C語言程序設計的知識點學習即C語言的課程領域;C語言與單片機的結合又可分解為C語言在單片機中的算法學習和單片機中的C語言程序設計;單片機課程任務主要面向單片機內部資源的學習即單片機課程領域;最后將 C語言的課程領域和C語言在單片機中的算法學習相結合,形成一門《基于單片機的C語言程序設計》課程,并將單片機課程領域和單片機中的C語言程序設計相結合,形成一門《單片機綜合應用》課程。

      三、基于單片機運用領域的C語言學習領域重構

      (一)C語言學習領域重構。如下圖表1所示,將七個典型單片機項目所需要的C語言知識點打勾,根據各個項目所需要的知識點,重新組織C語言課程的學習領域,形成重、難點突出,與專業課程緊密結合,針對性強的具有專業特色的C語言程序設計教程。

      表1 基于單片機項目的C語言學習領域重構

      (二) C語言學習領域中教學例子選取。在C語言知識講解中,我們將典型單片機項目分割成多個獨立完整的子任務,并將這些子任務稍加調整修改,使C語言知識點貫穿其中,讓學生從專業的實際運用中來學習C語言,既保證了C語言知識的系統性,又將C語言理論知識融入實踐任務,不僅可以培養學生專業技能,而且還培養學生學習C語言的興趣。

      四、全文總結

      本文融“教、學、做”為一體,強化學生能力的培養,將C語言課程與單片機課程進行了有機結合,形成新的課程模式,并對新的課程模式中《基于單片機的C語言程序設計》課程的知識領域進行了重構、教學例子進行了選取,從而促進了人才培養方案的正確修訂、課程體系的科學整合。

      單片機程序設計范文第4篇

      關鍵詞 單片機 教學模式研究 任務驅動 實踐教學

      中圖分類號:G424 文獻標識碼:A

      單片機自20世紀70年代問世以來,已對人類社會產生了巨大的影響。目前單片機在工業控制、智能儀器儀表、辦公室自動化、家用電器等諸多領域得到廣泛應用。①單片機原理與應用課程已經在許多高等院校的電子電氣類、計算機類、控制類、機械類等專業作為專業必修課開設。

      本文從該課程的特點和目前教學的不足出發,結合筆者在課程教學中的實際經驗,探討改進單片機課程教學模式的途徑,提高課程的教學效果。

      1 單片機課程特點與教學現狀

      單片機原理與應用是一門應用性極強的綜合性課程,包含理論與實踐兩部分,單片機技術是硬件設計與軟件編程的有機結合。對于初學者而言,往往感覺單片機概念繁多,內容枯燥,結構抽象,入門較難。其次,單片機常采用匯編語言作為編程語言,而匯編語言是面向機器的語言,缺乏通用性,設計程序時必須對單片機的硬件結構有相當深入的了解。相較于不受具體機器限制且參照一些數學語言設計的高級語言(如C語言)來說,匯編語言缺乏了直觀、易懂、可讀性好的特點,學習起來難度更大。另外,單片機技術綜合性強,涉及內容涵蓋了電路、模擬電子、數字電子、接口技術、傳感與檢測技術、自動控制原理等諸多課程的內容。②

      鑒于單片機課程的特點,傳統的教學模式存在著以下不足之處:③(1)課程講授重理論、輕實踐,講授內容仍按照硬件結構、指令系統、匯編語言程序設計、中斷與定時器/計數器、接口技術這一固定模式進行,教學以灌輸單片機結構知識為主,忽略其實際應用,讓學生感到抽象、乏味,失去興趣。(2)強調單片機應用程序設計的講授和訓練,忽略系統整體設計,使學生缺乏對單片機系統軟硬件有機結合的認識,常常出現學生編寫的程序與自己設計的單片機系統完全不對應的情況。(3)實踐環節相對薄弱,多以驗證性和演示性實驗為主,設計性、綜合性實驗不足,實驗條件和實驗學時有限,學生沒有足夠的機會在實踐中去理解和提高,更談不上培養學生主動設計和創新的能力。

      2 課程教學模式研究

      改進單片機課程的教學模式,應通過改進教學方法,調整教學內容,優化實踐教學體系,達到激發學生的學習興趣和主動性,改善教學效果,培養應用型人才的目的。

      2.1 改進教學方法

      合適的教學方法能夠有效地提高學生對課程的興趣。傳統的以教師灌輸知識為主的教學方式與單片機的課程特點大為不符,嚴重影響了學生的學習熱情,而引入任務驅動式的教學法能有效地解決這個問題。任務驅動法是一種探究式的教學模式,其主要形式是將教學內容轉換成一項或幾項任務來完成,通過任務的提出、分析到實現來引導學生主動思考,培養其獨立分析和解決問題的能力。譬如,在單片機控制LED閃爍的教學中,首先設定為簡單的驅動一個LED定時閃爍任務,使學生掌握延時程序和定時器控制兩種不同的方法;接著將其擴展為8個LED的跑馬燈控制任務,使學生學習分別應用左移(右移)方式和查表方式實現;繼而在該系統上引入按鍵控制跑馬燈的開始和停止,使學生學習按鍵的使用和按鍵去抖動的方法。學生在任務中學到知識的同時,獲得了成就感,學習興趣也自然提高了。

      2.2 調整教學內容

      單片機應用系統的程序設計,既可以采用匯編語言,也可以采用C語言。且在單片機的實際開發中,由于應用系統的規模較大,設計人員更趨于采用C語言進行程序設計。C語言相比于匯編語言,具有良好的可讀性,可移植性。采用C語言進行程序設計時,編譯器能自動完成變量的存儲單元的分配,使得學習編程者可以更多地專注于應用程序的邏輯思想。④此外,在開設單片機課程之前,一般都已開設過C語言程序設計課程。學生對C語言已有基礎,利于接受和理解。因此在講授匯編語言程序設計之后,引入單片機標準C語言的教學內容,可以讓學生在兩種語言的對照學習中更快地掌握單片機的編程技術,也使得學生對于單片機的學習更具實用性。

      2.3 優化實踐教學體系

      傳統的實踐教學多以演示性、驗證性實驗為主,實驗設備以單片機實驗箱居多。學生進行實驗時直接按照實驗指導書中現成的電路圖在實驗箱上進行簡單的電路連接并照搬現有的程序代碼,并不理解該實驗電路的設計原理和程序的設計思想,只是將指導書中的示例進行了簡單的驗證,沒有達到訓練學生獨立設計的目的。有效的實踐教學應該加大實驗學時比重,盡量減少驗證性實驗,增加設計性、綜合性實驗。在布置實驗任務時,應只說明本次實驗的目的和功能要求,提前讓學生進行預習和準備,待學生有了初步的設計思路和程序初稿方可開始實驗。這樣,有限的實驗時間主要用于學生的自行驗證、調試、修改中,即使一個簡單的實驗也能鍛煉學生的獨立思考和解決問題的能力。此外,增加獨立于課程外的實訓環節,以綜合性的課題設計來培養學生對單片機應用系統整體開發的能力。引入單片機系統虛擬仿真軟件-proteus,與開發工具keil及實驗板相結合,從電路原理圖設計、軟件設計到虛擬系統仿真再到實物系統調試和實現,整個過程環環相扣,鍛煉了學生綜合設計的能力。

      單片機程序設計范文第5篇

      關鍵詞:單片機 按鍵識別 一次響應

      中圖分類號:TP368.12 文獻標識碼:A 文章編號:1007-9416(2012)08-0175-02

      1、引言

      在以單片機為核心控制的應用系統中,鍵盤按鍵能實現向單片機輸入數據、傳送命令等功能,是單片機應用系統中人工干預單片機的主要手段。而單片機對按鍵閉合與否的判斷,主要是通過其引腳上的電壓高低進行的。本文以51單片機為例說明,所述鍵盤按鍵的硬件電路設計也非常簡單——輕觸開關的一端接地,另一端連接單片機引腳,該引腳同時接10K上拉電阻[1]。很明顯,單片機引腳呈現高電平表示按鍵開關斷開;反之,引腳電壓呈現低電平表示按鍵開關閉合。因此,對單片機的按鍵識別只要通過對其引腳電平的高低狀態的檢測,即可確認按鍵按下與否[2]。

      眾所周知,按鍵為機械彈性開關,加之按鍵按下或抬起瞬間均會產生抖動現象,因此消除按鍵抖動也是整個系統的關鍵。為更突出本文的討論重點,這里不再重點討論按鍵去抖的方法。

      2、傳統按鍵識別方法

      2.1 簡單的按鍵識別

      該按鍵識別方法雖然簡單,但當按下按鍵的瞬間,卻可能讓系統多次循環處理同一按鍵事件,造成CPU資源的浪費。以下為該方法的程序設計思路,下述中的“按鍵確實按下”表示延遲10ms后,按鍵仍處于按下狀態。

      (1)初始化按鍵;

      (2)if(按下按鍵){

      延遲10ms去抖;

      if(按鍵確實按下){事件處理,退出}

      }else {未按按鍵,退出}

      單片機程序可能是一個循環執行的過程,當按鍵按下閉合,程序進入按鍵事件,執行完該事件,若按鍵仍未被抬起,則程序循環又再一次進入同樣的按鍵事件執行。事實上,如果采用12MHZ外部晶振,單片機處理器執行一個指令通常只要2個機器周期的時間,也即4us。如此短暫的時間,當我們松開按鍵時,程序可能早已經循環執行很多次按鍵事件。因此該按鍵識別的程序思路并不合適。為了不重復執行同一個按鍵事件,可改進為如下所述的按鍵識別的方法:

      (1)初始化按鍵;

      (2)if(按下按鍵){

      延遲10ms去抖;

      if(按鍵確實按下){事件處理,等待按鍵釋放,退出}

      }else {未按按鍵,退出}

      此方法雖然可識別按鍵釋放,即實現每一次按鍵,系統只會調用一次按鍵處理事件。但若按鍵一直不釋放,則程序只可在此原地踏步等待,浪費系統執行時間,CPU每個時鐘周期均做無用功。解決方法是,在識別到第一次按鍵,并執行完按鍵事件后,將忽略后續的按鍵狀態,從而實現對按鍵的一次響應,解決多次冗余響應的缺陷。

      2.2 帶標志的按鍵識別

      為了解決多次冗余響應的缺陷,可設置按鍵按下與釋放兩種狀態的標志,在程序執行過程中,檢測標志位內容,識別按鍵的狀態。根據該思路,可在初始化按鍵時,設置按鍵按下與否的標志位,并賦予“0”與“1”兩種狀態。標志狀態為“0”表示按鍵無效,為“1”表示按鍵被按下。以下為帶標志位的按鍵識別的程序設計思路[2],這里假定標志位為key_mark,初始值為0。

      (1)初始化按鍵;

      (2)if(按下按鍵 && !key_mark){

      延遲10ms去抖;

      key_mark = 1; //將狀態“1”賦予標志位。表示按鍵已按下

      if(按鍵確實按下){事件處理,退出}

      }else if(未按按鍵){

      key_mark = 0,退出}

      該方法可行有效,其中標志位key_mark起了至關重要的作用。只有當按鍵按下,key_mark=0,且延遲10ms去抖后,程序才會確認是否真的有按鍵被按下。此時馬上對key_mark=1,使得下一次查詢key_mark標志時,得知按鍵正處于按下狀態。如此,不僅使得按鍵被按下時可被準確檢測到,還可以在按鍵還沒被抬起釋放時,不重復響應同一個按鍵事件。由于此時標志位key_mark的值被賦值為“1”,因此if(按下按鍵 && !key_mark)將不再成立,直到按鍵抬起,才重新賦值key_mark為“0”,實現了每一次按鍵,系統只會調用一次按鍵處理事件。

      3、快速按鍵識別方法

      對于程序員來說,實現同樣功能的程序,簡潔、高效對設計非常關鍵。本文討論的快速按鍵識別方法,嘗試使用單片機C語言中的邏輯運算方法,同樣快速有效地解決了按鍵識別的程序設計問題。該方法在初始化設置后,只需要使用一句異或運算語句,兩句賦值語句,即可快速進行按鍵識別。

      下面給出該快速按鍵識別方法的思路。先初始化三個標志位:key_now,key_old,key_change。其中,key_now表示當前讀取到的按鍵電平;key_old表示之前一次讀取到的按鍵電平;key_change表示按鍵被按下后出現的變化情況,即當key_change=0,表示按鍵處于斷開狀態,key_change=1,表示按鍵處于閉合狀態。這三個標志位的初始化值均為“1”。現在給出該方法的程序設計思路。

      (1)初始化按鍵

      (2)key_now = P1.0; //讀取當前按鍵電平(假定使用單片機P1.0引腳連接按鍵)

      key_change = (key_now ^ key_old) ^ key_change;

      key_old = key_now;

      根據上述方法,當未按下按鍵時,與按鍵連接的引腳P1.0為高電平,則key_now也為高電平,key_change與(key_now ^ key_old)異或運算后結果為“0”,并重新賦值給key_change,標志著當前沒有按鍵按下;當按鍵被按下,引腳P1.0為低電平,key_change與(key_now ^ key_old)異或運算后結果為“1”,同樣賦值給key_change,標志著當前按鍵已按下;若此時按鍵保持低電平,即按鍵未抬起釋放,則key_now仍為低電平,key_change的異或運算結果仍為“0”;只有當按鍵被抬起時,引腳P1.0恢復為高電平,對應的key_change異或為“1”。總之,只要有按鍵按下,key_change對應的位就為“1”,按鍵彈起后key_change對應的位為“0”,表示按鍵未被按下。這大大簡化了按鍵的識別,不需要再去進行其他判斷,程序設計也簡潔明了。

      4、結語

      本文首先介紹了鍵盤按鍵識別的工作原理,并以51單片機為例探討基于單片機的鍵盤按鍵識別方法,這些方法同樣適用于AVR、PIC、凌陽單片機等應用的程序設計中。圍繞如何進行快速有效的鍵盤按鍵識別,本文深入研究了傳統的鍵盤識別方法、帶標志位的鍵盤識別方法,以及一種通過異或運算得到的快速鍵盤按鍵識別方法。詳細比較各種方法,并采用單片機開發板(外部12M晶振,編程軟件為Keil uVision2)試驗[4],結果表明上述三種鍵盤識別程序思路均可,而后者只需要使用三句C語言語句,即可實現鍵盤按鍵識別,是一種可行有效的方法。

      參考文獻

      [1]林伸茂編著,管繼斌,白雁鈞改編.8051單片機徹底研究基礎篇.人民郵電出版社,2004.05:105-108.

      [2]張毅剛,彭喜元,姜守達,喬立巖編著.新編MCS-51單片機應用設計.哈爾濱工業大學出版社,2003.07:157-164.

      自拍偷自拍亚洲精品偷一| 亚洲国产欧美国产综合一区| 亚洲av再在线观看| 国产精品亚洲а∨无码播放麻豆| 亚洲色无码专区一区| 亚洲精品亚洲人成在线播放| 亚洲欧洲国产综合| 亚洲国产av高清无码| 亚洲制服丝袜一区二区三区| 亚洲三级视频在线| 亚洲综合精品第一页| 亚洲精品GV天堂无码男同| 亚洲国产精品自在自线观看 | 亚洲精品无码av片| 亚洲精品无码av片| 国产成人精品亚洲一区| 亚洲国产精品成人AV无码久久综合影院| 国产精品自拍亚洲| 久久精品国产亚洲5555| 亚洲乱色熟女一区二区三区丝袜 | 亚洲男人av香蕉爽爽爽爽| 国产精品亚洲不卡一区二区三区| 中文字幕亚洲无线码| 亚洲国产精品无码久久久蜜芽 | 久久亚洲精品成人综合| 91精品国产亚洲爽啪在线观看| 亚洲黄色片免费看| 亚洲国产av美女网站| 中文字幕在线日亚洲9| 色欲色欲天天天www亚洲伊| 亚洲精品高清一二区久久| 国产亚洲AV手机在线观看| 亚洲成A人片在线观看WWW| 亚洲AV日韩AV永久无码免下载 | 日韩色日韩视频亚洲网站| 久久精品国产亚洲Aⅴ香蕉| 国产精品亚洲一区二区三区在线| 亚洲天堂视频在线观看| 亚洲av永久无码精品三区在线4| 亚洲日韩AV无码一区二区三区人| 国产亚洲福利精品一区二区|