登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

51端口锁存器读取

作者:云痕 栏目:单片机
51端口锁存器读取
51的端口读取分读负载线和读端口锁存器。我看到的对读锁存器读取的介绍,都是要改变锁存器值的,如cpl等,我现在只想读取锁存器的值,但不像改变它,有人能告诉我怎么弄么?从P0到P3这几组口的读取都要,最好用汇编写下读取代码,谢谢

2楼: >>参与讨论
computer00
好象不可以光读不写的^_^
 
3楼: >>参与讨论
云痕
不能光读不写?
楼上的,确认么?我新学51,好多东西都不清楚。因为不知道如何只读不改,现在只好手工另外开了个寄存器存储输出端口状态,可这样实在太麻烦了

4楼: >>参与讨论
gaoyysea
这样不行吗?
MOV A,P0
MOV A,P3


5楼: >>参与讨论
computer00
楼上那样读的是引脚。
如果你的外围硬件电路能够保证不把P口拉低的话,那么直接读引脚的结果跟锁存器的作用是一样的。

6楼: >>参与讨论
AIRWILL
估计用这样的指令可以完成

    MOV A,P3  ;先保存 P3,不至于影响端口状态
    XCH A,P3  ;读锁存器内容至 A
    MOV P3,A  ;恢复P3 锁存器的内容

不过,没有做过试验  

7楼: >>参与讨论
computer00
XCH指令也不行的,读的还是引脚。
 
8楼: >>参与讨论
dengm
JBC P1.0, KKKK
 
9楼: >>参与讨论
conwh
讲的是什么意思?微指令还是口处理?
 
10楼: >>参与讨论
AIRWILL
嗯, xch 是不行的
原以为,在一条指令里完成端口的读写就行了,看来不是
资料称: 这样的指令才有 Read-Modify-Write 功效

ANL (logical AND, e.G., ANL P1,A)
ORL (logical OR, e.g., ORL P2,A)
XRL (logical EX-OR, e.g., XRL P3,A)
JBC (jump if bit = 1 and clear bit, e.g., JBC P1.1, LABEL)
CPL (complement bit, e.g., CPL P3.0)
INC (increment, e.g., INC P2)
DEC (decrement, e.g., DEC P2)
DJNZ (decrement and jump if not zero, e.g., DJNZ P3, LABEL)
MOV PX.Y,C(move carry bit to bit Y of PORT X)
CLR PX.Y(clear bit Y of PORT X)
SETB PX.Y(set bit Y of PORT X)

是不太好办,不过这么多长时间下来,我好象没有遇到要读锁存器内容的要求

11楼: >>参与讨论
涤纶
回复
那么C呢?

12楼: >>参与讨论
xwj
C也不行的,51的硬件映射(结构)决定了不能直接读出锁存器
就好像多和写SBUF为不同地址一样

13楼: >>参与讨论
高勇
想不通
    由于复位后各引脚寄存器的值是明确的,而以后各引脚的寄存器的值的改变不会因为芯片外面而,影响到引脚寄存嚣的值,引脚的寄存器的值只可能由程序来改变,所以就没有必要只读寄存器的值而不改变寄存器的内容了。
    事情往往不能想得太简单,由于系统在运行过程中由于各种原因造成非法程序的运行,有时非法的程序更会变改引脚寄存器的值,又因为不可能只读引脚寄存器的值而不改变它的值,所以有的系统就采用内部的存储器来作为引脚寄存器的缓冲。

14楼: >>参与讨论
xwj
按楼上的假设,既然因为“非法程序”让输出寄存器改变成未知值了
那么你读他还有什么用?如果没有非法程序,又有必要读他吗?
所以还是不存在要读输出寄存器的时候

真的要是非法了,让CPU复位,再把所有输出重新设为确定值这样,所有的输出就都在已控制范围内了,自然更为可靠些


15楼: >>参与讨论
conwh
LZ想做CPU
 
16楼: >>参与讨论
dengm
51端口锁存器是能读取!!仿真机才会用到
READ_PORT_P1_REG2ACC:
     CLR A ; MOV A, #0FFH
     CPL A

     JB P1.0, L_11 ; $+11 ; pin 为“1”时,锁存器肯定为“1”
       JBC P1.0, L_06; $+ 6 ; 用JBC TEST 锁存器, 为“1”时,跳    
          JBC ACC.0, L_05; $ + 5 ; == clr acc.0   / sjmp L_05
                                 ;  用2周期/3bytes, 代替 3周期/4bytes
L_06:       SETB P1.0       ; 恢复 锁存器 为“1”
L_05:
L_11:

     JB P1.1, $+11  
     JBC P1.1, $+ 6
         JBC ACC.1, $ + 5
       SETB P1.1

     JB P1.2, $+11
     JBC P1.2, $+ 6
         JBC ACC.2, $ + 5
       SETB P1.2

     JB P1.3, $+11
     JBC P1.3, $+ 6
         JBC ACC.3, $ + 5
       SETB P1.3

     JB P1.4, $+11
     JBC P1.4, $+ 6
         JBC ACC.4, $ + 5
       SETB P1.4

     JB P1.5, $+11
     JBC P1.5, $+ 6
         JBC ACC.5, $ + 5
       SETB P1.5

     JB P1.6, $+11
     JBC P1.6, $+ 6
         JBC ACC.6, $ + 5
       SETB P1.6

     JB P1.7, $+11
     JBC P1.7, $+ 6
         JBC ACC.7, $ + 5
       SETB P1.7

     RET





17楼: >>参与讨论
xwj
呵呵,看来还真是只有想不到,没有办不到的事啊,佩服!
用JBC P1.0, L_06;确实是好办法
从指令看确实是读-修改-写,回头再测试一下


看来还真是只有想不到,没有办不到的事啊
佩服!

18楼: >>参与讨论
高勇
xwj
xwj:
有时知道程序已经非法了,但是希望恢复非法前的状态,然后继续执行,所以有必要读取端口的状态,并给予保存。

19楼: >>参与讨论
xwj
To 楼上:既然程序已经非法,之前或这时的状态就没任何意义了
因为你不知道程序非法时做了什么!

这时我宁愿放弃,重新再来,以保证一切都在掌握中



20楼: >>参与讨论
yuands
读是读引脚
写是写锁存器

参与讨论
昵称:
讨论内容:
 
 
相关帖子
用哪种继电器可以控制类电话系统摘机和挂机
(图)请老树帮我看看这个复位电路是怎么工作的?谢谢
两个单片机串口直接相连能通信吗?
为什么不能脱机工作
调查:您赞成使用GOTO吗?来投票吧
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号