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