MCS-51单片机查表程序的问题?

以下是一个显示“090545“的程序,我想问一下它的工作情况,特别的,它是如何执行查表的??
请对这一句进行说明:MOV DPTR,#TAB
MOVC A,@A+DPTR
CPL A ;理解这句
MOV P0,A
在此谢了!!
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV 70H,#5
MOV 71H,#4
MOV 72H,#5
MOV 73H,#0
MOV 74H,#9
MOV 75H,#0
LCALL DISPLAY
LCALL DL1MS
LJMP MAIN
DISPLAY:MOV R1,#70H
MOV R5,#0FEH
PLAY:MOV A,R5
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
CPL A ;理解这句
MOV P0,A
LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.5,ENDOUT
RL A
MOV R5,A
AJMP PLAY
RET
ENDOUT: SETB P2.5
MOV P0,#0FFH
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;
DL1MS:MOV R6,#14H
DL1:MOV R7,#19H
DL2:DJNZ R7,DL2
DJNZ R6 ,DL1
RET
END

第1个回答  2010-12-28
MOV DPTR,#TAB
MOVC A,@A+DPTR
CPL A ;理解这句
MOV P0,A

MOV DPTR,#TAB 这句是将TAB处的内容的地址移入DPTR寄存器(51单片机中唯一的一个16位的)
MOVC A,@A+DPTR 这句将(A寄存器中的内容+DPTR)中的地址处的数据移入A
比如此时 A=0,DPTR=300,这时就将300+0寄存器里的数据移到A
如果A=2,DPTR=300,这时就将(300+2)寄存器里的数据移到A
CPL A ; A求反,
MOV P0,A 将A的值移入P0口,用数码管等显示出来结果本回答被网友采纳
第2个回答  2010-12-28
MOV DPTR,#TAB
把TAB表的首地(存0c0h的单元地址,下一个地址就存0f9h)址放进指针DPTR
MOVC A,@A+DPTR
累加器A的值加DPTR作为一个数并看成地址
将这个地址中的数赋值给累加器A
如果执行这句前累加器内容为0那么运行后A中就会存这个表格的第一个值;为2同样会变成第三个值@间接寻址的说明,后面的A+DPTR的结果作为地址进行查找就能找到你的表格本回答被提问者采纳
第3个回答  2010-12-28
MOV A,@R1 ;得到#TAB的偏移量
MOV DPTR,#TAB ;将tab的地址送给dptr
MOVC A,@A+DPTR ;将TAB的地址值加上A中的值后得到取值地址并送入A
CPL A ;求反(假设A为80H时执行此句后A的结果为7fH)
MOV P0,A ;将A中的值送到P0口
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;
例1234:db 0 1 2 .................... 第N个