版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘 要</b></p><p> 隨著計(jì)算機(jī)的越來(lái)越普及,人們對(duì)與信息的了解也越來(lái)越方便。而對(duì)于人機(jī)交流這塊現(xiàn)在也是大家在重點(diǎn)研究的方面,像鍵盤等外部設(shè)備能提供給我們交流的平臺(tái)。而除了PC機(jī)系統(tǒng)外想單片機(jī)、PLC等小型系統(tǒng)需要更適合的人機(jī)界面。多位LED設(shè)備就可以很好的完成這一任務(wù),而且相比PC機(jī)等成本更加合理。</p><p>
2、 本次課程設(shè)計(jì)是基于SPCE061A單片機(jī)的六位七段LED數(shù)碼管顯示設(shè)計(jì),其是凌陽(yáng)科技的一款16位微控制器,內(nèi)嵌32KB閃存和2KB字SRAM。CPU最高可工作在49MHz的主頻下,較高的處理速度使SPCE061A能夠非常容易、快速地處理復(fù)雜的數(shù)字信號(hào)。其中的六段七位LED數(shù)碼管可以很迅速的實(shí)現(xiàn)從“000000”到“999999”的顯示變化。</p><p> 關(guān)鍵詞:SPCE061A單片機(jī),六段七位LED數(shù)碼
3、管</p><p><b> 目 錄</b></p><p> 1. 實(shí)驗(yàn)箱簡(jiǎn)介2</p><p> 2.設(shè)計(jì)總體思路4</p><p><b> 2.1設(shè)計(jì)思路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硬件設(shè)計(jì)方案8</p><p> 3.3基本原理10</p><p><b> 4.軟件部分10&l
5、t;/b></p><p> 4.1中斷服務(wù)程序流程圖10</p><p> 4.2設(shè)計(jì)步驟12</p><p><b> 4.3主程序13</b></p><p> 5. 調(diào)試結(jié)果及分析24</p><p> 6.總結(jié)與心得27</p><p>
6、<b> 7.參考文獻(xiàn)28</b></p><p><b> 實(shí)驗(yàn)箱簡(jiǎn)介</b></p><p><b> 1.1整體介紹 </b></p><p> 凌陽(yáng)十六位單片機(jī)(SPCE061A)實(shí)驗(yàn)箱是集單片機(jī)應(yīng)用技術(shù)、在線調(diào)試、在線仿真等功能于一體的強(qiáng)大開發(fā)系統(tǒng),SPCE061A及其系列產(chǎn)品將帶
7、領(lǐng)MCU的應(yīng)用邁入片上系統(tǒng)(SOC)時(shí)代,使在體驗(yàn)凌陽(yáng)音頻的歡快愉悅中輕松步入單片機(jī)及其嵌入式系統(tǒng)的流行領(lǐng)域?!?lt;/p><p> 圖1-1 實(shí)驗(yàn)箱實(shí)物圖 </p><p><b> 1.2功能特點(diǎn)</b></p><p> 凌陽(yáng)科技大學(xué)計(jì)劃實(shí)驗(yàn)箱的主要硬件配置: </p><p> (1)主控芯片SPCE061
8、A,凌陽(yáng)16位單片機(jī)。 </p><p> ?。?)4×4矩陣鍵盤和6位8段數(shù)碼管,采用動(dòng)態(tài)掃描方式驅(qū)動(dòng)4×4矩陣鍵盤。 </p><p> (3)1×8高低電平發(fā)生按鍵和8個(gè)發(fā)光二極管。 </p><p> (4)I/O可選5V∕3.3V輸出電路以及可選外部電壓輸入電路。 </p><p> ?。?)兩路0
9、-3V可調(diào)A/D輸入電壓,為A/D數(shù)據(jù)采集等提供便利。</p><p> (6)雙色8×8 LED點(diǎn)陣,可以完成圖形、字模顯示。 </p><p> ?。?)RS232接口可實(shí)現(xiàn)直接與PC機(jī)進(jìn)行通訊。 </p><p> ?。?)利用串行設(shè)備輸入輸出接口(SIO接口)擴(kuò)展外部存儲(chǔ)芯片SPR4096A,為實(shí)驗(yàn)箱系統(tǒng)增加4M Bits Flash 或32K
10、Bits SRAM的存儲(chǔ)空間。 </p><p> (9)USB1.1 接口,提供完整的單片機(jī)固體程序、上位機(jī)驅(qū)動(dòng)程序源代碼及其完整的軟件包和應(yīng)用范例,可直接進(jìn)行USB通訊。 </p><p> ?。?0)帶背光的128×64點(diǎn)陣液晶模組,內(nèi)藏凌陽(yáng)的一款LCD驅(qū)動(dòng)芯片SPLC501,采用最新的COG(Chip on Glass)技術(shù)使驅(qū)動(dòng)和液晶合二為一。 </p>
11、<p> ?。?1)兩路音頻輸出電路,采用凌陽(yáng)音頻功放芯片SPY0030A,可以充分體驗(yàn)SPCE061A帶來(lái)的聽覺(jué)效果。 </p><p> (12)MIC 輸入電路,配合SPCE061A內(nèi)部的AGC和OPI電路,可獲得理想的語(yǔ)音效果。 </p><p> ?。?3)SPCE061A內(nèi)置ICE電路,配合凌陽(yáng)在線調(diào)試器PROBE和軟件開發(fā)環(huán)境IDE可方便的實(shí)現(xiàn)在線編程、仿真、下
12、載、調(diào)試等功能。</p><p><b> 2.設(shè)計(jì)總體思路</b></p><p><b> 2.1設(shè)計(jì)思路 </b></p><p> 本次設(shè)計(jì)要求完成基于單片機(jī)六位七段LED數(shù)碼管的顯示系統(tǒng)的設(shè)計(jì)。運(yùn)行開始點(diǎn)亮所有的數(shù)碼管,6位LED數(shù)碼管均顯示0并持續(xù)1s。1s后,第一位數(shù)碼管從0顯示到9,刷新時(shí)間為0.5
13、s,其他數(shù)碼管全部顯示0。當(dāng)?shù)谝晃粩?shù)碼管顯示到9后,第一位數(shù)碼管保持顯示9,第二位數(shù)碼管從0顯示到9,刷新時(shí)間為0.5s,其他數(shù)碼管顯示0。依次直到第6位數(shù)碼管顯示9,即6位數(shù)碼管全部顯示9,6位數(shù)碼管全部顯示0,持續(xù)1s,如此循環(huán)。(1s的時(shí)間、0.5s的時(shí)間都使用2Hz的時(shí)基信號(hào)(IRQ5)提供)。6位數(shù)碼管的顯示狀態(tài)見(jiàn)。 </p><p> 2.2 主程序流程圖</p><p>
14、 主程序流程圖如圖2-1。先進(jìn)行系統(tǒng)初始化;開2Hz中斷;進(jìn)入數(shù)碼管循環(huán)顯示程序:判斷位信號(hào)寄存器是否為0(位信號(hào)寄存器由讀者自己定義,這個(gè)寄存器的內(nèi)容在中斷里會(huì)改變),如果為0,6位數(shù)碼管顯示“000000”;如果不為零,按照位信號(hào)和段碼顯示數(shù)據(jù)進(jìn)行顯示。</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提供了位控制結(jié)構(gòu)的I/O端口,每一位都可以被單獨(dú)定義用于輸入或輸出數(shù)據(jù)。通常,對(duì)某一位的設(shè)定包括以下3個(gè)基本項(xiàng):數(shù)據(jù)向量Data、屬性向量Attribution和方向控制向量Direction。3個(gè)端口內(nèi)每個(gè)對(duì)應(yīng)的位組合在一起,形成一個(gè)控制字,用來(lái)定義相
16、應(yīng)I/O口位的輸入輸出狀態(tài)和方式。SPCE061A有32個(gè)可編程I/O端口,分為兩組:IOA0~15口和IOB0~15口,其中每一個(gè)端口都可以被單獨(dú)設(shè)置為輸入或者輸出口。</p><p> 圖 3-1 SPCE061A結(jié)構(gòu)圖</p><p> 3.1.2 6位7段數(shù)碼管工作原理</p><p> 首先介紹兩個(gè)基本概念:段碼和位碼,段碼即段選信號(hào)SEG,它負(fù)責(zé)數(shù)
17、碼管顯示的內(nèi)容,圖4-2中a~g、dp 組成的數(shù)據(jù)(a 為最低位,dp 為最高位)就是段碼。比如1的段碼“0x06”(b=1,c=1,其他都為0,即段碼為00000110b),8 的段碼為“0x7f”;位碼即位選信號(hào)DIG,它決定哪個(gè)數(shù)碼管工作,哪個(gè)數(shù)碼管不工作,比如僅使能DIG4,那么4 個(gè)LED 只有LED4 工作,而其它的三個(gè)都不工作。當(dāng)需要某一位數(shù)碼管顯示數(shù)字時(shí),只需要先選中這位數(shù)碼管的位信號(hào),再給顯示數(shù)字的段碼。比如當(dāng)在第一個(gè)
18、數(shù)碼管上顯示一個(gè)“6”時(shí),如圖3-4,先選中第一位數(shù)碼管的位信號(hào)(實(shí)驗(yàn)儀上標(biāo)號(hào)是“DIG1”),即先給和“DIG1”相連接的I/O 口送1;再把段碼設(shè)置為0x007d,即在a、c、d、e、f、g 各段引出的端口為高電平,就可以顯示一個(gè)“6”出來(lái)。</p><p> 圖3-2 數(shù)圖碼管示意</p><p> 圖 3-3 數(shù)碼管電路圖</p><p> 圖 3-4
19、 數(shù)碼管顯示“6”</p><p><b> 3.2硬件設(shè)計(jì)方案</b></p><p> 硬件連接圖如圖3-3,IOA0~IOA7分別接數(shù)碼管的7個(gè)段信號(hào)a~g和小數(shù)點(diǎn)信號(hào)dp,IOB15~IOB12連接數(shù)碼管的位信號(hào)1~4,IOB2~IOB1連接數(shù)碼管的位信號(hào)5~6,IOB0連接數(shù)碼管的分隔符號(hào)信號(hào)DD,即把JP4和JP5的引針用跳線全部短接。</p&g
20、t;<p> 實(shí)驗(yàn)箱在6位8段數(shù)碼管的上面有16對(duì)排針,其中有7個(gè)“a\b\c\d\e\f\g\”是控制此6位8段數(shù)碼管的段碼選擇的,另有6個(gè)“1\2\3\4\5\6”是控制6位8段數(shù)碼管位選擇的,“DD”控制“點(diǎn)”或“分隔符號(hào)”,“DP”控制小數(shù)點(diǎn)。把實(shí)驗(yàn)箱上JP4和JP5的引針用跳線全部短接??驁D如圖3-4。</p><p> 圖 3-3 試驗(yàn)箱上SPCE061A和6位LED顯示電路模塊的連
21、接</p><p> 圖 3-4實(shí)物連接圖</p><p><b> 3.3基本原理</b></p><p> 本實(shí)驗(yàn)用到的實(shí)驗(yàn)箱硬件模塊為:SPCE061A核心及周邊電路模塊(包含32個(gè)I/O口),6位8段數(shù)碼管電路模塊。</p><p> 圖 3-5 硬件原理圖</p><p>&l
22、t;b> 4.軟件部分</b></p><p> 4.1中斷服務(wù)程序流程圖</p><p> 由于顯示數(shù)據(jù)的刷新時(shí)間為1s和0.5s,因此考慮采用2Hz(0.5s)時(shí)基中斷。并且在中斷內(nèi)部完成段碼數(shù)據(jù)更新。具體的流程如圖 4-6示:在中斷服務(wù)程序中會(huì)用到三個(gè)重要的寄存器:中斷計(jì)數(shù)寄存器、顯示數(shù)據(jù)寄存器、位信號(hào)寄存器。其中中斷計(jì)數(shù)寄存器用于記錄第幾次進(jìn)入中斷(前3次有
23、效),顯示數(shù)據(jù)寄存器的內(nèi)容為當(dāng)前被刷新顯示數(shù)據(jù)的數(shù)值(0~9),位信號(hào)寄存器用于標(biāo)識(shí)被刷新數(shù)據(jù)所在位。結(jié)合主程序分析中斷程序:首先顯示“000000”時(shí)需要延時(shí)1s,使用2Hz中斷產(chǎn)生1s延時(shí),需要連續(xù)響應(yīng)兩次中斷,第二次響應(yīng)中斷延時(shí)滿1s,設(shè)置顯示數(shù)據(jù)寄存器和位信號(hào)寄存器,讓第一位數(shù)碼管顯示1,其余各位仍為“0”,即顯示“100000”;判斷顯示數(shù)據(jù)寄存器顯示數(shù)據(jù)是否大于9,如果小于,顯示數(shù)據(jù)寄存器數(shù)據(jù)加1;如果大于,判斷位信號(hào)寄存器
24、是否已經(jīng)指向第六位數(shù)碼管,否則位信號(hào)寄存器設(shè)置為指向下一位數(shù)碼管,顯示數(shù)據(jù)寄存器顯示數(shù)據(jù)設(shè)置為0;如果已經(jīng)指向第六位數(shù)碼且顯示數(shù)據(jù)寄存器為9,寄存器清零,清中斷標(biāo)志,中斷返回。 </p><p> 圖 4-1 中斷服務(wù)程序流程圖</p><p><b> 4.2設(shè)計(jì)步驟</b></p><p> 1. 新建一個(gè)工程ex1_Led_Show
25、,新建一個(gè)C語(yǔ)言文件main.c,新建一個(gè)匯編語(yǔ)言文件isr.asm。(根據(jù)讀者需要可以自己新建文件) </p><p> 2. 拷貝頭文件SPCE061A.inc和SPCE061A.h到新建工程ex1_Led_Show,這兩個(gè)文件在IDE的安裝路徑\SPCE061A\include路徑下可以找到。</p><p> 3. 添加SPCE061A.h、SPCE061A.inc到工程的“H
26、ead Files”;添加后可以直接用這兩個(gè)頭文件中申明的變量或者地址單元。</p><p> 4. 按照程序流程圖編寫程序。</p><p> 5. Rebuild All。</p><p> 6. 按照硬件連接圖連接電路,注意斷開JP3和JP7的所有引針,以免影響輸出顯示數(shù)據(jù)。</p><p> 7. 下載程序到實(shí)驗(yàn)箱,根據(jù)數(shù)碼管
27、顯示的現(xiàn)象,判斷是否和實(shí)驗(yàn)要求相統(tǒng)一。</p><p> 8. 觀察LED顯示數(shù)據(jù)和實(shí)驗(yàn)箱播報(bào)的數(shù)據(jù),分析是不是和實(shí)驗(yàn)要求相統(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延時(shí)</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、中斷當(dāng)中會(huì)被修改</p><p> g_uiSeg = 0;//該變量在2Hz中斷當(dāng)中會(huì)被修改,以便及時(shí)刷新顯示</p><p> DIG_Init(); //顯示初始化,同時(shí)會(huì)打開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è)置數(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次進(jìn)入中斷</p><p> ja ?Start//時(shí)間〉=1s</p><p> r1 = [_g_uiFirst]//時(shí)間小于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//置標(biāo)志,重新顯示“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位控制端口設(shè)定</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ù)碼管每一位的控制腳設(shè)定 </p><p> .DATAPIN_DIG:</p><p> .DW 0x8000,0x4000,0x2000,0x1000,0x0004,0x0002,0x0001;</p><p> 數(shù)碼
56、管所有位的控制腳設(shè)定,應(yīng)等于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// 當(dāng)前顯示的數(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、當(dāng)前顯示的位設(shè)置為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è)置數(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的相應(yīng)元素修改為設(shè)定值</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è)置所有數(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修改為設(shè)定值</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中斷服務(wù)程序調(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]// 清除當(dāng)前位顯示<
93、/p><p> r3 &= ~PIN_DIG_ALL</p><p> [P_DIG_Data] = r3</p><p> r4 = [P_SEG_Buf]// 段數(shù)據(jù)設(shè)置</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ù)設(shè)置</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> 恢復(fù)數(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)試結(jié)果及分析</b></p><p> 要實(shí)現(xiàn)一個(gè)六位七段的LED數(shù)碼管顯示過(guò)程,首先必
101、須調(diào)節(jié)好硬件的測(cè)試,確保其通暢,其次要調(diào)節(jié)好軟件程序,調(diào)試無(wú)誤后下載裝機(jī)并運(yùn)行程序,圖5-1顯示的事程序裝機(jī)界面,用的是IDE軟件進(jìn)行的調(diào)試;圖5-2是開始運(yùn)行時(shí)的初始狀態(tài)--即六位LED數(shù)碼管均顯示零的狀態(tài)“000000”;圖5-4顯示的是LED狀態(tài)一個(gè)循環(huán)的最后記數(shù)“999999”。實(shí)驗(yàn)過(guò)程全程無(wú)誤,最后達(dá)到實(shí)驗(yàn)要求的目的。</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.總結(jié)與心得</b></p><p> 兩周的課程設(shè)計(jì)已經(jīng)結(jié)束了,
103、我們也如期完成了自己的課設(shè)題目,盡管過(guò)程有些許短暫與困難,我們或許做的不是很好,但是這其中的體驗(yàn)讓我們受益匪淺,收獲頗多。</p><p> 在這次課程設(shè)計(jì)的過(guò)程中我了解并掌握了SPCE061A的使用方法,同時(shí)熟悉了凌陽(yáng)單片機(jī)試驗(yàn)箱中六位七段LED數(shù)碼管模塊的使用方法.</p><p> 通過(guò)對(duì)資料的查閱和應(yīng)用,更進(jìn)一步增加了對(duì)單片機(jī)知識(shí)的理解和運(yùn)用能力。本文列出了系統(tǒng)具體的硬件原理圖
104、,硬件連接方案,軟件流程圖和具體匯編語(yǔ)言程序設(shè)計(jì)與調(diào)試等方面。在這次課程設(shè)計(jì)的過(guò)程中學(xué)會(huì)了凌陽(yáng)十六位單片機(jī)的基本使用,感受到了熟練掌握它對(duì)于自動(dòng)化專業(yè)的同學(xué)的重要性??傮w來(lái)說(shuō)這次的科研實(shí)踐很成功,達(dá)到了預(yù)想的目的,學(xué)到了知識(shí),提高了能力,完成了任務(wù)。 最后,要感謝xx老師的悉心指導(dǎo),改正了我實(shí)驗(yàn)中很多沒(méi)有發(fā)現(xiàn)的問(wèn)題,衷心的感謝你們!</p><p><b> 7.參考文獻(xiàn)</b></
105、p><p> [1]杜剛. 16位單片機(jī)原理及應(yīng)用學(xué)習(xí)與實(shí)驗(yàn)指導(dǎo)[M].北京:中國(guó)電力出版社,2008.12.</p><p> [2]羅亞飛.凌陽(yáng)16位單片機(jī)應(yīng)用基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,2003.12.</p><p> [3]李曉白.凌陽(yáng)16位單片機(jī)C語(yǔ)言開發(fā)[M].北京:北京航空航天大學(xué)出版社,2006.7.</p><
106、p> [4]李朝青.單片機(jī)原理及接口技術(shù)(修訂版)[M].北京:北京航空航天大學(xué)出版社,1998.5.</p><p> [5]張友德. 趙志英.涂時(shí)亮.單片微型機(jī)原理[M].(第五版) 復(fù)旦大學(xué)出版社,2005.5</p><p> [6]王武江.陳樹凱.常用集成電路速查手冊(cè)[M]. 冶金
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)-8位8段led數(shù)碼管動(dòng)態(tài)掃描顯示解讀
- plc課程設(shè)計(jì)---七段數(shù)碼管數(shù)字顯示
- 單片機(jī)課程設(shè)計(jì)----凌陽(yáng)spce061a聲控小車
- 基于單片機(jī)的六位數(shù)碼管顯示的電子鐘的畢業(yè)設(shè)計(jì)
- 基于單片機(jī)的電子時(shí)鐘6位led數(shù)碼管顯示
- 單片機(jī)課程設(shè)計(jì)--兩位數(shù)碼管顯示設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---基于spce061a單片機(jī)的智能電動(dòng)車設(shè)計(jì)
- 基于SPCE061A單片機(jī)的家居智能機(jī)器人設(shè)計(jì).pdf
- 基于凌陽(yáng)SPCE061A單片機(jī)的智能小車的設(shè)計(jì).pdf
- 基于51單片機(jī)的led數(shù)碼管動(dòng)態(tài)顯示
- 八位七段數(shù)碼管動(dòng)態(tài)顯示電路設(shè)計(jì)
- 七段數(shù)碼管顯示數(shù)字電路
- 單片機(jī)課程設(shè)計(jì)(led顯示管)
- 單片機(jī)課程設(shè)計(jì)--鍵盤輸入在led數(shù)碼管上的顯示
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--單只數(shù)碼管顯示數(shù)字
- 凌陽(yáng)單片機(jī)課程設(shè)計(jì)驅(qū)動(dòng)數(shù)碼管
- 基于16位單片機(jī)spce061a的圖形液晶模塊的驅(qū)動(dòng)設(shè)計(jì)
- 單片機(jī)驅(qū)動(dòng)數(shù)碼管顯示設(shè)計(jì)-c語(yǔ)言
- 基于spce061a單片機(jī)設(shè)計(jì)的綜述【文獻(xiàn)綜述】
- 單片機(jī)控制數(shù)碼管顯示程序
評(píng)論
0/150
提交評(píng)論