而 MOVC A,@A+DPTR同样也是查表指令,但它就不需要人工进行计算修正,这是因为在进行编译时,汇编软件会自动计算出查表指令距离表首地址的长度,从而自行修正,不需要人工干涉。
“问题补充”的内容:
MOV A,@R0以寄存器R0中的内容为单元地址,并将这个单元地址中的数据传送至累加器A
ANL A,#0FH 将累加器A中的内容和十六进制立即数0F进行逻辑“与”运算,结果再传送给A(这实际是要将累加器A中的高4位进行清0处理,而低4位保持不变)
ADD A,#16 累加器A中的内容和十进制立即数16进行相加,相加后的结果再传送给A(修正指令)
MOVC A,@A+PC 典型的查表指令之一。含义:将累加器A中的内容和程序指针PC中的当前内容相加,相加后的结果作为要读取的程序存储器ROM的单元地址,并将这个单元地址中的内容传送给累加器A
唉……好久没来“知道”转转了,没想到刚一上来就敲了这么多字,也不知道楼主能看懂了没有?
查表法,就是将你的一些固定的数据存储到程序存储器中,当你的程序中需要这些数据时,movc指令读取这些数据。举例假设你的系统要用数码管显示0-9这10个数字,而假设这10个数字各自的断码(点亮时io口相应的电平)分别为\x0d\x0a0xC0,//"0"\x0d\x0a0xF9,//"1"\x0d\x0a0xA4,//"2"\x0d\x0a0xB0,//"3"\x0d\x0a0x99,//"4"\x0d\x0a0x92,//"5"\x0d\x0a0x82,//"6"\x0d\x0a0xF8,//"7"\x0d\x0a0x80,//"8"\x0d\x0a0x90,//"9"\x0d\x0a你有两种方法存储这时个数据,一种是在数据区用十个字节存储这些数据(数据常量),但这会占用你的数据存储器空间。另外一种方法就是把这些不变的数放到程序空间中,到需要的时候到程序空间中读取,这便是查表。也就是在程序空间中建立一个表,假设你需要就9这个数值的断码,就去表中查看一下9对应的数据。MOV DPTR,#TABMOVC 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口,用数码管等显示出来结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)