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

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条回答
marshallemon
1楼-- · 2020-01-27 17:06
人家写的是间接寻址,你用的是直接寻址,还有DPTR是16bit的,能同时操作2组IO
XA144F
2楼-- · 2020-01-27 20:50
marshallemon 发表于 2013-8-11 14:17
人家写的是间接寻址,你用的是直接寻址,还有DPTR是16bit的,能同时操作2组IO ...

你这说法完全错误,dptr的16bit关端口什么事啊。
估计楼主没看原理图,用到了这样的代码,估计是单片机外接了8155或8255这样的器件,port1是PA的地址,port2是PB的地址,这根本不是单片机本身的P1 P2端口。
marshallemon
3楼-- · 2020-01-27 23:43
本帖最后由 marshallemon 于 2013-8-11 16:13 编辑
XA144F 发表于 2013-8-11 14:30
你这说法完全错误,dptr的16bit关端口什么事啊。
估计楼主没看原理图,用到了这样的代码,估计是单片机外 ...


把汇编修好再来评价吧,先说你的回复,首先这段代码是51的的汇编,并非AVR,所以端口并不是PA,PB.
再说LZ问的这个问题,LZ问问题的 核心在于寻址方式的不同,并不在于端口,
再说我的回复,我回复的核心在于说使用DPTR进行间接寻址的灵活性。
另外说下即便使用8155,8255,8279之类的并不一定要使用这种方式操作,使用IO模拟时序依然是可以的这样依然用不到MOVX,之所以是使用MOVX的主旨在于使用总线模式操作
XA144F
4楼-- · 2020-01-28 03:52
 精彩回答 2  元偷偷看……
XA144F
5楼-- · 2020-01-28 08:16
执行movx指令的确能让51的P0和P2同时发生变化,但这只是输出地址信息持续一个movx指令的时间,指令执行后恢复高电平。但这输出没法用来扫描键盘矩阵吧?
wajlh
6楼-- · 2020-01-28 08:26
很明显是用了总线的操作方式。楼主不理解的话,没必要看了,这都是哪个年代了玩意了。

一周热门 更多>