指針與指量
指針是動(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ǔ)器,x為8位偏移量
@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:如果可選輸入位為0或1那么移位結(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=z,x=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é)
Powered by 單片機(jī)教程網(wǎng)