20문자 4 줄의 LCD 를 구동하는 예제프로그램 입니다.
;-----------------------------------------------------------------------------
; (C)SAMPLE Electronics co. http://www.SAMPLE.co.kr
;-----------------------------------------------------------------------------
; LCD Driver Program
;
; 이 프로그램은 C8051Fxxx 프로세서에 4줄 20문자 구성의 LCD를 연결하는 예입니다.
; 4 비트 모드로 동작 합니다.
;-----------------------------------------------------------------------------
;
;-----------------------------------------------------------------------------
; EQUATES
;-----------------------------------------------------------------------------
$MOD8F000 ; C8051F000 의 SFR 과 비트를 정의해 놓은 파일
;-----------------------------------------------------------------------------
; LCD 를 4 비트로 모드로 연결하기 위한 포트 설정
; 포트는 어떤 것이든지 상관없으며 순서대로 정렬될 필요도 없다.
;
LCD_RS EQU P3.2 ; LCD Register Select
LCD_EN EQU P3.3 ; LCD Enable
LCD_D4 EQU P3.4 ; LCD Data Bus D4
LCD_D5 EQU P3.5 ; LCD Data Bus D5
LCD_D6 EQU P3.6 ; LCD Data Bus D6
LCD_D7 EQU P3.7 ; LCD Data Bus D7
;
LINE_1 EQU 080h ; 첫번째 줄 어드레스 ( 4 x 20 LCD 기준)
LINE_2 EQU 0C0h ; 두번째 줄 어드레스 ( " )
LINE_3 EQU 094h ; 세번째 줄 어드레스 ( " )
LINE_4 EQU 0D4h ; 네번째 줄 어드레스 ( " )
;
;-----------------------------------------------------------------------------
; VARIABLES
;-----------------------------------------------------------------------------
; Indirect address space variables
ISEG at 80h
org 0e8h ; temporary forced STACK location
STACK_TOP:
DS 1 ; beginning of hardware stack
;-----------------------------------------------------------------------------
; RESET AND INTERRUPT VECTOR TABLE
;-----------------------------------------------------------------------------
CSEG
org 0000h
ljmp Main ; 프로그램 실행위치로 점프
;-----------------------------------------------------------------------------
; MAIN PROGRAM CODE
;-----------------------------------------------------------------------------
org 0B3h
;-----------------------------------------------------------------------------
; ASCII 스트링 문자 상수 영역
;
str_1: DB 'C8051F000 20MIPS MCU', 00h
str_2: DB '<4-BIT BUS MODE LCD>', 00h
str_4: DB 'www.CYGNAL.com ', 00h
;-----------------------------------------------------------------------------
Main:
mov WDTCN, #0deh ; 워치독 타이머 동작 금지
mov WDTCN, #0adh
;
mov SP, #STACK_TOP ; 스택 포인터 설정
mov XBR2, #40h ; Enable crossbar and weak pull-ups
lcall delay ; 딜레이 타임 1: 15 mS
lcall delay ; (LCD 파워 안정시간)
;-----------------------------------------------------------------------------
; LCD 초기설정
mov A, #00110000b ; 첫번째 Function Set
lcall LCD_CMD ; 4 비트 커맨드 출력
lcall delay ; 딜레이 타임 2: 4.1 mS
mov A, #00110000b ; 두번째 Function Set
lcall LCD_CMD ; 4 비트 커맨드 출력
lcall delay ; 딜레이 타임 3: 100 uS
mov A, #00110000b ; 세번째 Function Set
lcall LCD_CMD ; 4 비트 커맨드 출력
lcall delay ; 딜레이 타임 4:
mov A, #00101000b ; 4 비트 모드 2(4) 라인 LCD
lcall LCD_CMD ; 4 비트 커맨드 출력
lcall delay ; 딜레이 타임 5:
mov A, #00001000b ; Display Off/Cursor Off/Blink Off
clr LCD_RS ; 커맨드 출력 모드
lcall LCD_OUT ; 8 비트 출력
lcall delay ; 딜레이 타임 6:
mov A, #00000001b ; 디스프레이 클리어, 커서를 홈 위치
clr LCD_RS ; 커맨드 출력 모드
lcall LCD_OUT ; 8 비트 출력
lcall delay ; 딜레이 타임 7:
mov A, #00000110b ; 증가 모드, 커서 시프트
clr LCD_RS ; 커맨드 출력 모드
lcall LCD_OUT ; 8 비트 출력
lcall delay ; 딜레이 타임 8:
;-----------------------------------------------------------------------------
mov A, #00001111b ; Set Display On / Cursor On / Blink On
clr LCD_RS
lcall LCD_OUT
mov A, #LINE_3+7 ; 3 번째 줄 어드레스 세트 + 7
clr LCD_RS
lcall LCD_OUT
mov A, #'N' ; 1 개 문자 출력 예
setb LCD_RS
lcall LCD_OUT
mov A, #'E'
setb LCD_RS
lcall LCD_OUT
mov A, #'W'
setb LCD_RS
lcall LCD_OUT
mov A, #'C'
setb LCD_RS
lcall LCD_OUT
mov A, #'E'
setb LCD_RS
lcall LCD_OUT
mov A, #'S'
setb LCD_RS
lcall LCD_OUT
mov A, #'S'
setb LCD_RS
lcall LCD_OUT
mov A, #LINE_1 ; 첫번째 줄 어드레스 세트
clr LCD_RS ; 커맨드 출력 모드
lcall LCD_OUT
mov dptr, #str_1 ; 스트링 1 어드레스
lcall string_out ; 스트링 출력
mov A, #LINE_2 ; 두번째 줄 어드레스 세트
clr LCD_RS ; 커맨드 출력 모드
lcall LCD_OUT
mov dptr, #str_2 ; 스트링 2 어드레스
lcall string_out ; 스트링 출력
mov A, #LINE_4+3 ; 네번째 줄 어드레스 세트
clr LCD_RS ; 커맨드 출력 모드
lcall LCD_OUT
mov dptr, #str_4 ; 스트링 4 어드레스
lcall string_out ; 스트링 출력
sjmp $ ; 프로그램 정지
;-----------------------------------------------------------------------------
; 4 비트 모드로 커맨드 출력
; 입력조건 : A[7:4] <- 상위 4 비트의 커맨드
LCD_CMD:
clr LCD_RS
mov C, ACC.7
mov LCD_D7, C
mov C, ACC.6
mov LCD_D6, C
mov C, ACC.5
mov LCD_D5, C
mov C, ACC.4
mov LCD_D4, C
lcall LCD_EN_pulse
;-----------------------------------------------------------------------------
; 4 비트 모드로 데이터 출력
; 입력조건 : ACC <- 표시할 ASCII 데이터
LCD_OUT:
mov C, ACC.7 ; 상위 니블 출력
mov LCD_D7, C
mov C, ACC.6
mov LCD_D6, C
mov C, ACC.5
mov LCD_D5, C
mov C, ACC.4
mov LCD_D4, C
lcall LCD_EN_pulse
mov C, ACC.3 ; 하위 니블 출력
mov LCD_D7, C
mov C, ACC.2
mov LCD_D6, C
mov C, ACC.1
mov LCD_D5, C
mov C, ACC.0
mov LCD_D4, C
lcall LCD_EN_pulse
ret
;-----------------------------------------------------------------------------
; LCD 의 EN 신호선 펄스 발생
LCD_EN_pulse:
clr LCD_EN
mov r0, #000h
djnz r0, $
setb LCD_EN ; EN 신호를 High 로 만든다.
mov r0, #000h ; 약 300 uS 의 딜레이 (2MHz 내부 클럭)
djnz r0, $
clr LCD_EN
mov r0, #000h
djnz r0, $
ret
;-----------------------------------------------------------------------------
; C8051Fxxx 의 내장 오실레이터 2 MHz 를 사용할 때 약 10 mS 의 딜레이타임
;
delay:
mov r0, #0024h
delay_a:
mov r1, #000h
djnz r1, $
djnz r0, delay_a
ret
;-----------------------------------------------------------------------------
; 스트링 데이터 (문자열 )를 출력
; 스트링의 마지막을 00h 로 정의하는 ASCIIZ 포맷
; 입력조건: DPTR <- 프로그램 메모리의 스트링 스타트 어드레스
string_out:
setb LCD_RS
string_out_a:
mov a, #000h
movc a, @a+dptr
orl a, #000h
jz string_out_r
lcall LCD_OUT
inc dptr
sjmp string_out_a
string_out_r:
ret
;-----------------------------------------------------------------------------
; End of file.
END
회원에게만 댓글 작성 권한이 있습니다.