2017-10-13 2 views
0

8051 포트의 여러 비트를 한 번에 수정할 수있는 간단한 방법이 있는지 알아 내려고하고 있습니다.난파 작업없이 한 번에 여러 비트 수정 - 8051 포트

나는 내 딜레마를 더 구체적인 스타일로 다시 설명 할 것이다.

내 응용 프로그램에는 포트 2가 두 가지 기능으로 나누어 져 있습니다. FA와 FB라고 부르 자.

FA는 하위 3 비트의 출력 값에 의존하며 FB는 나머지 5 비트를 사용하지만 I/O 일 수 있습니다.

FB의 한 비트가 클럭을 제어하는 ​​출력 비트이므로 FA를 수정할 때 FB의 일부를 수정하지 않고 그 반대의 경우도 수정하지 않습니다. 명령의

다음과 같은 종류의 나를 위해 작동하지 않습니다 같은 명령이 두 기능은 아마도 잘못된 시간에 하나 개의 기능을 트리거 값을 덮어 쓰기 때문에

mov P2,#07h 
mov P2,#80h 

이입니다. 내가 좋아하는 뭔가

멀리 얻을 수있는 다음

setb P2.7 
setb P2.6 
clr P2.5 
clr P2.4 
setb P2.3 
setb P2.2 
clr P2.1 
clr P2.0 

나는 그 명령은 나머지 비트에 영향을주지 않고 하나의 개별 비트 하나를 설정할 수 있습니다 알고 있지만, 나는 이상을 설정하려고하고 싶습니다 때문에 한 번에 한 비트 씩

읽기 - 수정 - 쓰기에 대해 읽었으며 인터넷에서 MOV가 포트 핀의 논리 연산과 다르다는 것을 알았으므로 여기서 필자의 생각을 기반으로 맞는지 확인하려고 노력할 것입니다. :

FB에 대해 말하십시오. 모든 논리 하이를 출력하고 FA에 대해 최저 비트 = 1을 제외한 모든 논리 로우를 출력하고 싶습니다. 한 번에 하나의 기능으로 작동하고 싶습니다.

mov P2, #0F9h 

을하지만 어떻게 든 작동 할 수 포트에 논리를 사용하여 생각하지만, 내 생각이 맞다면 알고 싶어

나는 그것이 한 번에 모든 것을 놓기 때문에이 작동하지 않습니다 알고있다. 아래의 두 경우에서 P2는 mov 명령을 통해 # 0A1h로 설정된 값을 갖고 있다고 가정하고 P2의 핀은 모두 접지에 연결됩니다.

anl P2,#F8h ;value of P2 = #0A1h AND #F8h = #0A0h 
orl P2,#F9h ;value of P2 = #0A0h OR #F9h = #0F9h 
anl P2,#F0h ;value of P2 = #0F9h AND #F0h = #0F0h 

?이 옳은지 값 P2는 경우 생성 할 이잖아 때문에 I # 개 00H와 방정식을 시작한 두번째 예에서이 더? 정확한

anl P2,#F8h ;value of P2 = #00h AND #F8h = #00h 
orl P2,#F9h ;value of P2 = #00h OR #F9h = #0F9h 
anl P2,#F0h ;value of P2 = #00h AND #F0h = #00h 

이다 I MOV A, P2를 사용하고 A에 대한 값을 원했지만 그 값이 anl 및 orl 계산에 사용되는지 확실하지 않습니다.

전체적으로, 내 질문에, 나머지 비트를 방해하지 않고 포트의 특정 비트 만 수정하려면 anl 및 orl을 사용할 수 있습니까? 또는 setb 및 clr 같은 비트 조작 명령을 사용하여 붙어 있습니까?

답변

1

먼저 다음과 같은 부분을 추가하고 싶습니다. SETB 및 CLR 명령어를 사용하는 접근법은 실행하기 위해 더 많은 머신 사이클을 필요로하며 경우에 따라 (예 : 클럭 생성, 동기화 문제) 실행 불가능할 수도 있습니다.

8051 포트는 현대 MCU에 비해 ​​다소 원시적입니다. '포트'에는 핀 상태를 저장하는 래치가 있고 그 래치는 출력을 조절하려고 시도합니다. 이것은 반드시 포트가 원하는 상태에 있음을 의미하지는 않습니다. 예를 들어, 외부에서 로우로 구동되면 래치가 높을 수 있지만 포트는 로우가됩니다. 이것은 정확하게 포트를 입력으로 설정하는 방법입니다.

데이터를 포트에 MOVE하면 래치에 쓰고 포트에서 레지스터로 이동하면 래치의 상태에 관계없이 실제 상태를 읽습니다. 읽기 - 수정 - 쓰기 작업은 예외적으로 래치를 특별히 읽고 원하는 작업을 수행하고 래치에 다시 쓰기 때문에 예외입니다. 따라서 "이것이 맞습니까?"아래에 제시된 시나리오가 올바른 것입니다.

대신 MOV A, P2를 실행 한 다음 ANL P2를 실행하면 # F8h "또는 이것이 더 정확한가요?"라는 메시지가 올바른 것입니다.

결과적으로 논리 연산을 사용하여이 질문에서 주어진 경우의 포트를 수정할 수 있습니다.

+0

R7의 높은 니블에 내 사용자 정의 값을 넣고 포트 2의 하위 니블을 변경하지 않고 포트 2 실제 출력의 상위 니블로 만들고 싶다면이 코딩 방법을 사용하는 것이 더 좋습니다. MOV R7, # 70h MOV A, P2 ANL A, # 0Fh ORL A, R7 MOV P2, A'. 나는 올바른 길을 가고 있는가? – Mike