樂(lè)高RCX手冊(cè)資料_第1頁(yè)
樂(lè)高RCX手冊(cè)資料_第2頁(yè)
樂(lè)高RCX手冊(cè)資料_第3頁(yè)
樂(lè)高RCX手冊(cè)資料_第4頁(yè)
樂(lè)高RCX手冊(cè)資料_第5頁(yè)
已閱讀5頁(yè),還剩21頁(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)介

RCX手冊(cè)

目錄

L簡(jiǎn)介

2.H8/3292微型控制器

3.RCX:CPU、存儲(chǔ)器和輸入/輸出設(shè)備

3.1RCX的CPU

3.2RCX的存儲(chǔ)器

3.3RCX的輸入/輸出設(shè)備

3.3.1訪問(wèn)RCX的設(shè)備寄存器

3.3.2RCX中斷和中斷處理

3.3.3按鈕

3.3.4RCX輸入口和傳感器

3.3.5紅外發(fā)射/接收

3.3.6LCD顯示屏

3.3.7揚(yáng)聲器

3.3.8RCX輸出口和執(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通信的用戶程序

6.RCX預(yù)置程序提供底層服務(wù)

6.1LCD子程序

7.為RCX編譯程序

7.1如何安裝交叉匯編器和交叉編譯器

7.2編譯匯編語(yǔ)言程序

7.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輸入口,給控制程序提

供輸入值,然后控制程序再驅(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)境光亮度

角度傳感器輪子轉(zhuǎn)過(guò)的角度,軸的運(yùn)動(dòng)

溫度傳感器測(cè)量體溫,室外溫度

執(zhí)行器件應(yīng)用舉例

電機(jī)驅(qū)動(dòng)小車,電梯的升降

燈閃光,紅色報(bào)警光

聲音蜂聲

在主機(jī)上編寫好程序后,可通過(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)典

MindStorms),它可以下載低級(jí)的機(jī)器代碼。

這本手冊(cè)敘述UNIX主機(jī)上一個(gè)簡(jiǎn)單的開(kāi)發(fā)環(huán)境。程序既可以用C語(yǔ)言也可用H8/300

的匯編語(yǔ)言來(lái)編寫,然后通過(guò)交叉匯編器和交叉編譯器生成H8/300的機(jī)器碼,通過(guò)由片內(nèi)

ROM常駐程序提供的一個(gè)簡(jiǎn)單協(xié)議下載到RCX中,常駐程序在上電和復(fù)位后就會(huì)自動(dòng)運(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/300CPU采用通用寄存器結(jié)構(gòu)。指令集包括暫存器-暫存器運(yùn)算和邏輯操作。尋址方

式包括大多數(shù)常見(jiàn)的尋址方式如寄存器直接尋址,寄存器間接尋址,程序計(jì)數(shù)器和存儲(chǔ)器間

接尋址。最大尋址空間是16位(64K),為程序和數(shù)據(jù)所共用。

芯片存儲(chǔ)器包括16K加密可編程ROM和512個(gè)字節(jié)的RAM。其中128字節(jié)片內(nèi)寄存

器用作與片內(nèi)的輸入/輸出電路的接口。存儲(chǔ)器空間的分配決定片內(nèi)存儲(chǔ)空間和外擴(kuò)空間的

如何與16位地址對(duì)應(yīng)??臻g分配與cpu的MD1和MDO引腳設(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和RAM可以使用。當(dāng)使用外擴(kuò)存儲(chǔ)器時(shí),可以用外擴(kuò)邏

輯為其空間分配地址。

片內(nèi)輸入/輸出包括三種定時(shí)器(16位自由定時(shí)器、8位定時(shí)器和監(jiān)視跟蹤定時(shí)器

—watchdog),一個(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í)處理器就可從設(shè)備寄存器讀出8位輸入線上

的值。在沒(méi)有外部電路的情況下,按鈕可以和一個(gè)輸入引腳直接連接,并將其值讀入。當(dāng)

處理器向8位輸出口的設(shè)備寄存器寫值時(shí),其值可由輸出口輸出并直接驅(qū)動(dòng)外部電路如直

接驅(qū)動(dòng)發(fā)光二極管LEDo

片內(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)部電路包括一塊印制電路板和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é)構(gòu)。我們將從程序員的角度來(lái)描述它的邏輯結(jié)

構(gòu)。

3.1RCX的CPU

RCX的處理器是H8/300CPU。工作頻率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é))。尋址方式有:

尋址模式匯編語(yǔ)言

寄存器直接尋址Rn

寄存器間接尋址@rn

長(zhǎng)轉(zhuǎn)移尋址@(d:16,rn)

增量后寄存器間接尋址@rn+

增量前寄存器間接尋址@rn

絕對(duì)地址尋址(8或16位)@aa:8,@aa:16

立即尋址(8或16位)#aa:8,#aa:16

pc指針尋址@(d:pc)

存儲(chǔ)器間接尋址@@aa:8

3.2RCX存儲(chǔ)器

RCX的H8/3292芯片工作在摸過(guò)2下。模式的值可通過(guò)訪問(wèn)位于地址0xffc5的模式控

制寄存器而得到。在模式2下,片內(nèi)ROM、片內(nèi)RAM,32K外擴(kuò)RAM統(tǒng)一編址。

空間分配由工作模式和外部地址編碼共同決定。具體為:

地址范圍存儲(chǔ)器類型內(nèi)容

0x000-Ox3fff片內(nèi)加密可編程ROMH8/3292中斷向量,RCX預(yù)置程序

0x8000-Oxefff片外RAM程序/數(shù)據(jù)

OxfOOO片外寄存器RCX輸出口設(shè)備寄存器

0xfd80-Oxff7f片內(nèi)RAM片X中斷向量/程序/數(shù)據(jù)

0xff88-Oxffff片內(nèi)寄存器一^8/3292設(shè)備寄存器

3.3RCX輸入/輸出設(shè)備

RCX輸入/輸出設(shè)備包括兩部分:輸入/輸出設(shè)備控制器和輸入/輸出設(shè)備本身。從內(nèi)部

看到的是設(shè)備控制器,從外面看到的是設(shè)備本身。比如四個(gè)按鈕,從內(nèi)部來(lái)看,是兩個(gè)具有

確定地址的輸入/輸出口;從外面看,是RCX外殼的四個(gè)塑料按鈕。因?yàn)槲覀兪菑木幊痰慕?/p>

度看設(shè)備,所以將主要描述RCX設(shè)備控制器部分。

運(yùn)行在RCXCPU上的程序通過(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è)備寄存器中斷

1/0port4和7的設(shè)備寄存器。RUN連接在IRQO,OnOff在

按鈕

IRQO,IRQ1設(shè)備寄存器IRQ1

A/D轉(zhuǎn)換和1/0port6的設(shè)備寄存器。有三條線與

輸入口A/D中斷

port6相連

電量A/D轉(zhuǎn)換設(shè)備寄存器A/D中斷

定時(shí)器定時(shí)器設(shè)備寄存器定時(shí)器中斷

紅外發(fā)射/SCI設(shè)備寄存器,1/0port4和定時(shí)器loport4與

SCI中斷,定時(shí)器1中斷

接收一條線相連

(LCD1/0port6設(shè)備寄存器。使用port6的兩條線沒(méi)有中斷

1/0port6設(shè)備寄存器和定時(shí)器0o使用port6的

揚(yáng)聲器定時(shí)器。中斷

一條線

輸出口設(shè)備寄存器在外擴(kuò)地址空間沒(méi)有中斷

3.3.1訪問(wèn)RCX的設(shè)備寄存器

RCX設(shè)備寄存器的值可由匯編語(yǔ)言或C語(yǔ)言的位操作來(lái)訪問(wèn)。我們將用C語(yǔ)言來(lái)解釋某

一位是如何被清除或置位的。為了方便,我們定義一些變量:

typedefunsignedcharbyte;

typedefunsignedshortintword;

/*A/D轉(zhuǎn)換*/

/*A/D控制/狀態(tài)寄存器*/

#defineADCSR*((volatilebyte*)0xffe8)

#defineADF(1?7)/*A/DFlag,bit7*/

#defineADST(1?5)/*A/DStart,bit5*/

/*A/D數(shù)據(jù)寄存器A*/

#defineADDRA*((volatileword*)OxffeO)

第一個(gè)預(yù)定義用來(lái)把地址常量變成一個(gè)指向字節(jié)型地址的指針。*(...)表示取地址里的內(nèi)

容,動(dòng)態(tài)的限制可防止設(shè)備寄存器的值在改變前被讀出。可使用這些定義在通道。啟動(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.3.2RCX中斷和中斷處理

在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)度程序:pushr6

mov@RCXinterruptvectoraddress,r6

jsr@r6

popr6

rte

RCX中斷向量地址:RCX中斷管理程序地址

RCX中斷管理程序:保存寄存器的值(壓棧)

處理中斷

取出寄存器的值(出棧)

(rts)返回

堆棧的內(nèi)容由H8/3292的中斷機(jī)制和中斷調(diào)度程序確定。具體如下:

地址內(nèi)容

sp返回到調(diào)度程序

sp-2r6寄存器的值

sp-4cc寄存器的值

sp-6pc指針的值

此外,在RCX中斷管理程序?qū)c的中斷位清除并執(zhí)行rte指令前,中斷管理程序不會(huì)

響應(yīng)新的中斷。因?yàn)镽CX沒(méi)有使用不可屏蔽中斷,所以當(dāng)中斷位沒(méi)有清除前,RCX中斷管理程

序是不會(huì)被打斷的。

RCX中斷管理程序可用匯編語(yǔ)言和C語(yǔ)言編程。我們將使用C語(yǔ)言說(shuō)明如何為RUN按鈕

寫一個(gè)中斷管理程序。為了簡(jiǎn)單做如下定義:

ttdefineInt_Handler(RCX_Vector_Addr)(*(void(**)(void))(RCX_Vector_Addr))

ttdefineIRQ0_Addr0xfd94/*RCXIRQOInterruptVectorAddress*/

^defineRun_Button_Interrupt_HandlerInt_Handler(IRQ0_Addr)

定義把RCX_Vector_Addr變成一個(gè)指向沒(méi)有參數(shù)和返回值子程序的指針。最后一個(gè)定

義將Runlnt用作RUN按鈕的中斷管理程序(Run_Button_Interrupt_Handler=Runlnt);

Runlnt定義如下:

intl6Count;

voidRunlnt(void)

asm("push

push

push

push

push

push

”);

/*Run按一下,Count增加1*/

Count=Count+1;

asm("popr5

POPr4

popr3

popr2

poprl

POPrO

”);

)

為了打開(kāi)RUN按鈕的中斷和定義觸發(fā)中斷的事件,需要訪問(wèn)IRQ設(shè)備寄存器:

/*IRQSenseControlRegisterandIRQEnableRegister*/

#defineISCRaddr0xffc6

#definelERaddr0xffc7

^defineISCR?((byte?)ISCRaddr)

#defineIER*((byte*)lERaddr)

為了使RUN按鈕的下降沿觸發(fā)一個(gè)中斷,并打開(kāi)按鈕的中斷,設(shè)備寄存器應(yīng)該如下初始

化:

ISCR=1;IER=1;

3.3.3按鈕

在RCX的上邊有四個(gè)按鈕:VIEW,ON/OFF,Prgm和RUN。

四個(gè)按鈕

四個(gè)按鈕連接在H8/3292輸入/輸出口的四條輸入線上。其中兩個(gè)按鈕可觸發(fā)外部中

斷。具體為:

按鈕輸入口地址第幾位中斷

RUNport40xffb7第2位IRQ0

OnOffport40xffb7第1位IRQ1

VIEWport?Oxffbe第6位沒(méi)有中斷

Prgmport?Oxffbe第7位沒(méi)有中斷

按鈕按下時(shí)值為0,按鈕松開(kāi)時(shí)值為1。

通過(guò)位操作可以直接從設(shè)備寄存器獲取各個(gè)按鈕的值。我們將用C語(yǔ)言說(shuō)明如何使用

按鈕的輸入。我們定義以下符號(hào)簡(jiǎn)化這個(gè)過(guò)程。比如要讀RUN按鈕的狀態(tài):

#defineport4_addr0xffb7

#defineport4?((volatilebyte*)port4_addr)

#defineRun!(port4&(1?2))

最后一個(gè)定義可使RUN作為表達(dá)式來(lái)使用。RUN的值可用來(lái)停止一個(gè)循環(huán):

while(!Run){

)

3.3.4RCX輸入口和傳感器

可連接傳感器的三個(gè)輸入口(標(biāo)有1,2和3):

三個(gè)輸入口

傳感器有兩種類型:被動(dòng)和主動(dòng)。被動(dòng)傳感器有接觸傳感器和溫度傳感器。主動(dòng)傳感

器有光電和角度傳感器。兩種類型的編程方法是不同的。

lighttemperature

,touch

withrenx>veableleads

/touch

五個(gè)標(biāo)準(zhǔn)LEGO傳感器

傳感器的正確使用首先需要正確理解傳感器的電路和輸入口。詳細(xì)的描述請(qǐng)參考輸入

口和傳感器Internals。此外,也需要如何從傳感器取值的知識(shí)。具體描述如下:

從一個(gè)被動(dòng)傳感器取值,只需使用A/D轉(zhuǎn)換。從一個(gè)主動(dòng)傳感器如光電傳感器還必須

點(diǎn)亮LED二極管,可由輸出線I/Oport6的其中一路提供。角度傳感器也包含LED二極管,

使用時(shí)需點(diǎn)亮。它們包裝在一塊藍(lán)色LEGO積木塊里,從外部并不能看見(jiàn)。

連接在A/D轉(zhuǎn)換通道上的三個(gè)RCX輸入口和I/Oport6輸出線如下:

輸入口A/D通道輸出線

T模擬輸入引腳2(AN2)|port6,第2位

2模擬輸入引腳1(ANDpcrt6?第1位

3"模擬輸入引腳0(ANO)port6,第。位

兩種類型傳感器的輸入值都須通過(guò)A/D轉(zhuǎn)換。A/D轉(zhuǎn)換的設(shè)備寄存器用來(lái)初始化,檢測(cè)

轉(zhuǎn)換的結(jié)束和訪問(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)換的值可以從以下地址讀?。?/p>

輸入口A/D通道寄存器簡(jiǎn)稱地址

1AN2A/D數(shù)據(jù)寄存器AADDRC0xffe4

2AN1A/D數(shù)據(jù)寄存器BADDRB0xffe2

3AN0A/D數(shù)據(jù)寄存器CADDRAOxffeO

A/D控制/狀態(tài)寄存器(ADCSR)是位于地址0xffe8的8位設(shè)備寄存器。具體如下:

位名字簡(jiǎn)稱意思

7A/D結(jié)束標(biāo)志ADF轉(zhuǎn)換結(jié)束后置位,可由程序清除

6A/D結(jié)束中斷使能ADIE0:中斷屏蔽;1:中斷使能

5A/D開(kāi)始ADST0:轉(zhuǎn)換停止;1:開(kāi)始轉(zhuǎn)換

4掃瞄模式SCAN0:?jiǎn)温纺J?1:掃瞄模式

3|時(shí)鐘選擇CKS0:慢速轉(zhuǎn)換;1:快速轉(zhuǎn)換

2到0通道選擇CH2toCHO選擇通道

單路模式下,通道選擇位用來(lái)選擇三個(gè)輸入口中的一路。也可以使用多路(掃瞄模式):

輸入口CH2到CHO模式

010單路

2001單路

000單路

1,2,3010掃瞄

頭文件皿L含有一個(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ā)射/接收基于片內(nèi)串行通信接口(SCI)。SCI是紅外通信的一個(gè)設(shè)備控制器。信息

以38.5千赫的紅外光作為載波來(lái)傳送:0代表紅外光開(kāi)啟,1代表關(guān)閉。38.5千赫的載波頻

率是由定時(shí)器1提供的。紅外傳輸有短和長(zhǎng)兩個(gè)模式,port4的引腳。決定傳輸模式: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è)備寄存器的聲明包含在模塊SCLh中。

IR發(fā)射/接收有程序驅(qū)動(dòng)和中斷驅(qū)動(dòng)兩種方式,具體請(qǐng)參考&fa。在RCX編程,第3

芭有一個(gè)例子可供參考

3.3.6LCD顯示屏

LCD顯示一個(gè)LEGO人在走動(dòng)

LCD屏幕包含43個(gè)元素,一個(gè)元素可以是一個(gè)小點(diǎn)、箭頭或一個(gè)小LEGO人的腿。每

個(gè)元素都是單獨(dú)控制的,可讓它顯示或隱藏。這是通過(guò)LCD控制器實(shí)現(xiàn)的。有兩根串口線

與LCD控制器通信。這兩根線連接在I/Oport6的第5位和第6位。RCX就是通過(guò)對(duì)這兩根

線的讀寫來(lái)控制LCD的。RCX預(yù)置程序通過(guò)一個(gè)協(xié)議實(shí)現(xiàn)對(duì)LCD的高級(jí)操作:LCD每一個(gè)元

素的一位值暫存在儲(chǔ)器器的緩沖區(qū)里;RCX用戶程序向緩沖區(qū)寫值,調(diào)用預(yù)置程序,刷新,然

后屏幕上的元素就根據(jù)緩沖區(qū)里的值顯示或隱藏。具體請(qǐng)參考:RCXInternalso

3.3.7揚(yáng)聲器

揚(yáng)聲器由I/Oport6的第4位控制。在揚(yáng)聲器使用前,I/Oport6的數(shù)據(jù)方向寄存器應(yīng)

該如下設(shè)置:

^defineP6DDR?((volatilebyte*)0xffb9)

#defineP6DDR_R0M?((volatilebyte*)0xfd85)

#defineP6DR?((volatilebyte*)Oxffbb)

#definebit4(1?4)

#defineSpeakerHighP6DR|=bit4

#defineSpeakerLowP6DR&=~bit4

/*把port6的第4位初始化成輸出*/

P6DDR_R0M|=bit4;P6DDR=P6DDR_R0M;

要發(fā)出聲音,需要以適當(dāng)?shù)拈g隔時(shí)間對(duì)port6的第4位寫值。如發(fā)出500赫的聲音:

SpeakerHigh;

Waitonemsec;

SpeakerLow;

Waitonemsec;

port6的第4位也可由定時(shí)器0控制。

3.3.8RCX輸出口和執(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ì)跟著一起亮。

三個(gè)RCX輸出口A、B和C

輸出口由9V電源產(chǎn)生的電流驅(qū)動(dòng)。流經(jīng)執(zhí)行器件的電流狀態(tài)由位于地址OxfOOO的設(shè)

備寄存器的值決定。每一個(gè)輸出口由8位設(shè)備寄存器中的兩位控制。

輸出口ABC

位第7、6位第3、2位第1、0位

這些輸出口的控制位的值可在設(shè)備寄存器地址獲取。用如下c語(yǔ)句可將A口的狀態(tài)設(shè)

成2(見(jiàn)下表的四種狀態(tài)):

#defineOutputPorts*((volatilebyte*)OxfOOO):

^defineAmaskOxcO

bytetemp;

temp=OutputPorts;

temp&=~Amask;

temp|=(2?6);

OutputPorts=temp;

兩位值(有4種組合)對(duì)應(yīng)于電流的四種不同模式。01和10表示電流的兩種流動(dòng)方向。

00將執(zhí)行器件從電源斷開(kāi)。11將執(zhí)行器件的兩個(gè)端子連接到電源的同極性。具體請(qǐng)參考

InternalsofOutputPortsandActuators

為了更容易地控制執(zhí)行器件,我們用c語(yǔ)言舉例如下(控制A口):

^defineFloat0

ttdefineOnPos1

#defineOnNeg2

ttdefineBrake3

voidPortA(bytestate)

(

bytetemp;

temp=OutputPorts;

temp&=~Amask;

temp|=(state?6);

OutputPorts=temp;

)

經(jīng)過(guò)以上設(shè)置,四種狀態(tài)(Float,OnPos,OnNeg,andBrake)分別對(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ī)連接在A口和C口上的一輛小車(我們?nèi)匀灰訤loat,OnPos,OnNeg,

andBrake表示自由運(yùn)行,前進(jìn),后退,剎車)。狀態(tài)OnPos和OnNeg將根據(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允許我們用物匏動(dòng)來(lái)控制輸出口。用下面的語(yǔ)句可使連接

在A口上的燈閃爍:

PortA(OnPos);

Waitonemsec;

PortA(Float);

Waitonemsec;

這些宏也可以控制小車的運(yùn)動(dòng)。如:

/*如實(shí)際運(yùn)動(dòng)方向與程序不符,請(qǐng)改變電機(jī)的連接方向*/

^defineAbackOnNeg

#defineAforwardOnPos

#defineCbackOnNeg

ttdefineCforwardOnPos

voidCarCoast(void)

(

PortA(Float);PortC(Float);

}

voidCarBrake(void)

(

PortA(Brake);PortC(Brake);

)

voidCarGoForward(void)

PortA(Aforward);PortC(Cforward);

)

voidCarGoBackward(void)

(

PortA(Aback);PortC(Cback);

}

voidCarSpinClockwise(void)

(

PortA(Aforward);PortC(Cback);

}

voidCarSpinCounterClockwise(void)

(

PortA(Aback);PortC(Cforward);

輸出狀態(tài)以足夠快的速度改變,如以1毫秒的間隔,如果是燈,它的亮度就沒(méi)有一直供

電那么亮。這叫做PWM控制。每一個(gè)供電脈沖叫作脈沖的篦蜃控制脈沖寬度和脈沖的形

式就能控制傳遞到執(zhí)行器件的能量。我們可用H8/3292的定時(shí)器TO產(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í)可供使用。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é)議

可發(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)行下載的程序。只有下載的程序含有"Doyoubyte,whenIknock?”程序

才會(huì)被執(zhí)行。

每一個(gè)請(qǐng)求/應(yīng)答都是作為數(shù)據(jù)幀發(fā)送的。數(shù)據(jù)幀包含請(qǐng)求/應(yīng)答、幀頭、幀尾:

數(shù)據(jù)幀:幀頭請(qǐng)求/應(yīng)答幀尾

在這里,幀頭二0x55Oxff;請(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ì)描述。

應(yīng)答代

請(qǐng)求請(qǐng)求代碼請(qǐng)求數(shù)據(jù)應(yīng)答數(shù)據(jù)

Live10/18無(wú)ef/e7無(wú)

GetVersions15/ldKeyea/e2程序、固件版本

EnterDownloadMode65/6dKey9a/92無(wú)

程序入口、校驗(yàn)和、

BeginDownload75/7d8a/82結(jié)果

數(shù)據(jù)包號(hào)碼,長(zhǎng)度,

DownloadBlock45/4d數(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。

ProgramEntryPoint:兩字節(jié)表示的16位地址。這是用戶程序下載的地址。

ProgramChecksum:兩字節(jié)表示的16位無(wú)符號(hào)整型。已下載程序的字節(jié)數(shù)。

Zero:填充0o

BlockSequenceNumber:兩字節(jié)表示的數(shù)據(jù)包序列號(hào)。從1開(kāi)始,每接收一個(gè)加L0表示

請(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è)ASCH值76,69,71,79,174表示的五個(gè)字符“LEGO?"。

Text:26個(gè)ASCII值表示的一條語(yǔ)句"Justabitoftheblock!*<.

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)始和結(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同樣有相等的。位與1位)。這可使紅外接收器消除

周圍光線造成的影響。除了第一個(gè)字節(jié),其他都是作為22[2*(起始位+一個(gè)字節(jié)+奇偶位+

結(jié)束位)位發(fā)送的。波特率為2400時(shí),需時(shí)9亳秒。

5.3位協(xié)議

一串由0,1組成的數(shù)據(jù)以2400位/每分的速率傳輸。傳。時(shí),紅外光開(kāi)啟,傳1時(shí),

紅外光關(guān)閉。紅外光的頻率是38kHz。傳輸一位的時(shí)間是417useco

5.4與RS232連接的紅外發(fā)射/接收(指發(fā)射塔)

發(fā)射塔將電腦要發(fā)送的數(shù)據(jù)發(fā)出,同時(shí)接收來(lái)自RCX的數(shù)據(jù)包。

5.5一個(gè)和預(yù)置程序通信的用戶程序

一個(gè)簡(jiǎn)單的程序:RCXRequestReply.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_Request_Reply10

0000:ef

發(fā)送Alive(代碼10)請(qǐng)求,應(yīng)答是ef,表明通信正常。

如下可獲得程序的版本號(hào):

RCX_Request_Rep1y151357b

0000:ea0003000100000000

預(yù)置程序的版本是3.1且沒(méi)有固件。

現(xiàn)在我們要下載和運(yùn)行下面一個(gè)簡(jiǎn)單的匯編語(yǔ)言程序。請(qǐng)注意"D。youbyte,whenI

knock?”這條語(yǔ)句是如何使用的。

.section.text

.align1

.global_start

_start:

mov.w00,rO

jsr@r0

.section.data

.string“Doyoubyte,whenIknock?*

.end

首先把它變成16進(jìn)制表示的程序

mov.w@0,rO6b000000

jsr@r05d00

Do446f20

you796f7520

byte,627974652c20

when7768656e20

I4920

knock?6b6e6f636b3f

然后我們需要計(jì)算Programchecksum和BlockChecksumo

如下下載程序:

EnterDownloadMode:

RCX_Request_Reply651357b

0000:9a

BeginDownload,ProgramEntryPoint=8000,ProgramChecksum=09a8,Zero=0:

RCX_Request_Reply750080a80900

0000:8a00

DownloadBlock,BlockSequenceNamber=0,BlockLength=0022,DataBlock=6b00...

3f0000,BlockChecksum=a8:

RCX_Request_Rep1y4d000022006b00....3f0000a8

0000:b200

RunProgram,RunKey=4c45474fae(hex):

RCX_Request_Replya54c45474fae

0000:5a4a757374206120626974206f666620

0010:74686520626c6f636b21

應(yīng)答包含用十六進(jìn)制表示的"Justabitofftheblock!”語(yǔ)句。表明一切正常并且程

序正確運(yùn)行了。一會(huì)兒,程序執(zhí)行兩條指令跳轉(zhuǎn)到復(fù)位地址,將控制權(quán)還給預(yù)置程序。

6.使用RCX預(yù)置程序提供的底層服務(wù)

用戶程序可使用由預(yù)置程序提供的服務(wù),如對(duì)LCD屏幕的高級(jí)操作。在這個(gè)部分我們將

給出一些有用的服務(wù)程序并將描述怎樣通過(guò)匯編和C語(yǔ)言使用這些服務(wù)。具體請(qǐng)參考

RCXInternalso

我們將以一個(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

jsr00x0130

r6的值是3672=51*72。

我們可以把匯編調(diào)用嵌入到C語(yǔ)言程序里:

intl6imul(intl6a,intl6b)

(

intres;

asm("mov.w%1,r5

mov.w%2,r6

jsr0x0130;callimul

mov.wr6,%0

:=r(res)

:"r〃(a),(b)

:"rO","rl","r5","r6"

);

returnres;

)

這個(gè)C函數(shù)可像其他函數(shù)一樣調(diào)用:

intl6p;

p=imul(51,72);

像上面的乘法程序那樣,我們也可以嵌套別的語(yǔ)句,實(shí)現(xiàn)其他功能。這些嵌套程序模

塊可與數(shù)據(jù)類型、常數(shù)和全局變量放在一個(gè)頭文件里,如RCXRTE.ho這個(gè)頭文件也包含

H8/300的主要數(shù)據(jù)類型如字節(jié)、詞,語(yǔ)句"Doyoubyte,whenIknock?”和復(fù)位程序??捎?/p>

#include"RCX_RTE.h"包含在你的c語(yǔ)言程序里。

上面只是一個(gè)預(yù)置程序的簡(jiǎn)單應(yīng)用。下面將詳細(xì)描述預(yù)置程序?qū)Σ僮鱈CD提供的服務(wù)。

6.1LCD子程序

在預(yù)置程序中有一些預(yù)先寫好的子程序,它可以讓我們忽略控制LCD的H8/3292I/O

port6的底層細(xì)節(jié)。也隱藏了元素在屏幕怎樣顯示的細(xì)節(jié)。有兩個(gè)子程序可以顯示或隱藏屏

幕上的圖標(biāo)。一個(gè)圖標(biāo)是一個(gè)或多個(gè)元素。此外,還有一個(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í)行程序不斷更新。

調(diào)用地

LCD子程序描述參數(shù)名和類型

refresh更新屏幕內(nèi)容0x27c8沒(méi)有參數(shù)

clear清屏0x27ac沒(méi)有參數(shù)

show_icon使圖標(biāo)可見(jiàn)0xlb62圖標(biāo)(16位)

hide_icon隱藏圖標(biāo)0xle4a圖標(biāo)(16位)

根據(jù)格式和最小分度顯示格式(16位),值(16位),最小分度(16

show_number0xlff2

整數(shù)位)

子程序的第一個(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è)傳感器0

0x3009傳感器0激活

0x300a選擇觀測(cè)傳感器1

0x300b傳感器1激活

0x300c選擇觀測(cè)傳感器2

|0x300d傳感器2激活

0x300e選擇觀測(cè)電機(jī)0

辰300f電機(jī)0后退箭頭

0x3010電機(jī)0前進(jìn)箭頭

0x3011選擇觀測(cè)電機(jī)1

0x3012電機(jī)1后退箭頭

0x3013電機(jī)1前進(jìn)箭頭

0x3014選擇觀測(cè)電機(jī)2

0x3015電機(jī)2后退箭頭

0x3016電機(jī)2前進(jìn)箭頭

(0x3018datalog顯示

(0x3019下載中

0x301a上載中

0x301b電量低

0x301c低能量(指紅外發(fā)射)

|0x301d高能量(同上)

0x3020所有元素

重覆調(diào)用代碼0x3018、0x3019和0x301a可在屏幕顯示簡(jiǎn)單的動(dòng)畫(huà)。

格式:show_mimber子程序操作屏幕的六個(gè)位置:

符號(hào)數(shù)字3數(shù)字2數(shù)字1數(shù)字0數(shù)字(中間的空白是顯示小人的地方)

符號(hào)位可顯示一個(gè)減號(hào)(一)或是留空。其它五個(gè)位置可顯示十進(jìn)制數(shù)0,1...9和減號(hào)

(一),或是留空。在數(shù)字3和數(shù)字2、數(shù)字2和數(shù)字1或在數(shù)字1和數(shù)字。之間,可顯示小數(shù)

點(diǎn)。格式(見(jiàn)下表)控制16位值如何作為第二個(gè)參數(shù)傳遞和在屏幕顯示。

格式意思

16位值作為四個(gè)十進(jìn)制數(shù)的存方學(xué)類整數(shù)在位置3,2,1,0顯示。如果值小于

0x3001

-9999,顯示-9999,如果值大于9999,顯示9999

0x3017如果16位值在范圍0..9(即十進(jìn)制)將顯示在數(shù)字位置。否則什么也不顯示。

16位值作為四個(gè)十進(jìn)制數(shù)的無(wú)符號(hào)型整數(shù)在位置3,2,1,0顯示。如果值大于9999,

0x301f

顯示9999o

最小分度:確定小數(shù)點(diǎn)的位置。只適用于0x3001和0x301f兩種格式。

最小分度Scalefactor

(0x30021

(0x30030.1

0x30040.01

(0x30050.001

這些功能可集成在c語(yǔ)言的頭文件里,見(jiàn)RCXRTEh及RCXRIE.h描述。各個(gè)子程

序?qū)CD緩沖區(qū)更新后都調(diào)用了刷屏程序。為了讓使用更加方便,顯示數(shù)字的子程序包含

在了RCX_RTE.h里,如lcd_show_intl6和lcd_show_digito

7.為RCX編譯程序

我們已經(jīng)看到一個(gè)簡(jiǎn)單的匯編語(yǔ)言程序如何手工地翻譯成十六進(jìn)制表示的H8/300機(jī)器

代碼,這些字節(jié)怎么下載到RCX中,以及下載的程序如何起動(dòng)。但是,這個(gè)過(guò)程是非常繁瑣

和極易出錯(cuò)的。在本節(jié)及下面我們描述如何使用工具來(lái)簡(jiǎn)化這個(gè)過(guò)程。在本節(jié)我們描述一

個(gè)交叉匯編器和一個(gè)交叉編譯器將匯編語(yǔ)言程序和C語(yǔ)言程序翻譯成一系列用S碼表示的

H8/300機(jī)器碼。在下一節(jié),將描述RCX.Download程序如何將S碼變成字節(jié)序列,向RCX預(yù)

置程序發(fā)送請(qǐng)求,下載并且起

溫馨提示

  • 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)論