




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
TMS320LF2407DSP實驗指導書鄭群英鄭群英編著重慶大學――美國德州儀器公司數字信號處理解決方案實驗室20038實驗一 TMS320LF2407DSP實驗開發系統及CC軟件應用一.實驗說明DSP微控制器TMS320LF24x芯片作為設計對象,以TMS320LF2407芯片構成的實驗開發系統作為目標系統;用XDS510硬件仿真器通過JTAG接口與開發調試主機聯接,來建立程序的聯機調試環境。Windows版的CodeComposer(簡稱CC)是一個功能強大的高級語言交互式調試器,CC的功能非常子,說明如何使用CC’C2000來開發簡單的匯編程序、編譯并使用仿真器運行這一程序。同學們也可以根據自己的應用問題,嘗試創建新的項目、新的工作組和新的源文件。二.實驗目的認識TMS320LF2407DSP實驗開發系統的硬件結構。了解TMS320LF2407DSP應用程序的開發調試流程。學習使用CC’C2000調試TMS320LF2407DSP程序。三.實驗內容預習附錄四、五中的相關內容CC’C2000使用操作練習四.實驗操作練習下面將引導同學們利用CC’C2000幫助同學們盡快地熟悉集成開發環境CC’C2000典型的使用方法。實驗設備鏈接在聯機調試時,需要將調試主機PC、XDP硬件仿真器及待調試的目標系統按如下方法進行鏈接:JTAGJ2?用并口電纜將PC主機并行口與仿真器相連;?將穩壓電源的輸出調為+5V分別引入P101、23、4中;?將+5VDC/1.5A電源原邊接220V交流電壓,副邊鏈接仿真器外接電源插孔(針對XDSPP仿真器。集成調試軟件安裝(已安裝好,不需要重做)Windows2000操作系統之下,安裝CC4.10版本的CC的全過程參見附錄五。仿真器軟件Driver安裝(參見附錄四)仿真器運行環境設置CCDSP的程序調試。具體操作方法參見附錄四。CC2000的簡單應CC’C2000是CC的核心部分,用于創建和管理項目,為開發人員提供自動化程序高、操作簡便的符號化調試工作平臺。在CC’C2000中的用戶文件是組織成項目的。因此,使用CC’C2000的第一件事是創建新的項目,以說明用戶準備運行軟件的目標系統CPU,并創建項目所包含的文件列表。創建簡單的項目(在本實驗指導書中,若不聲明,點擊或雙擊均指鼠標左鍵)利用CCC2000Projec碼文件和必要的庫文件加入進項目中。具體步驟如下:C:\tic2xx\myprojects\wor?把“C:\tic2xx\c2000\tutorial\realtime”的文件復制到新建立的文件夾中。?在WindowsCC200C1.1所示的CC’C2000操作界面。圖1.1 CC’C2000操作界面?在圖1.1ProjecNe(項目>新建)時,出現一個如圖1.2SaveNewProjectA(另存為項目)對話框,選擇要保存項目文件的文件夾(即前面創建的工作目錄wor本試驗教程中取用“sy1”作為我們新創建的項目文件名輸入并保存。這時CC’C2000會自動創建一個名為“sy1.mak”的項目文件。圖1.2 新項目保存對話框新建、編輯一個簡單的源文件1.1所示的界面中,選擇菜單命令“File>New>SourceFile”(文件>新建>源文件)時,工作區內會出現一個如圖1.3所示的文本編輯窗口,作為創建源文件的編輯窗口,Untitled圖1.3 文本編輯窗口1.3中,若欲為即將輸入的源文件預先命名,那就選用菜單命令“File>SaveAs”(文件>另存為,隨即會出現一個如圖1.4所示的文件“保存為”對話框。圖1.4 保存為對話框在圖1.4sy件存放目錄確保一致。然后點擊“保存”按鈕,對話框消失,文本編輯窗口的標題欄中換成sy(參見圖1.5所示的標題欄).as”保存。然后在文本編輯窗口輸入下面一段程序,作為我們編輯、匯編和調試的實例程序。CC’C2000編輯器不支持漢字編輯工作,分號后面的注釋部分可以用英語或者漢語拼音,也可以使用其他的編輯軟件。由于匯編語言源文件[.asm]屬于ASII碼的純文本文件格式的文件,當然也可以選用Windwos附件中的記事本或寫字板等其它可以編輯純文本文件的軟件.asCC2000調用。CCC2000件整塊剪貼技術;彩色辨識正文等。它的鍵盤命令配合常規的鼠標操作可實現C語言和匯編語言源文件的編輯。1.18。當然,在掌握了本程序后,完全可以充分發揮想象,改變一下程序內容和燈的接法(比如用光耦驅動繼電器來控制霓虹燈,做出各種變化非凡的大型燈光廣告牌。程序清單:.include"vector.h".include"F2407REGS.H".def_c_int0,LEDLED.set0200h.bssDEYH,1.textSYSINIT:;系統初始化子程序SETCINTM;關閉總中斷CLRCSXMCLRCOVMCLRCCNF;B0isconfiguredasdataspaceLDP#SCSR1>>7;SCSR1所在的頁SPLK#81FEH,SCSR1;CLKIN=6M,CLKOUT=24MSPLK#0E8H,WDCR;DisableWDTLDP#IMR>>7SPLK#0h,IMR;disableallinterruptSPLK#0FFFFh,IFR;clearalltheinterruptflagsoffirstlevelLDP#MCRC>>7LACLMCRCAND#0FBFFh;IOPF2口為通用的IO口SACLMCRCLACLPFDATDIROR#0400h;使PF2口為輸出口AND#0FFFBHSACLPFDATDIR;74HC273芯片LACLMCRAAND#0FF00HSACLMCRA;IOPB[0-7]為一般I/O口功能LACLPBDATDIROR#0FF00HAND#0FF00H;IOPB[0-7]為輸出功能,0SACLPBDATDIRRET;*****************************************************************************CLOCK:
LDP
;74HC273驅動脈沖的子程序LACLPFDATDIRLACLPFDATDIROR#0004H;PF2口輸出高電平SACLPFDATDIRRPTNOPLACL#10HPFDATDIR;延時AND#0FFFBH;PF2口輸出低電平SACLRETPFDATDIR;***************************************************************************DELAY: ;延時子程序LDP #DEYH>>7SPLK0FFFFH,DEYHLACLDEYHCON:CLRCSUBC#1EXIT_c_int0BCNDNOPBRETEXIT,NCCON;主程序的入口LOOP1:CALLLDPSYSINIT#LED>>7;系統初始化LOOP:SPLKLDP#0001h,LED#PBDATDIR>>7;LED1LACLPBDATDIR;把PBDATDIRACC寄存器AND#0FF00H;0LDP#LED>>7ORLEDLDP#PBDATDIR>>7SACLPBDATDIR;把需要顯示的值賦給相應的寄存器CALLCLOCK;產生瑣存脈沖LDP#LED>>7LACLLEDCLRCC;清進位位,以免對移位造成影響ROLSACLLED;左移一位CALLDELAY;延時LDP#LED>>7PHANTOMGISR1GISR2GISR3GISR4GISR5GISR6
BIT LED,6BCND B LOOPNOPRETRETRETRETRETRETRET.end
;LEDTC位;LED的移位次數已到,LED重新賦值;循環源程序輸完之后(如圖1.5所示Fil>Sav(文件>保存)及時保存到C:\tic2xx\myprojects\work\sy1asm棄。將文件添加到該項目中
圖1.5 源程序編輯窗口由于項目文件是項目的管理文件,故項目管理的信息都需存放在“sy1.mak”的項目文件中,在對用戶系統進行開發時需要將所需文件包含在項目文件中,即使用工程管理方法:一次性將工程的全部源文件、頭文件、鏈接命令文件、用戶庫文件送入工程管理器,統一管理“匯編/編譯”和“鏈接/定位在圖1.1ProjecOpe(項目>打開,再根據給出ProjectOpe”對話框,選擇已存項目文件所在的文件夾并打開文件(如圖1.6所示,然后再選擇菜單命令“Project>AddFilesToProject”(項目>添加文件到項目),出現一個如1.7所示的“AddFilestoProject.asm匯編源文件、.cmd鏈接命令文件和一個“rts2xx.lib”的庫文件按類一一添加到該項目中,在默認情況下,該庫C:\tic2xx\c2000\cgtools\.lib.hinclude”入其它類型的文件。圖1.6 項目文件選擇對話框察看項目文件
圖1.7 添加文件對話框一旦編譯了文件,Project窗口將用樹型結構顯示項目包含的組和文件的關系,如圖1.8文件是否加入到相應文件夾中。當啟動CC2000VieProjec(觀察>項目ProjecOpenprojec1.9所示,根據給出(如圖1.)的對話框,用前面相同的方法選擇(具體操作參見附錄五。 圖1.8 項目管理窗口 圖1.9 文件操作方法編譯鏈接啟動CC’C2000是:在圖1.1Projec>Ope(項目>打開,以便選定需ProjecRebuildAl(項目>匯編編譯和鏈接所有文件CCC2000sy1.ma”管理下的源文sy1.assy1.ob1.10Buil(創建)窗口,其中倒數第二行用藍色字告訴我們BuildComplet(創建完成CC’C2000匯編編譯器是如何幫助我們查找錯誤的(即錯誤和警告自動定位。1.10創建結果窗口(不成功)根據系統提示該錯誤的類型和位置回到原程序中查看和修改行編譯。如果編譯正確,將會鏈接生成一個文件名為“sy1.out”的可執行文件。再次出現如圖1.11Buil(創建)窗口,最后一行告訴我們了一個可以在CC’C2000環境下用XDS510硬件仿真器進行調試的、完整的項目。1.11創建結果窗口(成功)對于建好的項目,一般情況下,在退出CC’C2000調試環境時,系統會自動將“項目文.wksFile>Save”即可保存到“sy1.asm”文件中。sy1.out”可執行文件裝載到實驗板上之后才能對1.1Fil>LoadProgra(文件>裝載程序1.12LoadProgra文件下載到實驗板上。文件下載之后,就可對文件進行在線調試。圖1.12 程序裝載對話框名必須保持一致。調試程序在設計漏洞,算法()設計是否合理,是否能夠準確地控制各種硬件資源,是否能夠實現預期的功能,等等。CC’C2000的調試環境功能很強,可以在C語言級調試,也可以在匯編語言級調試,并提供了多種運行程序的方式或調試手段,比較常用的有以下幾種:連續運行、設置觀察窗、手段的使用方法:?連續運行方式:在圖1.1所示的界面上,將源程序觀察窗作為當前窗口。首先應選擇菜單命令“DebugResetDS(DSP復位,或者點擊工具欄上的按鈕,使DSP復位,然后選擇菜單命令Debu>Ru(調試>程序運行,或者按動5鍵,或者點擊工具欄上的 圖標按鈕,均可令程序進入實時運行狀態。當輸入上述命令時,我們似乎看不出程序有任何反應,果變為淺色則表明程序正在運行。
由于這段程序結構是無限循環程序結構欲想終止程序運行可點擊工具欄上的 圖標DebuHal(調試>停止Shitf+”組合鍵。隨即,工具欄的顏色復原,表明程序停止運行,并隨機地停留在程序的某一行上。一種很有效的手段。因此,需要進一步探討和選擇其它的調試手段。?設置觀察窗口:CC’C20006個不重疊觀行狀況,進而達到調試程序的目的。實驗教程中調試的這個例子比較簡單,其中用到的寄存器除了ACC、ST0、ST1和PC該變量會被不停地改寫。增設:反匯編觀察窗口、存儲器窗口、CPU寄存器窗口、觀察窗口。詳細用法參見附錄五。存儲器窗口:可直接觀察存儲器的內容。詳細用法參見附錄五。CPU寄存器窗口:其中包含“CPURegister”和“StatusRegister”兩個選項,點擊相應的選項可以觀察調試過程中CPU寄存器和各個狀態位的變化情況。詳細用法參見附錄五。觀察窗口:觀察調試過程中的變量、C表達式、地址和寄存器的值。在圖1.1所示的界VieWatchWindo(視圖>觀察窗口,將有一個空白窗口出現在CC2000窗口的下部,如圖1.13所選擇的變量、寄存器和存儲器的內容。圖1.13 CC2000窗口下的觀察窗口InsertNewExpressio1.13所示。進入所選擇的圖1.14“WatchAddExpression(添加變量對話框O察窗中可以查看到以藍色顯示的變量的物理地址(十進制、符號名和數值。圖1.14 添加變量對話框鼠標右鍵,在彈出的語境菜單中選擇“RemoveCurrentExpression”即可。示出該變量的地址;如果需要顯示該變量的值,則需要在變量名前加“*”號。后緊跟一個逗號和一個格式指示字母。常用的格式指示字母和其代表格式的對應關系如表DEFDEF十進制XXOUC十六進制八進制ASCII字符(字節)?單步運行方式:單步運行是一種控制程序運行過程的有效方法,而且能夠及時觀察到程序的運行狀態。CCC2000桌面上各個觀察法如下:在圖1.1所示的界面上,將源程序觀察窗作為當前窗口,用前面所述方法使DSP復位。然后選擇菜單命令DebuStepInt(調試>單步運行方式,或者按一下鍵盤上的F鍵,8或者點擊工具欄中的 圖標按鈕,均可令程序進入單步運行狀態。一次次地點擊 按鈕的同時,可以看到觀察窗中出現變紅的寄存器或變量,并且其中的值會不斷地及時更新。程序的運行過程。程序的單步運行方式與實時連續運行方式相比,兩者具有很強的互補性。?動畫運行方式動畫運行方式既像連續運行方式那樣自動控制程序的運行過程在圖1.1所示的界面上,也應將源程序觀察窗作為當前窗口,并先讓DSP復位,然后選擇菜單命令DebuAnimat(調試>動畫運行方式,或者按一下鍵盤上的F12
鍵,或者點擊工具欄中的 圖標按鈕,均可令程序進入動畫運行狀態。同時應注意觀察寄存器變量的變化規律,是否符合設計要求。若想讓程序停止,點擊?設置斷點運行方式:
按鈕即可。單步運行那些復雜的或者待調試的程序片段說,設置斷點是控制程序運行過程的另一種有效方法。一種最簡便的設置斷點的方法:在圖1.1所示的界面上確保當前窗口為源程序觀察窗。用光標標記準備設置斷點的源程序語句行后,點擊 圖標按鈕或者雙擊鼠標,此時,選定行會出現紅色背景,表示設置完成;點擊 圖標按鈕,取消所設置的斷點。對已設置斷點的程序進行調試時DSP12個斷點又會暫停,等等一直調試下去。5CCS(以CC4.10版本為例的基本用法,有許多的功能還需要同學們根據自己的習慣愛好去慢慢挖掘。實驗二 常用指令操作實驗一.實驗說明在設計DSP應用系統時,指令組成了DSP系統的應用軟件。由于種種原因,所編寫的軟件中總會存在一些問題,因此必須對軟件進行調試,通過調試修改軟件中不合理的地方。在軟件調試中,一個重要問題是觀察指令執行的結果。例如,在DSP應用系統中輸出一個信號波形,但發現輸出的波形與預期的不同,這時就需要檢查原因。由于DSP指令執方法。二.實驗目的通過在TMS320LF2407DSP實驗開發系統中實際使用指令,初步學會如何使用實驗中的指令。學習指令的功能和基本使用操作方法。學習DSP應用系統中的系統調試方法,學會單步調試的基本方法。學會如何觀察指令的執行結果。三.實驗內容熟悉常用匯編指令。熟悉單步執行的調試方法。熟悉在調試環境下觀察指令的執行結果和相應寄存器內容。四.實驗步驟立即數載入指令實驗操作立即數載入指令包括:累加器載入立即數。向輔助寄存器載入數。DP載入立即數。DP是狀態寄存器的ST0(0~8)位,作為數據空間直接尋址時地址的高9位A15~A。本次練習中,需要完成如下工作:1234h。向累加器裝載立即數ABCDh4位。向輔助寄存器AR3-5裝載立即數。DP的裝載立即數。可以看到,本次練習不僅是向某個寄存器裝載數據,而且還包括向某個寄存器內容指向的某些數據存儲單元裝載數據。實驗時,可以先編寫好上述指令,作為一個程序段進行編譯。然后打開CPU寄存器觀器內容的變化。單步操作前可以通過CPU寄存器觀察窗口對各相關寄存器進行修改,以便更清楚地觀察到指令執行的結果。直接尋址方式下的數據存取對數據空間的直接尋址采用以下兩種方式:程序如下:間接尋址方式下的數據存取在本操作中,練習間接尋址中的操作數存儲器操作。這是利用輔助寄存器ARx(x=0~7)ARx的內容就是數據空間的地址,ARx加星號(*)前綴表示的是ARx中的地址所指向的存儲器單元,而且保存在ARx中的地址在對存儲單元訪問前/后可以進行修改。具體有7種修改方式:;訪問后ARx中地址不變*+ ;訪問后ARx1- ;訪問后ARx10+ ;訪問后ARx中地址加上AR0中的值0- ;訪問后ARx中地址減去AR0中的值BRO+ ;訪問后ARx中地址加上AR0中的值,并反向進位BRO- ;訪問后ARx中地址減去AR0中的值,并反向進位程序編制說明如下:TST寄存器中存放的移位值;語句AR3=#2000h和語句*AR3=#0AC01h2000h的數據單元存放數據AC01h;T=#8和B=*AR3-<<TS-2000h12位載入累加器B中,而且AR311FFFh;(4)語句*,AR3+0=#1111h到語句*,AR3(#16)=#5555h。程序清單如下:加減運算使用加減運行指令時,應當注意有關寄存器的影響,主要有如下兩個:ST1中符號擴展模式位SXM――的設置對加減運算的影響:SXM=0,符號不擴展SXM=1,符號擴展ALU運算模式位C16的設置及其對加減運算的影響:C16=0,雙精度(32位)運算C16=1,16位運算程序清單如下:5.邏輯運算程序清單如下:移位運算程序清單如下:乘法運算本指令操作主要是練習如何完成乘法操作,其中包括乘、加操作。程序清單如下:實驗三 “追燈”式電路控制一.實驗說明輸入/輸出端口(I/O口)是DSP芯片內部電路與外部世界交換信息的通道。輸TMS320LF2407芯片做基本的I/O控制接口。使用循環指令和多種送數延時循環程序,設計DSP的“追燈”控制器,是最容易和最LED展示的變化組合數據事先存在數組中,而在程序中逐一由數組中取出個別的樣本數據送往74HC273鎖存以驅動LED發光二極管SW-DIP8須置ON,便可完成“追燈”式電的變化較多,展示效果較佳。實驗箱中的TMS320LF2407芯片的輸出端口用IOPB0~IOPB7引腳,TMS320LF2407的IOPF274HC273的CLK74HC273的控制信號;TMS320LF2407的RESET(復位)74HC273CLR,復位時,74HC273輸出引腳為低電平。二.實驗目的熟悉基本的TMS320LF240X系列的匯編語言。了解實驗開發系統的基本I/O硬件電路的控制方法。進一步熟悉設計并調試程序的基本方法。三.實驗內容設計并調試用于TMS320LF2407的“追燈”控制器,要求“燈”的花樣和顯示次數均由軟件任意設定。程序要求具有多種不同的燈亮花樣,能實現發光二極管左移、右移即所謂“追燈”功能。四.實驗硬件電路圖3.1 TMS320LF與40LED接口電路五.實驗參考程序清單C程序I/O端口作為輸出(追燈)源程序代碼:vectors.asm”.title.ref.sectint1:int2:int3:int4:int5:
"vectors.asm"_c_int0,_nothing".vectors"b _c_int0b _nothingb _nothingb _nothingb _nothingb _nothingint6: b主程序
_nothing8個LED的循環顯示#include "register.h"initial() //初始化子程序{asm("setcSXM");asm("clrcOVM");asm("clrcCNF");asm("setcINTM");*SCSR1=0x81FE;*WDCR=0x0E8;*IMR=0x0000;*IFR=0x0FFFF;*MCRA=*MCRA&0x0FF;*PBDATDIR=*PBDATDIR|0x0FF00;*MCRC=*MCRC&0X0FBFF;*PFDATDIR=*PFDATDIR|0x0404;
//抑制符號位擴展//累加器中結果正常溢出//B0被配置為數據存儲空間//禁止所有中斷//CLKIN=6M,CLKOUT=4*CLKIN=24M//SCSR2WDOVERRIDE//WD1,故可以用//軟件禁止看門狗//禁止所有中斷"10"http://IOPBI/OTMS320LF240x的//IOPB的設置//IOPB端口設置為輸出方式//IOPF2I/O端口//LED燈//IOPF2IOPF2=1//IOPF2=0//以上的操作產生一個脈沖,使LED全部熄滅}//主程序main(){intled;inti,k;initial();while(1){
//定義一個局部變量//定義其它一些臨時變量//系統初始化for(led=0x0080,i=0;i<8;led=led>>1,i++){*PBDATDIR=*PBDATDIR&0x0FF00;//首先屏蔽IOPB的各位*PBDATDIR=*PBDATDIR|led; //把需要顯示的值賦給IOPB端口*PFDATDIR=*PFDATDIR|0x0404; //IOPF2設置為輸出方式,且IOPF2=1*PFDATDIR=*PFDATDIR&0x0FFFB;//IOPF2=0,這兩句語句給一個脈沖,//LEDIOPB端口的值k=k;}}}
//為了保證顯示時間,給一定時間的延時//直接返回中斷服務程序voidinterruptnothing(){return;}匯編程序;I/O端口作為輸出(追燈);(1) 主程序IOSFT_REG .usect ".data0",1.include "F2407REGS.H"; .include "vector.h"
;要顯示的數據寄存器;引用頭部文件_c_int0:.def.text_c_int0;相當于主程序的入口CALLSYSINIT;調系統初始化程序LDP#DP_PF2;7080h~7100h區LACLMCRAAND#000FFH;IOPBI/O功能SACLMCRALACLMCRCAND#0FBFFH;IOPF2I/O功能SACLMCRCLACLPBDATDIROR#0FF00H;IOPB口設置為輸出方式SACLPBDATDIRLDP#5H;0280h~0300h區SPLK#01H,IOSFT_REG;給顯示的數據賦初值LOOP:LDP#DP_PF2LACLPFDATDIROR#0404H;IOPF2設置為輸出方式,IOPF2=1SACLPFDATDIR;74HC273片選信號LDP#5HLACLIOSFT_REGLDP#DP_PF2OR#0FF00HSACLPBDATDIR;IOPB口LACLPFDATDIRAND#0FFFBH;IOPF2=0 (應該使能顯示)SACLPFDATDIR;74HC273片選信號CALLDELAY;調延時程序LDP#5HLACLIOSFT_REGSFL;左移一位SACLIOSFT_REGBITIOSFT_REG,BIT8;判是否循環完一次,8個發光二極管BCNDLOOP1,TCBWAITLOOP1:LDP#5HSPLK#01H,IOSFT_REG;如循環完一次則顯示數據賦初值WAIT:NOPBLOOP;(2)SYSINIT:SETCINTMCLRCSXMCLRCOVMCLRCCNF;B0被配置為數據存儲空間LDP#0E0HSPLK#81FEH,SCSR1;CLKIN=6M,CLKOUT=24MSPLK#0E8H,WDCR;WDTLDP#0SPLK#0000H,IMR;不使能SPLK#0FFFFH,IFR;清全部中斷標志RET;(3)軟件延時程序DELAY:MAR*,AR4LARAR4,#0FFFEHLARAR0,#00HDELAY1:SBRK#1NOPCMPR00BCNDDELAY1,NTCRET實驗四 按鍵計數器一.實驗說明在控制電路中,通常需要以按鍵來控制程序執行流程或是輸入數據。在圖4.1中,4個K~KTMS320LF2407IOPF3~IOPF4I/O端口的輸入,8只1 4發光二極管LED1~ILED8通過SW-DIP8撥碼開關和74HC273鎖存器芯片分別對應TMS320LF2407芯片的引腳IOPF0~IOPF7作為I/OI/O引腳,8只發光二極管。本實驗箱中的K1TMS320LF2407I/OIOPF3K1鍵,則F數據和方向控制寄存器(PFDATDIR)3位為(IOPF3引腳)0,同時點亮發光二極管。二.實驗目的掌握按鍵的工作原理、按鍵和TMS320LF2407芯片的接口技術以及按鍵輸入程序的設計和調試方法。掌握輸出端發光二極管的工作原理、顯示的信息與程序的設計和調試方法。三.實驗內容設計并調試用于TMS320LF2407芯片的計數程序,要求由按鍵K1作輸入并對其進行計數,計數的結果由LED7~LED0發光二極管以二進制方式顯示。對程序稍作改動,用K4按鍵完成上述功能。四.實驗硬件電路TMS320LF2407與鍵盤、LED接口電路五.實驗參考程序清單通過編程,設計一個按鍵計數器,要求剛接通電源時,8只發光二極管都不亮,表示計000000000BK11,發光二LED000000001B,然后松開按鍵;再次按下K1鍵時,計數器的值又加1,發光二極管LED100000010B,然后再松開按鍵;依次255次按鍵時,發光二極管LED7~LED0會全部點亮,其后的一次K1鍵0,就這樣循環往復。C語言程序說明,vectors.asm都是相同的。源程序代碼:#include intm=0x0001;initial(){asm("asm("
setc SXM");clrc asm(" clrc CNF");*SCSR1=0x81FE;*WDCR=0x0E8;*IMR=0x0000;*IFR=0x0FFFF;*MCRA=*MCRA&0x0FF;*PFDATDIR=*PFDATDIR|0x0400;*PBDATDIR=*PBDATDIR|0x0FF00;*PFDATDIR=*PFDATDIR|0x0404;*PFDATDIR=*PFDATDIR&0xFFFB;}voidinlinedisable(){asm(" setcINTM");}intkeyscan(){intk,j;k=*PFDATDIR&0x0008;if(k==0x0008)k=0;elsek=1;if(k==1){for(j=30000;j>0;j--)j=j;k=*PFDATDIR&0x0008;if(k==0x0008)k=0;elsek=1;}return(k);}intkeyserve(){intk;k=*PFDATDIR&0x0008;if(k==0x0000)*PBDATDIR=(*PBDATDIR&0xFF00)+m++;else*PBDATDIR=*PBDATDIR;*PFDATDIR=*PFDATDIR|0x0404;*PFDATDIR=*PFDATDIR&0xFFFB;}main(){disable();initial();while(1){inti;i=0;i=keyscan();if(i==1)keyserve();}}voidinterruptnothing(){return;}匯編程序;鍵盤與發光二極管配合使用程序st0_temp.usect".b20",1;60st1_temp.usect".b20",1;61contextSTACK.usect.usect".b20",7".stack",40;62-68IOSFT_REG.usect".data0",1;顯示數據移位寄存器IO_COUNT.usect".data0",1;延時計數寄存器IO_DATA.usect".data0",1;I/O臨時數據緩沖區LEDXS.usect".data0",1;LED顯示的數據LEDFLAG.usect".data0",1;LED顯示標志寄存器K1FLAG.usect".data0",1;K1標志寄存器KEYDATA.usect".data0",1;讀得鍵盤值存放寄存器DP_USER.set.include5"F2407REGS.H";引用頭部文件.def _c_int0;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;(1)建立中斷向量表.sect".vectors";定義主向量段RSVECTB_c_int0;PM0 ResetVector 1INT1BPHANTOM;PM2 Intlevel14INT2BGISR2;PM4 Intlevel25INT3BPHANTOM;PM6 Intlevel36INT4BPHANTOM;PM8 Intlevel47INT5BPHANTOM;PMA Intlevel58INT6BPHANTOM;PMC Intlevel69RESERVEDBPHANTOM;PME (AnalysisInt) 10SW_INT8BPHANTOM;PM10 UserS/Wint —SW_INT9BPHANTOM;PM12 UserS/Wint -SW_INT10BPHANTOM;PM14 UserS/Wint -SW_INT11BPHANTOM;PM16 UserS/Wint -SW_INT12BPHANTOM;PM18 UserS/Wint -SW_INT13BPHANTOM;PM1A UserS/Wint -SW_INT14BPHANTOM;PM1C UserS/Wint -SW_INT15BPHANTOM;PM1E UserS/Wint -SW_INT16BPHANTOM;PM20 UserS/Wint -TRAPBPHANTOM;PM22 Trapvector-NMIBPHANTOM;PM24 NonmaskableInt3EMU_TRAPBPHANTOM;PM26 EmulatorTrap2SW_INT20BPHANTOM;PM28 UserS/Wint -SW_INT21BPHANTOM;PM2A UserS/Wint -SW_INT22BPHANTOM;PM2C UserS/Wint -SW_INT23BPHANTOM;PM2E UserS/Wint -SW_INT24BPHANTOM;PM30 UserS/Wint -SW_INT25BPHANTOM;PM32 UserS/Wint -SW_INT26BPHANTOM;PM34 UserS/Wint -SW_INT27BPHANTOM;PM36 UserS/Wint -SW_INT28BPHANTOM;PM38 UserS/Wint -SW_INT29BPHANTOM;PM3A UserS/Wint -SW_INT30BPHANTOM;PM3C UserS/Wint -SW_INT31BPHANTOM;PM3E UserS/Wint—;pvecs.sect ".pvecs"PVECTORS B PHANTOMB PHANTOMB PHANTOMB PHANTOMB PHANTOMB PHANTOM
;定義子向量段;保留向量地址偏移量-0000h;保留向量地址偏移量-0001h;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量B B B
;保留向量地址偏移量-05;SCI_RX_ISR;保留向量地址偏移量;SCI_TX_ISR ;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-0ABPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-10BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-15BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-1ABPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-20BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-25BPHANTOM;-0026hBT1GP_ISR;保留向量地址偏移量-0027h T1PINT中斷BPHANTOM;-0028hBPHANTOM;保留向量地址偏移量BPHANTOM;-2ABPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量B B
;pvectoraddroffset0x02f-T3PINT;保留向量地址偏移量-30BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-35BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-3ABPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-3FB B
;CANMBX_ISR;保留向量地址偏移量;保留向量地址偏移量-0041h;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;(2)主程序.text_c_int0CALLSYSINIT;調系統初始化程序CALLKEYLEDINIT;LED初始化程序LDP#DP_USER;0280h~0300h區SPLK#01H,IOSFT_REG;寄存器和標志初始化SPLK#00H,IO_COUNTSPLK#001H,IO_DATASPLK#001H,LEDXSSPLK#00H,LEDFLAG;LEDFLAG.0=1K1,K2,K3按下;LEDFLAG.0=0K4按下SPLK#01H,K1FLAGCLRCINTM;開總中斷LOOP:CALLKEY;調鍵盤程序,即掃描鍵盤LDP#DP_USERBITLEDFLAG,15BCNDLEDBD1,TCLACLIO_COUNTSUB#03E8HBCNDWAIT,LEQ;10s延時到否LEDBD1:SPLK#00H,IO_COUNTLDP#DP_PF2LACLPFDATDIROR#0404H;IOPF2=1SACLPFDATDIR;74HC273片選信號LDP#DP_USERLACLLEDXSOR#0FF00H;IOPB口為輸出方式LDP#DP_PF2SACLPBDATDIR;IOPB口LACLPFDATDIRAND#0FFFBH;IOPF2=0SACLPFDATDIR;74HC273片選信號LDP#DP_USERBITLEDFLAG,15BCNDLEDBD2,TCLACLLEDXSSFLSACLLEDXSLACLIOSFT_REGSFLSACLIOSFT_REGBITIOSFT_REG,BIT8;判是否循環完一次BCNDLOOP1,TCBWAITLOOP1:LDP#DP_USERSPLK#01H,IOSFT_REG;賦初值LEDBD2:LACLIO_DATASACLLEDXSWAIT:NOPBLOOP;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~系統初始化程序SYSINIT:SETCCLRCCLRCCLRCLDPSPLKSPLKLDPSPLKSPLKLDPSPLK
INTMSXMOVMCNF#0E0H#81FEH,SCSR1#0E8H,WDCR#0#02H,IMR#0FFFFh,IFR#DP_EVA
;B0區被配置為數據空間;7000h~7080h區;4倍頻,CLKIN=6M,CLKOUT=24M;WDT;INT2;清中斷標志;7400h~7480h區;T1PINT中斷SPLKSPLK
#0FFFFh,EVAIFRA ;EVA中斷標志#0,GPTCONASPLK
#0EA6H,T1PR
;10ms產生一次中斷SPLKSPLKRET
#0,T1CNT#0164CH,T1CON ;1;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~鍵盤和發光二極管初始化程序KEYLEDINIT:LDPLACLANDSACLLACLANDSACLLACL
#DP_PF2MCRC#083FFHMCRCMCRA#000FFHMCRA
;IOPF2,IOPF[3~6]配置為一般的I/O口;IOPB[0~7]I/O口OR #0400H ;IOPF2為輸出方式ANDSACLLACLORSACLRET
#08787H#0FF00H
;IOPF[3~6]為輸入方式;IOPB[0~7]為輸出方式;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~鍵盤程序KEY:CALLLACLBCNDCALLCALLLACLBCND
READKEYKEYDATAKEYRET,EQKEYDELAYREADKEYKEYDATAKEYRET,EQ
;調讀鍵程序;ACC=0?;延時消抖動;再一次讀鍵值LDPBITBCND
#DP_USER ;判斷按鍵情況KEYDATA,15KEYRET,NTCKEYRET:
CALLBLACLANDSACLRET
K1KEYRETKEYDATA#0FFF0HKEYDATA
鍵按下;清讀取的鍵值寄存器;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~讀鍵子程序READKEY:LDP #DP_PF2LACLRPTSFRORCMPLLDP
#2#0FFF0H#DP_USER
;取出鍵值PFDATDIR.3~PFDATDIR.6;3位;4位(4個鍵)SACLRET
KEYDATA ;存放鍵值;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~KEYDELAY:KEYD1:
LACCSUBRPTNOPBCNDRET
#6000#1#80KEYD1,NEQ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;(8)鍵子程序K1: ;"+"鍵子程序READK1: CALLCALLLDPBITBCNDSPLKLACLADDSACLRET
KEYDELAYREADKEY#DP_USERKEYDATA,15READK1,TC#01,LEDFLAGIO_DATA#1IO_DATA
;判斷按鍵K1是否松開;LED左移標志,LED對同一個數不刷新;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;(9)中斷程序GISR2:;保護現場
LDPSSTSSTSACLSACHSARSARSARSARSAR
#0#0,st0_temp#1,st1_tempcontextcontext+1AR1,context+2AR2,context+3AR3,context+4AR4,context+5AR5,context+6
;INT2中斷人口;保存機器上下文;DP-0;B2DARAM.;ACC16位;ACC16位LDPLACC
#0E0HPIVR,1 ;讀取外設中斷向量寄存器(PIVR),并左移一位T1GP_ISR:; 恢復現場
ADDBACCLDPLACLADDSACLLDPSPLKLDPLARLARLARLARLARLACCADDSLSTLST
#PVECTORS#DP_USERIO_COUNT#1IO_COUNT#DP_EVA#0AR5,context+6AR4,context+5AR3,context+4AR2,context+3AR1,context+2context+1,16context#1,st1_temp#0,st0_temp
;加上外設中斷入口地址;跳到相應的中斷服務子程序;1中斷入口CLRCRET
INTM ;開總中斷,因為一進中斷就自動關閉總中斷;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;(10)假中斷程序PHANTOMKICK_DOG
RETEND
;復位看門狗實驗五 鍵盤和LED發光二極管顯示電路一.實驗說明在DSPI/OI/O端口的輸出點亮發光二極管,形成的鍵盤、LED4.1所示。二.實驗目的學會配合使用鍵盤與發光二極管的編程方法。進一步認識TMS320LF2407芯片的I/O端口的功能及控制方法。三.實驗內容用TMS320LF240788種花樣顯示。給按鍵定義各種不同功能,以實現對發光二極管循環順序和點亮個數的控制。四.實驗參考程序清單通過編程,使8只發光二極管實現如下顯示功能:按下K1鍵,可點亮8種不同組合的發光二極管花樣模式顯示,按8次為一個循環周期;當按下一次K2鍵,將使設定的發光二1;當按下一次K31位;當按K4鍵或不按鍵時,返回到循環點亮發光二極管模式。110ms10s延時。C程序I/O端口作為輸入和輸出使用源程序代碼:說明,vectors.asm都是相同的。主程序//該程序用于鍵盤的識別,按鍵情況通過LED表示.#include "register.h"http://初始化子程序initial(){asm("setcSXM");asm("clrcOVM");asm("clrcCNF");*SCSR1=0x81FE;*WDCR=0x0E8;*IMR=0x0000;*IFR=0x0FFFF;*MCRA=*MCRA&0x0FF;*PBDATDIR=*PBDATDIR|0x0FF00;*MCRC=*MCRC&0x03FF;*PFDATDIR=*PFDATDIR|0x0400;*PBDATDIR=*PBDATDIR&0x0FF00;*PFDATDIR=*PFDATDIR|0x0404;*PFDATDIR=*PFDATDIR&0x0FFFB;//以上的操作產生一個脈沖,使LED全部熄滅}// 屏蔽中斷子程序void inline disable(){
//抑制符號位擴展//累加器中結果正常溢出//B0被配置為數據存儲空間//CLKIN=6M,CLKOUT=4*CLKIN=24M//SCSR2WDOVERRIDE//WD1,故可以用//軟件禁止看門狗//禁止所有中斷"10"http://IOPBI/O功能//IOPB端口設置為輸出方式//IOPF2IOPF3~6配置為一般的I/O功能//IOPF2端口為輸出端口,IOPF3-IOPF6為輸入端口//LED燈//IOPF2IOPF2=1//IOPF2=0asm("setcINTM");}int keyscan(){intk,j; //定義局部變量k=*PFDATDIR&0x0078;//讀入鍵盤狀態并屏蔽掉相應的位if(k==0x0078) k=0;else k=1;//k=1if(k==1)//若無鍵按下,則直接返回{for(j=30000;j>0;j--) j=j;//若有鍵按下,則延時消抖動k=*PFDATDIR&0x0078;//讀入鍵盤狀態并屏蔽掉相應的位if(k==0x0078) k=0;else k=1;//有還有鍵按下,則k=1}return(k);//K值}intkeyserve()//鍵服務子程序{int k;//定義局部變量k=*PFDATDIR&0x0078;//讀入鍵盤狀態并屏蔽掉相應的位switch(k){case0x0070:*PBDATDIR=(*PBDATDIR&0xFF00)|0X0001;break;//K1鍵,則顯示"1"case0x0068:*PBDATDIR=(*PBDATDIR&0xFF00)|0X0002;break;//K2鍵,則顯示"2"case0x0058:*PBDATDIR=(*PBDATDIR&0xFF00)|0X0003;break;//K3鍵,則顯示"3"case0x0038:*PBDATDIR=(*PBDATDIR&0xFF00)|0X0004;break;//K4鍵,則顯示"4"}*PFDATDIR=*PFDATDIR|0x0404;*PFDATDIR=*PFDATDIR&0x0FFFB;//B端口的值顯示出來}main(){
//IOPF2IOPF2=1//IOPF2=0disable();initial();while(1){
//屏蔽所有中斷//系統初始化inti;i=0;i=keyscan();
//定義局部變量//鍵盤掃描,若有鍵按下,則返回值為"1",否則返回值為"0"if(i==1)}}
keyserve();
//如果有鍵按下,則進行鍵服務程序//直接返回中斷服務子程序voidinterruptnothing(){return;}匯編程序st0_temp.usect".b20",1;60st1_temp.usect".b20",1;61contextSTACK ..usectusect".b20",7".stack",40;62-68IOSFT_REG.usect".data0",1;280;IOPBSHIFTREGIO_COUNT.usect".data0",1;281;IOCOUNTREGIO_DATA.usect".data0",1;282;I/O臨時數據緩沖區LEDXS.usect".data0",1;283;LED顯示的數據LEDFLAG.usect".data0",1;284;LED顯示標志K1FLAGKEYDATA.KEYTIMERDP_USER.usectusect.usect.set".data0",1".data0",1".data0",15;285;286;287;K1標志寄存器.include "F2407REGS.H".def_c_int0~~~~~~~~~~~~~~~~~~~~.sect~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~".vectors" ;定義主向量段RSVECTB_c_int0;PM0 ResetVector 1INT1BPHANTOM;GISR1 ;PM2 Intlevel14INT2BGISR2;PM4 Intlevel2 5INT3BPHANTOM;PM6 Intlevel3 6INT4BPHANTOM;PM8 Intlevel4 7INT5BPHANTOM;GISR5;PMAIntlevel5 8INT6BPHANTOM;PMCIntlevel69RESERVEDBPHANTOM;PME(AnalysisInt)10SW_INT8BPHANTOM;PM10UserS/Wint-SW_INT9BPHANTOM;PM12UserS/Wint-SW_INT10BPHANTOM;PM14UserS/Wint-SW_INT11BPHANTOM;PM16UserS/Wint-SW_INT12BPHANTOM;PM18UserS/Wint-SW_INT13BPHANTOM;PM1AUserS/Wint-SW_INT14SW_INT15SW_INT16TRAPBBBBPHANTOMPHANTOMPHANTOMPHANTOM;PM1C;PM1E;PM20;PM22UserS/WintUserS/WintUserS/WintTrapvector----NMIBPHANTOM;PM24NonmaskableInt3EMU_TRAPBPHANTOM;PM26EmulatorTrap2SW_INT20BPHANTOM;PM28UserS/Wint-SW_INT21BPHANTOM;PM2AUserS/Wint-SW_INT22BPHANTOM;PM2CUserS/Wint-SW_INT23BPHANTOM;PM2EUserS/Wint-SW_INT24BPHANTOM;PM30UserS/Wint-SW_INT25BPHANTOM;PM32UserS/Wint-SW_INT26BPHANTOM;PM34UserS/Wint-SW_INT27BPHANTOM;PM36UserS/Wint-SW_INT28BPHANTOM;PM38UserS/Wint-SW_INT29BPHANTOM;PM3AUserS/Wint-SW_INT30BPHANTOM;PM3CUserS/Wint-SW_INT31BPHANTOM;PM3EUserS/Wint-;===========================================================;pvecs;===========================================================.sect ".pvecs" ;定義子向量段PVECTORSBBBBBBBBBBBBBBBBBBBBB
PHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOMPHANTOM
;保留向量地址偏移量-00;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量-05;SCI_RX_ISR ;保留向量地址偏移量;SCI_TX_ISR ;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量-0a;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量-10;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量;保留向量地址偏移量BPHANTOM;-15BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-1aBPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-20BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-25BPHANTOM;保留向量地址偏移量BT1GP_ISR;保留向量地址偏移量-0027T1PINTBPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-2aBPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量B PHANTOM ;pvectoraddroffset0x02f-T3PINTBPHANTOM;-30BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-35BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-3aBPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;保留向量地址偏移量BPHANTOM;-3fB PHANTOM ;CANMBX_ISR;保留向量地址偏移量B PHANTOM ;保留向量地址偏移量-41;程序段;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;K1=IOPF3,K2=IOPF4,K3=IOPF5,K4=IOPF6,LED的片選信號:IOP;48個發光二極管組合程序,再無鍵按下或K418個發光二極管;K1按下則為功能模式,按鍵的次數不同顯示的發光二極管也不同;K2按下則為“+”鍵模式,按一次加一,點亮不同的發光二極管;K3按下則為移位模式,按一次往右移一位,即LED7=LED6. LED1=LED0,LED0=LED7;注意LED顯示時要關閉LCD的塊選E1E2.text_c_int0
CALLCALL
INIT ;;;;KEYLEDINITLOOP:LEDBD1:
LDPSPLKSPLKSPLKSPLKSPLKSPLKCALLCALLLDPBITBCNDLACLSUBBCNDSPLK
#DP_USER#01H,IOSFT_REG#00H,IO_COUNT#001H,IO_DATA#001H,LEDXS#00H,LEDFLAG#01H,K1FLAGINIT_TIME1KEY#DP_USERLEDBD1,TCIO_COUNT#030HWAIT,LEQ#00H,IO_COUNT
;顯示數據移位寄存器;延時計數寄存器;I/O臨時數據緩沖區;LED顯示的數據K1,K2,K3按下LEDFLAG.0=0K4按下;K1標志寄存器LDPLACLORSACL
#DP_PF2#0004H
;IOPF21;74HC273片選信號LDP#DP_USERLACLLEDXSOR#0FF00H;IOPB是輸出LDP#DP_PF2SACLPBDATDIR;送要顯示的數據LDP#DP_PF2LACLPFDATDIRAND#0FFFBH;IOPF20SACLPFDATDIR;74HC273片選信號LDP#DP_USERBITLEDFLAG,15BCNDLEDBD2,TCLACLSFLSACLLEDXSLEDXS;要顯示的數左移一位LACLSFLSACLIOSFT_REGIOSFT_REGBITIOSFT_REG,BIT8;判是否循環完一次BCNDLOOP1,TCBWAITLOOP1:LDP#DP_USERLEDBD2:SPLKLACL#01H,IOSFT_REGIO_DATAWAIT:SACLLEDXSNOPBLOOPINIT:SETCINTM;系統初始化;關全局中斷CLRCSXM;抑止符號擴展CLRCOVMCLRCCNF;B0配置為數據空間LDP#0E0HSPLK#81FEH,SCSR1;CLKIN=6M,CLKOUT=24MSPLKLDP#0E8h,WDCR#0;關閉看門狗WDTSPLK#0002h,IMR;使能interrupt2SPLK#0FFFFh,IFR;清中斷標志RETINIT_TIME1:
LDPSPLK
#DP_EVA
;1初始化子程序;1周期中斷SPLK SPLKSPLKSPLKSPLKCLRCRET
#0,GPTCONA#0BBH,T1PR#00H,T1CNT#0174CH,T1CONINTM
1比較輸出;1ms產生一次中斷;1計數單元;TMODE=10(連續增模式),;TPS=111X/128,,CLOCK=Internal,1KEYLEDINIT:
LDPLACLANDSACLLACLANDSACL
#DP_PF2MCRC#083FFHMCRCMCRA#000FFHMCRA
;LED初始化子程序;IOPF2--IOPF6I/O口;IOPB[0-7]I/O口LACLOR
PFDATDIR#0400H IOPF2為輸出方式ANDSACLLACLSACL
#087FBH#0FF00H
;IOPF[3-6]為輸入方式;IOPB[0-7]為輸出方式RET;********************************************************************KEY:CALLLACLBCNDCALLCALL
READKEYKEYDATAKEYRET,EQKEYDELAYREADKEY
;讀鍵盤值;ACC=0?;KEYDATA0,表示有鍵按下,延時消抖動;鍵盤軟件延時子程序BCNDKEYRET,EQLDP#DP_USER;判斷按鍵情況(考慮只有一個鍵按下)BITKEYDATA,15BCNDKEY1,NTCCALLK1;KEY1功能鍵BKEYRETKEY1:BITKEYDATA,14BCNDKEY2,NTCCALLK2;KEY2"+"鍵BKEYRETKEY2:BITKEYDATA,13BCNDKEY3,NTCCALLK3;KEY3移位"鍵BKEYRETKEY3:BITKEYDATA,12;KEY4確認鍵BCNDKEYRET,NTCCALLK4KEYRET:LACLKEYDATA;KEYDATA4位AND#0fff0hSACLKEYDATARET;*****************讀鍵盤子程序*******************************************READKEY:;判鍵盤狀態子程序LDP#DP_PF2;DP-->7080h-70FFhLACLPFDATDIR;取出鍵值PFDATDIR.3--PFDATDIR.6RPT#2SFR;3位OR#0fff0h;4位(4個鍵)CMPL;有鍵盤按下時對應位為低,按位取反之后為高LDP#DP_USERSACLKEYDATA;KEYDATA中RETKEYDELAY:LACC#6000;86ms(20000)30mS(6000)KEYD1:
SUBRPTNOPBCNDLDP
#1 ;#080HKEYD1,NEQ#5RET********************功能鍵子程序*****************************K1:NOPREADK1:CALLREADKEYCALLKEYDELAYLDP#DP_USER;判斷按鍵K1是否松開BITKEYDATA,15BCNDREADK1,TCLDP#DP_USER;可擴展成16個或更多分支SPLK#01H,LEDFLAGBITK1FLAG,15BCNDGN_KEY1,TCBITK1FLAG,14BCNDGN_KEY2,TCBITK1FLAG,13BCNDGN_KEY3,TCBITK1FLAG,12BCNDGN_KEY4,TCBITK1FLAG,11BCNDGN_KEY5,TCBITK1FLAG,10BCNDGN_KEY6,TCBITK1FLAG,9BCNDGN_KEY7,TCBITK1FLAG,8BCNDGN_KEY8,TCBK1_RETGN_KEY1:GN_KEY2:GN_KEY3:GN_KEY4:GN_KEY5:
SPLK B K1_LOOP1SPLK B K1_LOOP1SPLK B K1_LOOP1SPLK B K1_LOOP1SPLK B K1_LOOP1
;K111H;K123H;K135H;K147H;K1511HGN_KEY6:SPLK#33H,IO_DATA;K1633HGN_KEY7:BSPLKK1_LOOP1#55H,IO_DATA;K1755HGN_KEY8:BSPLKK1_LOOP1#77H,IO_DATA;K1877HBK1_LOOP1K1_LOOP1:LACLK1FLAGSFLSACLK1FLAG;K1FLAG左移一位BITK1FLAG,7BCNDK1_LOOP2,TCBK1_RETK1_LOOP2:K1_RET:SPLKNOP#01H,K1FLAGRET;======="+"鍵子程序===========================K2:READK2:
NOPCALLCALLLDPBITBCND
READKEYKEYDELAY#DP_USERKEYDATA,14READK2,TC
;判斷按鍵K2是否松開LDPSPLKLACLSACLRET
#DP_USER#01,LEDFLAGIO_DATAIO_DATA
;LED左移標志,LED對同一個數不刷新;======="移位"鍵子程序===========================K3:NOPREADK3:CALLREADKEYCALLKEYDELAYLDP#DP_USER;判斷按鍵K3是否松開BITKEYDATA,13BCNDREADK3,TCLDP#DP_USERSPLK#01H,LEDFLAGLACLSFRSACLIO_DATAIO_DATABCNDK3_LOOP1,NCLACL#80HADDIO_DATAK3_LOOP1:SACLIO_DATARET;=======確認鍵子程序===========================K4:READK
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年生鮮供應鏈優化與冷鏈物流企業戰略布局與實施路徑報告
- 造價分章節試題及答案
- 2025年在線職業教育行業市場潛力與課程創新模式研究報告
- 砌筑合同解除協議書
- 公文寫作筆試試題及答案
- 國際教育在中國市場擴張中的師資力量與培訓體系研究報告
- 太保資管面試題目及答案
- 飯店管理考試題目及答案
- 環衛合同轉包協議書模板
- 泥漿簡易運輸合同協議書
- 供電系統 西南交通大學中國大學mooc課后章節答案期末考試題庫2023年
- 農藥安全使用技術
- 骨纖的影像學診斷
- 三年級下冊安全教育課件
- 公路物流運輸項目整體服務投標方案(技術標)
- 2024新版護欄加工合同范本doc
- 沖壓模具畢業設計答辯課件
- 實驗室質量控制規范 考試題附有答案
- ECMO并發癥教學課件
- 胸椎骨折的護理查房
- 【知識精講精研】高中英語備課組長工作匯報
評論
0/150
提交評論