Reporter : Jill Yang · 填寫「4-102-34b 校正實驗室_生產工廠參訪申請單」 允許進入參觀時應注意 ”保密 ” • 實驗室應重視與顧客溝通的建議與資訊。
61 板實驗指導手冊書 - read.pudn.comread.pudn.com/downloads90/ebook/342185/61_2v3.pdf · 61...
Transcript of 61 板實驗指導手冊書 - read.pudn.comread.pudn.com/downloads90/ebook/342185/61_2v3.pdf · 61...
-
61 板實驗指導手冊書
僑高科技有限公司 1
目 錄
前 言....................................................................................................................................4
第 1 章 凌陽公司簡介....................................................................................................5
第 2 章 SPCE061A 精簡開發板-61 板.....................................................................6
2.1 61 板功能描述 ......................................................................................................6
2.2 61 板硬體說明.......................................................................................................8
2.2.1 輸入/輸出(I/O)介面 ..............................................................................9
2.2.2 音頻輸入/輸出介面 ...................................................................................9
2.2.3 線上除錯器(PROBE)和 EZ-PROBE 介面......................................10
2.2.4 電源介面 ...................................................................................................10
2.2.5 外部重置............................................................................................11
2.3 配套 LED 鍵盤模組說明 .................................................................................11
第 3 章 凌陽 16 位單晶片軟體開發環境使用........................................................14
3.1 凌陽 16 位單晶片軟體開發環境簡介 .....................................................14
3.2 舉例應用 ........................................................................................................16
第 4 章 61 板結合 LED 鍵盤模組實驗...................................................................21
實驗一 發光二極體單向迴圈點亮..................................................................21
【實驗目的】....................................................................................................21
【實驗設備】....................................................................................................21
【實驗說明】....................................................................................................21
【實驗步驟】....................................................................................................22
【硬體連接圖】................................................................................................22
【程式流程圖】................................................................................................23
【程式範例】....................................................................................................23
實驗二 發光二極體雙向迴圈點亮..................................................................29
【實驗目的】....................................................................................................29
【實驗設備】....................................................................................................29
【實驗說明】....................................................................................................29
【實驗步驟】....................................................................................................29
【硬體連接圖】................................................................................................30
【程式流程圖】................................................................................................31
【程式範例】....................................................................................................32
【程式練習】....................................................................................................38
實驗三 按鍵點亮發光二極體 ..........................................................................39
【實驗目的】....................................................................................................39
【實驗設備】....................................................................................................39
【實驗說明】....................................................................................................39
-
61 板實驗指導手冊書
僑高科技有限公司 2
【實驗步驟】....................................................................................................39
【硬體連接圖】................................................................................................40
【程式流程圖】................................................................................................41
【程式範例】....................................................................................................41
【程式練習】....................................................................................................48
實驗四 鍵控發光二極體迴圈點亮..................................................................49
【實驗目的】....................................................................................................49
【實驗設備】....................................................................................................49
【實驗說明】....................................................................................................49
【實驗步驟】....................................................................................................49
【硬體連接圖】................................................................................................50
【程式流程圖】................................................................................................51
【程式範例】....................................................................................................52
【程式練習】....................................................................................................60
實驗五 七段顯示器顯示 0-9.........................................................................61
【實驗目的】....................................................................................................61
【實驗設備】....................................................................................................61
【實驗說明】....................................................................................................61
【實驗步驟】....................................................................................................61
【硬體連接圖】................................................................................................62
【程式流程圖】................................................................................................63
【程式範例】....................................................................................................64
【程式練習】....................................................................................................70
實驗六 七段顯示器移位元迴圈顯示 0-9...................................................71
【實驗目的】....................................................................................................71
【實驗設備】....................................................................................................71
【實驗步驟】....................................................................................................71
【硬體連接圖】................................................................................................71
【程式流程圖】................................................................................................71
【程式範例】....................................................................................................73
【程式練習】....................................................................................................77
實驗七 發光二極體和七段顯示器交替顯示 ................................................78
【實驗目的】....................................................................................................78
【實驗設備】....................................................................................................78
【實驗說明】....................................................................................................78
【實驗步驟】....................................................................................................78
【硬體連接圖】................................................................................................78
【程式流程圖】................................................................................................78
-
61 板實驗指導手冊書
僑高科技有限公司 3
【程式範例】....................................................................................................79
【程式練習】....................................................................................................86
實驗八 按鍵顯示數位 .......................................................................................87
【實驗目的】....................................................................................................87
【實驗設備】....................................................................................................87
【實驗步驟】....................................................................................................87
【硬體連接圖】................................................................................................87
【程式流程圖】................................................................................................87
【程式範例】....................................................................................................88
【程式練習】....................................................................................................96
實驗九 發光二極體巡迴點亮並七段顯示器計數 ........................................97
【實驗目的】....................................................................................................97
【實驗設備】....................................................................................................97
【實驗說明】....................................................................................................97
【實驗步驟】....................................................................................................97
【硬體連接圖】................................................................................................98
【程式流程圖】................................................................................................99
【程式範例】..................................................................................................100
【程式練習】..................................................................................................109
實驗十 A/D 採樣資料在發光二極體上點亮..............................................110
【實驗目的】..................................................................................................110
【實驗設備】..................................................................................................110
【實驗說明】..................................................................................................110
【實驗步驟】..................................................................................................110
【硬體連接圖】..............................................................................................111
【程式流程圖】..............................................................................................112
【程式範例】..................................................................................................112
【程式練習】..................................................................................................118
第 5 章 61 板深入學習嚮導......................................................................................119
5.1 學習嚮導 ......................................................................................................119
5.2 61 板其他配套模組說明...........................................................................121
5.2.1USB 介面模組.........................................................................................121
5.2.2USB/UART 轉換埠模組 ........................................................................122
5.2.3 乙太網通訊模組.....................................................................................122
5.2.4 SPLC501 液晶模組................................................................................123
5.2.5 圖像識別模組.........................................................................................124
5.2.6 交通燈模組 .............................................................................................124
第 6 章 附錄.................................................................................................................125
-
61 板實驗指導手冊書
僑高科技有限公司 4
前 言
本教材是結合北京航空航太大學出版社出版的《凌陽 16 位單晶片應用基
礎》一書而設計,與課堂教學內容結合緊密。本書所有實驗均是 61 板結合 LED
鍵盤模組而設計,且附有範例程式。實驗內容淺顯易懂,屬於基礎應用實驗,讀
者可以從學習凌陽單晶片 SPCE061A 埠的使用方法入手,逐步掌握凌陽µ’nSP系列單晶片的編程方法以及 61 板的基本功能和常用週邊元件如鍵盤、LCD、
LED 的使用方法等。
本書共分五節,基本內容如下:
第一節:凌陽公司簡介;
第二節:61 板及配套 LED 模組說明;
第三節:凌陽 16 位單晶片軟體開發環境使用簡介;
第四節:61 板結合 LED 模組基礎實驗,共十個;
第五節:61 板其他配套模組簡介。
本書中的所有實驗範例程式均經過除錯,範例中既包括組合語言版程式又
包括 C 語言版程式。實驗時按照硬體連接說明進行連接後,程式可直接下載
運行,使讀者達到節省時間、快速入門的目的。
由於編者水準有限,編寫時間倉促,書中難免有所錯漏,敬請讀者和專家
指正。
凌陽科技大學計畫部 二零零七年三月
-
61 板實驗指導手冊書
僑高科技有限公司 5
第 1 章 凌陽公司簡介
全球第一大消費性晶片設計公司——凌陽科技,1990 年 8 月成立於臺
灣。凌陽科技的主要業務 為研發、製造、銷售高品質及高附加價值的消費性積
體電路(IC)產品。它擁有較先進的工藝設計技術,提供幾千種標準產品,廣
泛應用於工業領域和消費類電子產品領域。部分型號單晶片可以完成線上編
程、模擬和除錯。此設計不僅降低開發者的成本,而且在很大程度上可以加快
開發者的設計進程。其主要產品包括:液晶 IC、微控器 IC、多媒體 IC、語音、
音樂 IC 及各式 ASICs,同時還提供高性能的週邊電路,包括 LCD、AGC、
DTMF、A/D、D/A、UART、SPI、PCI、計數器和儲存控制器等等。
為了回饋高校,實現 “科技落實生活" 的企業宗旨,2007年凌陽科技在
大陸隆重推出——凌陽大學計畫(http://www.chirkal.com.tw)。凌陽大學計畫內容
包括:共建凌陽單晶片實驗室;支持大學採用 61 板完成電子實習;支持大學採
用61 板完成課程設計;支持大學採用 61 板完成畢業設計;支持大學教師編寫
凌陽單晶片教材或專著;鼓勵大學師生發表凌陽單晶片論文;鼓勵採用凌陽單
晶片參加各類電子競賽;鼓勵大學教師採用凌陽單晶片進行專案開發。凌陽大
學計畫希望能達到改善大專院校單晶片教學條件,增進高校師生接觸新技術、
新元件的機會,提高在校生的動手能力,推動教學和新技術同步發展的目的。
-
61 板實驗指導手冊書
僑高科技有限公司 6
第 2 章 SPCE061A 精簡開發板-61 板
2.1 61 板功能描述
61 板是 SPCE061A 精簡開發板的簡稱,是“凌陽大學計畫"專為電子愛好
者和學校學生進行課程設計、畢業設計及電子競賽所設計的,以凌陽 16 位單晶
片 SPCE061A 為核心的精簡開發-模擬- 實驗板。硬體電路包括電源電路、音
頻電路(含 MIC 輸入部分和 DAC 音頻輸出部分)、重置電路等, 讓學生在掌握
軟體設計的同時,熟悉單晶片硬體的設計製作,鍛鍊動手能力。而且它的體積
小,採用電池供電,方便隨身攜帶。
能具體完成以下實驗內容:
1. 20 多個基礎實驗:內含單晶片常用的功能包括 I/O埠、中斷、計時器/計
數器、A/D 轉換和D/A 轉換等;
2.綜合實驗:配合學校培養學生動手能力的需求,實驗需要搭配必要的電路
完成,包括鍵盤、 七段顯示器、液晶(LCD)、USB 及外擴 FLASH
等模組;
3.語音處理實驗:提供三種應用於不同場合、不同壓縮比的放音、錄音(DVR)
及語音辨識實驗。同學們可以通過簡單的操作實現放音或
錄音,瞭解一般語音處理的功能,極大豐富同學們的單晶
片知識,增強學生學習單晶片的興趣。
另外,SPCE061A 具有 16*16 位的乘法運算和內積運算的 DSP 功能,這
不僅為它進行複雜的語音數位信號的壓縮編碼與解碼提供了便利,還可以做數位
濾波器 (Digital Filter) 。
那麼該板主要應用在哪些方面呢?
適合學生動手實踐——代替原來舊有的安裝收音機、萬用表及直流穩壓源等動
手實習課程:
焊接:可以鍛鍊學生的動手焊接能力。凌陽大學計畫提供 PCB 板、元件、元件清單,工藝要求及焊接步驟和要求等,讓同學們充分瞭解硬體設計和製
作的全過程。
測試:可以瞭解測試流程,增加測試經驗,進一步掌握一般單晶片的各種性能指標。針對 61 板 我們為您提供了標準的測試程式、詳細的測試步驟和
測試要求。測試程式具有智慧的語音提示作用,只需根據提示內容即可完成
每一步操作。通過對現象的觀察即可完成各部分功能的測試,如電源電路
-
61 板實驗指導手冊書
僑高科技有限公司 7
是否正常、I/O 焊接是否有短路、A/D 轉換和 D/A 轉換電路是否正常等。
下載運行:給出操作步驟,熟悉一般單晶片開發環境的使用,而且在下載完畢後即可實現報時器、音樂盒、複讀機等功能。
其他:該開發板含有 A/D 和 D/A 的功能,通過動手實踐活動可以實現簡易萬用表功能;板上的電源電路有 5V 和 3.3V 兩種電壓輸出,使學生瞭解
電源電路的基本結構。
適合學生課餘自學 學習單晶片開發環境(IDE),通過這一環節的學習掌握單晶片編程過程中程
式的除錯、模擬和 下載運行的方法整體學習單晶片的各單元結構功能,如:I/O
埠,定時/計數器、中斷、A/D 和 D/A 等,而且該16 位單晶片既是對原來 8 位
51 單晶片的補充,又具有其獨特的語音處理功能,同時又是片上系統(SOC)
設計,即內置 A/D 和 D/A 等很多功能。極大的拓寬了學生的知識面,培養了
學生濃厚的學習興趣。初步編程,學習單晶片的組合語言編程。
適合學生課程設計 設計中包括一般單晶片在 I/O埠、A/D、D/A 及 I/O 擴充等方面的應用舉
例,老師和學生可以結合實際情況選擇學習。學生不外接電路就可以實現 MIC
錄音和語音播放的功能,也可以動手外搭麵包板或自己用萬能板焊接一些簡單
的週邊電路,如發光二極體、LED 七段顯示器或按鍵,可以實現更多的功能。
適合學生畢業設計 對於學生畢業設計,如果覺得一般單晶片的擴充功能還不能滿足學習要
求,我們還配有:
1. 128×64LCD 模組
2. USB 模組
3. 4M 的記憶體(memory)擴充
4.乙太網通訊模組
5.步進電機、直流電機模組
6.交通燈模組
7. USB/UART 模組
8.圖像識別模組
總之,61 板是一個 16 位單晶片的平臺,您可以充分發揮自己的想像,只需
花很短的時間就可以 具備掌握 61 板的硬體結構及“精簡指令"的基礎,可以
很快地自己設計製作產品。如果您有自己用16 位元單晶片設計製作的語音遙控
器、語音報時器等產品,一定不會為畢業時找工作而發愁。
-
61 板實驗指導手冊書
僑高科技有限公司 8
2.2 61 板硬體說明
61 板硬體框圖如圖1 所示:
圖1 61 板硬體框圖
表1 框圖說明
POWER 5V&3V 供電電路 PLL 鎖向環外部電路
Power-電源指示燈
Sleep-睡眠指示燈 RESET 重置電路
K4 重置按鍵 PROBE 線上除錯器串列 5 針
介面
S5 EZ-PROBE 和 PROBE 切 換
的撥斷開關 J12、J3
耳機插孔和兩針喇叭插
頭
DAC 一 路 音 頻 輸 出 電 路 , 採 用
SPY0030 集成音頻放大器 MIC 麥克風輸入電路
OSC 32768 振盪電路 VREF A/D 轉換外部參考電壓
輸入介面
R/C 晶片其他週邊電阻、電容電路 K1~K3 擴充的按鍵:
接IOA0~IOA2
SPCE061A 61 板核心:16 位元微處理器 PORTA/B 32 個 I/O埠
-
61 板實驗指導手冊書
僑高科技有限公司 9
61 板介面說明圖:
圖 2 61 板介面說明圖
2.2.1 輸入/輸出(I/O)介面
61 板將 SPCE061A 的 32 個 I/O埠 IOA0~IOA15,IOB0~IOB15 全部引出,
對應的接腳為:A埠,41~48、53、54~60;B埠,5~1、81~76、68~64。而且該I/O
埠是可編程的,即可以設置為輸入或輸出。設置為輸入時,分為懸浮輸入或非懸
浮輸入。非懸浮輸入又可以設置為上拉輸入或是下拉輸入。
在 5V 情況下,上拉電阻為 150K,下拉電阻為 110K;設置為輸出時,可以
選擇同向輸出或者反相輸出。
2.2.2 音頻輸入/輸出介面
正如我們在前面介紹的 61 板具有強大的語音處理功能,如圖2 所示,X1 是
語音的 MIC 輸入端, 帶自動增益(AGC)控制。J12 和 J3 都是語音輸出介
面,一個是耳機插孔;另一個是兩PIN的插頭外接喇叭,由 DAC 輸出接腳 21 或
22 經語音集成放大器 SPY0030 放大,然後輸出。SPY0030 是凌陽的晶片相當
於 LM386,但是比 386 音質好。它可以工作在 2.4~6.0V 範圍內,最大輸出功率可達
700mW(LM386 必須工作在 4V 以上,而且功率只有 100mW)。
-
61 板實驗指導手冊書
僑高科技有限公司 10
2.2.3 線上除錯器(PROBE)和 EZ-PROBE 介面
圖2 中 J4 為 PROBE 的介面,該介面有 5 PIN,其中兩個分別是地
(VSS)和 3.3V 電源(VCC)。 此介面與 PROBE 的 5 PIN介面相連,PROBE 的
另一端接電腦 25 PIN並列。這樣,就不需要再用模擬器和編程器了,只要按圖3
所示將其連接好,就可以通過它在電腦上除錯程式、線上模擬、最後將程式下載
到晶片中,完成程式的燒寫。
圖 2 中的 J11 是 EZ-PROBE 的介面,我們提供一條轉接線用作
EZ-PROBE 的下載,一端連接電腦的 25 PIN 並列,另外一端連接 61 板的 5 PIN
EZ-PROBE 介面,參見圖 3。
圖 3 61 板、PROBE/連接線、電腦三者之間的連接圖
2.2.4 電源介面
圖2 中 J10 是電源介面,61 板的內核 SPCE061A 電壓要求為 3.3V,而 I/O
埠的電壓可以選擇3.3V 也可以選擇 5V。所以,在板子上具有兩種工作電壓:
5V 和 3.3V。對應的接腳中 15、36 和 7必須為 3.3V,對於 I/O 埠的電壓 51、
52、75 可以是 3.3V 也可以是 5V,這兩種電位的選擇通過跳線 J5 來控制。
61 板的供電電源系統採用用戶多種選擇方式:
1. DC5V 電池供電:用戶可以用 3 節電池來供電。5V 直流電壓直接通過
SPY0029(相當於一般 3.3V 穩壓器)穩壓到 3.3V,為整
個 61 板提供了 4.5V 和 3.3V 兩種電位的電壓。
2. DC5V 穩壓源供電:用戶可以直接外接 5V 的直流穩壓源供電。5V 電壓
再通過 SPY0029 穩壓到 3.3V。
3. DC3V 供電:用戶可以提供直流 3.3V 電壓為實驗板進行供電。此時整個
板子只有 3.3V 電壓,I/O 埠電壓此時只有一種選擇。
-
61 板實驗指導手冊書
僑高科技有限公司 11
◎需要注意的是由於 SPY0029 最大輸出電流為 50mA,所以如果需要外接一些
模組時要先考慮負載是否合適。
2.2.5 外部重置
重置是對 61 板內部的硬體初始化。61 板本身具有上電重置功能,即只要
一通電就自動重置。另 外,還具有外部重置電路,即在接腳 6 上外加一個低
電位就可令其重置。如圖2 中的 REST 按鍵。
2.3 配套 LED 鍵盤模組說明
模組資源:
1. 8 個按鍵,可以組成 1×8 按鍵,也可以組成 2×4 按鍵;
2. 8 個發光二極體;
3. 6 位 8 段 LED 七段顯示器;
4.一個電位器,提供 0-5V 的類比電壓信號。
LED 鍵盤模組介面說明圖如圖4 所示:
圖 4 LED 模組介面說明圖
介面說明:
LED 模組使用十分簡單,直接用排線與 61 板 I/O 介面相連即可。
1. KEYTEPE 選擇介面: 此介面是選擇 2*4KEY 還是 1*8KEY,具體選擇方式如下:
從左至右看,將第 1 至 4 短接塊連接,選擇了 2*4KEY;
-
61 板實驗指導手冊書
僑高科技有限公司 12
只將第 5 個短接塊短接,選擇 1*8KEY。
選擇 2*4KEY 介面連接示意圖如下:
圖5 選擇 2*4KEY 時 KEYTEPE 介面連接示意圖
選擇 1*8KEY 介面連接示意圖如下:
圖 6 選擇 1*8KEY 時 KEYTEPE 介面連接示意圖
2. 2*4KEY 介面 2*4KEY 的第 1 組行定義為 ROW1,第 2 組行定義為 ROW2,4 列定義
為 COL1~COL4。使用時 COL1 是 K1 和 K5 的輸入,COL2 是 K2 和 K6 的輸
入,COL3 是 K3 和 K7 的輸入,COL4 是 K4 和 K8 的輸入。用戶可自行選擇
ROW1 與 ROW2 接至 VDD 還是 GND,但同一時間只能使用 一組。AV 是類
比電壓輸出端,通過調整 R20 可以改變 AV 的值,AV 的最大輸出值與 VDD
相同。 D_DP 是第 4 位元七段顯示器後時鐘冒號的位元信號控制端。
圖7 2*4KEY 介面圖及使用示意圖
使用 2*4KEY 時相應 KEYTEPE 連接如圖5。
3. 1*8KEY 介面 1*8KEY 的 8 列分別定義為 COL1~COL8,1 行定義為 ROW1。
-
61 板實驗指導手冊書
僑高科技有限公司 13
圖 8 1*8KEY 介面圖及使用示意圖
使用時 KEYTEPE 介面的第五個短接塊短接。用戶可自行選擇 ROW1 接
至 VDD 還是 GND。使用 1*8KEY 時相應 KEYTEPE 連接如圖6。
4. DIG 介面
6 位七段顯示器的段發光管陽極和 8 個 LED 指示燈的陽極並聯,並且 8
個 LED 指示燈採用共陰極方式。6 位元七段顯示器的陰極和 8 個 LED 的共
陰極分別用 DIG 介面的 DIG1~DIG7 控制,第 4 位元七段顯示器後時鐘冒號
的位元信號用 DIG8 控制,位元信號均為高有效。
圖 9 DIG 介面圖
5. SEG 介面
A~G、DP 是 6 位元七段顯示器的段信號和 8 個 LED 指示燈的陽極控
制信號輸入端。控制信號為高有效。與 61 板配套使用時,2、3、4 介面可用
排線直接連至 61 板的 IOA 或 IOB 介面。
圖10 SEG 介面圖
實驗前請仔細閱讀附錄,要瞭解七段顯示器和 LED 的結構,在用排線連接
系統開發板和模組進行實驗時一定要注意方向問題:板子的 VCC 與模組的
VDD 是同一點。
-
61 板實驗指導手冊書
僑高科技有限公司 14
第 3 章 凌陽 16 位單晶片軟體開發環境使用
3.1 凌陽 16 位單晶片軟體開發環境簡介
µ’nSP™軟體開發環境,它集程式的編輯、編譯、鏈結、除錯以及模擬等功能為一體。具有友好的交互介面、下拉功能表、快捷鍵和快速訪問命令列表等,
使人們在進行編程、除錯工作時更加方便高效。此外,它還具有軟體模擬功能,
可以在不連接模擬板的情況下類比硬體的各項功能來除錯程式。
IDE 的軟體開發環境介面如圖 11 所示。本節將介紹 µ'nSP開發環境的
功能表、視窗介面以及專案的操作等,使有興趣者對開發環境有一個總體瞭解,
並能夠動手實踐。
圖11 軟體開發環境介面
凌陽十六位單晶片軟體開發環境採用專案方式進行檔管理。專案(Project)
是指為用戶除錯程式建立起來的一個開發環境,提供用戶程式及資源文檔的編
輯和管理,並提供各項環境要素的設置途徑,最後將通過對用戶程式庫的編制
(包括編譯、彙編以及鏈結等)為用戶提供出一個良好的除錯環境。
凌陽十六位單晶片軟體開發環境的工具欄中含有 µ’nSP™ IDE 提供的 3 種工具欄:標準、編輯 和除錯工具欄。每種工具欄都有固定和浮動兩種形式。
把滑鼠移到固定形式工具欄中沒有圖示的地方,按住左按鈕,向下拖動滑鼠,
-
61 板實驗指導手冊書
僑高科技有限公司 15
即可將工具欄變為浮動工具欄;雙擊浮動工具欄的標題條,則可將其變為固定
工具欄。
固定形式的標準工具欄位於功能表欄的下面,它以圖示的形式提供了部分
常用功能表命令的功能。只要用滑鼠單擊代表某個命令的圖示按鈕,就能直接
執行相應的功能表命令。工具條中有 38 個圖示,代表 38 種操作,如圖12 所
示。
圖12 工具欄
μ’nSP™ IDE支援多文檔視窗操作,用戶可以在主介面裏同時打開多個視窗,如圖13 所示。
圖13 文檔窗口
主介面裏通常有三個主要視窗:Workspace(工作區)視窗、Edit(編輯)視
窗和 Output(輸出)視窗。進行視窗切換只需在各視窗處單擊滑鼠左鍵即可。
此外,主介面裏還提供下拉功能表、工具欄等。
μ’nSP™ IDE支援軟體模擬和線上除錯。在兩種除錯過程中,均有單步運行、全速運行、中斷點除錯以及變數視窗、暫存器視窗、記憶體視窗、反彙編視窗
等以方便用戶進行軟體除錯和硬體除錯。軟體除錯時,軟體開發環境可以模擬
各種中斷和埠狀態。這些均為軟體發展者提供了方便。如圖14 為除錯狀態介面。
-
61 板實驗指導手冊書
僑高科技有限公司 16
圖14 檔程式 Download 後的除錯介面
在 μ’nSP™ IDE中,配備硬體聲明的頭檔和常用函數模組,例如鍵盤掃描模組,語音音量調節模組等等。另外還配備各種庫檔,包括標準 C 常用的庫函數、
凌陽音頻庫函數等,尤其是凌陽音頻庫函數,只要瞭解這些函數的使用方法,用
戶就可以輕而易舉的完成平時認為較神秘的語音播放、語音錄入和語音識別功
能。這些均可以大大加快開發者的開發進程。
3.2 舉例應用 帶有資源檔案(.rc) C 與 ASM 檔範例:自動放音程序
//===============================================================//
EX1
//===============================================================//
主程序為 C 檔,程式如下:
#include // 包括 A2000.h
#define
0
// SPEECH_1 = 0 表示最大
語音索引號
// 第一通道
#define DAC2 2 // 第二通道
#define Ramp_UpDn_Off 0 // 禁止音量增/減調節
#define 1 // 僅允許音量增調節
// 僅允許音量減調節
-
61 板實驗指導手冊書
僑高科技有限公司 17
#define Ramp_UpDn_On 3 // 允許音量增減調節
main()
{
SACM_A2000_Initial(1); // 設置為自動放音方式
SACM_A2000_Play(SPEECH_1, DAC1+DAC2, Ramp_UpDn_On);
// 播放資源的 SACM_A2000 格
式語音和樂曲
while(1)
{
SACM_A2000_ServiceLoop(); // 從 SRAM 中獲取語音資料,對
其進行解碼
// 等待中斷服務程式將其送出
DAC 通道
}
}
中斷服務程式的 ASM 檔,程式如下:
.TEXT
.INCLUDE hardware.inc // 包含頭檔
.INCLUDE a2000.inc
.INCLUDE Resource.inc
.PUBLIC _FIQ; // 聲明_FIQ 中斷
_FIQ:
PUSH R1,R4 TO [SP]; R1 = C_FIQ_TMA; TEST R1, [P_INT_Ctrl];
-
61 板實驗指導手冊書
僑高科技有限公司 18
JNZ L_FIQ_TimerA; // 計時器 A 的中斷入口
L_FIQ_PWM: // 中斷 PWM FIQ 入口
R1 = C_FIQ_PWM;
[P_INT_Clear] = R1;
POP R1, R4 FROM [SP];
L_FIQ_TimerA: // 中斷副程式 FIQ_TimerA
[P_INT_Clear] = R1; // 清中斷
CALL F_FIQ_Service_SACM_A2000; // SACM-A2000 計時器 A FIQ解碼
POP R1,R4 FROM [SP]; // 出棧
RETI;
L_FIQ_TimerB: // 中斷副程式 FIQ_TimerB
[P_INT_Clear] = R1; // 清中斷
POP R1,R4 FROM [SP]; // 出棧
RETI
方法步驟:
1. 新建項目, 項目名稱 EX1。
2. 該專案下新建彙編檔, 檔案名稱 SYSTEM.ASM。
3. 在彙編檔中鍵入範例彙編源代碼(圖 15)。
4. 該專案下新建 C 檔,檔案名稱 MAIN.C。
5. 在 C 檔中鍵入範例 C 源代碼(圖 16)。
6. 在原始檔案組中添加 HARDWARE.ASM 文件。
7. 在頭文件組中添加 A2000.INC、HARDWARE.INC 和 RESOURCE.INC 頭
文件。
-
61 板實驗指導手冊書
僑高科技有限公司 19
8. 在資源檔案視窗中,添加 RES_A27、RES_A32 和 RES_A38 資源檔案。
9. 保存專案。
10. 編譯除錯該程式。
11. 下載到模擬板中。
※注意:當編譯時,會出現如下錯誤:
Error L0080: The external symbol "T_SACM_A2000_SpeechTable" has not a public
definition.
這時在系統自動生成的 Resource.asm 檔中添加如下內容即可:
.PUBLIC T_SACM_A2000_SpeechTable
T_SACM_A2000_SpeechTable
.DW _RES_A27_SA; // 資源起始位址
.DW _RES_A32_SA
.DW _RES_A38_SA
圖 15 彙編檔源代碼介面
-
61 板實驗指導手冊書
僑高科技有限公司 20
圖 16 C 檔源代碼介面
圖17 EX4 RESOURCE .ASM 編譯成功後的檔介面
-
61 板實驗指導手冊書
僑高科技有限公司 21
第 4 章 61 板結合 LED 鍵盤模組實驗
實驗一 發光二極體單向迴圈點亮
【實驗目的】
1.熟悉 µ’nSP™ IDE 環境及在該環境下用彙編和 C 語言編寫的應用程式。 2.熟悉簡單的 µ’nSP™組合語言指令。 3.以 A埠和 B埠低八位為例,學會使用 SPCE061A 單晶片 I/O埠的基本輸
出功能。
【實驗設備】
1.裝有 Windows 系統和 µ'nSP IDE 模擬環境的電腦一台。
2. 61 板一套;LED 鍵盤模組一套;10 PIN排線兩條。
【實驗說明】
1. 61 板的 I/O 輸出實驗主要以 IOA0~7 接 LED 鍵盤模組上的 8 個發
光二極體。因 61 板核心晶片 SPCE061A 已內置上下拉電阻,所以埠直
接連接發光二極體的驅動端。
2.代碼編寫上,主要涉及 SPCE061A 的埠暫存器。
暫存器 功能 使用說明
P_IOA_Dir 方向暫存器 0:輸入 1:輸出
P_IOA_Attrib 屬性暫存器 0:輸入時為電阻輸入 輸出時為
反相輸出
1:輸入時為懸浮輸入 輸出時為
同相輸出
P_IOA_Data 資料暫存器 0:電阻輸入時為下拉電阻輸入
懸浮輸入時為帶喚醒輸入同相
輸出時為低電位輸出反相輸出
時為高電位輸出
1:電阻輸入時為上拉電阻輸入
懸浮輸入時為不帶喚醒輸入 同
相輸出時為高電位輸出 反相輸
出時為低電位輸出
IOB 口暫存器定義同上。
-
61 板實驗指導手冊書
僑高科技有限公司 22
【實驗步驟】
1.用 10 PIN排線將 61 板的 J8 介面 IOA 低 8 位元連接到 LED 鍵盤
模組的 SEG 介面I/O上,再將J6 介面 IOB 低 8 位元連接到 LED 鍵盤
模組的 DIG 介面管腳上。
2.運行參考程式。
【硬體連接圖】
IOA 低 8 位元接至 SEG 介面控制 LED 的導通,IOB6 連至 DIG7 通
過 ULN2003A 控制 8 個 LED的共陰極電位狀態,也可將 DIG7 直接連至
VDD,直接將 LED 共陰極接地,不用程式控制。
-
61 板實驗指導手冊書
僑高科技有限公司 23
【程式流程圖】
【程式範例】
組合語言版:
.include hardware.inc // 包含 hardware.inc
.ram
.var R_LedControl // 定義變數
.var R_DelayCounter
-
61 板實驗指導手冊書
僑高科技有限公司 24
.code
.public _main
//==========================================================//
// 函數名稱: _main
// 功能描述: 發光二極體單向迴圈點亮
// 語法格式: void main(void);
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//===========================================================//
//===========================================================//
_main:
r1 = 0x00FF // 設置 A0~A7 埠為同相低電位輸出
[P_IOA_Dir] = r1
[P_IOA_Attrib] = r1
r1 = 0x0000
[P_IOA_Data] = r1
r1=0x0040
[P_IOB_Dir]=r1
-
61 板實驗指導手冊書
僑高科技有限公司 25
[P_IOB_Attrib]=r1
[P_IOB_Data]=r1 // B6 輸出高電位,保證 LED 陰極接地
r1=0x0001
[R_LedControl] = r1 // LED 點亮控制初值
L_MainLoop:
r1 = [R_LedControl]
[P_IOA_Data] = r1 // 送數據到 A埠
r1=r1 LSL 1 // 修改 LED 點亮控制參數
cmp r1, 0x0100 // 只有 8 個 LED,保證輸出資料
在 8 位元以內
jne NoOver r1 = 0x0001
NoOver:
[R_LedControl] = r1
r1 = 0x0000 // 延時計數器清零
[R_DelayCounter] = r1
call F_Delay // 延時
jmp L_MainLoop // 跳轉到 L_MainLoop 迴圈,點亮
LED
//===============================================================//
// 函數名稱: F_Delay
// 功能描述: 實現延時
-
61 板實驗指導手冊書
僑高科技有限公司 26
//==========================================================//
F_Delay:
L_DelayLoop:
r1=0x0001 // 清看門狗
[P_Watchdog_Clear] = r1
r1 = [R_DelayCounter]
r1 += 1 // 延時計數加 1
[R_DelayCounter] = r1
jnz L_DelayLoop // 加到 65536 嗎?
retf
C 語言版:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
-
61 板實驗指導手冊書
僑高科技有限公司 27
//==========================================================//
// 函數名稱: Delay()
// 功能描述: 實現延時
//==========================================================//
void Delay()
{ // 延時副程式
unsigned int i;
for (i=0; i
-
61 板實驗指導手冊書
僑高科技有限公司 28
//===========================================================//
int main()
{
int LedControl = 0x0001;
*P_IOA_Dir = 0x00ff; // 設置 A埠低 8 位為同向低輸出
*P_IOA_Attrib = 0x00ff;
*P_IOA_Data = 0x0000;
*P_IOB_Dir=0x0040; // 設置 B6埠為高電位輸出,保證
LED 共陰極接地
*P_IOB_Attrib=0x0040;
*P_IOB_Data=0x0040;
while(1)
{
*P_IOA_Data = LedControl; // 送數據到 A埠
LedControl = LedControl 0x00FF)
LedControl = 0x0001; Delay();
}
}
【程式練習】
在 µ’nSP™ IDE 下用組合語言和 C 語言編寫隔一發光二極體單向迴圈點亮的程式。
//===============================================================//
EX1 END
//===============================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 29
實驗二 發光二極體雙向迴圈點亮
【實驗目的】
1.熟悉 µ’nSP™ IDE 環境及在該環境下用彙編和 C 語言編寫的應用程式。 2.熟悉簡單的 µ’nSP™組合語言指令。 3.以 A 埠和 B 埠低八位為例,學會使用 SPCE061A 單晶片 I/O 埠的基本
輸出功能。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套;LED 鍵盤模組一套;10 PIN排線兩條。
【實驗說明】
1.61 板的 I/O 輸出實驗主要以 IOA0~7 接 LED 鍵盤模組上的 8 個發光
二極體。因 61 板核心芯片 SPCE061A 已內置上下拉電阻,所以埠直接
連接發光二極體的驅動端。
2.代碼編寫上,主要涉及 SPCE061A 的埠暫存器 IOA 和 IOB。
【實驗步驟】
1.用 10 PIN排線將 61 板的 J8 介面 IOA 低 8 位元連接到 LED 鍵盤
模組的 SEG 介面I/O上,在將J6 介面 IOB 低 8 位元連接到 LED 鍵盤
模組的 DIG 介面I/O上。
2.運行參考程式。
-
61 板實驗指導手冊書
僑高科技有限公司 30
【硬體連接圖】
IOA 低 8 位元接至 SEG 介面控制 LED 的導通,IOB6 連至 DIG7 通過
ULN2003A 控制 8 個 LED 的共陰極電位狀態,也可將 DIG7 直接連至 VDD,
直接將 LED 共陰極接地,不用程式控制。
-
61 板實驗指導手冊書
僑高科技有限公司 31
【程式流程圖】
-
61 板實驗指導手冊書
僑高科技有限公司 32
【程式範例】
組合語言版:
//==========================================================//
// 工程名稱: led2.spj
// 功能描述: 發光二極體雙向迴圈點亮
// IDE 環境: SUNPLUS u'nSPTM IDE 1.8.4
//==========================================================//
.include hardware.inc // 包含 hardware.inc
.ram
.var R_LedControl // 定義變數
.var R_DelayCounter
.var R_LedDir
.code
.public _main
//===========================================================//
// 函數名稱: _main()
// 功能描述: 發光二極體雙向迴圈點亮
//===========================================================//
_main:
-
61 板實驗指導手冊書
僑高科技有限公司 33
r1 = 0x00FF //設置 A0~A7埠為同相低電位輸出
[P_IOA_Dir] = r1
[P_IOA_Attrib] = r1
r1 = 0x0000
[P_IOA_Data] = r1
r1=0x0040
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
[P_IOB_Data]=r1 // B6 輸出高電位,保證 LED 陰極
接地
r1=0x0001
[R_LedControl] = r1 // LED 點亮控制初值
r1 = 0x0000
[R_LedDir] = r1; L_MainLoop:
r1 = [R_LedControl]
[P_IOA_Data] = r1 // 送數據到 A埠
r1 = [R_LedDir]
cmp r1,0x0001
je MoveR // 反向右移
r1 = [R_LedControl]
-
61 板實驗指導手冊書
僑高科技有限公司 34
r1 = r1 LSL 1 // 修改 LED 點亮控制參數
cmp r1,0x0100 // 只有 8 個 LED,保證輸出資料
在 8 位元以內
jne NoOver
r1 = 0x0001 // 正向左移完畢,移位方向改變
[R_LedDir] = r1;
r1 = [R_LedControl] // [R_LedControl]數據不變
NoOver:
[R_LedControl] = r1
r1 = 0x0000 // 延時計數器清零
[R_DelayCounter] = r1
call F_Delay // 延時
jmp L_MainLoop // 跳轉到 L_MainLoop 迴圈,點
亮 LED MoveR:
r1 = [R_LedControl]
r1 = r1 LSR 1 // 修改 LED 點亮控制參數
cmp r1,0x0000
jne NoOver
r1 = 0x0000 // 反向右移完畢,移位方向改變
[R_LedDir] = r1;
r1 = [R_LedControl] // [R_LedControl]數據不變
-
61 板實驗指導手冊書
僑高科技有限公司 35
jmp NoOver // 跳轉到延時函數
//==========================================================//
// 函數名稱: F_Delay()
// 功能描述: 實現延時
//==========================================================//
F_Delay:
L_DelayLoop:
r1=0x0001 // 清看門狗
[P_Watchdog_Clear] = r1
r1 = [R_DelayCounter]
r1 += 1 // 延時計數加 1
[R_DelayCounter] = r1
jnz L_DelayLoop // 加到 65536 嗎?
Retf
C 語言版:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
-
61 板實驗指導手冊書
僑高科技有限公司 36
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
//==========================================================//
// 函數名稱: Delay()
// 功能描述: 實現延時
//==========================================================//
void Delay()
{ // 延時副程式
unsigned int i;
for (i=0; i
-
61 板實驗指導手冊書
僑高科技有限公司 37
int main()
{
int LedControl = 0x0001;
int LedDir = 0x0000;
*P_IOA_Dir = 0x00ff; // 設置 A埠低 8 位為同向低輸出
*P_IOA_Attrib = 0x00ff;
*P_IOA_Data = 0x0000;
*P_IOB_Dir=0x0040; // 設置 B6埠為高電位輸出,保證
LED 共陰極接地
*P_IOB_Attrib=0x0040;
*P_IOB_Data=0x0040;
while(1)
{
*P_IOA_Data = LedControl; // 送數據到 A埠
if (LedDir == 1) // 反向右移迴圈
{
LedControl = LedControl >> 1;
if (LedControl == 0x0000) // 反向迴圈完畢
{
LedDir = 0x0000; LedControl = 0x0001;
-
61 板實驗指導手冊書
僑高科技有限公司 38
}
}
else
{ // 正向左移迴圈
LedControl = LedControl > 1;
}
} Delay();
}
}
【程式練習】
在 µ’nSP™ IDE 下用組合語言和 C 語言編寫隔一或者隔二發光二極體雙向迴圈點亮的程式。
//===============================================================//
EX2 END
//===============================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 39
實驗三 按鍵點亮發光二極體
【實驗目的】
1.熟悉 µ’nSP™ IDE 環境及在該環境下用彙編和 C 語言編寫的應用程式。 2.熟悉簡單的 µ’nSP™組合語言指令。 3.以 A埠和 B埠為例,學會使用 SPCE061A 單晶片 I/O埠的基本輸出和輸
入功能。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套;LED 鍵盤模組一套;10 PIN排線兩條。
【實驗說明】
1. 61 板的 I/O 輸出實驗主要以 IOA0~7 接 LED 鍵盤模組上的 8 個發光
二 極 體 ,IOA8IOA15 接 鍵 盤 K1~K8 的 輸 入 。 因 61 板 核 心 晶 片
SPCE061A 已內置上下拉電阻,所以埠直接連接發光二極體的驅動端。
2.實驗結果是按鍵後相應發光二極體點亮。
3.代碼編寫上,主要涉及 SPCE061A 的埠暫存器 IOA 和 IOB。
【實驗步驟】
1.用 10 PIN排線將 61 板的 J8 介面 IOA 低 8 位元連接到 LED 鍵盤模
組的 SEG 介面I/O上,將 J6 介面 IOB 低 8 位元連接到 LED 鍵盤模組
的 DIG 介面I/O上,將 J9 介面 IOA 高 8 位元連接到 LED 鍵盤 模組
的 1*8KEY 介面I/O上,將 1*8KEY 介面中 ROW1 接至 DGND 上。
2.運行參考程式。
-
61 板實驗指導手冊書
僑高科技有限公司 40
【硬體連接圖】
IOA 低 8 位元接至 SEG 介面控制 LED 的導通,IOA 高 8 位元連接到
LED 鍵盤模組的 1*8KEY 介面I/O上,讀取相應按鍵值,1*8key 中 ROW1 與
DGND 相連,IOB6 連至 DIG7 通過 ULN2003A 控制8 個 LED 的共陰極電位
狀態,也可將 DIG7 直接連至 VDD,直接將 LED 共陰極接地,不用程式控
制。
-
61 板實驗指導手冊書
僑高科技有限公司 41
【程式流程圖】
【程式範例】
組合語言版:
.include hardware.inc // 包含 hardware.inc
.external F_GetKey
.ram
.var R_key // 定義變數
.code
.public _main
//===========================================================//
// 函數名稱: _main
-
61 板實驗指導手冊書
僑高科技有限公司 42
// 日 期: 20040816
// 功能描述: 按鍵點亮發光二極體
// 語法格式: void main(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//===========================================================//
_main:
r1 = 0x00FF // 設置 A0~A7埠為同相低電位輸出
[P_IOA_Dir] = r1 //A8 ~A15 為高電位輸入
[P_IOA_Attrib] = r1
r1 = 0xff00
[P_IOA_Data] = r1
r1=0x0040
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
[P_IOB_Data]=r1 // B6 輸出高電位,保證 LED 陰極
接地
L_MainLoop:
call F_GetKey // 取鍵值
-
61 板實驗指導手冊書
僑高科技有限公司 43
[R_key] = r1
r1 = r1 lsr 4 // 取新的顯示資料
r1 = r1 lsr 4
[P_IOA_Data] = r1
jmp L_MainLoop
//==========================================================//
功能:取鍵值
//==========================================================//
.include hardware.inc
.define KEY_ALL 0xff00 // 使用 IOA8~IOA15 作為鍵盤輸
入口
//==========================================================//
// 函數名稱: F_GetKey
// 功能描述: 等待直到有鍵按下並抬起,返回鍵值,沒有去抖處理
// 輸 出: 由 r1 返回 16 位鍵值
//==========================================================//
.public F_GetKey;
.code
F_GetKey:
push r2 to [sp]
-
61 板實驗指導手冊書
僑高科技有限公司 44
r1=[P_IOA_Dir] //初始化 IOA 的相應埠為上拉輸入
r1&=~KEY_ALL
[P_IOA_Dir]=r1 r1=[P_IOA_Attrib] r1&=~KEY_ALL
[P_IOA_Attrib]=r1 r1=[P_IOA_Buffer] r1|=KEY_ALL
[P_IOA_Buffer]=r1
L_WaitKeyDown: //等待有鍵按下,即有埠變為 0
r1=1
[P_Watchdog_Clear]=r1 //清看門狗
r1=[P_IOA_Data]
r1&=KEY_ALL
r1^=KEY_ALL //取反
jz L_WaitKeyDown //如果 r1 為 0 說明沒有鍵按下,繼續等待
L_WaitKeyUp: //如果有鍵按下則等待該鍵抬起
r2=1
[P_Watchdog_Clear]=r2 r2=[P_IOA_Data] r2&=KEY_ALL r2^=KEY_ALL
jnz L_WaitKeyUp pop r2 from [sp] retf
C 語言版:
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
-
61 板實驗指導手冊書
僑高科技有限公司 45
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
extern unsigned GetKey(void);
//===========================================================//
// 函數名稱: int main()
// 日 期: 20040816
// 功能描述: 按鍵點亮發光二極體
// 語法格式 int main()
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//===============================================================//
int main()
{
unsigned Key = 0x0000;
*P_IOA_Dir = 0x00ff; //設置 A 埠低 8 位為同向低輸
出,高 8 位為同向上拉輸入
-
61 板實驗指導手冊書
僑高科技有限公司 46
*P_IOA_Attrib = 0x00ff;
*P_IOA_Data = 0xff00;
*P_IOB_Dir=0x0040; //設置 B6 埠為高電位輸出,保證
LED 共陰極接地
*P_IOB_Attrib=0x0040;
*P_IOB_Data=0x0040;
while(1)
{
Key = GetKey(); // 取鍵值
Key = Key >> 8; // 取 LED 顯示初值
*P_IOA_Data = Key;
}
}
//==========================================================//
// 功能:取鍵值
//==========================================================//
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
-
61 板實驗指導手冊書
僑高科技有限公司 47
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define KEY_ALL 0xff00 // 使用 IOA8~IOA15 作為鍵盤輸入口
unsigned GetKey(void)
{
unsigned KeyValue = 0x0000;
//初始化 IOA 的相應埠為上拉輸入
*P_IOA_Dir&=~KEY_ALL;
*P_IOA_Attrib&=~KEY_ALL;
*P_IOA_Buffer|=KEY_ALL;
//等待有鍵按下,即有埠變為 0
while(KeyValue==0)
{
KeyValue=(*P_IOA_Data & KEY_ALL)^KEY_ALL;
*P_Watchdog_Clear=1; //清看門狗
}
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
//等待按鍵抬起
while((*P_IOA_Data&KEY_ALL)^KEY_ALL)
-
61 板實驗指導手冊書
僑高科技有限公司 48
{
*P_Watchdog_Clear=1;
}
return KeyValue;
}
【程式練習】
在 µ’nSP™ IDE 下用組合語言和 C 語言編寫按鍵熄滅相應發光二極體程式。
//===============================================================//
EX3 END
//===============================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 49
實驗四 鍵控發光二極體迴圈點亮
【實驗目的】
1.熟悉 µ’nSP™ IDE 環境及在該環境下用彙編和 C 語言編寫的應用程式。 2.熟悉簡單的 µ’nSP™組合語言指令。
以 A 埠和 B 埠為例,學會使用 SPCE061A 單晶片 I/O 埠的基本輸出和
輸入功能。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套;LED 鍵盤模組一套;10 PIN排線兩條。
【實驗說明】
1. 61 板的 I/O 輸出實驗主要以 IOA0-7 接 LED 鍵盤模組上的 8 個發
光二極體,IOA8~IOA15 接 鍵盤 K1~K8 的輸入,將 J6 介面 IOB 低 8
位元連接到 LED 鍵盤模組的 DIG 介面I/O上,將 1*8KEY 介面中
ROW1 接至 VDD 上。因 61 板核心晶片 SPCE061A 已內置上下拉電
阻,所以埠直接連接發 光二極體的驅動端。
2.實驗的結果是實現按鍵後從相應按鍵對應的發光二極體開始迴圈點亮。
3.代碼編寫上,主要涉及 SPCE061A 的埠暫存器 IOA 和 IOB。
【實驗步驟】
1.用 10 PIN排線將 61 板的 J8 介面 IOA 低 8 位元連接到 LED 鍵盤模
組的 SEG 介面I/O上,將 J6 介面 IOB 低 8 位元連接到 LED 鍵盤模
組的 DIG 介面I/O上,將 J9 介面 IOA 高 8 位元連接到 LED 鍵盤 模
組的 1*8KEY 介面I/O上,將 1*8KEY 介面中 ROW1 接至 VDD 上。
2.運行參考程式。
-
61 板實驗指導手冊書
僑高科技有限公司 50
【硬體連接圖】
IOA 低 8 位元接至 SEG 介面控制 LED 的導通,IOA 高 8 位元連接到
LED 鍵盤模組的 1*8KEY 介面管腳上,讀取相應按鍵值,1*8key 中 ROW1 與
DGND 相連,IOB6 連至 DIG7 通過 ULN2003A 控制8 個 LED 的共陰極電位
狀態,也可將 DIG7 直接連至 VDD,直接將 LED 共陰極接地,不用程式控
制。
-
61 板實驗指導手冊書
僑高科技有限公司 51
【程式流程圖】
-
61 板實驗指導手冊書
僑高科技有限公司 52
【程式範例】
組合語言版:
.include hardware.inc // 包含 hardware.inc
.external F_GetKey
.ram
.var R_key // 定義變數
.var R_LedControl
.code
.public _main
//==========================================================//
// 函數名稱: _main
// 日 期: 20040816
// 功能描述: 鍵控發光二極體迴圈點亮
// 語法格式: _main
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//==========================================================//
_main:
-
61 板實驗指導手冊書
僑高科技有限公司 53
r1 = 0x00FF // 設置 A0~A7 埠為同相低電位
輸出
[P_IOA_Dir] = r1
[P_IOA_Attrib] = r1
r1 = 0xff00
[P_IOA_Data] = r1
r1=0x0040
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
[P_IOB_Data]=r1 // B6 輸出高電位,保證 LED 陰極
接地
r1 = 0
[R_LedControl] = r1
L_MainLoop:
call F_GetKey // 取鍵值
[R_key] = r1 cmp r1, 0x0000 je L_LedLoop
r1 = r1 lsr 4 // 取新的顯示資料
r1 = r1 lsr 4
[R_LedControl] = r1
L_LedLoop:
r1 = [R_LedControl]
-
61 板實驗指導手冊書
僑高科技有限公司 54
[P_IOA_Data] = r1 // 送數據到 A埠
r1 = r1 LSL 1 // 修改 LED 點亮控制參數
cmp r1,0x0100 // 只有 8 個 LED,保證輸出資料
在 8 位元以內
jne L_LedValue
r1 = 0x0001 // Led 顯示初始值
L_LedValue // Led 下一次顯示值
[R_LedControl] = r1
jmp L_MainLoop // 跳轉到 L_MainLoop 迴圈
//===========================================================//
// 取鍵值程式如下:
//===========================================================//
.include hardware.inc
.define KEY_ALL 0xff00 // 使用 IOA8~IOA15 作為鍵盤輸
入口
.ram
.var Delay = 0
//===========================================================//
// 函數名稱: F_GetKey
-
61 板實驗指導手冊書
僑高科技有限公司 55
// 語 法: unsigned F_GetKey(void)
// 功能描述: 等待直到有鍵按下並抬起,返回鍵值,沒有去抖處理
// 輸 出: 由 r1 返回 16 位鍵值
//===========================================================//
.public F_GetKey;
.code
F_GetKey:
push r2 to [sp]
r1=[P_IOA_Dir] //初始化 IOA 的相應埠為上拉輸入
r1&=~KEY_ALL
[P_IOA_Dir]=r1 r1=[P_IOA_Attrib] r1&=~KEY_ALL
[P_IOA_Attrib]=r1
r1=[P_IOA_Buffer]
r1|=KEY_ALL
[P_IOA_Buffer]=r1
r3=0x3000
L_WaitKeyDown: //等待有鍵按下,即有埠變為 0
r3-=1
jz L_WaitKeyUp //延時沒有檢測到按鍵,返回
r1=1
-
61 板實驗指導手冊書
僑高科技有限公司 56
[P_Watchdog_Clear]=r1 //清看門狗
r1=[P_IOA_Data]
r1&=KEY_ALL
r1^=KEY_ALL //取反
jz L_WaitKeyDown //如果 r1 為 0 說明沒有鍵按下,繼續等待
L_WaitKeyUp: //如果有鍵按下則等待該鍵抬起
r2=1
[P_Watchdog_Clear]=r2 r2=[P_IOA_Data] r2&=KEY_ALL r2^=KEY_ALL
jnz L_WaitKeyUp pop r2 from [sp] retf
C 語言版:
//==========================================================//
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
extern unsigned GetKey(void);
-
61 板實驗指導手冊書
僑高科技有限公司 57
#define KEY_ALL 0xff00 // 使用 IOA8~IOA15 作為鍵盤輸入口
//===========================================================//
// 函數名稱: int main()
// 功能描述: 鍵控發光二極體迴圈點亮
// 語法格式: int main()
//===========================================================//
int main()
{
unsigned Key = 0x0000;
int LedControl = 0x0000;
*P_IOA_Dir = 0x00ff; // 設置 A埠低 8 位為同向低輸出
*P_IOA_Attrib = 0x00ff; // 設置 A埠高 8 位為同向高輸入
*P_IOA_Data = 0xff00;
*P_IOB_Dir=0x0040; // 設置 B6埠為高電位輸出,保證
LED 共陰極接地
*P_IOB_Attrib=0x0040;
*P_IOB_Data=0x0040;
while (1)
{
-
61 板實驗指導手冊書
僑高科技有限公司 58
Key = GetKey(); // 取鍵值
if (Key != 0) // 重新按鍵
{
Key = Key >> 8; // 取 LED 顯示初值
LedControl = Key;
}
*P_IOA_Data = LedControl; // LED 迴圈顯示
LedControl = LedControl
-
61 板實驗指導手冊書
僑高科技有限公司 59
#define KEY_ALL 0xff00 // 使用 IOA8~IOA15 作為鍵盤輸入口
unsigned GetKey(void)
{
unsigned KeyValue = 0x0000;
unsigned KeyNumber = 0x0000;
*P_IOA_Dir&=~KEY_ALL; //初始化 IOA 的相應埠為上拉輸
入
*P_IOA_Attrib&=~KEY_ALL;
*P_IOA_Buffer|=KEY_ALL;
while(KeyValue==0) //等待有鍵按下,即有埠變為 0
{
KeyNumber++;
*P_Watchdog_Clear=1; //清看門狗
KeyValue=(*P_IOA_Data&KEY_ALL)^KEY_ALL;
if(KeyNumber==0x1000)
break;
}
while((*P_IOA_Data&KEY_ALL)^KEY_ALL) //等待按鍵抬起
{
*P_Watchdog_Clear=1;
-
61 板實驗指導手冊書
僑高科技有限公司 60
}
return KeyValue;
}
【程式練習】
在 µ’nSP™ IDE 下用組合語言和 C 語言編寫鍵控發光二極體點亮方向程式,按鍵 K1~K4 向左循環點亮,按鍵 K5~K8 向右迴圈點亮。
//===============================================================//
EX4 END
//===============================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 61
實驗五 七段顯示器顯示 0-9
【實驗目的】
1.瞭解 SPCE061A 控制 LED 七段顯示器顯示的方法。
2.進一步熟悉 µ’nSP™組合語言和 C 語言程式設計。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套;LED 鍵盤模組一套;10 PIN排線兩條。
【實驗說明】
LED 鍵盤模組包含兩組共 6 個 LED 七段顯示器,如圖所示:
要實現每個七段顯示器分別顯示不同數位的效果,例如,要顯示“123456",
則需要不斷地快速刷新七段顯示器的顯示狀態,即先使第一個七段顯示器顯示數
位“1",其他七段顯示器熄滅,然後熄滅第一個七段顯示器,第二個七段顯示器
顯示數位“2",以此類推。這樣,利用人眼的視覺殘留效應,就產生了“123456"
同時顯示出來的效果。
【實驗步驟】
1.將 61 板的 IOB0-7 用排線連接到 LED 鍵盤模組的 SEG 排針上;
IOB8~IOB15 連接到 LED鍵盤模組的 DIG 排針上。
2.運行參考程式。
-
61 板實驗指導手冊書
僑高科技有限公司 62
【硬體連接圖】
其原理圖如下,其中 A~G 與 DP 在 LED 鍵盤模組中由“SEG"排針引
出,G1~G6 則對應 LED鍵盤模組“DIG"排針的“DIG1"~“DIG6"埠,時鐘冒
號 D_DP 在“2*4KEY"排針中可以找到。
單晶片的 I/O 控制 G1~G6 可以選 6 個 LED 七段顯示器中的一個或幾
個點亮,而控制 A~G 以及 DP則可以設定七段顯示器顯示的圖形。
-
61 板實驗指導手冊書
僑高科技有限公司 63
【程式流程圖】
-
61 板實驗指導手冊書
僑高科技有限公司 64
【程式範例】
組合語言版:
.include hardware.inc
.define LED_SEG 0x00ff // IOB0~IOB7
.define LED_DIG 0x3f00 // IOB8~IOB13
.ram
.var Pos,Dig,TimerCnt
.data
DigCode:
.dw 0x3F,0x06,0x5B,0x4F,0x66
.dw 0x6D,0x7D,0x07,0x7F,0x6F // 0~9 十個數位的 LED 編碼
.code
//==========================================================//
// 函數名稱: LedDispDig
// 功能描述: 在指定的七段顯示器上顯示數位
// 語法: void LedDispDig (int Pos,int Dig)
//
輸
輸入: Pos: 要顯示數位的七段顯示器位置,取值範圍 1~6
Dig: 要顯示的數位,取值範圍 0~9
// 輸出: 無
//==========================================================//
.public LedDispDig
-
61 板實驗指導手冊書
僑高科技有限公司 65
LedDispDig:
push r1,r2 to [sp]
r1=1
[P_Watchdog_Clear]=r1
// 初始化 IOB 為同相輸出 r1=[P_IOB_Dir] r1|=LED_DIG+LED_SEG
[P_IOB_Dir]=r1 r1=[P_IOB_Attrib] r1|=LED_DIG+LED_SEG
[P_IOB_Attrib]=r1
// 將數位的位置轉換為 IOB 高 8 位值,選中相應七段顯示器
r1=0x0080
r2=[Pos] // 將 0x0080 左移(Pos)位
L_SetIOBHigh:
r1=r1 LSL 1
r2-=1
jnz L_SetIOBHigh
[P_IOB_Data]=r1
// 將數位轉換為編碼,作為 IOB 低 8 位輸出
r1=[Dig] r2=DigCode r2+=r1 r1=[r2]
r2=[P_IOB_Buffer]
r2|=r1
[P_IOB_Data]=r2
pop r1,r2 from [sp]
-
61 板實驗指導手冊書
僑高科技有限公司 66
retf
//===========================================================//
// 主函數
//===========================================================//
.public _main
_main:
L_MainLoop: // 迴圈 1:主迴圈
r1=0
[Dig]=r1
L_DigLoop: // 迴圈 2:迴圈顯示 0~9 十個數字
r1=0
[TimerCnt]=r1
L_TimerLoop: // 迴圈 3:每組數字保持一段時間
r1=1
[Pos]=r1
L_DispLoop: // 迴圈 4:讓 6 個七段顯示器顯
示相同的數位(即 Dig 的值)
call LedDispDig
r1=[Pos] // 判斷迴圈 4 是否結束
r1+=1
-
61 板實驗指導手冊書
僑高科技有限公司 67
[Pos]=r1
cmp r1,6
jna L_DispLoop
r1=[TimerCnt] // 判斷迴圈 3 是否結束
r1+=1
[TimerCnt]=r1
cmp r1,1000
jb L_TimerLoop
r1=[Dig] // 判斷迴圈 2 是否結束
r1+=1
[Dig]=r1
cmp r1,9
jna L_DigLoop
jmp L_MainLoop // 返回主迴圈
retf
C 語言版:
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
-
61 板實驗指導手冊書
僑高科技有限公司 68
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define LED_SEG 0x00ff // IOB0~IOB7
#define LED_DIG 0x3f00 // IOB8~IOB13
const unsigned char DigCode[10]={0x3F,0x06,0x5B,
0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 0~9 十個數位的 LED 編碼
//===========================================================//
// 函數名稱: LedDispDig
// 功能描述: 在指定的七段顯示器上顯示數位
// 語法: void LedDispDig(int Pos,int Dig)
//
輸
輸入: Pos: 要顯示數位的七段顯示器位置,取值範圍 1~6
Dig: 要顯示的數位,取值範圍 0~9
// 輸出: 無
//===========================================================//
void LedDispDig(int Pos,int Dig)
{
*P_Watchdog_Clear=1;
// 初始化 IOB 為同相輸出
*P_IOB_Dir|=LED_SEG+LED_DIG;
*P_IOB_Attrib|=LED_SEG+LED_DIG;
*P_IOB_Data=(unsigned)0x0100
-
61 板實驗指導手冊書
僑高科技有限公司 69
高 8 位值,選中相應的
// 七段顯示器
*P_IOB_Data|=DigCode[Dig]; // 將數位轉換為編碼,作為
IOB 低 8 位輸出
}
//===========================================================//
// 主函數
//===========================================================//
int main()
{
int Pos,Dig,TimerCnt;
while(1)
{
for(Dig=0;Dig
-
61 板實驗指導手冊書
僑高科技有限公司 70
}
}
}
【程式練習】
編寫程式控制所有七段顯示器迴圈顯示 0~9~0。
//===============================================================//
EX5 END
//===============================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 71
實驗六 七段顯示器移位元迴圈顯示 0-9
【實驗目的】
1.熟悉 SPCE061A 控制 LED 七段顯示器顯示的方法。
2.進一步熟悉 µ’nSP™組合語言和 C 語言程式設計。 3.實驗效果:
由六個 LED 七段顯示器移位元迴圈顯示 0~9,即:“012345",“123456",
“234567",⋯⋯,“890123",“901234"⋯⋯。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套;LED 鍵盤模組一套;10 PIN排線兩條。
【實驗步驟】
1.將 61 板的 IOB0-7 用排線連接到 LED 鍵盤模組的 SEG 排針上;
IOB8~IOB15 連接到 LED鍵盤模組的 DIG 排針上。
2.運行參考程式。
【硬體連接圖】
參見實驗五。
【程式流程圖】
LedDispDig 函數流程參見實驗五。
-
61 板實驗指導手冊書
僑高科技有限公司 72
-
61 板實驗指導手冊書
僑高科技有限公司 73
【程式範例】
組合語言版:
.include hardware.inc
.define LED_SEG 0x00ff // IOB0~IOB7
.define LED_DIG 0x3f00 // IOB8~IOB13
.ram
.var Pos,Dig,TimerCnt
.data
DigCode:
.dw 0x3F,0x06,0x5B,0x4F,0x66
.dw 0x6D,0x7D,0x07,0x7F,0x6F // 0~9 十個數位的 LED 編碼
.code
//==========================================================//
// 函數名稱: LedDispDig
// 功能描述: 在指定的七段顯示器上顯示數位
// 語法: void LedDispDig(int Pos,int Dig)
// 輸入: Pos: 要顯示數位的七段顯示器位置,
取值範圍 1~6
Dig: 要顯示的數位,取值範圍 0~9
// 輸出: 無
-
61 板實驗指導手冊書
僑高科技有限公司 74
//==========================================================//
(略,見實驗五)
//==========================================================//
// 主函數
//==========================================================//
.public _main
_main:
r1=0 // 設置迴圈的起始數字
L_MainLoop: // 迴圈 1:主迴圈
r2=1000 // 迴圈 2:每組數字保持一段時間
L_TimerLoop:
[Dig]=r1
r3=1
[Pos]=r3
L_DigLoop: // 迴圈 3:使六個七段顯示器分別
顯示數位
call LedDispDig // 在第[Pos]個七段顯示器上顯示數
位[Dig]
r3=[Dig]
r3+=1
-
61 板實驗指導手冊書
僑高科技有限公司 75
cmp r3,9 // 使數字在 0~9 之間迴圈
jna L_DigNext r3=0
L_DigNext:
[Dig]=r3
r3=[Pos] // 判斷迴圈 3 是否結束
r3+=1
[Pos]=r3
cmp r3,6
jna L_DigLoop
r2-=1
jnz L_TimerLoop // 判斷迴圈 2 是否結束
r1+=1 // 得到下一組數位的起始數位
cmp r1,9 // 如果大於 9 則清 0
jna L_MainLoop r1=0
jmp L_MainLoop
retf
C 語言版:
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define LED_SEG 0x00ff //IOB0~IOB7
#define LED_DIG 0x3f00 //IOB8~IOB13
-
61 板實驗指導手冊書
僑高科技有限公司 76
const unsigned char DigCode[10]={0x3F,0x06,0x5B,
0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 0~9 十個數位的 LED 編碼
//==========================================================//
// 函數名稱: LedDispDig
// 功能描述 在指定的七段顯示器上顯示數位
// 語法: void LedDispDig(int Pos,int Dig)
// 輸入: Pos: 要顯示數位的七段顯示器位置,取值範圍 1~6
// Dig: 要顯示的數位,取值範圍 0~9
// 輸出: 無
//==========================================================//
(略,見實驗五)
//==========================================================//
// 主函數
//==========================================================//
int main()
{
int Pos,DigStart,Dig,TimerCnt;
DigStart=0; // 設置迴圈的起始數字
while(1)
{
-
61 板實驗指導手冊書
僑高科技有限公司 77
for(TimerCnt=0;TimerCnt9)DigStart=0;
}
}
【程式練習】
編寫程式使十個數位在七段顯示器上向右移位元迴圈顯示,即“012345",
“901234",“890123",⋯⋯。
//===============================================================//
EX6 END
//===============================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 78
實驗七 發光二極體和七段顯示器交替顯示
【實驗目的】
1.熟悉 SPCE061A 控制 LED 七段顯示器顯示的方法。
2.進一步熟悉 µ’nSP™組合語言和 C 語言程式設計。 3.實驗效果:
發光二極體全部點亮;發光二極體全部熄滅,七段顯示器全部顯示數位元
8;七段顯示器全部熄滅,發光二極體全部點亮,如此反復。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套; LED 鍵盤模組一套;10 PIN排線兩條。
【實驗說明】
發光二極體和七段顯示器的顯示資料都由 LED 鍵盤模組的 SEG 排針控
制,而 DIG 排針上的“DIG7"對應發光二極體,“DIG1~DIG6"則對應 6 個七段
顯示器。將單晶片的 I/O 埠與上述介面連接,即可分別控制發光二極體和各個
七段顯示器。
【實驗步驟】
1.將 61 板的 IOB0-7 用排線連接到 LED 鍵盤模組的 SEG 排針上;
IOB8~IOB15 連接到 LED鍵盤模組的 DIG 排針上。
2.運行參考程式
【硬體連接圖】
參見實驗一和實驗五。
【程式流程圖】
LedDispDig 函數流程圖參見實驗五。
-
61 板實驗指導手冊書
僑高科技有限公司 79
【程式範例】
組合語言版:
.include hardware.inc
.define LED_SEG 0x00ff // IOB0~IOB7 控制七段顯示器或
燈的狀態
.define LED_DIG 0x3f00 // IOB8~IOB13 分別控制 6 個七段
顯示器
-
61 板實驗指導手冊書
僑高科技有限公司 80
.define LED_LIGHTS 0x4000 // IOB14 控制 LED 燈
.ram
.var Pos,Dig,BitValue,TimerCnt
.data
DigCode:
.dw 0x3F,0x06,0x5B,0x4F,0x66
.dw 0x6D,0x7D,0x07,0x7F,0x6F // 0~9 十個數位的 LED 編碼
.code
//==========================================================//
// 函數名稱: LedDispDig
// 功能描述: 在指定的七段顯示器上顯示數位
// 語法: void LedDispDig(int Pos,int Dig)
//
輸
輸入: Pos: 要顯示數位的七段顯示器位置,
取值範圍 1~6
Dig: 要顯示的數位,取值範圍 0~9
// 輸出: 無
//==========================================================//
(略,見實驗五)
//==========================================================//
// 函數名稱: LedLights
// 語 法: void LedLights(int BitValue)
// 功能描述: 控制 LED 燈
-
61 板實驗指導手冊書
僑高科技有限公司 81
// 輸入: BitValue: 8 個 LED 燈的亮滅狀態
// 輸出: 無
//==========================================================//
.public LedLights
LedLights:
push r1 to [sp]
r1=1
[P_Watchdog_Clear]=r1
// 初始化 IOB 為同相輸出
r1=[P_IOB_Dir]
r1|=LED_LIGHTS+LED_SEG
[P_IOB_Dir]=r1 r1=[P_IOB_Attrib] r1|=LED_LIGHTS+LED_SEG
[P_IOB_Attrib]=r1
r1=[BitValue] // 顯示 BitValue 指定的值
r1|=LED_LIGHTS // 選中 LED 燈
[P_IOB_Data]=r1
pop r1 from [sp]
retf
//===========================================================//
// 主函數
//===========================================================//
-
61 板實驗指導手冊書
僑高科技有限公司 82
.public _main
_main:
L_MainLoop: // 迴圈 1:主迴圈
// 點亮全部 LED 燈
r1=0xff;
[BitValue]=r1
call LedLights
r1=60000 // 迴圈 2:保持 LED 燈點亮一段
時間
[TimerCnt]=r1
L_LightsLoop:
r1=1
[P_Watchdog_Clear]=r1
r1=[TimerCnt] // 判斷迴圈 2 是否結束
r1-=1
[TimerCnt]=r1
jnz L_LightsLoop
r1=1000 // 迴圈 3:在一段時間中使所有
七段顯示器顯示數位“8"
[TimerCnt]=r1
-
61 板實驗指導手冊書
僑高科技有限公司 83
L_DigTimerLoop:
r1=1
[Pos]=r1
L_DigLoop: // 迴圈 4:使六個七段顯示器依
次顯示數位“8"
r1=8
[Dig]=r1
call LedDispDig
r1=[Pos] q // 判斷迴圈 4 是否結束
r1+=1
[Pos]=r1
cmp r1,6
jna L_DigLoop
r1=[TimerCnt]
r1-=1
[TimerCnt]=r1
jnz L_DigTimerLoop // 判斷迴圈 3 是否結束
jmp L_MainLoop // 返回主迴圈
retf
C 語言版:
-
61 板實驗指導手冊書
僑高科技有限公司 84
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define LED_SEG 0x00ff // IOB0~IOB7 控制七段顯示器或燈
的狀態
#define LED_DIG 0x3f00 // IOB8~IOB13 分別控制 6 個七段
顯示器
#define LED_LIGHTS 0x4000 // IOB14 控制 LED 燈
const unsigned char DigCode[10]={0x3F,0x06,0x5B,
0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 0~9 十個數位的 LED 編碼
//===========================================================//
// 函數名稱: LedDispDig
// 語 法: void LedDispDig(int Pos,int Dig)
// 功能描述: 在指定的七段顯示器上顯示數位
// 輸入: Pos: 要顯示數位的七段顯示器位置,取值範圍 1~6
// Dig: 要顯示的數位,取值範圍 0~9
// 輸出: 無
//===========================================================//
(略,見實驗五)
-
61 板實驗指導手冊書
僑高科技有限公司 85
//===========================================================//
// 函數名稱: LedLights
// 語 法: void LedLights(int BitValue)
// 功能描述: 控制 LED 燈
// 輸入: BitValue: 8 個 LED 燈的亮滅狀態
// 輸出: 無
//===========================================================//
void LedLights(int BitValue)
{
*P_Watchdog_Clear=1;
// 初始化 IOB13 為同相輸出
*P_IOB_Dir|=LED_LIGHTS+LED_SEG;
*P_IOB_Attrib|=LED_LIGHTS+LED_SEG;
*P_IOB_Data=LED_LIGHTS; // 選中 LED 燈
*P_IOB_Data|=BitValue; // 顯示 BitValue 指定的值
}
// 主函數
//==========================================================//
int main()
{
unsigned Pos,TimerCnt;
-
61 板實驗指導手冊書
僑高科技有限公司 86
while(1) // 迴圈 1:主迴圈
{
LedLights(0xff); //點亮全部 LED 燈
for(TimerCnt=0;TimerCnt
-
61 板實驗指導手冊書
僑高科技有限公司 87
實驗八 按鍵顯示數位
【實驗目的】
1.熟悉 SPCE061A 控制鍵盤和 LED 七段顯示器顯示的方法。
2.進一步熟悉 µ’nSP™組合語言和 C 語言程式設計。 3.實驗效果:
在七段顯示器上顯示按鍵的值,按第一個鍵則顯示"1",按第二個鍵顯示
"2",……,按第 8 個鍵顯示"8"。
【實驗設備】
1.裝有 Windows 系統和 µ’nSP™ IDE 模擬環境的電腦一台。 2. 61 板一套; LED 鍵盤模組一套;10 PIN排線三條。
【實驗步驟】
1.將 LED 鍵盤模組的"KEYTYPE"跳線跳到"1*8KEY"狀態;將 61 板的
IOA8~IOA15 用排線連接到 LED 鍵盤模組的 1*8KEY 排針上;IOB0~7
連接到 LED 鍵盤模組的 SEG 排針上;IOB8~IOB15 連接到 LED 鍵盤模
組的 DIG 排針上。
2.運行參考程式。
【硬體連接圖】
參見實驗三和實驗五。
【程式流程圖】
LedDispDig 函數流程圖參見實驗五。
-
61 板實驗指導手冊書
僑高科技有限公司 88
【程式範例】
組合語言版:
.include hardware.inc
.define LED_SEG 0x00ff // IOB0~IOB7 控制七段顯示器或
燈的狀態
.define LED_DIG 0x3f00 // IOB8~IOB13 分別控制 6 個七段
顯示器
.define LED_LIGHTS 0x4000 // IOB14 控制 LED 燈
-
61 板實驗指導手冊書
僑高科技有限公司 89
.define KEY_ALL 0xff00 // 使用 IOA8~IOA15 作為鍵盤輸
入口
.ram
.var Pos,Dig
.data
DigCode:
.dw 0x3F,0x06,0x5B,0x4F,0x66
.dw 0x6D,0x7D,0x07,0x7F,0x6F //0~9 十個數位的 LED 編碼
.code
//===========================================================//
// 函數名稱: LedDispDig
// 功能描述: 在指定的七段顯示器上顯示數位
// 語法: void LedDispDig(i