【精華】rcx手冊(cè)_第1頁(yè)
【精華】rcx手冊(cè)_第2頁(yè)
【精華】rcx手冊(cè)_第3頁(yè)
【精華】rcx手冊(cè)_第4頁(yè)
【精華】rcx手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.工作總結(jié)、述職報(bào)告、申報(bào)文本、申請(qǐng)文書(shū)、可行性報(bào)告等精品文檔RCX手冊(cè)作者:Ole Caprani University of Aarhus, Department of Computer Science ocapranidaimi.au.dk譯者:任永 北京交通大學(xué)電氣學(xué)院 ryong21 致謝 感謝董春教授一直以來(lái)的關(guān)心與指導(dǎo)。感謝您為我提供樂(lè)高機(jī)器人并將辦公電腦讓與我使用,使我有機(jī)會(huì)接觸到樂(lè)高并完成這篇文章的翻譯與錄入工作。 目錄1.簡(jiǎn)介 2.H8/3292微型控制器 3.RCX:CPU、存儲(chǔ)器和輸入/輸出設(shè)備 3.1 RCX 的CPU 3.2 RCX的存儲(chǔ)器 3.3 RCX的輸入/輸

2、出設(shè)備 3.3.1 訪問(wèn)RCX的設(shè)備寄存器 3.3.2 RCX中斷和中斷處理 3.3.3按鈕 3.3.4 RCX輸入口和傳感器3.3.5 紅外發(fā)射/接收 3.3.6 LCD顯示屏 3.3.7揚(yáng)聲器 3.3.8 RCX輸出口和執(zhí)行器件 4. RCX預(yù)置程序(指出廠時(shí),ROM里預(yù)先燒好的程序) 5. 與RCX預(yù)置程序通信 5.1 請(qǐng)求/應(yīng)答協(xié)議 5.2 字節(jié)協(xié)議 5.3 位協(xié)議 5.4連接在RS232口的紅外發(fā)射/接收(發(fā)射塔) 5.5一個(gè)與RCX通信的用戶程序 6RCX預(yù)置程序提供底層服務(wù) 6.1 LCD子程序 7為RCX編譯程序 7.1如何安裝交叉匯編器和交叉編譯器 7.2編譯匯編語(yǔ)言程序 7

3、.3 編譯C語(yǔ)言程序 8程序下載9參考文獻(xiàn) 介紹使用樂(lè)高M(jìn)indStorms 機(jī)器人開(kāi)發(fā)系統(tǒng)您可以搭建一輛能避開(kāi)障礙走出迷宮的小車或組裝一個(gè)能顯示最小值、最大值和平均值的數(shù)字溫度計(jì)。RCX是一個(gè)可編程控制器,MindStorms系統(tǒng)的一個(gè)組件。RCX可裝在小車或數(shù)字式溫度計(jì)上來(lái)控制小車的行為和溫度計(jì)的溫度采樣與測(cè)量。 RCX使用的微型控制器,是日立H8/3292系列的H8/300單片機(jī)。本質(zhì)上是單片機(jī)在執(zhí)行控制程序,通過(guò)H8/3292的設(shè)備控制器來(lái)訪問(wèn)RCX的輸入/輸出設(shè)備如按鈕、揚(yáng)聲器, LCD顯示屏。此外, 傳感器如接觸傳感器或溫度傳感器可以連接到RCX輸入口,給控制程序提供輸入值,然后控

4、制程序再驅(qū)動(dòng)執(zhí)行器件如電機(jī)。交互過(guò)程:來(lái)自環(huán)境的刺激-小車碰到障礙可由傳感器如接觸傳感器感知,變換成輸入值。引起的反應(yīng)小車轉(zhuǎn)向控制程序輸出值到執(zhí)行器件使電機(jī)完成轉(zhuǎn)向。 RCX配備有以下輸入/輸出設(shè)備: 輸入設(shè)備四個(gè)標(biāo)有Run, OnOff, View, Prgm的按鈕三個(gè)標(biāo)有1,2,3的輸入口電量定時(shí)器紅外接收器輸出設(shè)備顯示屏揚(yáng)聲器三個(gè)標(biāo)有A, B, C的輸出口紅外發(fā)射器RCX就是通過(guò)這些輸入/輸出設(shè)備和連接到RCX輸入/輸出口的傳感器/執(zhí)行器件與環(huán)境交互??梢允褂玫膫鞲衅?執(zhí)行器件有: 傳感器應(yīng)用舉例接觸傳感器遇到障礙后, 在按鈕上產(chǎn)生一個(gè)信號(hào)光電傳感器顏色分辨, 檢測(cè)環(huán)境光亮度角度傳感器輪

5、子轉(zhuǎn)過(guò)的角度, 軸的運(yùn)動(dòng)溫度傳感器測(cè)量體溫, 室外溫度執(zhí)行器件應(yīng)用舉例電機(jī)驅(qū)動(dòng)小車, 電梯的升降燈閃光, 紅色報(bào)警光聲音蜂聲在主機(jī)上編寫(xiě)好程序后,可通過(guò)串口下載到RCX中。程序可用不同的開(kāi)發(fā)環(huán)境來(lái)開(kāi)發(fā),如LEGO 提供的圖形化開(kāi)發(fā)工具:ROBOLAB, 還有用VB來(lái)開(kāi)發(fā)程序的軟件開(kāi)發(fā)包(參見(jiàn)LEGO MindStorms),它可以下載低級(jí)的機(jī)器代碼。 這本手冊(cè)敘述UNIX 主機(jī)上一個(gè)簡(jiǎn)單的開(kāi)發(fā)環(huán)境。程序既可以用C語(yǔ)言也可用H8/300的匯編語(yǔ)言來(lái)編寫(xiě),然后通過(guò)交叉匯編器和交叉編譯器生成H8/300的機(jī)器碼,通過(guò)由片內(nèi)ROM常駐程序提供的一個(gè)簡(jiǎn)單協(xié)議下載到RCX中,常駐程序在上電和復(fù)位后就會(huì)自動(dòng)

6、運(yùn)行 。下載的程序運(yùn)行后,RCX的預(yù)置程序提供基本的I/O服務(wù)(如訪問(wèn)LCD屏),這本手冊(cè)同時(shí)也提供直接操作輸入/輸出設(shè)備的細(xì)節(jié),直接操作是通過(guò)與單片機(jī)的設(shè)備控制器和內(nèi)存分配的協(xié)調(diào)應(yīng)用實(shí)現(xiàn)的。 這本手冊(cè)和UNIX編程環(huán)境可作為為RCX開(kāi)發(fā)簡(jiǎn)單程序的工具,也可作為開(kāi)發(fā)實(shí)時(shí)操作系統(tǒng)的工具。 H8/3292 微型控制器RCX使用的是日立的H8/3292單片機(jī),屬于H8/3297系列。芯片具有計(jì)算機(jī)的三個(gè)主要功能: H8/300微處理器、存儲(chǔ)器和輸入/輸出。它們通過(guò)芯片內(nèi)的地址/數(shù)據(jù)/控制總線連接在一起。 H8/300 CPU采用通用寄存器結(jié)構(gòu)。指令集包括暫存器-暫存器運(yùn)算和邏輯操作。尋址方式包括大多

7、數(shù)常見(jiàn)的尋址方式如寄存器直接尋址,寄存器間接尋址,程序計(jì)數(shù)器和存儲(chǔ)器間接尋址。最大尋址空間是16位(64K),為程序和數(shù)據(jù)所共用。 芯片存儲(chǔ)器包括16 K 加密可編程ROM和512 個(gè)字節(jié)的RAM 。其中128字節(jié)片內(nèi)寄存器用作與片內(nèi)的輸入/輸出電路的接口。存儲(chǔ)器空間的分配決定片內(nèi)存儲(chǔ)空間和外擴(kuò)空間的如何與16位地址對(duì)應(yīng)??臻g分配與cpu的MD1和MD0引腳設(shè)置有關(guān),這兩個(gè)引腳決定處理器的工作模式(共有1, 2 或3三種)。在所有模式下片內(nèi)RAM 和片內(nèi)寄存器都使用相同的地址。模式1和2,叫外擴(kuò)模式,這兩種模式允許通過(guò)片內(nèi)的地址/數(shù)據(jù)總線訪問(wèn)外擴(kuò)的空間。模式3, 稱單片模式、只有片內(nèi)ROM和R

8、AM可以使用。當(dāng)使用外擴(kuò)存儲(chǔ)器時(shí),可以用外擴(kuò)邏輯為其空間分配地址。片內(nèi)輸入/輸出包括三種定時(shí)器(16 位自由定時(shí)器、8位定時(shí)器和監(jiān)視跟蹤定時(shí)器-watch dog), 一個(gè)串行通信接口,A/D轉(zhuǎn)換和一些輸入/輸出口。定時(shí)器可以脫離外部電路使用。串行通信接口可作為外部串口發(fā)射/接收的設(shè)備控制器。同樣,10 位A/D 轉(zhuǎn)換可作為八個(gè)模擬通道的設(shè)備控制器。連接在A/D轉(zhuǎn)換8個(gè)引腳的外部模擬信號(hào)由內(nèi)部的采樣-保持電路采樣后,轉(zhuǎn)換成10位的值。內(nèi)部模擬通道有單路和掃瞄兩種工作模式。掃瞄模式允許多路通道連續(xù)轉(zhuǎn)換,并將轉(zhuǎn)換結(jié)果保存到不同的設(shè)備寄存器里。片內(nèi)輸入/輸出口可和外部的輸入/輸出線相連,此時(shí)處理器就

9、可從設(shè)備寄存器讀出8位輸入線上的值。在沒(méi)有外部電路的情況下,按鈕可以和一個(gè)輸入引腳直接連接,并將其值讀入。當(dāng)處理器向8位輸出口的設(shè)備寄存器寫(xiě)值時(shí),其值可由輸出口輸出并直接驅(qū)動(dòng)外部電路如直接驅(qū)動(dòng)發(fā)光二極管LED。 片內(nèi)中斷控制器可響應(yīng)內(nèi)部和外部的中斷源。片內(nèi)輸入/輸出事件對(duì)應(yīng)內(nèi)部中斷源。每個(gè)事件(如A/D轉(zhuǎn)換結(jié)束、定時(shí)器溢出) 對(duì)應(yīng)一個(gè)中斷向量。外部事件對(duì)應(yīng)外部中斷源。所有中斷都可以被屏蔽或開(kāi)啟(除了NMI不可屏蔽中斷)。 3.RCX: CPU、存儲(chǔ)器和輸入/輸出設(shè)備RCX是一個(gè)具有計(jì)算機(jī)三個(gè)主要功能(處理器、存儲(chǔ)器,和輸入/輸出設(shè)備)的可編程積木塊。 從物理上看,RCX的內(nèi)部電路包括一塊印制電

10、路板和9V電源。H8/3292單片微型控制器,32K的RAM,電機(jī)控制芯片,LCD屏和LCD控制器芯片,揚(yáng)聲器,四個(gè)按鈕等通過(guò)電路板連接在一起。RCX的拆卸圖以及詳細(xì)元件清單請(qǐng)參考RCXInternals。 從邏輯結(jié)構(gòu)上說(shuō),RCX控制器可看作一臺(tái)低端個(gè)人計(jì)算機(jī),它通過(guò)一條總線把處理器、存儲(chǔ)器和輸入/輸出設(shè)備連接起來(lái)。輸入/輸出口都分配了確定的地址。每個(gè)設(shè)備包括兩部分:一部分是通過(guò)總線與設(shè)備連接的接口電路,另一部分是組成設(shè)備的機(jī)械裝置和電路元件。按鈕、LCD屏、揚(yáng)聲器,傳感器和執(zhí)行器件都屬于設(shè)備。接口部份通常專指設(shè)備控制器,當(dāng)然,設(shè)備與接口并沒(méi)有明顯的界線。 當(dāng)對(duì)RCX編程時(shí),主要考慮它的邏輯結(jié)

11、構(gòu)。我們將從程序員的角度來(lái)描述它的邏輯結(jié)構(gòu)。 3.1 RCX的CPURCX的處理器是H8/300 CPU。工作頻率16 兆赫。CPU 有八個(gè)通用16 位寄存器(r0 - r7, r7 作為堆棧指針(sp) 使用), 16 位程序寄存器(pc), 和一個(gè)8位狀態(tài)寄存器(cc) 。狀態(tài)寄存器顯示算術(shù)狀態(tài)(如進(jìn)位,溢出,和零)和中斷屏蔽與使能。指令集包括暫存器-暫存器運(yùn)算, 如16 位加法、16 位減法、8位乘法和16 位/8 位除法),及常見(jiàn)的邏輯操作如異或,或,與,非,移位,位操作,子程序的調(diào)用與返回和使RCX進(jìn)入節(jié)電模式的sleep指令。數(shù)據(jù)類型包括位、4位BCD碼,字節(jié),和字(2 個(gè)字節(jié))

12、。尋址方式有: 尋址模式匯編語(yǔ)言寄存器直接尋址Rn寄存器間接尋址rn長(zhǎng)轉(zhuǎn)移尋址(d:16, rn)增量后寄存器間接尋址rn+增量前寄存器間接尋址 rn絕對(duì)地址尋址(8或16位)aa:8, aa:16立即尋址(8或16位)# aa:8, # aa:16pc指針尋址(d:pc)存儲(chǔ)器間接尋址aa:83.2 RCX存儲(chǔ)器RCX的H8/3292芯片工作在模式2下。模式的值可通過(guò)訪問(wèn)位于地址0xffc5的模式控制寄存器而得到。在模式2下,片內(nèi)ROM、片內(nèi)RAM,32K外擴(kuò)RAM統(tǒng)一編址。 空間分配由工作模式和外部地址編碼共同決定。具體為: 地址范圍存儲(chǔ)器類型內(nèi)容0x000 - 0x3fff片內(nèi)加密可編程

13、ROMH8/3292 中斷向量, RCX預(yù)置程序0x8000 -0xefff片外RAM程序/數(shù)據(jù)0xf000片外寄存器RCX輸出口設(shè)備寄存器0xfd80 -0xff7f片內(nèi)RAMRCX中斷向量/程序/數(shù)據(jù)0xff88 - 0xffff片內(nèi)寄存器 H8/3292設(shè)備寄存器3.3 RCX輸入/輸出設(shè)備RCX輸入/輸出設(shè)備包括兩部分: 輸入/輸出設(shè)備控制器和輸入/輸出設(shè)備本身。從內(nèi)部看到的是設(shè)備控制器,從外面看到的是設(shè)備本身。比如四個(gè)按鈕,從內(nèi)部來(lái)看,是兩個(gè)具有確定地址的輸入/輸出口;從外面看,是RCX外殼的四個(gè)塑料按鈕。因?yàn)槲覀兪菑木幊痰慕嵌瓤丛O(shè)備,所以將主要描述RCX設(shè)備控制器部分。 運(yùn)行在RC

14、X CPU上的程序通過(guò)設(shè)備寄存器和中斷來(lái)與設(shè)備通信和保持同步。通信和同步的接口是由RCX設(shè)備控制器提供的設(shè)備寄存器和RCX中斷。 大多數(shù)設(shè)備控制器是基于H8/3292 輸入/輸出元件的。H8/3292輸入/輸出元件的地址分配寄存器是設(shè)備寄存器的一部分。同樣輸入/輸出中斷源也是RCX設(shè)備中斷的一部分。RCX輸出口是唯一的例外。RCX輸出口控制器并不使用H8/3292輸入/輸出元件也就不使用片內(nèi)寄存器。因此,RCX輸出口的設(shè)備寄存器不在片內(nèi)寄存器地址范圍內(nèi)。 基于H8/3292元件的設(shè)備控制器如下: RCX設(shè)備控制設(shè)備寄存器中斷按鈕I/O port4和7的設(shè)備寄存器。IRQ0,IRQ1設(shè)備寄存器R

15、UN連接在IRQ0, OnOff在IRQ1輸入口A/D轉(zhuǎn)換和I/O port6的設(shè)備寄存器。有三條線與port6相連A/D 中斷電量A/D轉(zhuǎn)換設(shè)備寄存器A/D 中斷定時(shí)器定時(shí)器設(shè)備寄存器定時(shí)器中斷紅外發(fā)射/接收SCI設(shè)備寄存器,I/O port4和定時(shí)器1。port4與一條線相連SCI中斷,定時(shí)器1中斷LCDI/O port6設(shè)備寄存器。使用port6的兩條線沒(méi)有中斷揚(yáng)聲器I/O port6設(shè)備寄存器和定時(shí)器0。使用port6的一條線定時(shí)器0中斷輸出口設(shè)備寄存器在外擴(kuò)地址空間沒(méi)有中斷3.3.1 訪問(wèn)RCX的設(shè)備寄存器RCX設(shè)備寄存器的值可由匯編語(yǔ)言或C語(yǔ)言的位操作來(lái)訪問(wèn)。我們將用C語(yǔ)言來(lái)解釋某

16、一位是如何被清除或置位的。為了方便,我們定義一些變量: typedef unsigned char byte;typedef unsigned short int word;/* A/D 轉(zhuǎn)換*/* A/D控制/狀態(tài)寄存器 */#define ADCSR *(volatile byte *) 0xffe8) #define ADF ( 1 << 7 ) /* A/D Flag , bit 7 */#define ADST ( 1 << 5 ) /* A/D Start, bit 5 */* A/D 數(shù)據(jù)寄存器 A */#define ADDRA *(volatile w

17、ord *) 0xffe0) 第一個(gè)預(yù)定義用來(lái)把地址常量變成一個(gè)指向字節(jié)型地址的指針。*( .)表示取地址里的內(nèi)容,動(dòng)態(tài)的限制可防止設(shè)備寄存器的值在改變前被讀出??墒褂眠@些定義在通道0啟動(dòng)A/D轉(zhuǎn)換,轉(zhuǎn)換結(jié)束后可從數(shù)據(jù)寄存器A讀出10 位的數(shù)據(jù): ADCSR = 0; ADCSR |= ADST; / * 起動(dòng)轉(zhuǎn)換*/while ( ! ( ADCSR & ADF ) ); /*等待轉(zhuǎn)換結(jié)束*/ADCSR &= ADF; /*讀寄存器,清除ADF */Port3 = ( ADDRA >> 6 ) & 0x03ff); /*移位后成為0-1023的整數(shù) */3

18、.3.2 RCX中斷和中斷處理在H8/3292 向量表里第一個(gè)向量的地址是0x0000,最后一個(gè)在地址0x0048 。向量表的入口由片內(nèi)ROM管理。每一個(gè)入口包含一個(gè)指向一個(gè)片內(nèi)ROM中斷調(diào)度程序的地址。一個(gè)中斷向量對(duì)應(yīng)一個(gè)調(diào)度程序。對(duì)應(yīng)于每一個(gè)中斷調(diào)度程序,在片內(nèi)RAM都有一個(gè)用來(lái)指向中斷服務(wù)程序地址的入口。這些入口保存在一張表格里。表格也可用來(lái)存放本來(lái)由H8/3292的硬件處理的中斷程序。這樣,片內(nèi)ROM的內(nèi)容和RCX中斷向量就把H8/3292的硬件中斷機(jī)制變成了RCX的中斷機(jī)制。描述如下(對(duì)比): H8/3292中斷向量地址 : 中斷調(diào)度程序地址H8/3292中斷調(diào)度程序: push r

19、6 mov RCX interrupt vector address, r6 jsr r6 pop r6 rteRCX中斷向量地址: RCX中斷管理程序地址 RCX中斷管理程序: 保存寄存器的值(壓棧) 處理中斷 取出寄存器的值(出棧) (rts) 返回堆棧的內(nèi)容由H8/3292的中斷機(jī)制和中斷調(diào)度程序確定。具體如下: 地址 內(nèi)容sp 返回到調(diào)度程序sp - 2 r6寄存器的值sp - 4 cc寄存器的值sp - 6 pc指針的值此外,在RCX中斷管理程序?qū)c的中斷位清除并執(zhí)行rte指令前,中斷管理程序不會(huì)響應(yīng)新的中斷。因?yàn)镽CX沒(méi)有使用不可屏蔽中斷,所以當(dāng)中斷位沒(méi)有清除前,RCX中斷管理程

20、序是不會(huì)被打斷的。 RCX中斷管理程序可用匯編語(yǔ)言和C語(yǔ)言編程。我們將使用C語(yǔ)言說(shuō)明如何為RUN按鈕寫(xiě)一個(gè)中斷管理程序。為了簡(jiǎn)單做如下定義:#define Int_Handler(RCX_Vector_Addr) ( *(void (*)(void)(RCX_Vector_Addr) )#define IRQ0_Addr 0xfd94 /* RCX IRQ0 Interrupt Vector Address */#define Run_Button_Interrupt_Handler Int_Handler(IRQ0_Addr)定義把RCX_Vector_Addr變成一個(gè)指向沒(méi)有參數(shù)和返回值子

21、程序的指針。最后一個(gè)定義將RunInt用作RUN按鈕的中斷管理程序(Run_Button_Interrupt_Handler = RunInt); RunInt定義如下: int16 Count;void RunInt (void) asm("push r0 push r1 push r2 push r3 push r4 push r5 "); /* Run按一下,Count增加1 */ Count = Count + 1; asm("pop r5 pop r4 pop r3 pop r2 pop r1 pop r0 ");為了打開(kāi)RUN按鈕的中斷和定義

22、觸發(fā)中斷的事件,需要訪問(wèn)IRQ設(shè)備寄存器: /* IRQ Sense Control Register and IRQ Enable Register */#define ISCRaddr 0xffc6#define IERaddr 0xffc7#define ISCR *( (byte *) ISCRaddr ) #define IER *( (byte *) IERaddr )為了使RUN按鈕的下降沿觸發(fā)一個(gè)中斷,并打開(kāi)按鈕的中斷,設(shè)備寄存器應(yīng)該如下初始化: ISCR=1;IER=1;3.3.3 按鈕在RCX的上邊有四個(gè)按鈕: VIEW, ON/OFF, Prgm 和RUN。 四個(gè)按鈕 四

23、個(gè)按鈕連接在H8/3292 輸入/輸出口的四條輸入線上。其中兩個(gè)按鈕可觸發(fā)外部中斷。具體為: 按鈕輸入口地址第幾位中斷RUNport40xffb7第2位IRQ 0OnOffport40xffb7第1位IRQ 1VIEWport70xffbe第6位沒(méi)有中斷Prgmport70xffbe第7位沒(méi)有中斷按鈕按下時(shí)值為0,按鈕松開(kāi)時(shí)值為1。 通過(guò)位操作可以直接從設(shè)備寄存器獲取各個(gè)按鈕的值。我們將用C 語(yǔ)言說(shuō)明如何使用按鈕的輸入。我們定義以下符號(hào)簡(jiǎn)化這個(gè)過(guò)程。比如要讀RUN按鈕的狀態(tài): #define port4_addr 0xffb7#define port4 *(volatile byte *) p

24、ort4_addr)#define Run ! ( port4 & ( 1 << 2 ) )最后一個(gè)定義可使RUN作為表達(dá)式來(lái)使用。RUN的值可用來(lái)停止一個(gè)循環(huán): while ( ! Run ) .3.3.4 RCX輸入口和傳感器可連接傳感器的三個(gè)輸入口(標(biāo)有1,2和3): 三個(gè)輸入口傳感器有兩種類型: 被動(dòng)和主動(dòng)。被動(dòng)傳感器有接觸傳感器和溫度傳感器。主動(dòng)傳感器有光電和角度傳感器。兩種類型的編程方法是不同的。 五個(gè)標(biāo)準(zhǔn)LEGO傳感器 傳感器的正確使用首先需要正確理解傳感器的電路和輸入口。詳細(xì)的描述請(qǐng)參考 輸入口和傳感器Internals。此外,也需要如何從傳感器取值的知識(shí)。

25、具體描述如下: 從一個(gè)被動(dòng)傳感器取值,只需使用A/D 轉(zhuǎn)換。從一個(gè)主動(dòng)傳感器如光電傳感器還必須點(diǎn)亮LED二極管,可由輸出線I/O port6的其中一路提供。角度傳感器也包含LED二極管,使用時(shí)需點(diǎn)亮。它們包裝在一塊藍(lán)色LEGO積木塊里,從外部并不能看見(jiàn)。 連接在A/D 轉(zhuǎn)換通道上的三個(gè)RCX輸入口和I/O port6輸出線如下: 輸入口A/D 通道輸出線 1模擬輸入引腳2 (AN2)port6, 第2位2模擬輸入引腳1 (AN1)port6, 第1位3模擬輸入引腳0 (AN0)port6, 第0位兩種類型傳感器的輸入值都須通過(guò)A/D 轉(zhuǎn)換。A/D 轉(zhuǎn)換的設(shè)備寄存器用來(lái)初始化,檢測(cè)轉(zhuǎn)換的結(jié)束和訪

26、問(wèn)10 位轉(zhuǎn)換結(jié)果。A/D控制/狀態(tài)寄存器用來(lái)開(kāi)始轉(zhuǎn)換和標(biāo)志轉(zhuǎn)換的結(jié)束。轉(zhuǎn)換結(jié)束可觸發(fā)A/D結(jié)束中斷。A/D數(shù)據(jù)寄存器存放轉(zhuǎn)換的結(jié)果,其值為16位的高10位。數(shù)據(jù)寄存器與A/D通道連接,轉(zhuǎn)換的值可以從以下地址讀取: 輸入口A/D 通道寄存器 簡(jiǎn)稱地址1AN2A/D數(shù)據(jù)寄存器AADDRC0xffe42AN1A/D數(shù)據(jù)寄存器BADDRB0xffe23AN0A/D數(shù)據(jù)寄存器CADDRA0xffe0A/D控制/狀態(tài)寄存器(ADCSR)是位于地址0xffe8的8位設(shè)備寄存器。具體如下: 位名字簡(jiǎn)稱意思7A/D結(jié)束標(biāo)志ADF轉(zhuǎn)換結(jié)束后置位,可由程序清除6A/D結(jié)束中斷使能ADIE0:中斷屏蔽;1:中斷使能

27、5A/D開(kāi)始ADST0:轉(zhuǎn)換停止;1:開(kāi)始轉(zhuǎn)換4掃瞄模式SCAN0:單路模式;1:掃瞄模式3時(shí)鐘選擇CKS0:慢速轉(zhuǎn)換;1:快速轉(zhuǎn)換2到0通道選擇CH2 to CH0選擇通道單路模式下,通道選擇位用來(lái)選擇三個(gè)輸入口中的一路。也可以使用多路(掃瞄模式): 輸入口CH2 到CH0模式1010單路2001單路3000單路1,2,3010掃瞄頭文件 AD.h含有一個(gè)A/D轉(zhuǎn)換的簡(jiǎn)單例子。頭文件InputPorts.h 包含一些被動(dòng)和主動(dòng)傳感器的例子。在 RCX編程,第一節(jié) 解釋了光電傳感器如何識(shí)別不同的顏色。 3.3.5 紅外發(fā)射/接收RCX使用IR(紅外光)與主機(jī)或其他RCX通信。 紅外發(fā)射 IR發(fā)

28、射/接收基于片內(nèi)串行通信接口(SCI)。SCI是紅外通信的一個(gè)設(shè)備控制器。信息以38.5千赫的紅外光作為載波來(lái)傳送:0代表紅外光開(kāi)啟,1代表關(guān)閉。38.5千赫的載波頻率是由定時(shí)器1提供的。紅外傳輸有短和長(zhǎng)兩個(gè)模式,port4的引腳0決定傳輸模式:1為短距離;0為長(zhǎng)距離。紅外光不僅會(huì)由其它IR接收器接收也會(huì)由正在發(fā)射紅外光的RCX接收。這意味著RCX有檢測(cè)沖突的機(jī)制。每?jī)晌粩?shù)據(jù)的間隔時(shí)間與SCI選擇的波特率有關(guān)。2400位/每分的波特率間隔時(shí)間是417微秒 = 1位/2400 位/每分。SCI的設(shè)備寄存器決定串行通信的通信格式。用C語(yǔ)言所作的一個(gè)設(shè)備寄存器的聲明包含在模塊 SCI.h中。 IR發(fā)

29、射/接收有程序驅(qū)動(dòng)和中斷驅(qū)動(dòng)兩種方式,具體請(qǐng)參考IR.h。在 RCX編程, 第3節(jié)有一個(gè)例子可供參考3.3.6 LCD顯示屏LCD顯示一個(gè)LEGO 人在走動(dòng) LCD屏幕包含43個(gè)元素,一個(gè)元素可以是一個(gè)小點(diǎn)、箭頭或一個(gè)小LEGO 人的腿。每個(gè)元素都是單獨(dú)控制的,可讓它顯示或隱藏。這是通過(guò)LCD控制器實(shí)現(xiàn)的。有兩根串口線與LCD控制器通信。這兩根線連接在I/O port6的第5位和第6位。RCX就是通過(guò)對(duì)這兩根線的讀寫(xiě)來(lái)控制LCD的。RCX預(yù)置程序通過(guò)一個(gè)協(xié)議實(shí)現(xiàn)對(duì)LCD的高級(jí)操作: LCD每一個(gè)元素的一位值暫存在儲(chǔ)器器的緩沖區(qū)里;RCX用戶程序向緩沖區(qū)寫(xiě)值,調(diào)用預(yù)置程序,刷新,然后屏幕上的元素

30、就根據(jù)緩沖區(qū)里的值顯示或隱藏。具體請(qǐng)參考: RCXInternals。 3.3.7 揚(yáng)聲器揚(yáng)聲器由I/O port6的第4位控制。在揚(yáng)聲器使用前,I/O port6的數(shù)據(jù)方向寄存器應(yīng)該如下設(shè)置: #define P6DDR *(volatile byte *) 0xffb9)#define P6DDR_ROM *(volatile byte *) 0xfd85)#define P6DR *(volatile byte *) 0xffbb)#define bit4 (1 << 4) #define SpeakerHigh P6DR |= bit4 #define SpeakerLow

31、 P6DR &= bit4 /* 把 port6的第4位初始化成輸出 */P6DDR_ROM |= bit4; P6DDR = P6DDR_ROM;要發(fā)出聲音,需要以適當(dāng)?shù)拈g隔時(shí)間對(duì)port 6的第4位寫(xiě)值。如發(fā)出500 赫的聲音: SpeakerHigh;Wait one msec;SpeakerLow;Wait one msec;port6的第4位也可由定時(shí)器0控制。 3.3.8 RCX輸出口和執(zhí)行器件RCX有標(biāo)有A 、B和C的三個(gè)輸出口。各種各樣的執(zhí)行器件可連接到輸出口。如電機(jī),燈和發(fā)聲器件。一個(gè)輸出口可驅(qū)動(dòng)一個(gè)或多個(gè)執(zhí)行器件。如電機(jī)和燈可接在一個(gè)輸出口上,電機(jī)轉(zhuǎn)動(dòng)時(shí)燈就會(huì)跟著一

32、起亮。 三個(gè)RCX輸出口A、B和C 輸出口由9 V電源產(chǎn)生的電流驅(qū)動(dòng)。流經(jīng)執(zhí)行器件的電流狀態(tài)由位于地址0xf000的設(shè)備寄存器的值決定。每一個(gè)輸出口由8 位設(shè)備寄存器中的兩位控制。 輸出口ABC位第7、6位第3、2位第1、0位這些輸出口的控制位的值可在設(shè)備寄存器地址獲取。用如下c語(yǔ)句可將A口的狀態(tài)設(shè)成2(見(jiàn)下表的四種狀態(tài)):#define OutputPorts *( volatile byte *) 0xf000 ):#define Amask 0xc0 byte temp;temp = OutputPorts;temp &= Amask;temp |= (2 << 6)

33、;OutputPorts = temp;兩位值(有4種組合)對(duì)應(yīng)于電流的四種不同模式。01和10表示電流的兩種流動(dòng)方向。00將執(zhí)行器件從電源斷開(kāi)。11將執(zhí)行器件的兩個(gè)端子連接到電源的同極性。具體請(qǐng)參考Internals of Output Ports and Actuators 為了更容易地控制執(zhí)行器件,我們用c語(yǔ)言舉例如下(控制A口):#define Float 0#define OnPos 1#define OnNeg 2#define Brake 3void PortA( byte state ) byte temp; temp = OutputPorts; temp &= Am

34、ask; temp |= (state << 6); OutputPorts = temp;經(jīng)過(guò)以上設(shè)置,四種狀態(tài)(Float, OnPos, OnNeg, and Brake)分別對(duì)應(yīng)0、1、2、3。請(qǐng)參考OutputPorts.h。 執(zhí)行器件在四種狀態(tài)下的具體表現(xiàn)見(jiàn)下表: 輸出位電機(jī)燈閃光聲音00自由運(yùn)行沒(méi)有光沒(méi)有光沒(méi)有聲音01在某一方向轉(zhuǎn)動(dòng)有光閃爍發(fā)聲10在另一方向轉(zhuǎn)動(dòng)有光閃爍發(fā)聲11剎車沒(méi)有光沒(méi)有光沒(méi)有聲音對(duì)于有兩個(gè)電機(jī)連接在口和口上的一輛小車(我們?nèi)匀灰訤loat, OnPos, OnNeg, and Brake表示自由運(yùn)行,前進(jìn),后退,剎車)。狀態(tài) OnPos和OnNe

35、g將根據(jù)輸出口和電機(jī)導(dǎo)線的連接使電機(jī)順時(shí)針或逆時(shí)針旋轉(zhuǎn)。從狀態(tài)OnPos或OnNeg變到Float和 Brake對(duì)正在運(yùn)動(dòng)的小車會(huì)有很大的影響:Brake會(huì)使小車立刻停下。Float允許電機(jī)自由地轉(zhuǎn)動(dòng)并逐漸停止。 電機(jī)連接在A口和C口 宏P(guān)ortA、PortB和PortC允許我們用程序驅(qū)動(dòng)來(lái)控制輸出口。用下面的語(yǔ)句可使連接在口上的燈閃爍: PortA(OnPos);Wait one msec;PortA(Float);Wait one msec;這些宏也可以控制小車的運(yùn)動(dòng)。如: /* 如實(shí)際運(yùn)動(dòng)方向與程序不符,請(qǐng)改變電機(jī)的連接方向*/#define Aback OnNeg#define Afo

36、rward OnPos#define Cback OnNeg#define Cforward OnPosvoid CarCoast ( void ) PortA(Float); PortC(Float);void CarBrake ( void ) PortA(Brake); PortC(Brake);void CarGoForward ( void ) PortA(Aforward); PortC(Cforward);void CarGoBackward ( void ) PortA(Aback); PortC(Cback);void CarSpinClockwise ( void ) Po

37、rtA(Aforward); PortC(Cback);void CarSpinCounterClockwise ( void ) PortA(Aback); PortC(Cforward);輸出狀態(tài)以足夠快的速度改變,如以1毫秒的間隔,如果是燈,它的亮度就沒(méi)有一直供電那么亮。這叫做PWM控制。每一個(gè)供電脈沖叫作脈沖的寬度??刂泼}沖寬度和脈沖的形式就能控制傳遞到執(zhí)行器件的能量。我們可用H8/3292的定時(shí)器T0產(chǎn)生的定時(shí)器中斷實(shí)現(xiàn)對(duì)輸出口的PWM控制(時(shí)間間隔為1毫秒)。這些中斷可用來(lái)調(diào)用預(yù)先設(shè)好占空比的子程序。一個(gè)PWM控制A口和C口的例子見(jiàn)MotorControl.h,共有16個(gè)能級(jí)可供使

38、用。C語(yǔ)言的例子見(jiàn) RCX編程, 第2節(jié)。 4. RCX預(yù)置程序(指出廠時(shí),ROM里預(yù)先燒好的程序)當(dāng)RCX上電或復(fù)位后,ROM里的預(yù)置程序就開(kāi)始運(yùn)行并控制RCX。此時(shí)通過(guò)紅外發(fā)射/接收,其它計(jì)算機(jī)就可與RCX通信了。預(yù)置程序可提供一個(gè)簡(jiǎn)單協(xié)議從其它計(jì)算機(jī)下載用戶程序到RCX中。當(dāng)程序下載后,可由預(yù)置程序啟動(dòng)。用戶程序運(yùn)行時(shí),預(yù)置程序提供對(duì)RCX輸入/輸出設(shè)備的訪問(wèn)等服務(wù)。 5. 與RCX預(yù)置程序的通信預(yù)置程序通過(guò)一個(gè)簡(jiǎn)單的請(qǐng)求/應(yīng)答協(xié)議與其它計(jì)算機(jī)通信: 計(jì)算機(jī)送出請(qǐng)求;預(yù)置程序響應(yīng)請(qǐng)求并發(fā)回應(yīng)答。應(yīng)答可能包含數(shù)據(jù)如版本號(hào),但應(yīng)答常常用來(lái)表明請(qǐng)求已滿足或通信一切正常。 5.1請(qǐng)求/應(yīng)答協(xié)議可

39、發(fā)送的請(qǐng)求有: Alive: 驗(yàn)證預(yù)置程序是否運(yùn)行并且RCX是否與電腦連接。 GetVersions:預(yù)置程序和固件版本號(hào)。EnterDownloadMode: 如果有程序運(yùn)行將被停止。預(yù)置程序進(jìn)入下載模式BeginDownload: 預(yù)置程序?yàn)橄螺d程序做準(zhǔn)備。 DownloadBlock: 下載字節(jié)塊到RCX存儲(chǔ)器。 RunProgram: 運(yùn)行下載的程序。只有下載的程序含有"Do you byte, when I knock?"程序才會(huì)被執(zhí)行。 每一個(gè)請(qǐng)求/應(yīng)答都是作為數(shù)據(jù)幀發(fā)送的。數(shù)據(jù)幀包含請(qǐng)求/應(yīng)答、幀頭、幀尾: 數(shù)據(jù)幀=幀頭 請(qǐng)求/應(yīng)答 幀尾在這里,幀頭= 0x5

40、5 0xff;請(qǐng)求/應(yīng)答=字節(jié)序列;幀尾=校驗(yàn)和。校驗(yàn)和是請(qǐng)求/應(yīng)答的最低有效字節(jié)。 請(qǐng)求是一個(gè)字節(jié)序列。第一個(gè)字節(jié)是請(qǐng)求代碼,接下來(lái)的字節(jié)包含請(qǐng)求數(shù)據(jù)。應(yīng)答有一個(gè)相似的結(jié)構(gòu),第一個(gè)字節(jié)是應(yīng)答代碼, 接下來(lái)的字節(jié)是應(yīng)答數(shù)據(jù)。應(yīng)答代碼是請(qǐng)求代碼的補(bǔ)碼。每一個(gè)請(qǐng)求有兩個(gè)請(qǐng)求代碼,區(qū)別是兩個(gè)代碼的第4位的值不同。這一位是順序控制位:預(yù)置程序只執(zhí)行相同請(qǐng)求代碼中的第一個(gè),給第二個(gè)請(qǐng)求及以后的發(fā)送的應(yīng)答其效果是相同的。所以為了使同樣的請(qǐng)求連續(xù)執(zhí)行兩次,就需要給順序控制位不同的值。下面是請(qǐng)求/應(yīng)答的一個(gè)詳細(xì)描述。 請(qǐng)求請(qǐng)求代碼請(qǐng)求數(shù)據(jù)應(yīng)答代碼應(yīng)答數(shù)據(jù)Live10/18無(wú)ef/e7無(wú)GetVersions1

41、5/1dKeyea/e2程序、固件版本EnterDownloadMode65/6dKey9a/92無(wú)BeginDownload75/7d程序入口、校驗(yàn)和、零8a/82結(jié)果DownloadBlock45/4d數(shù)據(jù)包號(hào)碼, 長(zhǎng)度,數(shù)據(jù)包,數(shù)據(jù)包校驗(yàn)和ba/b2結(jié)果RunPrograma5/adRunKey5a/52文本Key: 五個(gè)字節(jié)表示的十進(jìn)制數(shù)1, 3, 5, 7, 11 。Key可防止一個(gè)正在運(yùn)行的程序被非法停止。 ROMVersion: BCD碼表示的ROM預(yù)置程序的版本號(hào)。 ProgramVersion: BCD碼表示的固件的版本號(hào)。沒(méi)有固件時(shí),BCD碼是0 。 ProgramEntr

42、yPoint: 兩字節(jié)表示的16 位地址。這是用戶程序下載的地址。 ProgramChecksum: 兩字節(jié)表示的16 位無(wú)符號(hào)整型。已下載程序的字節(jié)數(shù)。 Zero:填充0。 BlockSequenceNumber: 兩字節(jié)表示的數(shù)據(jù)包序列號(hào)。從1開(kāi)始,每接收一個(gè)加1,0表示請(qǐng)求結(jié)束。 BlockLength: 下一個(gè)DataBlock的字節(jié)數(shù)。用兩字節(jié)16 位無(wú)符號(hào)整型表示。 DataBlock:數(shù)據(jù)包;長(zhǎng)度為BlockLength的所定義的長(zhǎng)度。 BlockChecksum:最新的DataBlock的校驗(yàn)和。 RunKey: 五個(gè)ASCII值76, 69, 71, 79, 174表示的五個(gè)

43、字符"LEGO®"。 Text: 26 個(gè)ASCII 值表示的一條語(yǔ)句"Just a bit of the block!"。 Result:一個(gè)字節(jié)。0表示通信正常。非零表示發(fā)生了錯(cuò)誤。錯(cuò)誤有以下幾種: 1: 空間不足 2: 格式不正確 3: 數(shù)據(jù)包校驗(yàn)和錯(cuò)誤4: 程序校驗(yàn)和錯(cuò)誤 6: 未進(jìn)入下載模式 5.2 字節(jié)協(xié)議請(qǐng)求/應(yīng)答作為字節(jié)組成的數(shù)據(jù)包在計(jì)算機(jī)和RCX之間的一條串行通信線間傳送。這條通信線包括兩個(gè)紅外發(fā)射/接收設(shè)備,一個(gè)通過(guò)RS232通信端口連接到計(jì)算機(jī),另一接入RCX。波特率是2400,即每秒傳送2400位。為標(biāo)記每個(gè)字節(jié)的開(kāi)始和

44、結(jié)束,字節(jié)含有一個(gè)起始位和結(jié)束位,同時(shí)增加一位奇偶位,保證第9位是奇數(shù)。因此每一個(gè)字節(jié)作為11位來(lái)發(fā)送。字節(jié)除了第一個(gè),如0x55,都被作為兩個(gè)字節(jié)發(fā)送:字節(jié)本身和它的補(bǔ)碼。結(jié)果是每一個(gè)數(shù)據(jù)包都有相等的0位和1位(幀頭0x55同樣有相等的0位與1位)。這可使紅外接收器消除周圍光線造成的影響。除了第一個(gè)字節(jié),其他都是作為222*(起始位+一個(gè)字節(jié)+奇偶位+結(jié)束位)位發(fā)送的。波特率為2400時(shí),需時(shí)9毫秒。 5.3 位協(xié)議一串由0,1組成的數(shù)據(jù)以2400位/每分的速率傳輸。傳0時(shí),紅外光開(kāi)啟,傳1時(shí),紅外光關(guān)閉。紅外光的頻率是38kHz。傳輸一位的時(shí)間是417 usec。 5.4 與RS232連接

45、的紅外發(fā)射/接收(指發(fā)射塔)發(fā)射塔將電腦要發(fā)送的數(shù)據(jù)發(fā)出,同時(shí)接收來(lái)自RCX的數(shù)據(jù)包。5.5 一個(gè)和預(yù)置程序通信的用戶程序 一個(gè)簡(jiǎn)單的程序:RCX_Request_Reply.c(需預(yù)先編譯)可用來(lái)在UNIX主機(jī)和RCX預(yù)置程序之間通信。紅外發(fā)射/接收應(yīng)該連接到一個(gè)串口并將串口名賦給DEFAULT_RCX_IR。也可以使用環(huán)境變量RCX_IR代替缺省設(shè)置。 用戶程序向RCX預(yù)置程序發(fā)出請(qǐng)求(十六進(jìn)制表示的字節(jié)序列),然后等待應(yīng)答。一會(huì)兒,可得到一個(gè)正確應(yīng)答或是發(fā)生錯(cuò)誤。接著用戶程序以十六進(jìn)制表示的字節(jié)序列輸出正確的應(yīng)答或發(fā)生錯(cuò)誤。 為了檢查和RCX的連接,我們使用如下命令: RCX_Reque

46、st_Reply 100000: ef發(fā)送Alive(代碼10)請(qǐng)求,應(yīng)答是ef,表明通信正常。 如下可獲得程序的版本號(hào): RCX_Request_Reply 15 1 3 5 7 b 0000: ea 00 03 00 01 00 00 00 00預(yù)置程序的版本是3.1且沒(méi)有固件。 現(xiàn)在我們要下載和運(yùn)行下面一個(gè)簡(jiǎn)單的匯編語(yǔ)言程序。請(qǐng)注意"Do you byte, when I knock?"這條語(yǔ)句是如何使用的。 .section .text.align 1.global _start_start:mov.w 0,r0jsr r0.section .data.string

47、 "Do you byte, when I knock?".end首先把它變成16進(jìn)制表示的程序mov.w 0,r0 6b 00 00 00jsr r0 5d 00Do 44 6f 20you 79 6f 75 20byte, 62 79 74 65 2c 20when 77 68 65 6e 20I 49 20knock? 6b 6e 6f 63 6b 3f 然后我們需要計(jì)算ProgramChecksum和BlockChecksum。 如下下載程序:EnterDownloadMode: RCX_Request_Reply 65 1 3 5 7 b0000: 9aBegin

48、Download, ProgramEntryPoint = 8000, ProgramChecksum = 09a8, Zero = 0: RCX_Request_Reply 75 00 80 a8 09 000000: 8a 00DownloadBlock, BlockSequenceNumber = 0, BlockLength = 0022, DataBlock = 6b 00 . 3f 00 00, BlockChecksum = a8: RCX_Request_Reply 4d 00 00 22 00 6b 00 . 3f 00 00 a80000: b2 00RunProgram,

49、 RunKey = 4c 45 47 4f ae (hex): RCX_Request_Reply a5 4c 45 47 4f ae0000: 5a 4a 75 73 74 20 61 20 62 69 74 20 6f 66 66 20 0010: 74 68 65 20 62 6c 6f 63 6b 21 應(yīng)答包含用十六進(jìn)制表示的"Just a bit off the block!"語(yǔ)句。表明一切正常并且程序正確運(yùn)行了。一會(huì)兒,程序執(zhí)行兩條指令跳轉(zhuǎn)到復(fù)位地址,將控制權(quán)還給預(yù)置程序。 6. 使用RCX預(yù)置程序提供的底層服務(wù)用戶程序可使用由預(yù)置程序提供的服務(wù),如對(duì) LCD

50、屏幕的高級(jí)操作。在這個(gè)部分我們將給出一些有用的服務(wù)程序并將描述怎樣通過(guò)匯編和C語(yǔ)言使用這些服務(wù)。具體請(qǐng)參考RCXInternals。 我們將以一個(gè)簡(jiǎn)單的例子開(kāi)始: 16位有符號(hào)整數(shù)的乘法??赏ㄟ^(guò)對(duì)地址0x0130的操作實(shí)現(xiàn),乘法子程序可用匯編語(yǔ)言調(diào)用: jsr 0x0130兩個(gè)操作數(shù)傳遞到寄存器r5,r6里,結(jié)果存在r6里。如計(jì)算51*72: mov.w # 51, r5 mov.w # 72, r6 jsr 0x0130r6 的值是3672 =51*72。 我們可以把匯編調(diào)用嵌入到C語(yǔ)言程序里: int16 imul( int16 a, int16 b) int res; asm("

51、;mov.w %1,r5 mov.w %2,r6 jsr 0x0130 ; call imul mov.w r6,%0 ": "=r" (res) : "r" (a), "r" (b) : "r0", "r1", "r5", "r6" ); return res;這個(gè)C函數(shù)可像其他函數(shù)一樣調(diào)用: int16 p;. p = imul(51,72);像上面的乘法程序那樣,我們也可以嵌套別的語(yǔ)句,實(shí)現(xiàn)其他功能。這些嵌套程序模塊可與數(shù)據(jù)類型、常數(shù)和全局

52、變量放在一個(gè)頭文件里,如 RCX_RTE.h。這個(gè)頭文件也包含H8/300的主要數(shù)據(jù)類型如字節(jié)、詞,語(yǔ)句"Do you byte, when I knock?"和復(fù)位程序??捎?include "RCX_RTE.h"包含在你的c語(yǔ)言程序里。上面只是一個(gè)預(yù)置程序的簡(jiǎn)單應(yīng)用。下面將詳細(xì)描述預(yù)置程序?qū)Σ僮鱈CD提供的服務(wù)。 6.1 LCD子程序 在預(yù)置程序中有一些預(yù)先寫(xiě)好的子程序,它可以讓我們忽略控制LCD的H8/3292 I/O port6的底層細(xì)節(jié)。也隱藏了元素在屏幕怎樣顯示的細(xì)節(jié)。有兩個(gè)子程序可以顯示或隱藏屏幕上的圖標(biāo)。一個(gè)圖標(biāo)是一個(gè)或多個(gè)元素。此外,還

53、有一個(gè)子程序用來(lái)在屏幕上顯示數(shù)字。所有子程序通過(guò)操作LCD在存儲(chǔ)器的緩沖內(nèi)容來(lái)實(shí)現(xiàn)其各自功能。存儲(chǔ)器的緩沖內(nèi)容的變動(dòng)對(duì)屏幕沒(méi)有影響除非有一個(gè)執(zhí)行程序不斷對(duì)LCD的緩沖操作。在下表中我們假設(shè),LCD緩沖由一個(gè)執(zhí)行程序不斷更新。 LCD子程序描述調(diào)用地址參數(shù)名和類型refresh更新屏幕內(nèi)容0x27c8沒(méi)有參數(shù)clear清屏0x27ac沒(méi)有參數(shù)show_icon使圖標(biāo)可見(jiàn) 0x1b62圖標(biāo)(16 位)hide_icon隱藏圖標(biāo) 0x1e4a圖標(biāo)(16 位)show_number根據(jù)格式和最小分度顯示整數(shù)0x1ff2格式(16位),值(16位),最小分度(16 位)子程序的第一個(gè)參數(shù)傳到寄存器r6里,剩余的參數(shù)傳到堆棧: 第三個(gè)參數(shù)是最先被壓棧的,接著是第二個(gè)參數(shù)壓棧。參數(shù)的意思如下: 圖標(biāo):可調(diào)用的16 位代碼,如站立或走動(dòng)的LEGO人圖標(biāo)。圖標(biāo)有:16 位代碼描述0x3006站立圖標(biāo)0x3007走動(dòng)圖標(biāo)0x3008選擇觀測(cè)

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論