單片機課程設計51系列_第1頁
單片機課程設計51系列_第2頁
單片機課程設計51系列_第3頁
單片機課程設計51系列_第4頁
單片機課程設計51系列_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、單片機課程設計可存儲式電子琴姓 名: 班 級:學 號:指導老師:組 長:小組成員:摘要電子琴是現代電子科技與音樂結合的產物,是一種新型的鍵盤樂器。它在現代音樂扮演著重要的角色,單片機具有強大的控制功能和靈活的編程實現特性,它已經溶入現代人們的生活中,成為不可替代的一部分。我們設計的這個簡易電子琴以單片機作為主控核心,與鍵盤、蜂鳴器等模塊組成核心主控制模塊,在主控模塊上設有4*4的矩陣鍵盤設計成16個音。本系統運行穩定,其優點是硬件電路簡單,軟件功能完善,控制系統可靠,性價比較高等,具有一定的實用和參考價值。 根據使用者的操作隨意彈奏想要表達的音樂。一首音樂是許多不同的音階組成的,而每個音階對應

2、著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號。此外,本系統還實現了實時存儲,能將演奏的音律存儲起來并一塊演奏出來。 關鍵詞:單片機;按鍵;蜂鳴器;音階;電子琴;可存儲 目錄1 概述11.1電子琴設計目的及意義11.2設計任務11.3設計項目與功能簡介11.31 設計項目簡介11.32 系統功能簡介22 硬件設計及說明32.1 硬件系統設計32.2 元件簡介32.21 STC89C5232.22 蜂鳴器42.23 矩陣鍵盤52.24 LCD160263 軟件程序設計

3、73.1 軟件系統設計73.2音樂相關知識93.3 產生音頻脈沖93.4 識別矩陣鍵盤103.5 LCD實時顯示113.6實時存儲音律信息134 系統調試134.1 硬件調試134.2軟件調試135 課程設計個人分工及心得體會155.1個人分工155.2心得體會15致謝15參考文獻16附錄171 概述1.1 電子琴設計目的及意義 隨著當代科學技術的發展,電子產品在人們的日常生活中占據著越來越重要的地位。電子琴作為其中的一個典型代表,引領著許多孩子進入音樂的殿堂。因此電子琴的設計不僅能夠提高我的實踐動手能力,還與實際生活有著緊密地聯系。單片機是一門實踐性很強的課程,而此次課程設計依據的理論基礎是

4、單片機的相關知識。其主要目的是通過本課程的培養,啟發學生的創造性思維,進一步理解數字系統的概念,掌握小型數字系統的設計方法,掌握小型數字系統的組裝和調試技術,掌握查閱有關資料的技能。單片機又稱單片微控制器,它不是完成某一個邏輯功能的芯片,而是把一個計算機系統集成到一個芯片上。概括的講:一塊芯片就成了一臺計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。1.2 設計任務本設計要求利用8051單片機的控制程序結合LCD,設計一臺數字式可存儲式電子琴。其基本要求為:(1)使用LCD顯示器來顯示音階輸入的相關信息;(2)當按下

5、鍵盤組相對按鍵,壓電喇叭會發出相對音階單音,共有2個8度音階;(3)所有單音會存入8051內而保存起來;(4)至多可以輸入64個單音,可以一起演奏出來;(5)演奏時可以按鍵中斷;(6)可以實時顯示目前正演奏的單音碼。1.3 設計項目與功能簡介1.31 設計項目簡介 本項目設計是采用 STC89C52 單片機作為核心,利用單片機技術、無源蜂鳴器、4x4 鍵盤、SPEAKER、以及LCD顯示屏實現原理圖設計到電路板設計開發,并用 C51 高級語言進行鍵盤識別程序設計和音頻脈沖輸出程序與音頻存儲程序的設計。最終能夠實現樂曲演奏和音律存儲以及自動播放,并且可以通過LCD顯示屏顯示音符。1.32 系統功

6、能簡介(1)能實現基本的琴鍵功能。 即按下每一個琴鍵,單片機能夠檢測到鍵盤的按鍵,并通過鍵盤的位置,通過程序來控制,使蜂鳴器發出不同頻率的聲音。(2)能夠實現LCD顯示按鍵。 每按下一個按鍵時,單片機能夠檢測到所按下的按鍵,然后通過按鍵的位置通過程序控制來實現在LCD中顯示相應按鍵。(3)能夠實現實時存儲。 每按下一個按鍵時,發出一個單音并能將其存儲起來。然后,通過一個播放鍵將所存儲的音樂播放出來。(4)能夠實現按鍵中斷。 在播放音樂時可以按下中斷鍵使音樂暫停與播放。 2 硬件設計及說明2.1 硬件系統設計硬件設計的任務是根據總體設計要求,在選擇的機型的基礎上,具體確定系統中所要使用的元器件,

7、設計出系統的結構圖。該設計要實現一種由單片機控制可存儲式電子琴,因為這是一個比較簡單的系統,而STC89C52單片機經濟實惠,也有很多優點,其性能完全可以滿足設計的需求,所以我們選擇STC89C52來作為此設計項目的核心。電子琴首先必須要有按鍵,又要求輸出16個音階,所以我們采用了4X4矩陣鍵盤。另外LCD顯示器件具有工作電流小、重量輕、功耗低、壽命長、字跡清晰美觀等優點,在便攜式儀表、低功耗應用的儀器儀表中得到了廣泛應用,所以我們選用了LCD1602來實現顯示相應音符,其總體框圖設計如下:圖2.1 系統結構圖2.2 元件簡介2.21 STC89C52STC89C52是一種帶 8K字節閃爍可編

8、程可擦除只讀存儲器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低電壓,高性能 CMOS8 位微處理器,俗稱單片機。該器件采用高密度非易失存儲器制造技術制造,與工業標準的 MCS-51 指令集和輸出管腳相兼容。由于將多功能 8位CPU 和閃爍存儲器組合在單個芯片中,STC89C52是一種高效微控制器,為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。STC89C52的主要特征:·8K字節可編程閃爍存儲器壽命:1000寫/擦循環數據保留時間:10年 ·全靜態工作:0Hz-24Hz ·三級程序存儲器

9、鎖定 ·128*8位內部RAM ·32可編程 I/O線 ·兩個16位定時器/計數器 ·6個中斷源 ·可編程串行通道 ·低功耗的閑置和掉電模式 ·片內振蕩器和時鐘電路STC89C52的芯片圖:圖2.2 STC89C52芯片圖2.22 蜂鳴器蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型1壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組

10、成。有的壓電式蜂鳴器外殼上還裝有發光二極管。多諧振蕩器由晶體管或集成電路構成。當接通電源后(1.515V直流工作電壓),多諧振蕩器起振,輸出1.52.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。 壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極,經極化和老化處理后,再與黃銅片或不銹鋼片粘在一起。 2電磁式蜂鳴器 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。 2.23 矩陣鍵盤單片機系統中,若使用按鍵的數量比較多時,通常選用用矩陣式鍵盤。矩陣式鍵由行線和列線構成,按鍵位于行、列線的交叉點上, 鍵盤矩陣是由四行四列構成,矩陣的四列和 P1 口的低四位相

11、連,四行與 P1 口的高四位相連。其鍵盤識別方法如下:(1) 判斷鍵盤中有無鍵按下 將全部行線置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。(2) 判斷閉合鍵所在的位置 在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。圖2.3矩陣式鍵盤結構2.24 LCD1602LCD160

12、2是以點陣字符型為顯示方式的液晶顯示器,每行可以顯示16個字符,一共可以顯示2行。它由LCD顯示屏、擴展驅動器HD44100和控制器HD44780組成,其主要參數如下:3 軟件程序設計3.1 軟件系統設計 軟件設計實際上就是程序編程,根據項目設計要求,我們把軟件,設計部分大體分為了四個模塊:音頻脈沖產生程序設計、鍵盤掃描識別程序、實時存儲程序與LCD顯示程序。其設計圖如下:圖3.1 軟件系統設計圖其總體流程圖如下:圖3.2 總體流程圖3.2音樂相關知識樂音聽起來有的高,有的低,這就叫音高,音高是由發音物體振動頻率的高低決定的,頻率高聲音就高,頻率低聲音就低,不同音樂的樂音是用C、D、E、F、G

13、、A、B表示的,這7個字母就是樂音的音名,它們一般依次唱成DO、RE、MI、FA、SO、LA、SI,這是唱曲時樂音的發音,所以叫唱名。音持續時間的長短即時值,一般用拍數表示,休止符表示暫停發音。一首音樂是由許多不同的音符組成的,而每個音符對應著不同的頻率,這樣就可以利用不同頻率的組合,加以與拍數對應的延時,構成音樂。3.3 產生音頻脈沖在本實驗中,單片機工作于12MHZ時鐘頻率,使用其定時/計數器T0,工作模式為1,改變計數值TH0和TL0可以產生不同頻率的脈沖信號,在此情況下,C調的各音符頻率與計數值T的對照如下表:音符頻率(HZ)計數值(T值)音符頻率(HZ)計數值(T值)低1DO2626

14、3628#4FA#74064860#1DO#27763737中5SO78464898低2RE29463835#5SO#83194934#2RE#31163928中6LA88064968低3MI33064021#6LA#93264994低4FA34964103中7SI96865030#4FA#37064185低1DO104665058低SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3MI131865157低7SI49464524高4FA139765178中1DO5

15、2364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI65964732#6LA#186565268中4FA69864820高7SI196765283 表3-1 音符頻率與計數值T的對照表T的值決定了TH0和TL0的值,其關系為:TH0=T/256,TL0=T%256。3.4 識別矩陣鍵盤在單片機應用系統中,鍵盤的工作方式主要有兩種,即編程掃描與定時掃描。編程掃描即行掃描法。行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,介紹過

16、程如下: (1) 檢測當前是否有鍵被按下。(2) 去除鍵抖動。(3) 若有鍵被按下,應識別出是哪一個鍵閉合。方法是對鍵盤的行線進行逐行掃描。(4)為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。定時掃描是利用單片機內部的定時器產生一定時間的定時間隔,當定時時間到就產生定時器溢出中斷,CPU響應中斷時對鍵盤進行行掃描取鍵值,以響應鍵輸入請求。因為編程掃描CPU需不停地掃描鍵盤,影響其他功能的執行,工作效率低,所以我們采用了第二種鍵盤掃描識別方法。其程序如下:void timer1()interrupt 3 TL1 =0x18 ; TH1 =0xfc ; KeyScan();此語句

17、實現了每1ms進行一次鍵盤掃描工作。函數名稱:鍵盤掃描子程序函數功能:按鍵狀態的采集,定時1ms和消抖掩碼實現每個按鍵20ms的消抖延時void KeyScan() uint8 i; static uint8 iKeyOut=0; static uint8 KeyScanBuff44;KeyScanBuffiKeyOut0 = (KeyScanBuffiKeyOut0<<1) | KEY_IN_1) & DEBOUNCE_MASK; KeyScanBuffiKeyOut1 = (KeyScanBuffiKeyOut1<<1) | KEY_IN_2) &

18、DEBOUNCE_MASK; KeyScanBuffiKeyOut2 = (KeyScanBuffiKeyOut2<<1) | KEY_IN_3) & DEBOUNCE_MASK; KeyScanBuffiKeyOut3 = (KeyScanBuffiKeyOut3<<1) | KEY_IN_4) & DEBOUNCE_MASK; for (i=0; i<4; i+) if (KeyScanBuffiKeyOuti = DEBOUNCE_MASK) KeyStaiKeyOuti = KEY_UP; else if (KeyScanBuffiKeyO

19、uti = 0) KeyStaiKeyOuti = KEY_DOWN; iKeyOut = (iKeyOut+1) & 0x3; switch (iKeyOut) case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; 3.5 LCD實時顯示 LCD160

20、2的控制器HD44780的主要功能部件有:DDRAM顯示數據RAM、CGROM字符產生器ROM、CGRAM字形產生器RAM、IR指令寄存器、DR數據寄存器、BF忙碌標志信號和AC地址計數器,七大部分組成。另外,HD44780還提供了清屏指令、讀取狀態指令、寫數據指令、讀數據指令等11條指令對DDRAM的內容和地址進行具體操作,這些指令足以完成我們的設計目標,具體相關程序如下:函數名稱:LCD1602讀繁忙標志位子程序void Lcd1602WaitReady() uint8 sta; P0 = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do LCD1602_E

21、 = 1; _nop_(); sta = P0; LCD1602_E = 0; while (sta&0x80) != 0); 函數名稱:LCD1602寫命令子函數void Lcd1602WriteCmd(uint8 cmd) Lcd1602WaitReady(); LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_E = 1; P0 = cmd; nop_(); LCD1602_E = 0;函數名稱:LCD1602寫數據子函數void Lcd1602WriteDat(uint8 dat) Lcd1602WaitReady(); LCD1602_RS =

22、1; LCD1602_RW = 0; LCD1602_E = 1; P0 = dat;_nop_(); LCD1602_E = 0;函數名稱:LCD1602初始化子程序void Lcd1602Init() Lcd1602WriteCmd(0x38); Lcd1602WriteCmd(0x0C); Lcd1602WriteCmd(0x06); 3.6實時存儲音律信息 設計要求要把所彈奏的音律實時存儲起來,所以編程時我們定義了一個數組來實現存儲。我們把鍵值與該鍵所代表的音律脈沖一對應,在按下某個鍵時,把它代表的音律脈沖通過查詢數組的方式存入另一個數組中,在連續播放時再調用這個數組。例如music_

23、savesave_count = i*4+j;這條語句用來儲存鍵值,music_timesave_count = key_time;這條語句用來儲存按鍵按下時間的長短,if(play_count<save_count)STH0 = music_tabmusic_saveplay_count/256;STL0 = music_tabmusic_saveplay_count%256;這些語句用于播放時查找存儲的音律信息。4 系統調試4.1 硬件調試硬件調試主要是針對單片機部分進行調試,自行制作了電路板。硬件調試我們先采用了普中HC6800-EM3開發板進行調試,后自行制作了電路板,在上電前,

24、先確保電路中不在斷路或短路情況,這一工作是整個調試工作的第一步,也是非常重要的一個步驟。在確保硬件電路正常,無異常情況(斷路或短路)方可上電調試,上電調試的目的是檢驗電路是否接錯,同時還要檢驗原理是否正確,在本次設計中,上電調試主要鍵盤單片機控制部分、LCD顯示部分、和音頻轉換電路硬件調試。1、鍵盤單片機控制部分調試:上電后,隨機按動鍵盤可以發現各個按鍵對應的正確。2、LCD電路調試:接通電源,隨機按下按鈕可以看到LCD液晶顯示數字。4.2軟件調試軟件調試主要方法和技巧:通常一個調試程序應該具備至少四種性能:跟蹤、斷點、查看變量、更改數值。整個程序是一個主程序調用各個子程序實現功能的過程,要使

25、主程序和整個程序都能平穩運行,各個模塊的子程序的正確與平穩運行必不可少,所以在軟件調試的最初階段就是把各個子程序模塊進行分別調試。我們調試日志如下:(1)編寫了鍵盤掃描程序,初步實現彈奏。(2)放棄原來鍵盤掃描程序,編寫新的鍵盤掃描程序。(3)實現彈奏和播放儲存音樂功能。(4)初步編寫LCD1602的驅動程序。(5)繼續編寫LCD1602程序,實現顯示彈奏的音符和頻譜圖。(6)編寫播放暫停功能。(7)完成在普中HC6800-EM3開發板調試。5 課程設計個人分工及心得體會5.1個人分工主程序的編寫與整合、鍵盤掃描及按鍵動作程序的編寫、電路板的加工與調試。5.2心得體會通過理論設計,到仿真軟件仿

26、真,再到確定具體方案,再到安裝實際電路,最后到調試電路、成型,整個過程都需要我們充分利用所學的知識進行思考、借鑒。可以說,本次課程設計是針對前面所學的知識進行的一次比較綜合的檢驗,讓我們所學到的知識更加深刻,同時把理論與實際充分的結合起來。總的來說,這次課程設計雖然累,但非常充實。另外,這次課程設計也讓我們懂得了團結的重要性,我們小組5人分工明確,同時也互幫互助,同心協力才出色的完成了這次任務。 在這次實習中,正確的思路是很重要的,只有你的設計思路是正確的,那你的設計才有可能成功。因此我們在設計前必須做好充分的準備,認真查找詳細的資料,為我們設計的成功打下堅實的基礎。要做好本次的課程設計,熟練

27、地掌握課本上的理論知識是前提,這樣才能對試驗中出現的問題進行一定的分析和解決。另外,還要學會互相幫助,在自己走入困境無法走出時,這時別人的幫助可能會使你豁然開朗。此外在學習單片機知識的時候對于這個領域有了更新更全面的認識。作為21世紀的工科大學生,學好單片機,一方面可以加深對計算機原理和結構的認識,另一方面也為自身在專業上的深入發展構筑了一個很好的平臺其重要性怎么強調都不為過。致謝這次課程設計能夠得以順利完成,是所有指導過我們的老師,幫助過我們的同學的結果。我們小組在這里對他們表示深深的謝意! 首先,要特別感謝我們的指導老師。老師豐富的專業知識,嚴謹的治學態度,精益求精的工作作風,誨人不倦的高

28、尚師德,樸實無華、平易近人的人格魅力對我們影響深遠。 其次,要感謝所有曾經教我們單片機的任課老師劉鵬老師,他教會我們的不僅僅是專業知識,更多的是對待學習、對待生活的態度。 再次,感謝我們的同學,因為有你們的幫助,我們的項目才得以順利完成。 參考文獻【1】黃鑫,馬善農,趙永科.基于CPLD的電子琴研究與設計J.科技廣場,2007【2】吳金戌,沈慶陽,郭庭吉,8051單片機實踐與應用M清華大學出版社,2001【3】龍威林,楊冠聲,胡山.單片機應用入門:AT89S51和AVRM.北京:化學工業出版社,2008.【4】張毅剛,MCS-51單片機應用設計M哈爾濱工業大學出版社,2004【5】李朝青. 單

29、片機原理及接口技術M. 北京:北京航天航空大學出版色,2001【6】胡漢才. 單片機原理及其接口技術M. 北京:清華大學出版社,2004【7】陳明熒8051單片機課程設計實訓教材M北京:清華大學出版社,2003年9月【8】徐新艷單片機原理、應用與實踐M北京:高等教育出版社,2005年3月【9】楊恢先,黃輝先.單片機原理及應用M.北京:人民郵電出版社,2006【10】張虹.單片機原理及應用M.北京:中國電力出版社,2009【11】趙亮,侯國銳.單片機C語言編程與實例M.北京:人民郵電出版社,2003附錄附錄1:程序清單C程序(非程序文字)/*說明:*/#include<reg52.h>

30、;#include <intrins.h>#include"config.h"/程序設置頭文件uint16 code music_tab=63628, 63835, 64021, 64103, /低音音階 64260, 64400, 64524, 64580, 64580, 64633, 64732, 64820, /高音音階 64898, 64968, 65030, 65058;uint8 code Ledshow_mus_tab='1', '2', '3', '4', '5',

31、'6', '7', '1', /低音音階字符 '1', '2', '3', '4', /高音音階字符 '5', '6', '7', '1'uint8 code Ledshow_pic_tab= 1, 2, 3, 4, /低音音階頻譜圖 5, 6, 7, 8, 8, 9, 10, 11,/高音音階頻譜圖 12, 13, 14, 15; volatile uint8 KeySta44; /當前的按鍵狀態uint8 xdata

32、 music_save80; /保存音樂的音符uint16 xdata music_time80;/保存音樂的時間uint16 key_time;/音符時間計數uint8 save_count;/保存計數uint8 play_count;/播放計數uint8 play_flag;/播放標志位uint8 pause_flag;/暫停標志位uint16 STL0; /重裝T0值uint16 STH0;void KeyScan();/鍵盤掃描子程序void KeyHandle();/鍵盤按鍵動作判斷子程序void play();/音樂播放子程序void Lcd1602WaitReady();/LCD

33、1602讀繁忙標志位子程序void Lcd1602WriteCmd(uint8 cmd);/LCD1602寫命令子程序void Lcd1602WriteDat(uint8 dat);/LCD1602寫數據子程序void Lcd1602Init();/LCD1602初始化子程序void Lcd1602_show_L1(uint8 dat);/LCD1602第一行顯示子程序void Lcd1602_show_L2(uint8 dat);/LCD1602第二行顯示子程序void play_pause();/音樂播放暫停子程序void delay_ms(uint8 i);/延時1ms子程序/*函數名稱

34、:主函數函數功能:實現對個子函數的掃描調用*/void main()TMOD |= 0x11;/定時器0,方式1 驅動蜂鳴器 0001 0001TMOD &= 0xdd;/定時器1,方式1 用于鍵盤掃描 1101 1101ET0 = 1;/ XX01 XX01ET1 = 1;EA = 1;TR1 = 1;while(1)KeyHandle();play_pause();if(PLAYER)play_flag=1;if(play_flag)play();/*函數名稱:定時器0中斷子程序函數功能:定時不同時間,產生不同頻率的方波,產生音符*/void timer0()interrupt 1

35、/Timer0定時產生特定頻率的波形驅動蜂鳴器TH0 =STH0;TL0 =STL0;SPEAKER=SPEAKER;key_time+;/*函數名稱:定時器1中斷子程序函數功能:定時1ms,調用鍵盤掃描子程序實現按鍵狀態的采集和按鍵的消抖*/void timer1()interrupt 3/Timer1定時1ms,用于按鍵的檢測和消抖 TL1 =0x18 ; TH1 =0xfc ; KeyScan();/*函數名稱:鍵盤掃描子程序函數功能:按鍵狀態的采集,定時1ms和消抖掩碼實現每個按鍵20ms的消抖延時*/void KeyScan() uint8 i; static uint8 iKeyO

36、ut=0; static uint8 KeyScanBuff44; / 掃描按鍵輸入 KeyScanBuffiKeyOut0 = (KeyScanBuffiKeyOut0<<1) | KEY_IN_1) & DEBOUNCE_MASK; KeyScanBuffiKeyOut1 = (KeyScanBuffiKeyOut1<<1) | KEY_IN_2) & DEBOUNCE_MASK; KeyScanBuffiKeyOut2 = (KeyScanBuffiKeyOut2<<1) | KEY_IN_3) & DEBOUNCE_MASK;

37、 KeyScanBuffiKeyOut3 = (KeyScanBuffiKeyOut3<<1) | KEY_IN_4) & DEBOUNCE_MASK;/ 消抖后更新按鍵狀態 for (i=0; i<4; i+) if (KeyScanBuffiKeyOuti = DEBOUNCE_MASK) KeyStaiKeyOuti = KEY_UP; else if (KeyScanBuffiKeyOuti = 0) KeyStaiKeyOuti = KEY_DOWN; / 逐行拉低行輸出 iKeyOut = (iKeyOut+1) & 0x3;/&0x3的作

38、用使iKeyOut在03之間循環 switch (iKeyOut) case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; /*函數名稱:鍵盤按鍵動作判斷子程序函數功能:實判斷按鍵的按下和彈起動作,及執行相關操作*/void KeyHandle() uint8 i

39、, j; static uint8 bkKey44; / 檢索按鍵狀態的變化 for (i=0; i<4; i+) for (j=0; j<4; j+) if (bkKeyij != KeyStaij) /按鍵按下時的操作 if (bkKeyij = KEY_UP) /按鍵按下時播放音樂 STH0 = music_tabi*4+j/256;STL0 = music_tabi*4+j%256;TR0 = 1;/顯示頻譜和音符Lcd1602WriteCmd(0x01); /清屏 Lcd1602_show_L1(Ledshow_pic_tabi*4+j);Lcd1602_show_L2(

40、Ledshow_mus_tabi*4+j);/儲存鍵值music_savesave_count = i*4+j; else /按鍵彈起時的操作/關閉音樂 TR0 = 0;/儲存按鍵按下的時間music_timesave_count = key_time;save_count+;key_time = 0; /時間計數清零 bkKeyij = KeyStaij; /*函數名稱:音樂播放子程序函數功能:播放一個音符,和調用LCD1602顯示子程序*/void play()if(PLAYER) /播放初始時清屏 Lcd1602WriteCmd(0x01); if(play_count=save_cou

41、nt) /判斷是否播放完成, /若播放完成清除各標志和計數save_count=0;play_count=0;play_flag =0;if(play_count<save_count)/播放音樂 STH0 = music_tabmusic_saveplay_count/256;STL0 = music_tabmusic_saveplay_count%256;if(pause_flag) /判斷是否暫停播放TR0 =1;/LCD顯示頻譜和音符Lcd1602_show_L1(Ledshow_pic_tabmusic_saveplay_count);Lcd1602_show_L2(Ledshow_mus_tabmusic_saveplay_count);if(music_timeplay_count < key_time)TR0 =0;key_time=0;play_count+;if(pause_flag) /暫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論