Ⅰ 單片機程序詳解,尤其是查表指令,如何查表,tab怎麼那麼多數據啊數據怎麼用順序是怎麼的謝謝!
MOV DPTR #TAB 是將TAB標號所在的地址給DPTR,對於查表指令所查數據為表中第(A中地址單元的值)個數據,假如你的程序20H的值是0,那麼查表的數據就是0C0H,是1就是0F9H以此類推。另外TAB的數據為八段共陽數碼管0~F的值
Ⅱ 關於單片機查表指令時用RLC左移指令
MOV
DPTR,#TAB
MOV
A,R3
;
如
R2R
3
=
0292H
=
0000
0010
1001
0010
(
十進制
658
)
CLR
C
;
C
=0
A=
1001
0010
RLC
A
;
A
=
0010
0100
C
=
1
(
左移一位)
XCH
A,R2
;
A
<=>
R2
A
=
0000
0010
C=1
RLC
A
;
A
=
0000
0101
C
=
0
(
左移一位)
XCH
AR2
;
A
<=>
R2
R2=0000
0101
A
=
0010
0100
(
十六進制
0524H)
ADD
A,DPL
;
(
十進制
1316)
MOV
DPL,A;調整DPL,DPH
MOV
A,DPH
ADDC
A,R2
MOV
DPH,A
CLR
A
MOVC
A,@A+DPTR;查表
MOV
R2,A;第一位元組
CLR
A
INC
DPTR
MOVC
A,@A+DPTR;查第二位元組
MOV
R3,A
RET
TAB:
DW
XXXXH;共1024個
數據項
DW
XXXXH
......
DW
XXXXH
Ⅲ 單片機查表程序編寫 急!
org 0000h
mov 30h, #1
mov 31h, #3
mov 32h, #5
mov 33h, #7
mov 34h, #9
mov 35h, #2
mov 36h, #4
mov 37h, #6
mov 38h, #8
mov 39h, #10
call SQRT
sjmp $
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H
MOV R1, #40H
MOV R2, #10
LOOP:
MOV A, @R0
ADD A, #S_TAB - ($ + 4)
MOVC A, @A + PC
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
;完
Ⅳ 單片機查表指令MOVC A @A+DPTR
51單片機的指令系統中,是沒有MOVC
A,@R0+DPTR的,查表指令只有兩條:
1、MOVC
A,@A+DPTR
2、MOVC
A,@A+PC
Ⅳ MSC-51單片機指令中的查表問題
查表程序是要從一個專門的數據區內找到你所需要的那個數。這個數在表中的位置,由表首地址、數在表內相對表首地址的偏移量、一個數據的位元組數等因素來確定。
具體方法是:將表首地址放入DPTR中,偏移量放入A中,用查表指令MOVC A,@A+DPTR;來完成從數據區取數。有如下幾種情況:
1、如果數據區的長度不超過256個位元組(累加器A的容量之內),且數據是單位元組的,則不需要另外處理;
2、因為如果數據區的長度不超過256個位元組,但數據是雙位元組的,需要將偏移量乘2,第一次讀出一個位元組保存,將地址加1後再讀第二位元組(類推:一個數據是n位元組,則偏移量乘n,每次讀出一個位元組保存,將地址加1後再讀下一位元組,直到一個數全部讀出)。
3、如果數據區的長度超過了256個位元組,因為A已經存放不了256以上的偏移量,此時需要事先將偏移量加入到DPTR中去(即數據的真實地址全部放到DPTR中了),再將A清零後使用查表指令。同樣也要如上區分單位元組數和多位元組數。
你所給例就是數據區的長度超過了256個位元組,且數據為雙位元組的情況。程序解釋如下,供參考。
MOV DPTR,#TAB ;表首地址入DPTR
MOV A,R3
CLR C
RLC A ;偏移量的低8位乘2在A中,移出的最高位在C中
XCH A,R2 ;乘2後的偏移量的低8入R2中,偏移量的高8位入A中
RLC A;偏移量的高8位乘2在A中
XCH A,R2 ;偏移量的高低位元組歸位,至此完成了偏移量乘2
ADD A,DPL
MOV DPL,A;
MOV A,DPH
ADDC A,R2
MOV DPH,A;將偏移量加到DPTR中,至此DPTR中就是數據第一個位元組的實際地址
CLR A ;A清零,因為偏移量已經加入,DPTR內容不需要再修正。
MOVC A,@A+DPTR;讀數據第一個位元組
MOV R2,A;讀數據第一個位元組存入R2中
CLR A ;A清零
INC DPTR ;地址加「1」,准備讀下一個位元組
MOVC A,@A+DPTR
MOV R3,A 讀數據第一個位元組存入R3中
RET
TAB: DW XXXXH;TAB為表首地址,共1024個雙位元組數據項,共2048個位元組
DW XXXXH
......
DW XXXXH
Ⅵ 51單片機,查表指令,乘2用移位。
51單片機查表指令是:MOVC A,@A+DPTR
DPTR是表的首地址,第二個A是偏移量。第一個A是取出的結果。
乘2相當於左移一位,即:RLC A(C需要先清零)
除2相當於右移一位,即:RRC A(C需要先清零)
Ⅶ PIC 的單片機如何實現查表功能
PIC系列單片機的查表程序可以利用子程序帶值返回的特點來實現。
具體是在主程序中先取出表數據地址放入W,接著調用子程序,子程序的第一條指令將W置入PC,則程序跳到數據地址的地方,再由「RETLW」指令將數據返回到主程序。
Ⅷ 單片機中用C語言查表和移位問題
先說第一個問題:
比如用查表法將結果保存到變數i中,查表變數為x,則i = table[x],記住C語言裡面數組是從0開始的,比如說上面的0x01就是table[0],0x02是table[1],以此類推。
再說第二個問題:
比如說從P1.0口發送出去,則可以寫為
sbit OUT = P1^0;//定義OUT為P1.0口,這樣今後好寫程序
char i;
for(i = 0;i < 8;i++)
{
OUT = data & 0x80;//因為高位在前,將它寫成二進制就明白了
data <<= 1;
}
上面的程序就能搞定了;
應該是所有的單片機都有CY位(不知道浮點DSP有沒有);
C語言中左移和右移之後低位或高位自動補零,CY位也保持為零(視編譯器而定,這個得看編譯器手冊),有些編譯器提供了循環移位的函數;
還有什麼不明白的補充問題就是