Ⅰ 单片机程序详解,尤其是查表指令,如何查表,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位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是