0% found this document useful (0 votes)
8 views19 pages

LCD Code and Simulation

This document contains assembly code for a PIC18F452 microcontroller to control an LCD display for a washing machine interface. It initializes the LCD, checks for user input from switches, and displays messages based on the state of the switches. The program includes subroutines for writing commands and data to the LCD, as well as for implementing delays.

Uploaded by

ibrahimabbas8899
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)
8 views19 pages

LCD Code and Simulation

This document contains assembly code for a PIC18F452 microcontroller to control an LCD display for a washing machine interface. It initializes the LCD, checks for user input from switches, and displays messages based on the state of the switches. The program includes subroutines for writing commands and data to the LCD, as well as for implementing delays.

Uploaded by

ibrahimabbas8899
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

LIST P=PIC18F452,F=INHX32,N=0,ST=OFF,R=HEX ; List directive specifying the details of the output

file format

#include <[Link]> ; Include the PIC18F452 header file

config
OSC=HS,OSCS=OFF,WDT=OFF,BORV=45,PWRT=ON,BOR=ON,DEBUG=OFF,LVP=OFF,STVR=OFF ;
Configuration settings

ORG 0X2A ; Set the program counter origin to 0x2A

; Define constants for LCD interfacing

LCD_DATA EQU PORTD ; Define LCD data port

LCD_CTRL EQU PORTB ; Define LCD control port

RS EQU RB0 ; Define Register Select pin

RW EQU RB1 ; Define Read/Write pin

EN EQU RB2 ; Define Enable pin

CLRF TRISD ; Clear TRISD to configure PORTD as output

CLRF TRISB ; Clear TRISB to configure PORTB as output

BCF LCD_CTRL,EN ; Clear Enable pin initially

; Initialize LCD

MOVLW 38H ; Function Set: 8-bit, 2 lines, 5x7 font

CALL COMNWRT

CALL LDELAY

MOVLW 0EH ; Display Control: Display ON, Cursor OFF, Blink OFF

CALL COMNWRT

CALL DELAY

MOVLW 01H ; Clear Display

CALL COMNWRT
CALL DELAY

MOVLW 06H ; Entry Mode Set: Increment cursor, no display shift

CALL COMNWRT

CALL DELAY

; Set cursor to the beginning of the second line

MOVLW 80H ; Set DDRAM address to 0x80 (second line)

CALL COMNWRT

CALL DELAY

; Display a message on the LCD

MOVLW A'I' ; ASCII character 'I'

CALL DATAWRT

CALL DELAY

MOVLW A'B' ; ASCII character 'B'

CALL DATAWRT

CALL DELAY

MOVLW A'R' ; ASCII character 'R'

CALL DATAWRT

CALL DELAY

MOVLW A'A' ; ASCII character 'A'

CALL DATAWRT

CALL DELAY

MOVLW A'H' ; ASCII character 'H'

CALL DATAWRT

CALL DELAY

MOVLW A'I' ; ASCII character 'I'

CALL DATAWRT

CALL DELAY

MOVLW A'M' ; ASCII character 'M'


CALL DATAWRT

CALL DELAY

MOVLW D'32' ; ASCII character ' ' (space)

CALL DATAWRT

CALL DELAY

MOVLW A'A' ; ASCII character 'A'

CALL DATAWRT

CALL DELAY

MOVLW A'B' ; ASCII character 'B'

CALL DATAWRT

CALL DELAY

MOVLW A'B' ; ASCII character 'B'

CALL DATAWRT

CALL DELAY

MOVLW A'A' ; ASCII character 'A'

CALL DATAWRT

CALL DELAY

MOVLW A'S' ; ASCII character 'S'

CALL DATAWRT

CALL DELAY

MOVLW D'32' ; ASCII character ' ' (space)

CALL DELAY

; Set DDRAM address to 0xC0 (start of the second line)

MOVLW 0C0H

CALL COMNWRT

CALL DELAY

; Display additional characters on the second line

MOVLW A'F'

CALL DATAWRT
CALL DELAY

MOVLW A'A'

CALL DATAWRT

CALL DELAY

MOVLW A'2'

CALL DATAWRT

CALL DELAY

MOVLW A'0'

CALL DATAWRT

CALL DELAY

MOVLW A'-'

CALL DATAWRT

CALL DELAY

MOVLW A'E'

CALL DATAWRT

CALL DELAY

MOVLW A'P'

CALL DATAWRT

CALL DELAY

MOVLW A'E'

CALL DATAWRT

CALL DELAY

MOVLW A'-'

CALL DATAWRT

CALL DELAY

MOVLW A'0'

CALL DATAWRT

CALL DELAY

MOVLW A'2'

CALL DATAWRT

CALL DELAY
MOVLW A'9'

CALL DATAWRT

CALL DELAY

BRA $ ; Infinite loop

; Subroutine to write a command to the LCD

COMNWRT

MOVWF LCD_DATA ; Move the command to the data port

BCF LCD_CTRL,RS ; Set RS low for command

BCF LCD_CTRL,RW ; Set RW low for write

BSF LCD_CTRL,EN ; Set EN high to enable

CALL SDELAY ; Delay

BCF LCD_CTRL,EN ; Clear EN to disable

RETURN

; Subroutine to write data to the LCD

DATAWRT

MOVWF LCD_DATA ; Move the data to the data port

BSF LCD_CTRL,RS ; Set RS high for data

BCF LCD_CTRL,RW ; Set RW low for write

BSF LCD_CTRL,EN ; Set EN high to enable

CALL SDELAY ; Delay

BCF LCD_CTRL,EN ; Clear EN to disable

RETURN

; Subroutine for a short delay

SDELAY

MOVLW B'01001000' ; Load T0CON with the appropriate values

MOVWF T0CON

MOVLW 0FEH ; Load TMR0L with the appropriate value


MOVWF TMR0L

BCF INTCON,TMR0IF ; Clear TMR0 interrupt flag

BSF T0CON,7 ; Start the timer

ABC1

BTFSS INTCON,TMR0IF ; Wait for TMR0 overflow

BRA ABC1

BCF T0CON,7 ; Stop the timer

RETURN

; Subroutine for a longer delay

DELAY

MOVLW B'00001000' ; Load T0CON with the appropriate values

MOVWF T0CON

MOVLW 0D8H ; Load TMR0H with the appropriate value

MOVWF TMR0H

MOVLW 0F0H ; Load TMR0L with the appropriate value

MOVWF TMR0L

BCF INTCON,TMR0IF ; Clear TMR0 interrupt flag

BSF T0CON,7 ; Start the timer

ABC2

BTFSS INTCON,TMR0IF ; Wait for TMR0 overflow

BRA ABC2

BCF T0CON,7 ; Stop the timer

RETURN

; Subroutine for a long delay

LDELAY

MOVLW B'00001000' ; Load T0CON with the appropriate values

MOVWF T0CON

MOVLW 0B1H ; Load TMR0H with the appropriate value

MOVWF TMR0H
MOVLW 0E0H ; Load TMR0L with the appropriate value

MOVWF TMR0L

BCF INTCON,TMR0IF ; Clear TMR0 interrupt flag

BSF T0CON,7 ; Start the timer

ABC3

BTFSS INTCON,TMR0IF ; Wait for TMR0 overflow

BRA ABC3

BCF T0CON,7 ; Stop the timer

RETURN

END ; End of the program

ONLY “washing machine” is displayed!

LIST P=PIC18F452, F=INHX32, N=0, ST=OFF, R=HEX

#include <[Link]>
; Configuration settings

config OSC=HS, OSCS=OFF, WDT=OFF, BOR=ON, PWRT=ON, LVP=OFF

; Define constants

LCD_DATA EQU PORTD

LCD_CTRL EQU PORTB

RS EQU RB0

RW EQU RB1

EN EQU RB2

POWER_SWITCH EQU RB3

START_SWITCH EQU RB4

MODE_SWITCH EQU RB5

; Reset Vector

ORG 0x00

GOTO Start

; Initialization

Start:

CLRF TRISD ; Set PORTD as output for LCD data

CLRF TRISB ; Set PORTB as output for LCD control and input for switches

CALL InitLCD

MAIN_LOOP:

CALL CheckSwitches

GOTO MAIN_LOOP

; Subroutine to initialize LCD

InitLCD:
CALL Delay

MOVLW B'00111000' ; 8-bit, 2-line, 5x7 font

CALL CommandWrite

MOVLW B'00001100' ; Display on, cursor off, blink off

CALL CommandWrite

MOVLW B'00000001' ; Clear display

CALL CommandWrite

MOVLW B'00000110' ; Entry mode set: Increment

CALL CommandWrite

RETURN

; Subroutine to write a command to LCD

CommandWrite:

MOVWF LCD_DATA

BCF LCD_CTRL, RS

BCF LCD_CTRL, RW

BSF LCD_CTRL, EN

CALL SDELAY

BCF LCD_CTRL, EN

RETURN

; Subroutine to check switches

CheckSwitches:

BTFSS PORTB, POWER_SWITCH ; Power switch

GOTO NoPowerSwitch

MOVLW 0x80 ; Move to the beginning of the first line

CALL CommandWrite

MOVLW 'W'

CALL DataWrite

MOVLW 'A'

CALL DataWrite
MOVLW 'S'

CALL DataWrite

MOVLW 'H'

CALL DataWrite

MOVLW 'I'

CALL DataWrite

MOVLW 'N'

CALL DataWrite

MOVLW 'G'

CALL DataWrite

MOVLW ' '

CALL DataWrite

MOVLW 'M'

CALL DataWrite

MOVLW 'A'

CALL DataWrite

MOVLW 'C'

CALL DataWrite

MOVLW 'H'

CALL DataWrite

MOVLW 'I'

CALL DataWrite

MOVLW 'N'

CALL DataWrite

MOVLW 'E'

CALL DataWrite

MOVLW ' '

CALL DataWrite

MOVLW 'I'

CALL DataWrite

MOVLW 'S'
CALL DataWrite

MOVLW ' '

CALL DataWrite

MOVLW 'T'

CALL DataWrite

MOVLW 'U'

CALL DataWrite

MOVLW 'R'

CALL DataWrite

MOVLW 'N'

CALL DataWrite

MOVLW 'E'

CALL DataWrite

MOVLW 'D'

CALL DataWrite

MOVLW 'O'

CALL DataWrite

MOVLW 'N'

CALL DataWrite

MOVLW 'N'

CALL DataWrite

GOTO SwitchProcessed

NoPowerSwitch:

SwitchProcessed:

RETURN

; Subroutine to write data to LCD

DataWrite:

MOVWF LCD_DATA
BSF LCD_CTRL, RS

BCF LCD_CTRL, RW

BSF LCD_CTRL, EN

CALL SDELAY

BCF LCD_CTRL, EN

RETURN

; Subroutine for delay

Delay:

MOVLW B'00001000'

MOVWF T0CON

MOVLW 0xD8

MOVWF TMR0H

MOVLW 0xF0

MOVWF TMR0L

BCF INTCON, TMR0IF

BSF T0CON, 7

DELAY_LOOP:

BTFSS INTCON, TMR0IF

GOTO DELAY_LOOP

BCF T0CON, 7

RETURN

; Subroutine for short delay

SDELAY:

MOVLW B'00000100'

MOVWF T0CON

MOVLW 0xFF

MOVWF TMR0L

BCF INTCON, TMR0IF

BSF T0CON, 7
SDELAY_LOOP:

BTFSS INTCON, TMR0IF

GOTO SDELAY_LOOP

BCF T0CON, 7

RETURN

END

Washing machine,water and spinner :

LIST P=PIC18F452, F=INHX32, N=0, ST=OFF, R=HEX

#include <[Link]>

; Configuration settings

config OSC=HS, OSCS=OFF, WDT=OFF, BOR=ON, PWRT=ON, LVP=OFF

; Define constants

LCD_DATA EQU PORTD

LCD_CTRL EQU PORTB

RS EQU RB0

RW EQU RB1

EN EQU RB2

POWER_SWITCH EQU RB3

START_SWITCH EQU RB4

MODE_SWITCH EQU RB5

; Reset Vector

ORG 0x00
GOTO Start

; Initialization

Start:

CLRF TRISD ; Set PORTD as output for LCD data

CLRF TRISB ; Set PORTB as output for LCD control and input for switches

CALL InitLCD

MAIN_LOOP:

CALL CheckSwitches

GOTO MAIN_LOOP

; Subroutine to initialize LCD

InitLCD:

CALL Delay

MOVLW B'00111000' ; 8-bit, 2-line, 5x7 font

CALL CommandWrite

MOVLW B'00001100' ; Display on, cursor off, blink off

CALL CommandWrite

MOVLW B'00000001' ; Clear display

CALL CommandWrite

MOVLW B'00000110' ; Entry mode set: Increment

CALL CommandWrite

RETURN

; Subroutine to write a command to LCD

CommandWrite:

MOVWF LCD_DATA

BCF LCD_CTRL, RS

BCF LCD_CTRL, RW
BSF LCD_CTRL, EN

CALL SDELAY

BCF LCD_CTRL, EN

RETURN

; Subroutine to check switches

CheckSwitches:

BTFSS PORTB, POWER_SWITCH ; Power switch

GOTO NoPowerSwitch

; Display "Washing Machine"

MOVLW 0x80 ; Move to the beginning of the first line

CALL CommandWrite

MOVLW 'W'

CALL DataWrite

MOVLW 'a'

CALL DataWrite

MOVLW 's'

CALL DataWrite

MOVLW 'h'

CALL DataWrite

MOVLW 'i'

CALL DataWrite

MOVLW 'n'

CALL DataWrite

MOVLW 'g'

CALL DataWrite

MOVLW ' '

CALL DataWrite

MOVLW 'M'

CALL DataWrite

MOVLW 'a'
CALL DataWrite

MOVLW 'c'

CALL DataWrite

MOVLW 'h'

CALL DataWrite

MOVLW 'i'

CALL DataWrite

MOVLW 'n'

CALL DataWrite

MOVLW 'e'

CALL DataWrite

GOTO SwitchProcessed

NoPowerSwitch:

BTFSS PORTB, START_SWITCH ; Start switch

GOTO NoStartSwitch

; Display "Water Started"

MOVLW 0xC0 ; Move to the beginning of the second line

CALL CommandWrite

MOVLW 'W'

CALL DataWrite

MOVLW 'a'

CALL DataWrite

MOVLW 't'

CALL DataWrite

MOVLW 'e'

CALL DataWrite

MOVLW 'r'

CALL DataWrite

MOVLW ' '

CALL DataWrite
MOVLW 'S'

CALL DataWrite

MOVLW 't'

CALL DataWrite

MOVLW 'a'

CALL DataWrite

MOVLW 'r'

CALL DataWrite

MOVLW 't'

CALL DataWrite

MOVLW 'e'

CALL DataWrite

MOVLW 'd'

CALL DataWrite

GOTO SwitchProcessed

NoStartSwitch:

BTFSS PORTB, MODE_SWITCH ; Mode switch

GOTO NoModeSwitch

; Display "Spinner"

MOVLW 0xC0 ; Move to the beginning of the second line

CALL CommandWrite

MOVLW 'S'

CALL DataWrite

MOVLW 'p'

CALL DataWrite

MOVLW 'i'

CALL DataWrite

MOVLW 'n'

CALL DataWrite

MOVLW 'n'
CALL DataWrite

MOVLW 'e'

CALL DataWrite

MOVLW 'r'

CALL DataWrite

GOTO SwitchProcessed

NoModeSwitch:

; If none of the switches are pressed, clear the display

MOVLW 0x01 ; Clear display

CALL CommandWrite

SwitchProcessed:

RETURN

; Subroutine to write data to LCD

DataWrite:

MOVWF LCD_DATA

BSF LCD_CTRL, RS

BCF LCD_CTRL, RW

BSF LCD_CTRL, EN

CALL SDELAY

BCF LCD_CTRL, EN

RETURN

; Subroutine for delay

Delay:

MOVLW B'00001000'

MOVWF T0CON

MOVLW 0xD8

MOVWF TMR0H
MOVLW 0xF0

MOVWF TMR0L

BCF INTCON, TMR0IF

BSF T0CON, 7

DELAY_LOOP:

BTFSS INTCON, TMR0IF

GOTO DELAY_LOOP

BCF T0CON, 7

RETURN

; Subroutine for short delay

SDELAY:

MOVLW B'00000100'

MOVWF T0CON

MOVLW 0xFF

MOVWF TMR0L

BCF INTCON, TMR0IF

BSF T0CON, 7

SDELAY_LOOP:

BTFSS INTCON, TMR0IF

GOTO SDELAY_LOOP

BCF T0CON, 7

RETURN

END

You might also like