智能儀器課程設計---基于spce061a單片機的六位七段led數(shù)碼管顯示設計_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  摘 要</b></p><p>  隨著計算機的越來越普及,人們對與信息的了解也越來越方便。而對于人機交流這塊現(xiàn)在也是大家在重點研究的方面,像鍵盤等外部設備能提供給我們交流的平臺。而除了PC機系統(tǒng)外想單片機、PLC等小型系統(tǒng)需要更適合的人機界面。多位LED設備就可以很好的完成這一任務,而且相比PC機等成本更加合理。</p><p> 

2、 本次課程設計是基于SPCE061A單片機的六位七段LED數(shù)碼管顯示設計,其是凌陽科技的一款16位微控制器,內(nèi)嵌32KB閃存和2KB字SRAM。CPU最高可工作在49MHz的主頻下,較高的處理速度使SPCE061A能夠非常容易、快速地處理復雜的數(shù)字信號。其中的六段七位LED數(shù)碼管可以很迅速的實現(xiàn)從“000000”到“999999”的顯示變化。</p><p>  關鍵詞:SPCE061A單片機,六段七位LED數(shù)碼

3、管</p><p><b>  目 錄</b></p><p>  1. 實驗箱簡介2</p><p>  2.設計總體思路4</p><p><b>  2.1設計思路4</b></p><p><b>  3.硬件部分6</b></p

4、><p>  3.1各部分元件介紹6</p><p>  3.1.1 SPCE061A6</p><p>  3.1.2 6位7段數(shù)碼管工作原理7</p><p>  3.2硬件設計方案8</p><p>  3.3基本原理10</p><p><b>  4.軟件部分10&l

5、t;/b></p><p>  4.1中斷服務程序流程圖10</p><p>  4.2設計步驟12</p><p><b>  4.3主程序13</b></p><p>  5. 調(diào)試結果及分析24</p><p>  6.總結與心得27</p><p>

6、<b>  7.參考文獻28</b></p><p><b>  實驗箱簡介</b></p><p><b>  1.1整體介紹 </b></p><p>  凌陽十六位單片機(SPCE061A)實驗箱是集單片機應用技術、在線調(diào)試、在線仿真等功能于一體的強大開發(fā)系統(tǒng),SPCE061A及其系列產(chǎn)品將帶

7、領MCU的應用邁入片上系統(tǒng)(SOC)時代,使在體驗凌陽音頻的歡快愉悅中輕松步入單片機及其嵌入式系統(tǒng)的流行領域?!?lt;/p><p>  圖1-1 實驗箱實物圖 </p><p><b>  1.2功能特點</b></p><p>  凌陽科技大學計劃實驗箱的主要硬件配置: </p><p> ?。?)主控芯片SPCE061

8、A,凌陽16位單片機。 </p><p> ?。?)4×4矩陣鍵盤和6位8段數(shù)碼管,采用動態(tài)掃描方式驅動4×4矩陣鍵盤。 </p><p> ?。?)1×8高低電平發(fā)生按鍵和8個發(fā)光二極管。 </p><p> ?。?)I/O可選5V∕3.3V輸出電路以及可選外部電壓輸入電路。 </p><p>  (5)兩路0

9、-3V可調(diào)A/D輸入電壓,為A/D數(shù)據(jù)采集等提供便利。</p><p>  (6)雙色8×8 LED點陣,可以完成圖形、字模顯示。 </p><p> ?。?)RS232接口可實現(xiàn)直接與PC機進行通訊。 </p><p> ?。?)利用串行設備輸入輸出接口(SIO接口)擴展外部存儲芯片SPR4096A,為實驗箱系統(tǒng)增加4M Bits Flash 或32K

10、Bits SRAM的存儲空間。 </p><p> ?。?)USB1.1 接口,提供完整的單片機固體程序、上位機驅動程序源代碼及其完整的軟件包和應用范例,可直接進行USB通訊。 </p><p> ?。?0)帶背光的128×64點陣液晶模組,內(nèi)藏凌陽的一款LCD驅動芯片SPLC501,采用最新的COG(Chip on Glass)技術使驅動和液晶合二為一。 </p>

11、<p> ?。?1)兩路音頻輸出電路,采用凌陽音頻功放芯片SPY0030A,可以充分體驗SPCE061A帶來的聽覺效果。 </p><p>  (12)MIC 輸入電路,配合SPCE061A內(nèi)部的AGC和OPI電路,可獲得理想的語音效果。 </p><p>  (13)SPCE061A內(nèi)置ICE電路,配合凌陽在線調(diào)試器PROBE和軟件開發(fā)環(huán)境IDE可方便的實現(xiàn)在線編程、仿真、下

12、載、調(diào)試等功能。</p><p><b>  2.設計總體思路</b></p><p><b>  2.1設計思路 </b></p><p>  本次設計要求完成基于單片機六位七段LED數(shù)碼管的顯示系統(tǒng)的設計。運行開始點亮所有的數(shù)碼管,6位LED數(shù)碼管均顯示0并持續(xù)1s。1s后,第一位數(shù)碼管從0顯示到9,刷新時間為0.5

13、s,其他數(shù)碼管全部顯示0。當?shù)谝晃粩?shù)碼管顯示到9后,第一位數(shù)碼管保持顯示9,第二位數(shù)碼管從0顯示到9,刷新時間為0.5s,其他數(shù)碼管顯示0。依次直到第6位數(shù)碼管顯示9,即6位數(shù)碼管全部顯示9,6位數(shù)碼管全部顯示0,持續(xù)1s,如此循環(huán)。(1s的時間、0.5s的時間都使用2Hz的時基信號(IRQ5)提供)。6位數(shù)碼管的顯示狀態(tài)見。 </p><p>  2.2 主程序流程圖</p><p>

14、  主程序流程圖如圖2-1。先進行系統(tǒng)初始化;開2Hz中斷;進入數(shù)碼管循環(huán)顯示程序:判斷位信號寄存器是否為0(位信號寄存器由讀者自己定義,這個寄存器的內(nèi)容在中斷里會改變),如果為0,6位數(shù)碼管顯示“000000”;如果不為零,按照位信號和段碼顯示數(shù)據(jù)進行顯示。</p><p>  圖 2-1 系統(tǒng)流程圖</p><p><b>  3.硬件部分</b></p&g

15、t;<p>  3.1各部分元件介紹</p><p>  3.1.1 SPCE061A</p><p>  SPCE061A提供了位控制結構的I/O端口,每一位都可以被單獨定義用于輸入或輸出數(shù)據(jù)。通常,對某一位的設定包括以下3個基本項:數(shù)據(jù)向量Data、屬性向量Attribution和方向控制向量Direction。3個端口內(nèi)每個對應的位組合在一起,形成一個控制字,用來定義相

16、應I/O口位的輸入輸出狀態(tài)和方式。SPCE061A有32個可編程I/O端口,分為兩組:IOA0~15口和IOB0~15口,其中每一個端口都可以被單獨設置為輸入或者輸出口。</p><p>  圖 3-1 SPCE061A結構圖</p><p>  3.1.2 6位7段數(shù)碼管工作原理</p><p>  首先介紹兩個基本概念:段碼和位碼,段碼即段選信號SEG,它負責數(shù)

17、碼管顯示的內(nèi)容,圖4-2中a~g、dp 組成的數(shù)據(jù)(a 為最低位,dp 為最高位)就是段碼。比如1的段碼“0x06”(b=1,c=1,其他都為0,即段碼為00000110b),8 的段碼為“0x7f”;位碼即位選信號DIG,它決定哪個數(shù)碼管工作,哪個數(shù)碼管不工作,比如僅使能DIG4,那么4 個LED 只有LED4 工作,而其它的三個都不工作。當需要某一位數(shù)碼管顯示數(shù)字時,只需要先選中這位數(shù)碼管的位信號,再給顯示數(shù)字的段碼。比如當在第一個

18、數(shù)碼管上顯示一個“6”時,如圖3-4,先選中第一位數(shù)碼管的位信號(實驗儀上標號是“DIG1”),即先給和“DIG1”相連接的I/O 口送1;再把段碼設置為0x007d,即在a、c、d、e、f、g 各段引出的端口為高電平,就可以顯示一個“6”出來。</p><p>  圖3-2 數(shù)圖碼管示意</p><p>  圖 3-3 數(shù)碼管電路圖</p><p>  圖 3-4

19、 數(shù)碼管顯示“6”</p><p><b>  3.2硬件設計方案</b></p><p>  硬件連接圖如圖3-3,IOA0~IOA7分別接數(shù)碼管的7個段信號a~g和小數(shù)點信號dp,IOB15~IOB12連接數(shù)碼管的位信號1~4,IOB2~IOB1連接數(shù)碼管的位信號5~6,IOB0連接數(shù)碼管的分隔符號信號DD,即把JP4和JP5的引針用跳線全部短接。</p&g

20、t;<p>  實驗箱在6位8段數(shù)碼管的上面有16對排針,其中有7個“a\b\c\d\e\f\g\”是控制此6位8段數(shù)碼管的段碼選擇的,另有6個“1\2\3\4\5\6”是控制6位8段數(shù)碼管位選擇的,“DD”控制“點”或“分隔符號”,“DP”控制小數(shù)點。把實驗箱上JP4和JP5的引針用跳線全部短接。框圖如圖3-4。</p><p>  圖 3-3 試驗箱上SPCE061A和6位LED顯示電路模塊的連

21、接</p><p>  圖 3-4實物連接圖</p><p><b>  3.3基本原理</b></p><p>  本實驗用到的實驗箱硬件模塊為:SPCE061A核心及周邊電路模塊(包含32個I/O口),6位8段數(shù)碼管電路模塊。</p><p>  圖 3-5 硬件原理圖</p><p>&l

22、t;b>  4.軟件部分</b></p><p>  4.1中斷服務程序流程圖</p><p>  由于顯示數(shù)據(jù)的刷新時間為1s和0.5s,因此考慮采用2Hz(0.5s)時基中斷。并且在中斷內(nèi)部完成段碼數(shù)據(jù)更新。具體的流程如圖 4-6示:在中斷服務程序中會用到三個重要的寄存器:中斷計數(shù)寄存器、顯示數(shù)據(jù)寄存器、位信號寄存器。其中中斷計數(shù)寄存器用于記錄第幾次進入中斷(前3次有

23、效),顯示數(shù)據(jù)寄存器的內(nèi)容為當前被刷新顯示數(shù)據(jù)的數(shù)值(0~9),位信號寄存器用于標識被刷新數(shù)據(jù)所在位。結合主程序分析中斷程序:首先顯示“000000”時需要延時1s,使用2Hz中斷產(chǎn)生1s延時,需要連續(xù)響應兩次中斷,第二次響應中斷延時滿1s,設置顯示數(shù)據(jù)寄存器和位信號寄存器,讓第一位數(shù)碼管顯示1,其余各位仍為“0”,即顯示“100000”;判斷顯示數(shù)據(jù)寄存器顯示數(shù)據(jù)是否大于9,如果小于,顯示數(shù)據(jù)寄存器數(shù)據(jù)加1;如果大于,判斷位信號寄存器

24、是否已經(jīng)指向第六位數(shù)碼管,否則位信號寄存器設置為指向下一位數(shù)碼管,顯示數(shù)據(jù)寄存器顯示數(shù)據(jù)設置為0;如果已經(jīng)指向第六位數(shù)碼且顯示數(shù)據(jù)寄存器為9,寄存器清零,清中斷標志,中斷返回。 </p><p>  圖 4-1 中斷服務程序流程圖</p><p><b>  4.2設計步驟</b></p><p>  1. 新建一個工程ex1_Led_Show

25、,新建一個C語言文件main.c,新建一個匯編語言文件isr.asm。(根據(jù)讀者需要可以自己新建文件) </p><p>  2. 拷貝頭文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,這兩個文件在IDE的安裝路徑\SPCE061A\include路徑下可以找到。</p><p>  3. 添加SPCE061A.h、SPCE061A.inc到工程的“H

26、ead Files”;添加后可以直接用這兩個頭文件中申明的變量或者地址單元。</p><p>  4. 按照程序流程圖編寫程序。</p><p>  5. Rebuild All。</p><p>  6. 按照硬件連接圖連接電路,注意斷開JP3和JP7的所有引針,以免影響輸出顯示數(shù)據(jù)。</p><p>  7. 下載程序到實驗箱,根據(jù)數(shù)碼管

27、顯示的現(xiàn)象,判斷是否和實驗要求相統(tǒng)一。</p><p>  8. 觀察LED顯示數(shù)據(jù)和實驗箱播報的數(shù)據(jù),分析是不是和實驗要求相統(tǒng)一。</p><p><b>  4.3主程序</b></p><p>  #include "SPCE061A.h"</p><p>  #include "Di

28、g.h"</p><p>  #define C_IRQ5_2Hz0x004</p><p>  unsigned int g_uiFirst = 0x0000;//用于控制1s延時</p><p>  unsigned int g_uiFlag;//用于控制數(shù)碼管</p><p>  unsignedintg

29、_Data[11]={0x0000,0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f</p><p>  }; //0,1, 2, 3, 4, 5, 6, 7,8,9</p><p>  unsigned int g_uiSeg;//段碼指針

30、</p><p>  int main(void)</p><p><b>  {</b></p><p>  unsigned int Dis1[6] = {0x003f,0x003f,0x003f,0x003f,0x003f,0x003f};</p><p>  unsigned int uiIntStatus;&l

31、t;/p><p>  uiIntStatus = *P_INT_Ctrl_New; //開2Hz中斷</p><p>  uiIntStatus |= C_IRQ5_2Hz;</p><p>  *P_INT_Ctrl = uiIntStatus;</p><p>  g_uiFlag = 0x0000;//該變量在2Hz

32、中斷當中會被修改</p><p>  g_uiSeg = 0;//該變量在2Hz中斷當中會被修改,以便及時刷新顯示</p><p>  DIG_Init(); //顯示初始化,同時會打開IRQ4的4KHz中斷</p><p><b>  while(1)</b></p><p><b>  {</

33、b></p><p>  if(g_uiFlag == 0x0000) </p><p><b>  {</b></p><p>  DIG_SetAll(Dis1); //設置數(shù)碼管全部顯示0</p><p><

34、;b>  }</b></p><p>  if(g_uiFlag != 0x0000)</p><p><b>  {</b></p><p>  DIG_Set(g_uiFlag,g_Data[g_uiSeg]);//刷新6位數(shù)碼管顯示值</p><p><b>  }</b>

35、;</p><p>  *P_Watchdog_Clear = 0x0001;</p><p><b>  }</b></p><p><b>  }</b></p><p>  .INCLUDE SPCE061A.inc</p><p>  .INCLUDE Dig.inc

36、</p><p>  .EXTERNAL _g_uiFirst</p><p>  .EXTERNAL _g_uiFlag</p><p>  .EXTERNAL _g_uiSeg</p><p><b>  .TEXT</b></p><p>  .PUBLIC _IRQ4</p>

37、<p><b>  _IRQ4:</b></p><p>  push r1,r5 to [sp]</p><p>  r1 = C_IRQ4_1KHz</p><p>  test r1,[P_INT_Ctrl]</p><p>  jnz ?L_IRQ4_1KHz</p><p>

38、  r1 = C_IRQ4_2KHz</p><p>  test r1,[P_INT_Ctrl]</p><p>  jnz ?L_IRQ4_2KHz</p><p>  ?L_IRQ4_4KHz:</p><p>  call F_DIG_Drive //F_DIG_Drive函數(shù)是數(shù)碼管顯示函數(shù),定義在Dig.asm文件<

39、;/p><p>  r1 = C_IRQ4_4KHz</p><p>  [P_INT_Clear] = r1</p><p>  pop r1,r5 from [sp]</p><p><b>  reti</b></p><p>  ?L_IRQ4_2KHz:</p><p&g

40、t;  [P_INT_Clear] = r1</p><p>  pop r1,r5 from [sp]</p><p><b>  reti</b></p><p>  ?L_IRQ4_1KHz:</p><p>  call F_DIG_Drive</p><p>  [P_INT_Clear

41、] = r1</p><p>  pop r1,r5 from [sp]</p><p><b>  reti</b></p><p>  .PUBLIC _IRQ5</p><p><b>  _IRQ5:</b></p><p>  push r1,r5 to [sp]&

42、lt;/p><p>  r1 = C_IRQ5_2Hz</p><p>  test r1,[P_INT_Ctrl]</p><p>  jnz ?L_IRQ5_2Hz</p><p>  ?L_IRQ5_4Hz:</p><p>  r1 = C_IRQ5_4Hz</p><p>  [P_INT

43、_Clear] = r1</p><p>  pop r1,r5 from [sp]</p><p><b>  reti</b></p><p>  ?L_IRQ5_2Hz:</p><p>  r1 = [_g_uiFirst]</p><p>  cmp r1,0x0001

44、//第2次進入中斷</p><p>  ja ?Start//時間〉=1s</p><p>  r1 = [_g_uiFirst]//時間小于1s</p><p><b>  r1 += 1</b></p><p>  [_g_uiFirst] = r1</p><p&g

45、t;  goto ?Exit</p><p><b>  ?Start:</b></p><p>  r1 = [_g_uiFirst]</p><p>  cmp r1,2//1s</p><p><b>  jne ?Next</b></p><p&

46、gt;  r1 += 1//初始化g_uiFlag、g_uiSeg顯示"1000000"</p><p>  [_g_uiFirst] = r1</p><p><b>  r1 = 1</b></p><p>  [_g_uiFlag] = r1</p><p><b> 

47、 r1 = 2</b></p><p>  [_g_uiSeg] = r1</p><p>  goto ?Exit</p><p>  ?Next:</p><p>  r1 = [_g_uiSeg]</p><p>  cmp r1,9 //更改段碼指針

48、,顯示數(shù)值加1</p><p><b>  ja ?Next1</b></p><p><b>  r1 += 1</b></p><p>  [_g_uiSeg] = r1</p><p>  goto ?Exit</p><p>  ?Next1:&l

49、t;/p><p>  r1 = [_g_uiFlag]//更改被刷新數(shù)碼管位</p><p><b>  cmp r1,6</b></p><p><b>  je ?Last</b></p><p><b>  r1 += 1</b></p><

50、p>  [_g_uiFlag] = r1</p><p><b>  r1 = 2</b></p><p>  [_g_uiSeg] = r1</p><p>  goto ?Exit</p><p><b>  ?Last:</b></p><p>  r1 = 0x

51、0000//置標志,重新顯示“000000”</p><p>  [_g_uiFirst] = r1</p><p>  [_g_uiFlag] =r1</p><p>  goto ?Exit</p><p><b>  ?Exit:</b></p><p>  r1 = C_I

52、RQ5_2Hz</p><p>  [P_INT_Clear] = r1</p><p>  pop r1,r5 from [sp]</p><p><b>  reti</b></p><p>  .DEFINE SEG_IO_Port0// 若LED段選使用IOA口則采用該行定義</p>&l

53、t;p>  .DEFINE SEG_IO_Port 1 // 若LED段選使用IOB口則采用該行定義</p><p>  .DEFINE SEG_IO_HighByte0// 若LED段選使用IO口低8位則采用該行定義</p><p>  .DEFINE SEG_IO_HighByte 1 // 若LED段選使用IO口高8位則采用該行定</

54、p><p>  LED位控制端口設定</p><p>  .DEFINE DIG_IO_Port 0// 若LED位選使用IOA口則采用該行定義</p><p>  .DEFINE DIG_IO_Port1// 若LED位選使用IOB口則采用該行定義</p><p><b>  數(shù)碼管的位數(shù) </b>

55、</p><p>  .DEFINE DIG_Count6</p><p>  數(shù)碼管每一位的控制腳設定 </p><p>  .DATAPIN_DIG:</p><p>  .DW 0x8000,0x4000,0x2000,0x1000,0x0004,0x0002,0x0001;</p><p>  數(shù)碼

56、管所有位的控制腳設定,應等于PIN_DIG所有數(shù)之和</p><p>  .DEFINE PIN_DIG_ALL0xf007</p><p>  .IFSEG_IO_Port==0</p><p>  .DEFINE P_SEG_Data0x7000</p><p>  .DEFINE P_SEG_Buf0x7001

57、</p><p>  .DEFINE P_SEG_Dir0x7002</p><p>  .DEFINE P_SEG_Attrib0x7003</p><p><b>  .ELSE</b></p><p>  .DEFINE P_SEG_Data0x7005</p><p>  .DE

58、FINE P_SEG_Buf0x7006</p><p>  .DEFINE P_SEG_Dir0x7007</p><p>  .DEFINE P_SEG_Attrib0x7008</p><p><b>  .ENDIF</b></p><p>  .IF SEG_IO_HighByte==0</p&

59、gt;<p>  .DEFINE PIN_SEG_ALL0x00ff</p><p><b>  .ELSE</b></p><p>  .DEFINE PIN_SEG_ALL0xff00</p><p><b>  .ENDIF</b></p><p>  .IFDIG_I

60、O_Port==0</p><p>  .DEFINE P_DIG_Data0x7000</p><p>  .DEFINE P_DIG_Buf0x7001</p><p>  .DEFINE P_DIG_Dir0x7002</p><p>  .DEFINE P_DIG_Attrib0x7003</p><

61、p><b>  .ELSE</b></p><p>  .DEFINE P_DIG_Data0x7005</p><p>  .DEFINE P_DIG_Buf0x7006</p><p>  .DEFINE P_DIG_Dir0x7007</p><p>  .DEFINE P_DIG_Attrib

62、0x7008</p><p><b>  .ENDIF</b></p><p><b>  中斷常量定義</b></p><p>  .DEFINE P_INT_Mask0x702d</p><p>  .DEFINE C_IRQ4_4KHz0x0040</p><p

63、><b>  變量定義</b></p><p><b>  .RAM</b></p><p>  R_DIG_Buf:.DW DIG_Count DUP (?)// 數(shù)碼管顯示緩沖區(qū)</p><p><b>  .IRAM</b></p><p>  R_Cur

64、DIG:.DW 0xffff// 當前顯示的數(shù)碼管位,0xffff表示不顯示</p><p><b>  公有函數(shù)聲明</b></p><p>  .PUBLIC F_DIG_Init</p><p>  .PUBLIC _DIG_Init</p><p>  .PUBLIC F_DIG_Set</p&

65、gt;<p>  .PUBLIC _DIG_Set</p><p>  .PUBLIC F_DIG_SetAll</p><p>  .PUBLIC _DIG_SetAll</p><p>  .PUBLIC F_DIG_Get</p><p>  .PUBLIC _DIG_Get</p><p>  .

66、PUBLIC F_DIG_GetAll</p><p>  .PUBLIC _DIG_GetAll</p><p>  .PUBLIC F_DIG_Drive</p><p>  .PUBLIC _DIG_Drive</p><p>  .PUBLIC F_DIG_Off</p><p>  .PUBLIC _DIG_

67、Off</p><p>  .PUBLIC F_DIG_On</p><p>  .PUBLIC _DIG_On</p><p><b>  .code</b></p><p>  數(shù)碼管顯示初始化,該函數(shù)將開啟IRQ4_4KHz中斷</p><p>  _DIG_Init:</p>

68、<p>  F_DIG_Init:</p><p>  push r1,bp to [sp]</p><p><b>  INT Off</b></p><p>  r1 = DIG_Count</p><p>  r2 = 0x0000</p><p>  bp = R_DIG_Bu

69、f</p><p>  ?DIG_InitBuf:// 清除顯示緩沖區(qū)</p><p>  [bp++] = r2</p><p><b>  r1 -= 1</b></p><p>  jnz ?DIG_InitBuf</p><p>  [R_CurDIG] = r2//

70、當前顯示的位設置為0</p><p>  r1 = [P_SEG_Attrib]// 初始化段選IO</p><p>  r1 |= PIN_SEG_ALL</p><p>  [P_SEG_Attrib] = r1</p><p>  r1 = [P_SEG_Buf]</p><p>  r1 &= ~

71、PIN_SEG_ALL</p><p>  [P_SEG_Data] = r1</p><p>  r1 = [P_SEG_Dir]</p><p>  r1 |= PIN_SEG_ALL</p><p>  [P_SEG_Dir] = r1</p><p>  r1 = [P_DIG_Attrib]// 初始化

72、位選IO</p><p>  r1 |= PIN_DIG_ALL</p><p>  [P_DIG_Attrib] = r1</p><p>  r1 = [P_DIG_Buf]</p><p>  r1 &= ~PIN_DIG_ALL</p><p>  [P_DIG_Buf] = r1</p>

73、<p>  r1 = [P_DIG_Dir]</p><p>  r1 |= PIN_DIG_ALL</p><p>  [P_DIG_Dir] = r1</p><p>  r1 = [P_INT_Mask]// 開啟IRQ4_4KHz中斷</p><p>  r1 |= C_IRQ4_4KHz</p>&

74、lt;p>  [P_INT_Mask] = r1</p><p>  INT FIQ,IRQ</p><p>  pop r1,bp from [sp]</p><p><b>  retf</b></p><p>  設置數(shù)碼管某一位的顯示內(nèi)容</p><p><b>  _DI

75、G_Set:</b></p><p>  push r1,r2 to [sp]</p><p>  r1 = sp + 5</p><p><b>  r1 = [r1]</b></p><p><b>  r2 = sp+6</b></p><p><b&

76、gt;  r2 = [r2]</b></p><p>  call F_DIG_Set</p><p>  pop r1,r2 from [sp]</p><p><b>  retf</b></p><p>  F_DIG_Set:</p><p>  push bp to [sp]

77、</p><p>  .IF SEG_IO_HighByte==1</p><p>  r2 = r2 lsl 4</p><p>  r2 = r2 lsl 4</p><p><b>  .ENDIF</b></p><p><b>  r1 -= 1</b></p

78、><p>  cmp r1,DIG_Count// 如果"位"值超出范圍則退出</p><p><b>  ja ?Exit</b></p><p>  bp = R_DIG_Buf// 將R_DIG_Buf的相應元素修改為設定值</p><p><b>  bp += r1&l

79、t;/b></p><p><b>  [bp] = r2</b></p><p><b>  ?Exit:</b></p><p>  pop bp from [sp]</p><p><b>  retf</b></p><p>  設置所有數(shù)

80、碼管的顯示內(nèi)容</p><p>  _DIG_SetAll:</p><p>  push bp to [sp]</p><p><b>  bp = sp</b></p><p>  r1 = [bp+4]</p><p>  call F_DIG_SetAll</p><p

81、>  pop bp from [sp]</p><p><b>  retf</b></p><p>  F_DIG_SetAll:</p><p>  push r2,bp to [sp]</p><p><b>  bp = r1</b></p><p>  r2

82、= DIG_Count</p><p>  r3 = R_DIG_Buf</p><p>  ?DIG_Set_Loop:</p><p>  r1 = [bp++]// 將R_DIG_Buf修改為設定值</p><p>  .IF SEG_IO_HighByte==1</p><p>  r1 = r1

83、lsl 4</p><p>  r1 = r1 lsl 4</p><p><b>  .ENDIF</b></p><p>  [r3++] = r1</p><p><b>  r2 -= 1</b></p><p>  jnz ?DIG_Set_Loop</p&g

84、t;<p>  pop r2,bp from [sp]</p><p><b>  retf</b></p><p>  獲取所有數(shù)碼管的顯示內(nèi)容</p><p><b>  _DIG_Get:</b></p><p>  push bp to [sp]</p><

85、p><b>  bp = sp</b></p><p>  r1 = [bp+4]</p><p>  call F_DIG_Get</p><p>  pop bp from [sp]</p><p><b>  retf</b></p><p>  F_DIG_Ge

86、t:</p><p>  push r2 to [sp]</p><p>  r2 = R_DIG_Buf</p><p><b>  r2 += r1</b></p><p><b>  r1 = [r2]</b></p><p>  pop r2 from [sp]<

87、;/p><p><b>  retf</b></p><p>  獲取所有數(shù)碼管的顯示內(nèi)容</p><p>  _DIG_GetAll:</p><p>  push bp to [sp]</p><p><b>  bp = sp</b></p><p>

88、;  r1 = [bp+4]</p><p>  call F_DIG_GetAll</p><p>  pop bp from [sp]</p><p><b>  retf</b></p><p>  F_DIG_GetAll:</p><p>  push r2,bp to [sp]<

89、/p><p><b>  bp = r1</b></p><p>  r2 = DIG_Count</p><p>  r3 = R_DIG_Buf</p><p>  ?DIG_Get_Loop:</p><p>  r4 = [r3++]</p><p>  [bp++]

90、= r4</p><p><b>  r2 -= 1</b></p><p>  jnz ?DIG_Get_Loop</p><p>  pop r2,bp from [sp]</p><p><b>  retf</b></p><p>  數(shù)碼管顯示函數(shù),由IRQ4_4K

91、Hz中斷服務程序調(diào)用</p><p>  _DIG_Drive:</p><p>  F_DIG_Drive:</p><p>  push r1,r4 to [sp]</p><p>  r1 = [R_CurDIG]// 如果不顯示則直接退出</p><p>  cmp r1,0xffff</p>

92、;<p>  je?DIG_Exit</p><p>  r2 = r1 + R_DIG_Buf</p><p><b>  r2 = [r2]</b></p><p>  r2 &= PIN_SEG_ALL</p><p>  r3 = [P_DIG_Buf]// 清除當前位顯示<

93、/p><p>  r3 &= ~PIN_DIG_ALL</p><p>  [P_DIG_Data] = r3</p><p>  r4 = [P_SEG_Buf]// 段數(shù)據(jù)設置</p><p>  r4 &= ~PIN_SEG_ALL</p><p><b>  r4 |= r2<

94、;/b></p><p>  [P_SEG_Data] = r4</p><p>  r3 = [P_DIG_Buf]// 位數(shù)據(jù)設置</p><p>  r4 = r1 + PIN_DIG</p><p>  r3 |= [r4]</p><p>  [P_DIG_Data] = r3</p>

95、;<p>  r1 += 1</p><p>  cmp r1,DIG_Count</p><p>  jb ?DIG_Next// R_CurDIG指向下一位</p><p>  ?DIG_Reverse:</p><p>  r1 = 0// 若已顯示到最后一位則R_CurDIG指向第一位

96、</p><p>  ?DIG_Next:</p><p>  [R_CurDIG] = r1</p><p>  ?DIG_Exit:</p><p>  pop r1,r4 from [sp]</p><p><b>  retf</b></p><p><b&g

97、t;  停止數(shù)碼管顯示</b></p><p><b>  _DIG_Off:</b></p><p>  F_DIG_Off:</p><p>  push r1 to [sp]</p><p>  r1 = [P_DIG_Buf]</p><p>  r1 &= ~PIN_

98、DIG_ALL</p><p>  [P_DIG_Buf] = r1</p><p>  r1 = 0xffff</p><p>  [R_CurDIG] = r1</p><p>  pop r1 from [sp]</p><p><b>  Retf</b></p><p

99、><b>  恢復數(shù)碼管顯示</b></p><p><b>  _DIG_On:</b></p><p><b>  F_DIG_On:</b></p><p>  push r1 to [sp]</p><p><b>  r1 = 0</b>&

100、lt;/p><p>  [R_CurDIG] = r1</p><p>  pop r1 from [sp]</p><p><b>  Retf</b></p><p><b>  5.調(diào)試結果及分析</b></p><p>  要實現(xiàn)一個六位七段的LED數(shù)碼管顯示過程,首先必

101、須調(diào)節(jié)好硬件的測試,確保其通暢,其次要調(diào)節(jié)好軟件程序,調(diào)試無誤后下載裝機并運行程序,圖5-1顯示的事程序裝機界面,用的是IDE軟件進行的調(diào)試;圖5-2是開始運行時的初始狀態(tài)--即六位LED數(shù)碼管均顯示零的狀態(tài)“000000”;圖5-4顯示的是LED狀態(tài)一個循環(huán)的最后記數(shù)“999999”。實驗過程全程無誤,最后達到實驗要求的目的。</p><p><b>  圖 5-1 </b></p&

102、gt;<p><b>  圖 5-2 </b></p><p><b>  圖 5-3</b></p><p><b>  圖 5-4</b></p><p><b>  6.總結與心得</b></p><p>  兩周的課程設計已經(jīng)結束了,

103、我們也如期完成了自己的課設題目,盡管過程有些許短暫與困難,我們或許做的不是很好,但是這其中的體驗讓我們受益匪淺,收獲頗多。</p><p>  在這次課程設計的過程中我了解并掌握了SPCE061A的使用方法,同時熟悉了凌陽單片機試驗箱中六位七段LED數(shù)碼管模塊的使用方法.</p><p>  通過對資料的查閱和應用,更進一步增加了對單片機知識的理解和運用能力。本文列出了系統(tǒng)具體的硬件原理圖

104、,硬件連接方案,軟件流程圖和具體匯編語言程序設計與調(diào)試等方面。在這次課程設計的過程中學會了凌陽十六位單片機的基本使用,感受到了熟練掌握它對于自動化專業(yè)的同學的重要性。總體來說這次的科研實踐很成功,達到了預想的目的,學到了知識,提高了能力,完成了任務。 最后,要感謝xx老師的悉心指導,改正了我實驗中很多沒有發(fā)現(xiàn)的問題,衷心的感謝你們!</p><p><b>  7.參考文獻</b></

105、p><p>  [1]杜剛. 16位單片機原理及應用學習與實驗指導[M].北京:中國電力出版社,2008.12.</p><p>  [2]羅亞飛.凌陽16位單片機應用基礎[M].北京:北京航空航天大學出版社,2003.12.</p><p>  [3]李曉白.凌陽16位單片機C語言開發(fā)[M].北京:北京航空航天大學出版社,2006.7.</p><

106、p>  [4]李朝青.單片機原理及接口技術(修訂版)[M].北京:北京航空航天大學出版社,1998.5.</p><p>  [5]張友德. 趙志英.涂時亮.單片微型機原理[M].(第五版) 復旦大學出版社,2005.5</p><p>  [6]王武江.陳樹凱.常用集成電路速查手冊[M]. 冶金

溫馨提示

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

評論

0/150

提交評論