MCS-51单片机查表程序

MCS-51单片机查表程序,第1张

ADD A,#16和ADD A,#7都属于查表“修正”指令。这是 MOVC A,@A+PC 这条查表指令必须要用到的修正方式,所以这种修正指令的识别特征就是:它的下条要运行的指令一定是 MOVC A,@A+PC 这样作的目的就是为了当A中的数值与PC中的当前内容相加后,形成的查表地址能跟表格TABLE的首地址相对应,否则相加后形成的查表地址就会出错。具体的修正数值不是固定的(不同的人编写的指令数量不同,所以修正数值也不同,大致上可以按照每条指令占用2个字节、个别指令需要3字节,如MOVC A,@A+PC就需要3个字节这样来计算,总之这条指令使用起来很麻烦,需要提前人工计算出它的修正值。

而 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,#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口,用数码管等显示出来结果


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11510720.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存