指針與指量
指針是動態數據結構的根本,利用指針程序員可隨意操縱數據結構,因為指針具有極大的靈活性,所有使用指針也必須小心。ZJB根據單片機的特點,為了避免生成效率低下的代碼,ZJB用戶僅可操作硬件指針,使用硬件指針的好處是代碼小巧精悍,不利的一點是硬件指針只有少數的幾個,所以使用指針前必須首先對指針進行賦值,這種要求也是用好指針的金科玉律,為了使用指針,必須了解存儲結構和地址,這點在聲明變量時必須保證聲明順序不變,這樣,這些順序聲明的變量就形成了數據結構,你可以使用
#變量名 來取得變量的首地址,然后把地址賦值給指針,這樣指針指向的地址就可增量或減量操作,我們把指針指向的地址變量稱作指量,操作指針只是指向要操作的指量,指量一般在指針前加@或@@來代表指量。
單片機硬件指針:
R0 八位內存指針0,指向片內內存
R1 八位內存指針1,指向片內內存
DP 16位外存指針,指向片內或片外16位存儲器
DP.x 16位程序代碼指針,指向16位程序存儲器,x為8位偏移量
@R0 8位內存指量0
@R1 8位內存指量1
@@R0 8位外存指量0(具體應用請參閱硬件文檔手冊)
@@R1 8位外存指量1(具體應用請參閱硬件文檔手冊)
@@DP 16位外存指量
@@DP.x 16位程序存儲器指量
;利用指針進行內存清零示例:
R0=~0 ;指針賦值
.. @R0=0,??R0< ; 遞減循環指量清零
其他代碼
;利用指針把外存2000H處的8字節數據復制到內存緩沖器,
:: x:7 ;定義內存8字節緩沖器x
DP=2000H ;外存指針指向外存2000H處
R0=#x ;內存指針指向內存緩沖器x
8.. @R0=@@DP ;重復復制8字節數據到x
++R0,++DP ;修改指針指向下一個指量
其他代碼
;利用指針進行7段數碼管顯示示例:
數碼顯示(A):
DP=七段顯示代碼 ;指針賦值
P1=@@DP.A ;獲取指量7段代碼并在P1口驅動數碼管
/
七段顯示代碼: 0xCF, 0xA4,0xB0,0x99,0x92,0x82,0xD8,0x80,0x90
移位與通信
通信是單片機和外界聯系的必要手段,隨著外部芯片越來越多的使用串行器件,對單片機的編程也提出了相應的要求,為此,ZJB修改了移位語句來和這些新穎的硬件打交道,例如大量使用的IIC器件和SPI器件等。
串行通信的實質為移位操作,在發送端,把發送緩沖器中的數據逐位移出移出到通信的輸出口,同時再把通信輸入端的電平狀態從另一端逐位移入到發生緩沖器中,當發送緩沖器中的數據全部移出后,發送緩沖器中就收到了對方傳入的數據,這樣就完成了一幀數據的通信或信息交換?梢钥闯觯ㄐ判枰3個部件,1:發送端口(位變量),2:數據緩沖器,3:接收端口(位變量),由于以上原因,ZJB的移位語句被設計為一個三目語句,由于通信可能從緩沖器高位移出也可能從低位移出,所以ZJB的基本移位語句有兩個,她們分別是左移語句和右移語句。
基本移位語句形式如下:
[可選左移輸出的位]<<通信緩沖器變量[<<可選左移輸入的位]
[可選右移輸入的位]>>通信緩沖器變量[>>可選右移輸出的位]
功能:把數據從一端移入變量,從變量的另一端移出數據到位變量,變量內容移位改變。
可能的變形語句:
1:如果忽略可選的輸入位,那么移位結束緩沖器的數據不定。
2:如果可選輸入位為0或1那么移位結束緩沖器中為全0或全1。
3:移位語句每次只能移位1次,多位傳送需在定次循環中完成。
;利用串并語句進行1字節SPI通信的例子:
SPI(*A): ;聲明SPI通信過程,緩沖器為A
SDI==P1.0 ;定義輸入口
SDO==P1.1 ;定義輸出口
SCK==P1.2 ;定義同步口
8.. ;重復8次,傳遞1字節數據
SDO<<A<<SDI ;從輸入口接收數據從輸出口傳出數據
SCK=1,~SCK ;給出一個同步脈沖
/ ;返回
;利用串并語句進行BCD轉換的例子:
BCD(x"1,/y"2): ;x:BIN碼,y:壓縮BCD碼,y為可返參數
y=0 ;y清零
16.. ;2字節BIN碼,共2*8=16位
C<<x ;左移
A=y0++y0,DAA,y0=A ;y+y,BCD調整
A=y1++y1,DAA,y1=A
A=y2++y2,DAA,y2=A
/
單目操作語句
編程中最重要的任務是操作一個變量,為了簡單快速操作變量,ZJB設計了一系列單目語句用于操作變量本身,這些語句由一個變量和一個前綴運算符組成,可以完成諸如取反、取補、增量、減量和半字節交換等簡單任務,單目語句簡單明快,操作簡單,下面介紹常用的單目語句。
取反語句: ~ 變量,
功能:對變量內容取反,相當于匯編的CPL指令。
取補語句: - 變量,
功能:對變量內容取反,相當于匯編的CPL指令。
增量語句: ++ 變量,
功能:對變量內容直接進行+1操作,不影響標志字,相當于匯編中的 INC指令。
減量語句: -- 變量,
功能:對變量內容直接進行-1操作,不影響標志字,相當于匯編中的 DEC指令。
半交換語句: <> 字節變量,
功能:把字節變量的高低四位進行互換,不影響標志字,相當于匯編的SWAP指令。
通用操作語句
通用語句由左值表達式和右值表達式組成,右值表達式一般是一個運算式,由一系列變量、常量和運算符組成,右值運算的結果將賦值給左值表達式中的每一個變量,如果左值表達式中的變量有一個后綴運算符,那么這個左值變量和右值運算的結果再次運算,然后再賦值給這個左值變量,左值表達式的賦值順序從右向左逐個運算并賦值,而右值表達式的計算則按從左到右的順序逐個計算,然后生成結果。
為了完成復雜的運算,ZJB使用了如下運算符:
= 賦值運算符 雙目
+ 加法運算符 雙目
- 減法運算符 雙目 取補運算符 前綴單目
* 乘法運算符 雙目
/ 除法運算符 雙目
& 位與運算符 雙目
| 位或運算符 雙目
^ 異或運算符 雙目
~ 位非運算符 前綴單目
;賦值運算示例:
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
;混合運算示例:
x=y|z+10 ;運算順序:y和 z相或再加20,最后把結果賦值給x
;混合運算示例:
x=y|=z&20H ;運算順序: y=y|z&20H,x=y
為了簡化編譯器,右值表達式的優先級為從左到右,她們按運算順序從左到右逐個計算,這點和其他編譯器不同,至于其他運算,請參閱附錄:ZJB運算符一節