问一个汇编最简单的问题,进来看看吧。

2020-01-27 11:31发布

本帖最后由 大哈欠E 于 2013-8-11 22:29 编辑

看到一个扫描矩阵行列程序的一部分,看了一下郁闷了。。。

KEY: MOV A,#00H
       MOV DPTR,#POTR1      ;port1为单片机的io口
       MOVX @DPTR,A              ;把行全部赋值为00H 相当于port1=00h
       MOV DPTR,#PORT2        ;读取列的值
       MOVX A,@DPTR
      
有两个问题:
1、为什么要这样写,读取列端口port2的值为什么用movx(对外部RAM的数据传送)?难道51单片机的io口port2属于片外ram吗?它的端口不是特殊功能寄存器的一个单元吗                                                                                                                                                                                                          2、为什么不这样写
                mov port1,#00h
                        mov a,port2
?访问51的sfr不是直接寻址的吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
30条回答
大哈欠E
1楼-- · 2020-01-28 21:44
NJ8888 发表于 2013-8-11 17:27
同意8楼意见

嗯,我还是认为有必要搞搞汇编。
大哈欠E
2楼-- · 2020-01-29 01:29
 精彩回答 2  元偷偷看……
marshallemon
3楼-- · 2020-01-29 01:51
XA144F 发表于 2013-8-11 16:18
不用你说,我知道这是51的汇编。
8155或8255器件上的IO口就是用PA、PB、PC命名的,别以为只有AVR单片机才写 ...

呵呵,看来你说来说去都指在使用8155,8255啊,不使用8155或8255类只使用锁存来扩展IO这种方法依然是可以使用的,使用总线方式速度快这个是肯定的
marshallemon
4楼-- · 2020-01-29 07:09
大哈欠E 发表于 2013-8-11 17:11
小生刚接触汇编,有些问题还是不明白,对于51或52特殊功能寄存器块,不是只能用直接寻址访问吗?而对于52 ...

让你这么一问让我反而不知道该怎样作答了,感觉你把两个内容搞混了,这种间接寻址是对于变量自身来说的,并不是针对SFR来说的,例如你例子中的#POTR1,#POTR2,也就是说对于#POTR1,#POTR2是间接寻址,而不是对于DPTR,在这个例子中#POTR1,#POTR2为立即数
大哈欠E
5楼-- · 2020-01-29 11:16
marshallemon 发表于 2013-8-11 20:26
让你这么一问让我反而不知道该怎样作答了,感觉你把两个内容搞混了,这种间接寻址是对于变量自身来说的, ...

我没有搞混淆,大神可能没仔细看问题,我纠结的是port1 port2是51单片机的io端口,像P1和P2,但如果是这样的话还可以用movx来访问吗?如果port1和port2是自变量的话那么一切疑问即可烟消云散,但是如果是变量的话,是不是也要求port1和port2是片外ram单元,还有关键是这个程序是矩阵键盘扫描程序应该是端口才对啊,现在结果可能只有一个那就是用8155和8255扩展了io口,所以才用movx,不知道小生这样理解对不对?
大哈欠E
6楼-- · 2020-01-29 17:08
如果你们说的总线访问是这样吗?“movx 只用于访问外部RAM或EPROM(EA要为低电平)。会用到地址总线P0(低8位)和P2(高8位) 数据总线P0 和 控制总线WR、RD、ALE、PCON访问是外部RAM时:ALE用于低8位地址锁存, RD为读信号,WR为写信号. 地址线P0(低8位)和P2(高8位) 访问了地址后数据再由P0口数据线传送。 时序:ALE先发出锁存选通信号,P0和P2再发地址信号,RD或WR作RAM选通信号。之后锁存地址线,再由P0接收读的数据或发送写的数据。访问是外EPROM时:ALE用于低8位地址锁存,地址线为P2和P0 PCON为外EPROM选通信号。”

一周热门 更多>