0% found this document useful (0 votes)
13 views6 pages

Code PIC

This document contains code for controlling an LCD display from a PIC microcontroller. It defines constants for the LCD, sets up ports and registers, clears the display, and includes functions to write characters, shift the display, and toggle the enable pin to transfer data to the LCD. The main loop reads characters from EEPROM and writes them to the display, shifting the characters across when the end is reached.

Uploaded by

songbao527
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views6 pages

Code PIC

This document contains code for controlling an LCD display from a PIC microcontroller. It defines constants for the LCD, sets up ports and registers, clears the display, and includes functions to write characters, shift the display, and toggle the enable pin to transfer data to the LCD. The main loop reads characters from EEPROM and writes them to the display, shifting the characters across when the end is reached.

Uploaded by

songbao527
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 6

#include "p16f84a.

inc" ; PIC16F84A definitions for


MPASM assembler

CHAR EQU 0x0C ; CHAR TO


DISPLAY ON LCD
CHAR_COUNT EQU 0x0D ; COUNTS
THE CHARACTERS ON THE MESSAGE
ADDR_INDEX EQU 0x0E ; STARTING
ADDRESS IN EEPROM
TEMP EQU 0x10
CONSTANT START_ADDR = 0x00 ;
STARTING ADDRESS IN EEPROM
CONSTANT LCD_CAPACITY = 0x50 ;
CAPACITY OF LCD 4x20 = 80 = 50H

; will prevent assembler's warning message 302


errorlevel -302

BSF STATUS, RP0 ; BANK 1


MOVLW 0x80 ; DISABLE WEAK PULLUP
RESISTORS
MOVWF OPTION_REG
MOVLW 0x00 ; SET PORTA AS OUTPUTS
MOVWF TRISA
MOVLW 0x00 ; SET PORT B AS OUTPUTS
MOVWF TRISB
BCF STATUS, RP0 ; BANK 0
MOVLW 0x00 ; SET CHARACTER COUNT TO
0
MOVWF CHAR_COUNT

; SEND INSTRUCTIONS CLEAR DISPLAY AND TURN


CURSOR OFF TO THE LCD
CALL CLEAR_DISPLAY
CALL ENAB_DISPLAY_CURSOR

MAIN
MOVLW START_ADDR ; SET THE STARTING
ADDRESS FOR EEPROM
MOVWF ADDR_INDEX

READ_CHAR
MOVF ADDR_INDEX,0 ; STARTING EEPROM
ADDRESS
MOVWF EEADR
BSF STATUS,RP0 ; SWITCH TO BANK 1
BSF EECON1,RD
BCF STATUS,RP0 ; SWITCH TO BANK 0

MOVF EEDATA,0
MOVWF CHAR ; LOAD THE CHAR THAT
WAS READ FROM EEPROM TO W
CALL WRITE_CHAR ; WRITE THE CHAR TO
DISPLAY

INCF ADDR_INDEX,1
INCF CHAR_COUNT,1

SUBLW 0x00 ; DETECT IF THE CHAR = 00H


IF SO THEN EXIT LOOP
BTFSS STATUS,2 ; EXIT IF ZERO BIT IS SET
GOTO READ_CHAR

; START SHIFTING THE CHARACTERS


SHIFTING
MOVLW LCD_CAPACITY ; TEMP = CHAR_COUNT -
LCD_CAPACITY
SUBWF CHAR_COUNT,0
MOVWF TEMP
COMF TEMP,1 ; TAKE THE
COMPLEMENT OF THE NEGATIVE VALUE
MOVLW 0x02 ; ADD OFFSET
ADDWF TEMP,1

SHIFTRIGHT
MOVLW 0x1C ; SHIFT RIGHT
INSTRUCTION TO LCD
CALL MOVE_CURSOR_SHIFT_DISPLAY
DECFSZ TEMP,1
GOTO SHIFTRIGHT

MOVLW LCD_CAPACITY ; TEMP = CHAR_COUNT -


LCD_CAPACITY
SUBWF CHAR_COUNT,0
MOVWF TEMP
COMF TEMP,1 ; TAKE THE
COMPLEMENT OF THE NEGATIVE VALUE
MOVLW 0x02 ; ADD OFFSET
ADDWF TEMP,1

SHIFTLEFT
MOVLW 0x18 ; SHIFT LEFT
INSTRUCTION TO LCD
CALL MOVE_CURSOR_SHIFT_DISPLAY
DECFSZ TEMP,1
GOTO SHIFTLEFT
GOTO SHIFTING

; FUNCTIONS
CLEAR_DISPLAY
MOVLW 0x01
MOVWF PORTB
BCF PORTA,1 ; R/S = 0 R/W = 0
BCF PORTA,0
CALL TOGGLE
RETURN

ENAB_DISPLAY_CURSOR
MOVLW 0x0D
MOVWF PORTB
BCF PORTA,1 ; R/S = 0 R/W = 0
BCF PORTA,0
CALL TOGGLE
RETURN
MOVE_CURSOR_SHIFT_DISPLAY
MOVWF PORTB ; THE VALUE PASSED IN W IS
SET TO PORTB
BCF PORTA,1 ; R/S = 0 R/W = 0
BCF PORTA,0
CALL TOGGLE
RETURN

WRITE_CHAR
MOVF CHAR,0 ; MOVE CHAR TO PORTB
MOVWF PORTB
BSF PORTA,1 ; R/S = 1 R/W = 0
BCF PORTA,0
CALL TOGGLE
RETURN

TOGGLE
BSF PORTA,2 ; SET ENABLE BIT
BCF PORTA,2 ; CLEAR ENABLE BIT
RETURN

END

You might also like