기초 프로그램 소개

   1) LED 점등 프로그램 

 

ORG

8000H

시작 번지(8000H) 지정

 

MOV

DPTR, #0FF1BH

8255의 번지 저장

 

MOV

A, #89H

A, B 포트 출력, C 포트 입력용으로 사용

 

MOVX

@DPTR, A

8255 초기화

 

MOV

DPTR, #0FF19H

출력 번지 지정

 

MOV

A, #0F0H

LED 출력 데이터 저장 (A레지스터)

 

MOVX

@DPTR, A

LED로 출력. (11110000) 1 : LED OFF

 

END

 

 

 

 

 

 

 ▣ 8255를 사용하지 않고 P1 포트를 통해 직접 점등 시키는 프로그램

 

ORG

8000H

시작 번지(8000H) 지정

 

MOV

A, #11101110B

A 레지스터에 값 지정

LOOP:

MOV

P1, A

P1 포트로 출력

 

CALL

TIMER

시간 지연을 위한 서브루틴 호출

 

RL

A

A 레지스터의 값을 왼쪽으로 로테이트(회전)

 

JMP

LOOP

LOOP: 로 분기

TIMER:

MOV

R0, #00

R0 레지스터에 #00 대입 (반복 횟수)

L1:

MOV

R1, #00

R1 레지스터에 #00 대입 (반복 횟수)

L2:

NOP

 

시간 지연

 

DJNZ

R1, L2

R1 레지스터값 감소 후 0이 아니면 L2로 분기

 

DJNZ

R0, L1

R0 레지스터값 감소 후 0이 아니면 L1로 분기

 

RET

 

서브루틴 복귀

 

END

 

 

 

 

 

 

 

   2) User Key에 대응하는 LED를 ON시키는 프로그램 

DACB

EQU

0FF19H

LED (B 포트)의 주소를 DACB라는 기호 주소에 할당

DACC

EQU

0FF1AH

USER KEY (C 포트)의 주소를 DACC라는 기호 주소에 할당

DACCW

EQU

0FF1BH

포트 제어 주소를 DACCW라는 기호 주소에 할당

 

ORG

8000H

8000H 번지부터 프로그램 적재/시작

START:

MOV

SP, #40H

스택의 시작점을 40H로 설정

 

MOV

DPTR, #DACCW

포트 제어 주소(DACCW)를 DPTR로 이동

 

MOV

A, #89H

89H를 A레지스터로 이동 (8255 모드 설정)

 

MOVX

@DPTR, A

C포트 입력용 / A, B포트 출력용 설정

MAIN:

MOV

DPTR, #DACC

USER KEY (C 포트)의 주소를 DPTR로 이동

 

MOVX

A, @DPTR

키보드로부터 값 입력

 

MOV

DPTR, #DACB

LED (B 포트)의 주소를 DPTR로 이동

 

MOVX

@DPTR, A

A값을 DPTR이 가리키는 곳(LED)으로 이동 (LED 점등)

 

JMP

MAIN

MAIN 위치로 분기 (점프)

 

END

 

 

 

 

 

 

 

   3) LED 점멸 프로그램 

DACB

EQU

0FF19H

LED (B 포트)의 주소를 DACB라는 기호에 할당

DACCW

EQU

0FF1BH

포트 제어 주소를 DACCW라는 기호에 할당

 

ORG

8000H

8000H 번지부터 프로그램 적재/실행

START:

MOV

SP, #50H

스택 포인터 (시작 위치)를 50H로 설정

 

MOV

DPTR, #DACCW

포트 제어 주소 DACCW를 DPTR로 이동

 

MOV

A, #89H

89H를 A레지스터로 이동 (8255 모드 설정)

 

MOVX

@DPTR, A

C포트 입력용 / A, B포트 출력용 설정

 

MOV

DPTR, #DACB

LED (B포트)의 주소(DACB)를 DPTR로 이동

MAIN:

MOV

A, #0F0H

F0H를 A레지스터로 이동

 

MOV

B, #4

4를 B레지스터로 이동 (반복 횟수 지정)

J1:

MOVX

@DPTR, A

하위 4개 LED 켜짐

 

CPL

A

A레지스터의 값을 보수화함

 

CALL

DELAY

DELAY 서브루틴 호출

 

DJNZ

B, J1

B레지스터를 감소시키고, 0이 아니면 J1로 분기

 

MOV

A, #0FEH

FEH를 A레지스터로 이동

 

MOV

B, #8

8을 B레지스터로 이동 (반복 횟수 지정)

J2:

MOVX

@DPTR, A

1개 LED 켜짐

 

RL

A

A레지스터의 값을 왼쪽으로 1BIT ROTATE 시킴 (이동)

 

CALL

DELAY

DELAY 서브루틴 호출

 

DJNZ

B, J2

B레지스터의 값을 감소시키고 0이 아니면 J2로 분기

 

MOV

A, #0FEH

FEH를 A레지스터로 이동

 

MOV

B, #8

8을 B레지스터로 이동 (반복 횟수 지정)

J3:

MOVX

@DPTR, A

LED 켜짐

 

RL

A

A레지스터의 값을 왼쪽으로 1BIT ROTATE 시킴

 

ANL

A, #0FEH

A레지스터의 값과 FEH를 AND시킴

 

CALL

DELAY

DELAY 서브루틴 호출

 

DJNZ

B, J3

B레지스터의 값을 감소시키고, 0이 아니면 J3으로 분기

 

JMP

MAIN

MAIN으로 분기

DELAY:

MOV

R5, #10

R5레지스터 값 설정 (반복 횟수 지정)

D1:

MOV

R6, #50

R6레지스터 값 설정 (반복 횟수 지정)

D2:

MOV

R7, #0

R6레지스터 값 설정 (반복 횟수 지정)

 

DJNZ

R7, $

R7레지스터 값 감소, 0이 아니면 제자리 반복

 

DJNZ

R6, D2

R6레지스터 값 감소, 0이 아니면 D2로 분기

 

DJNZ

R5, D1

R5레지스터 값 감소, 0이 아니면 D1로 분기

 

RET

 

서브루틴 복귀

 

END