立即注冊(cè) 登錄
返回首頁(yè)

uid:257705的個(gè)人空間

日志

一種新的單片機(jī)編譯器:ZJB8

已有 574 次閱讀2017-12-5 15:25

指針與指量

 

       指針是動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)的根本,利用指針程序員可隨意操縱數(shù)據(jù)結(jié)構(gòu),因?yàn)橹羔樉哂袠O大的靈活性,所有使用指針也必須小心。ZJB根據(jù)單片機(jī)的特點(diǎn),為了避免生成效率低下的代碼,ZJB用戶僅可操作硬件指針,使用硬件指針的好處是代碼小巧精悍,不利的一點(diǎn)是硬件指針只有少數(shù)的幾個(gè),所以使用指針前必須首先對(duì)指針進(jìn)行賦值,這種要求也是用好指針的金科玉律,為了使用指針,必須了解存儲(chǔ)結(jié)構(gòu)和地址,這點(diǎn)在聲明變量時(shí)必須保證聲明順序不變,這樣,這些順序聲明的變量就形成了數(shù)據(jù)結(jié)構(gòu),你可以使用

#變量名 來(lái)取得變量的首地址,然后把地址賦值給指針,這樣指針指向的地址就可增量或減量操作,我們把指針指向的地址變量稱(chēng)作指量,操作指針只是指向要操作的指量,指量一般在指針前加@@@來(lái)代表指量。

      

       單片機(jī)硬件指針:

              R0          八位內(nèi)存指針0,指向片內(nèi)內(nèi)存

              R1          八位內(nèi)存指針1,指向片內(nèi)內(nèi)存

              DP          16位外存指針,指向片內(nèi)或片外16位存儲(chǔ)器

              DP.x        16位程序代碼指針,指向16位程序存儲(chǔ)器,x8位偏移量

              @R0              8位內(nèi)存指量0

              @R1              8位內(nèi)存指量1

              @@R0    8位外存指量0(具體應(yīng)用請(qǐng)參閱硬件文檔手冊(cè))

              @@R1    8位外存指量1(具體應(yīng)用請(qǐng)參閱硬件文檔手冊(cè))

              @@DP    16位外存指量

              @@DP.x  16位程序存儲(chǔ)器指量

 

       ;利用指針進(jìn)行內(nèi)存清零示例:

              R0=~0                                ;指針賦值

              ..      @R0=0??R0<            ; 遞減循環(huán)指量清零

              其他代碼

       ;利用指針把外存2000H處的8字節(jié)數(shù)據(jù)復(fù)制到內(nèi)存緩沖器,

              ::      x:7                               ;定義內(nèi)存8字節(jié)緩沖器x

              DP=2000H                           ;外存指針指向外存2000H

              R0=#x                                 ;內(nèi)存指針指向內(nèi)存緩沖器x

              8..    @R0=@@DP                ;重復(fù)復(fù)制8字節(jié)數(shù)據(jù)到x

                     ++R0,++DP                  ;修改指針指向下一個(gè)指量

              其他代碼

       ;利用指針進(jìn)行7段數(shù)碼管顯示示例:

              數(shù)碼顯示(A):

                     DP=七段顯示代碼           ;指針賦值

                     P1=@@DP.A                 ;獲取指量7段代碼并在P1口驅(qū)動(dòng)數(shù)碼管

                     /

              七段顯示代碼:  0xCF, 0xA4,0xB0,0x99,0x92,0x82,0xD8,0x80,0x90


 移位與通信

 

       通信是單片機(jī)和外界聯(lián)系的必要手段,隨著外部芯片越來(lái)越多的使用串行器件,對(duì)單片機(jī)的編程也提出了相應(yīng)的要求,為此,ZJB修改了移位語(yǔ)句來(lái)和這些新穎的硬件打交道,例如大量使用的IIC器件和SPI器件等。

 

       串行通信的實(shí)質(zhì)為移位操作,在發(fā)送端,把發(fā)送緩沖器中的數(shù)據(jù)逐位移出移出到通信的輸出口,同時(shí)再把通信輸入端的電平狀態(tài)從另一端逐位移入到發(fā)生緩沖器中,當(dāng)發(fā)送緩沖器中的數(shù)據(jù)全部移出后,發(fā)送緩沖器中就收到了對(duì)方傳入的數(shù)據(jù),這樣就完成了一幀數(shù)據(jù)的通信或信息交換?梢钥闯,通信需要3個(gè)部件,1:發(fā)送端口(位變量),2:數(shù)據(jù)緩沖器,3:接收端口(位變量),由于以上原因,ZJB的移位語(yǔ)句被設(shè)計(jì)為一個(gè)三目語(yǔ)句,由于通信可能從緩沖器高位移出也可能從低位移出,所以ZJB的基本移位語(yǔ)句有兩個(gè),她們分別是左移語(yǔ)句和右移語(yǔ)句。

 

基本移位語(yǔ)句形式如下:

              [可選左移輸出的位]<<通信緩沖器變量[<<可選左移輸入的位]

              [可選右移輸入的位]>>通信緩沖器變量[>>可選右移輸出的位]

功能:把數(shù)據(jù)從一端移入變量,從變量的另一端移出數(shù)據(jù)到位變量,變量?jī)?nèi)容移位改變。

可能的變形語(yǔ)句:

       1:如果忽略可選的輸入位,那么移位結(jié)束緩沖器的數(shù)據(jù)不定。

       2:如果可選輸入位為01那么移位結(jié)束緩沖器中為全0或全1

       3:移位語(yǔ)句每次只能移位1次,多位傳送需在定次循環(huán)中完成。

 

       ;利用串并語(yǔ)句進(jìn)行1字節(jié)SPI通信的例子:

              SPI(*A):                                              ;聲明SPI通信過(guò)程,緩沖器為A

                     SDI==P1.0                                  ;定義輸入口

                     SDO==P1.1                                ;定義輸出口

                     SCK==P1.2                                 ;定義同步口

                     8..                                              ;重復(fù)8,傳遞1字節(jié)數(shù)據(jù)

                            SDO<<A<<SDI                    ;從輸入口接收數(shù)據(jù)從輸出口傳出數(shù)據(jù)

                            SCK=1,~SCK                        ;給出一個(gè)同步脈沖

                     /                                                ;返回

 

       ;利用串并語(yǔ)句進(jìn)行BCD轉(zhuǎn)換的例子:

              BCD(x"1,/y"2):                                    ;x:BIN,y:壓縮BCD,y為可返參數(shù)

                     y=0                                            ;y清零

                     16..                                            ;2字節(jié)BIN,2*8=16

                            C<<x                                  ;左移

                            A=y0++y0,DAA,y0=A            ;y+y,BCD調(diào)整

                            A=y1++y1,DAA,y1=A

                            A=y2++y2,DAA,y2=A

                     /



 單目操作語(yǔ)句

 

編程中最重要的任務(wù)是操作一個(gè)變量,為了簡(jiǎn)單快速操作變量,ZJB設(shè)計(jì)了一系列單目語(yǔ)句用于操作變量本身,這些語(yǔ)句由一個(gè)變量和一個(gè)前綴運(yùn)算符組成,可以完成諸如取反、取補(bǔ)、增量、減量和半字節(jié)交換等簡(jiǎn)單任務(wù),單目語(yǔ)句簡(jiǎn)單明快,操作簡(jiǎn)單,下面介紹常用的單目語(yǔ)句。

取反語(yǔ)句:      ~ 變量,

       功能:對(duì)變量?jī)?nèi)容取反,相當(dāng)于匯編的CPL指令。

取補(bǔ)語(yǔ)句:      - 變量,

       功能:對(duì)變量?jī)?nèi)容取反,相當(dāng)于匯編的CPL指令。

增量語(yǔ)句:      ++ 變量,

       功能:對(duì)變量?jī)?nèi)容直接進(jìn)行+1操作,不影響標(biāo)志字,相當(dāng)于匯編中的 INC指令。

減量語(yǔ)句:      -- 變量,

       功能:對(duì)變量?jī)?nèi)容直接進(jìn)行-1操作,不影響標(biāo)志字,相當(dāng)于匯編中的 DEC指令。

半交換語(yǔ)句:   <> 字節(jié)變量,

       功能:把字節(jié)變量的高低四位進(jìn)行互換,不影響標(biāo)志字,相當(dāng)于匯編的SWAP指令。




通用操作語(yǔ)句

 

       通用語(yǔ)句由左值表達(dá)式和右值表達(dá)式組成,右值表達(dá)式一般是一個(gè)運(yùn)算式,由一系列變量、常量和運(yùn)算符組成,右值運(yùn)算的結(jié)果將賦值給左值表達(dá)式中的每一個(gè)變量,如果左值表達(dá)式中的變量有一個(gè)后綴運(yùn)算符,那么這個(gè)左值變量和右值運(yùn)算的結(jié)果再次運(yùn)算,然后再賦值給這個(gè)左值變量,左值表達(dá)式的賦值順序從右向左逐個(gè)運(yùn)算并賦值,而右值表達(dá)式的計(jì)算則按從左到右的順序逐個(gè)計(jì)算,然后生成結(jié)果。

 

為了完成復(fù)雜的運(yùn)算,ZJB使用了如下運(yùn)算符:

       =            賦值運(yùn)算符 雙目

       +            加法運(yùn)算符 雙目

       -             減法運(yùn)算符 雙目      取補(bǔ)運(yùn)算符 前綴單目

       *             乘法運(yùn)算符 雙目

       /             除法運(yùn)算符 雙目

       &            位與運(yùn)算符 雙目

       |             位或運(yùn)算符 雙目

       ^            異或運(yùn)算符 雙目

       ~            位非運(yùn)算符 前綴單目

 

;賦值運(yùn)算示例:

       x=y=z=20             ;賦值順序: z=20,y=z,x=y

       x=y=z=~0             ;賦值順序: z=~0,y=zx=y

       x=y=z=-1              ;賦值順序: z=-1,y=z,x=y

;混合運(yùn)算示例:

       x=y|z+10               ;運(yùn)算順序:y z相或再加20,最后把結(jié)果賦值給x

;混合運(yùn)算示例:

       x=y|=z&20H          ;運(yùn)算順序: y=y|z&20H,x=y

 

       為了簡(jiǎn)化編譯器,右值表達(dá)式的優(yōu)先級(jí)為從左到右,她們按運(yùn)算順序從左到右逐個(gè)計(jì)算,這點(diǎn)和其他編譯器不同,至于其他運(yùn)算,請(qǐng)參閱附錄:ZJB運(yùn)算符一節(jié)

 


路過(guò)

雞蛋

鮮花

握手

雷人

評(píng)論 (0 個(gè)評(píng)論)

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部