You are on page 1of 5

C:\Users\thejas\Desktop\Untitled.

asm
;PROGRAM FOR ACIDENT PREVENTION USING EYEBLINK SENSOR
#include <p16f877A.inc>
__CONFIG _HS_OSC&_PWRTE_ON&_CP_OFF&_WDT_OFF&_LVP_OFF
W_TEMP EQU 0X4F ;TEMPERORY REGISTER FOR W DURING INTERRUPT
STATUS_TEMP EQU 0X4E ;TEMPERORY REGISTER FOR STATUS DURING INTERRUPT
PCLATH_TEMP EQU 0X4D ;TEMPERORY REGISTER FOR PCLATH DURING INTERRUPT
LCD_DATA EQU PORTD
LCD_CNTRL EQU PORTC
RS EQU 0
RW EQU 1
EN EQU 2
;PORTB
BUSSER EQU 0
LED1 EQU 2
LED2 EQU 1
;PORTA
EYE_BLINK_SENSOR EQU 0
REVERSE_SENSOR EQU 1
;PORTB
RELAY EQU 1
TEMP_LCD_COM EQU 0X23
TEMP_LCD_DAT EQU 0X24
PRG_ADDR_MSB EQU 0X25
PRG_ADDR_LSB EQU 0X26
PRG_DAT_MSB EQU 0X27
PRG_DAT_LSB EQU 0X28
MSG_CHR_CNTR EQU 0X29
TEMP_1 EQU 0X33
TEMP_2 EQU 0X34
TEMP_3 EQU 0X35
TEMP_4 EQU 0X36
FLAG_BITS EQU 0X3F
ORG 0X0000
;STARTTING OF POGRAM
START:
CALL INIT_PORTS ;PORT INITILISATION
CLRF PORTA ;OFF ALL RELAYS
CALL INIT_LCD ;LCD INITIAILISATION
BCF PORTB,RELAY
;WELCOME MESSAGE
START_DISPLAY:
BANKSEL PORTB
BSF PORTE,LED1
BSF PORTE,LED2
BSF PORTE,BUSSER
BANKSEL EEADR
MOVLW LOW(MSG1)
MOVWF EEADR
MOVLW HIGH(MSG1)
BANKSEL EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X09
MOVWF MSG_CHR_CNTR
MOVLW 0X01
MOVWF TEMP_LCD_COM
CALL LCD_CMD
CALL DELAY_3
CALL STRNG_MSSG
BANKSEL EEADR
MOVLW LOW(MSG2)
MOVWF EEADR
MOVLW HIGH(MSG2)
BANKSEL EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X09
MOVWF MSG_CHR_CNTR
MOVLW 0XC0
MOVWF TEMP_LCD_COM
CALL LCD_CMD
1
C:\Users\thejas\Desktop\Untitled.asm
CALL STRNG_MSSG
CALL DELAY_1
CALL DELAY_1
BCF PORTE,LED1
BCF PORTE,LED2
BCF PORTE,BUSSER
CLRF TEMP_1
;*****************MAIN ROUTINE *****************************
MAIN_LOOP:
BANKSEL PORTE
BCF PORTE,LED1
BCF PORTE,LED2
BCF PORTE,BUSSER
BANKSEL TEMP_LCD_COM
MOVLW 0X01
MOVWF TEMP_LCD_COM ;CLEAR DISPLAY
CALL LCD_CMD
BANKSEL EEADR
MOVLW LOW(MSG3) ;LOAD PROGRAM MEMORY ADDRESS LSB TO BE READ TO EEADR
MOVWF EEADR
MOVLW HIGH(MSG3) ; message "EYE SENSOR:"
BANKSEL EEADRH ;LOAD PROGRAM MEMORY ADDRESS MSB TO BE READ TO EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X06 ;LOAD NO OF BYTES TO BE READ FROM PROGRAM MEMORY
MOVWF MSG_CHR_CNTR
MOVLW 0X01
MOVWF LCD_CMD ;COMMAND FOR FIRST LINE
CALL LCD_CMD
CALL DELAY_2
CALL STRNG_MSSG ;READ PROGRAM MEMORY AND DISPLAY IN LCD
;CHECK EYEBLINK SENSOR
BANKSEL PORTA
BTFSC PORTA,EYE_BLINK_SENSOR
GOTO NO_BLINK
CLRF TEMP_1
BANKSEL EEADR
MOVLW LOW(MSG4) ;LOAD PROGRAM MEMORY ADDRESS LSB TO BE READ TO EEADR
MOVWF EEADR
MOVLW HIGH(MSG4) ;message OK
BANKSEL EEADRH ;LOAD PROGRAM MEMORY ADDRESS MSB TO BE READ TO EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X03 ;LOAD NO OF BYTES TO BE READ FROM PROGRAM MEMORY
MOVWF MSG_CHR_CNTR
CALL STRNG_MSSG ;READ PROGRAM MEMORY AND DISPLAY IN LCD
GOTO CHECK_REVERSE
NO_BLINK:
INCF TEMP_1,F
MOVF TEMP_1,W
SUBLW 0X03
BTFSC STATUS,C
GOTO CHECK_REVERSE
BANKSEL EEADR
MOVLW LOW(MSG5) ;LOAD PROGRAM MEMORY ADDRESS LSB TO BE READ TO EEADR
MOVWF EEADR
MOVLW HIGH(MSG5) ;message "NOT OK"
BANKSEL EEADRH ;LOAD PROGRAM MEMORY ADDRESS MSB TO BE READ TO EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X04 ;LOAD NO OF BYTES TO BE READ FROM PROGRAM MEMORY
MOVWF MSG_CHR_CNTR
CALL STRNG_MSSG ;READ PROGRAM MEMORY AND DISPLAY IN LCD
BSF PORTB,RELAY
BSF PORTE,BUSSER
BSF PORTE,LED1
CHECK_REVERSE:
BANKSEL EEADR
MOVLW LOW(MSG6) ;LOAD PROGRAM MEMORY ADDRESS LSB TO BE READ TO EEADR
MOVWF EEADR
MOVLW HIGH(MSG6)
BANKSEL EEADRH ;LOAD PROGRAM MEMORY ADDRESS MSB TO BE READ TO EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X05 ;LOAD NO OF BYTES TO BE READ FROM PROGRAM MEMORY
2
C:\Users\thejas\Desktop\Untitled.asm
MOVWF MSG_CHR_CNTR
MOVLW 0XC0
MOVWF TEMP_LCD_COM ;COMMAND FOR FIRST LINE
CALL LCD_CMD
CALL DELAY_2
CALL STRNG_MSSG ;READ PROGRAM MEMORY AND DISPLAY IN LCD
;CHECK REVERSE SENSOR
BTFSC PORTA,REVERSE_SENSOR
GOTO NO_REVERSE_BLOCK
BANKSEL EEADR
MOVLW LOW(MSG7) ;LOAD PROGRAM MEMORY ADDRESS LSB TO BE READ TO EEADR
MOVWF EEADR
MOVLW HIGH(MSG7)
BANKSEL EEADRH ;LOAD PROGRAM MEMORY ADDRESS MSB TO BE READ TO EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X04 ;LOAD NO OF BYTES TO BE READ FROM PROGRAM MEMORY
MOVWF MSG_CHR_CNTR
CALL STRNG_MSSG ;READ PROGRAM MEMORY AND DISPLAY IN LCD
BSF PORTE,LED2
BSF PORTE,BUSSER
CALL DELAY_1
GOTO MAIN_LOOP
NO_REVERSE_BLOCK:
BANKSEL EEADR
MOVLW LOW(MSG8) ;LOAD PROGRAM MEMORY ADDRESS LSB TO BE READ TO EEADR
MOVWF EEADR
MOVLW HIGH(MSG8)
BANKSEL EEADRH ;LOAD PROGRAM MEMORY ADDRESS MSB TO BE READ TO EEADRH
MOVWF EEADRH
BANKSEL MSG_CHR_CNTR
MOVLW 0X05 ;LOAD NO OF BYTES TO BE READ FROM PROGRAM MEMORY
MOVWF MSG_CHR_CNTR
CALL STRNG_MSSG ;READ PROGRAM MEMORY AND DISPLAY IN LCD
CALL DELAY_1
GOTO MAIN_LOOP
;INITIALISATION OF PORTS
INIT_PORTS:
BANKSEL ADCON1 ;
MOVLW 0X07
MOVWF ADCON1
BANKSEL TRISA ;
MOVLW 0XFF
MOVWF TRISA
BANKSEL TRISB ;RB0 IS INPUT
MOVLW 0X00 ;
MOVWF TRISB
BANKSEL TRISC ;RC0 TO RC2 IS OUTPUT FOR LCD
MOVLW 0XF0
MOVWF TRISC
BANKSEL TRISD
MOVLW 0X00 ;PORTD AS OUTPUT
MOVWF TRISD ;LCD DATA
BANKSEL TRISE ;PORTE AS OUTPUT
MOVLW 0XE0 ;RE0 FOR KEY
ANDWF TRISE,F ;RE1, RE2 AS LED OUTPUT
MOVLW 0X00
IORWF TRISE,F
MOVLW 0X00
BANKSEL PORTA
MOVWF PORTA
MOVLW 0XFF
BANKSEL PORTB
MOVWF PORTB
BANKSEL PORTC
MOVLW 0XF0
MOVWF PORTC
BANKSEL PORTD
MOVLW 0X00
MOVWF PORTD
BANKSEL PORTD
MOVLW 0X00
MOVWF PORTE
RETURN
;INITIALISATION OF LCD MODULE
3
C:\Users\thejas\Desktop\Untitled.asm
INIT_LCD:
BANKSEL TEMP_LCD_COM
MOVLW 0X3C ;lcd declaration as 8bit/char,2rows,5x10dots/char
MOVWF TEMP_LCD_COM
CALL LCD_CMD ;strobe command to display
MOVLW 0X0C ;screen ON and cursor OFF on,no blink
MOVWF TEMP_LCD_COM
CALL LCD_CMD ;strobe command to display
MOVLW 0X06 ;shift cursor right
MOVWF TEMP_LCD_COM
CALL LCD_CMD ;strobe command to display
MOVLW 0X01 ;clear memory and home cursor
MOVWF TEMP_LCD_COM
CALL LCD_CMD ;strobe command to display
CALL DELAY_1
MOVLW 0X81 ;move cursor space to 3,line1
MOVWF TEMP_LCD_COM
CALL LCD_CMD ;strobe command to display
RETURN
;COMMAND TO LCD
LCD_CMD:
CALL DELAY_3
BANKSEL PORTC
MOVF TEMP_LCD_COM,W ;DATA FROM RAM TO LCD DATA PORT
MOVWF LCD_DATA
BCF LCD_CNTRL,RS ;RS LOW COMMAND REGISTER SELECTED
BCF LCD_CNTRL,RW ;RW LOW WRITE OPEARTION SELECTED
BSF LCD_CNTRL,EN ;ENABLE LCD
NOP
NOP
NOP ;WAIT FOR DATA READING BY LCD
BCF LCD_CNTRL,EN ;DISABLE LCD
RETURN
; DATA TO LCD MODULE
LCD_DIS:
BANKSEL LCD_DATA
MOVWF LCD_DATA
CALL DELAY_3
BSF LCD_CNTRL,RS ;RS HIGH DATA REGISTER SELECTED
BCF LCD_CNTRL,RW ;RW LOW WRITE OPEARTION SELECTED
BSF LCD_CNTRL,EN ;ENABLE LCD
NOP ;WAIT FOR DATA READING BY LCD
NOP
NOP
NOP
BCF LCD_CNTRL,EN ;DISABLE LCD
RETURN
;READ PROGRAM MEMORY AND GIVE STRING DATA TO LCD
STRNG_MSSG:
BANKSEL EECON1
BSF EECON1,EEPGD ;SELECT PROGRAM MEMORY
BSF EECON1,RD ;START READ OPERATION
NOP
NOP ;WAIT FOR READ CYCLE
BANKSEL EEDATA
MOVF EEDATA,W ;STORE READ DATA (LSB)
BANKSEL PRG_DAT_LSB
MOVWF PRG_DAT_LSB
BANKSEL EEDATH
MOVF EEDATH,W
BANKSEL PRG_DAT_MSB
MOVWF PRG_DAT_MSB ;STORE RAED DATA(MSB)
DECFSZ MSG_CHR_CNTR,F
GOTO LCD_DISL
RETURN
;********************* ROUTINE FOR REALIGN OF 14 BIT PACKED BCD TO NORMAL 16 BIT UNPACKED
BCD**************
LCD_DISL:
BCF STATUS,C
RLF PRG_DAT_LSB,F
RLF PRG_DAT_MSB,F
BCF STATUS,C
RRF PRG_DAT_LSB,F
MOVF PRG_DAT_MSB,W
CALL LCD_DIS
4
C:\Users\thejas\Desktop\Untitled.asm
MOVF PRG_DAT_LSB,W
CALL LCD_DIS
BANKSEL EEADR
INCF EEADR,F
GOTO STRNG_MSSG
;********************DELAY ROUTINES****************************
RETURN
;*********************LOOK UP TABLE & PRINTING DETAILS*************************************
ORG 0X0500
ASCII_NUM:
ADDWF PCL,F
dt "01234567890:"
MSG1:
da " EYEBLINK BASED "
MSG2:
da "ACC. PREVENTION "
MSG3:
da "EYE SENSOR:"
MSG4:
da " OK "
MSG5:
da "NOT OK"
MSG6:
da "REVERSE: "
MSG7:
da " BLOCK "
MSG8:
da "NO BLOCK"
END
5

You might also like