You are on page 1of 17

;* FILENAME: GasfireG.

asm

;* DISPLAY: 16X2 LCD 4-BIT OPERATION

;* PROJECT: Gas and fire sensing and inform by SMS through GSM modem

$MOD51

; ***LCD CONTROL***

LCD_DATA EQU 080H

LCD_RS EQU 080H ; P0.0 LCD REGISTER SELECT LINE

LCD_RW EQU 081H ; P0.1 LCD READ / WRITE LINE

LCD_E EQU 082H ; P0.2 LCD ENABLE LINE

LCD_DB4 EQU 084H ; P0.4 HIGH NIBBLE OF PORT 1 IS USED FOR DATA

LCD_DB5 EQU 085H ; P0.5 HIGH NIBBLE OF PORT 1 IS USED FOR DATA

LCD_DB6 EQU 086H ; P0.6 HIGH NIBBLE OF PORT 1 IS USED FOR DATA

LCD_DB7 EQU 087H ; P0.7 HIGH NIBBLE OF PORT 1 IS USED FOR DATA

; ***SYSTEM INSTRUCTIONS***

CONFIG EQU 28H ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD

ENTRYMODE EQU 6 ; INCREMENT CURSOR DON'T SHIFT DISPLAY

; ***CURSOR CONTROL INSTRUCTIONS***

OFFCUR EQU 0CH

BLINKCUR EQU 0DH

; ***DISPLAY CONTROL INSTRUCTIONS***

CLRDSP EQU 01H

ONDSP EQU 0EH

; Input Assign.

gas_sen BIT 0b5H ; p3.4 - gas sensor i/p

fire_sen bit 0b4h ; P3.5 - fire sensing i/p

load bit 0a0h

LED_IND BIT 0a6h ; p2.6 - LED indication


BZ_ON BIT 0a7h ; P2.7 - buzzer

org 0000h

ajmp start

org 0023h

srt0: jnb ri,srt0

mov a,sbuf ; read data received in serially

mov r3,a

MOV A,r3

mov r4,a

LCALL WRLCDDATA

no_start:

setb scon.4

setb ie.7

reti

; **********************************************************

; RESET GOES HERE TO START PROGRAM

; **********************************************************

START: MOV SP,#55H ; POSITION STACK ABOVE BUFFER

mov p2,#00h ; clear o/p ports

mov tmod,#20h ; timer 1 sel, mode 2 (auto reload for serail baud rate & timer0-mode1

mov scon,#50h ; make serial mode 1 and enable serail data tx & rx

mov th1,#0FDh ; baud rate 9600 @ 11.0592Mhz

lcall bz ; buzzer on for startup

LCALL RESETLCD4

LCALL INITLCD4

MOV A,#1
MOV B,#0

LCALL PLACECUR4

LCALL PRTLCD4

DB 'Gas & Fire sense',0

MOV A,#2

MOV B,#0

LCALL PLACECUR4

LCALL PRTLCD4

DB '- INTERFACE GSM-',0

setb load

LCALL DLY2S

mov ie,#90h ; timer 1, timer 0, int 0 and global enable

setb tr1 ; timer 1 for serial baud rate

srt: lcall fire_chk

lcall gas_chk

lcall BIG_DELAY

cpl led_ind

ajmp srt

fire_chk:

jb fire_Sen,out_fire ; cheking for FIRE sense

lcall bz ; If found, indicate by buzz 2 beep

lcall disp_fire

lcall bz

clr load

setb ind_fire

lcall gsm_text ; set text mode for SMS

lcall dly5
lcall bz1

lcall gsm_firephone_no ; send phone no to Modem

lcall dly5

lcall bz

lcall gsm_fire_sms ; Send message "Fire accident"

lcall dly5

lcall bz

lcall bz

clr ind_fire

out_fire: ret

gas_chk:

jb gas_Sen,out_gas ; cheking for FIRE sense

lcall bz ; If found, indicate by buzz 2 beep

clr load

lcall disp_gasleak

lcall bz

setb ind_fire

lcall gsm_text ; set text mode for SMS

lcall dly5

lcall bz1

lcall gsm_gasphone_no ; send phone no to Modem

lcall dly5

lcall bz

lcall gsm_gas_sms ; Send message "Gas leak found"

lcall dly5

lcall bz

lcall bz

clr ind_gas

out_gas: ret
disp_gasleak:

MOV A,#1

MOV B,#0

LCALL PLACECUR4

LCALL PRTLCD4

DB '- Gas leak -',0

ret

disp_fire:

MOV A,#1

MOV B,#0

LCALL PLACECUR4

LCALL PRTLCD4

DB '- Fire Occured -',0

ret

gsm_text:

clr LED_IND

MOV A,#2 ; LINE #2

MOV B,#0 ; COLUMN #14

LCALL PLACECUR4

mov dptr,#0600h ; db 'AT+CMGF=1,0;'0dh

mcs1: clr a

movc a,@a+dptr

mov sbuf,a

here1: jnb ti,here1

clr ti

mov r4,a

LCALL WRLCDDATA
inc dptr

mov a,dpl

cjne a,#12h,mcs1

clr LED_IND

ret

gsm_gasphone_no:

clr LED_IND

MOV A,#2 ; LINE #2

MOV B,#0 ; COLUMN #14

LCALL PLACECUR4

mov dptr,#0610h ; gas phone no.

mcs2: clr a

movc a,@a+dptr

mov sbuf,a

here2: jnb ti,here2

clr ti

mov r4,a

LCALL WRLCDDATA

inc dptr

mov a,dpl

cjne a,#2fh,mcs2

clr LED_IND

ret

gsm_gas_sms:

clr LED_IND

MOV A,#2 ; LINE #2

MOV B,#0 ; COLUMN #14

LCALL PLACECUR4
mov dptr,#0630h ; 'Gas Leak Found'

mcs3: clr a

movc a,@a+dptr

mov sbuf,a

here3: jnb ti,here3

clr ti

mov r4,a

LCALL WRLCDDATA

inc dptr

mov a,dpl

cjne a,#55h,mcs3

clr LED_IND

ret

gsm_firephone_no:

clr LED_IND

MOV A,#2 ; LINE #2

MOV B,#0 ; COLUMN #14

LCALL PLACECUR4

mov dptr,#0660h ; fire phone no

mcs4: clr a

movc a,@a+dptr

mov sbuf,a

here4: jnb ti,here4

clr ti

mov r4,a

LCALL WRLCDDATA

inc dptr

mov a,dpl

cjne a,#7fh,mcs4
clr LED_IND

ret

gsm_fire_sms:

clr LED_IND

MOV A,#2 ; LINE #2

MOV B,#0 ; COLUMN #14

LCALL PLACECUR4

mov dptr,#0680h ; 'Fire Accident'

mcs5: clr a

movc a,@a+dptr

mov sbuf,a

here5: jnb ti,here5

clr ti

mov r4,a

LCALL WRLCDDATA

inc dptr

mov a,dpl

cjne a,#0a5h,mcs5

clr LED_IND

ret

bz: setb BZ_ON ; buzzer on long period

lcall BIG_DELAY

clr BZ_ON ; buzzer off

ret

bz1: setb BZ_ON ; buzzer on short period

lcall dly1

clr BZ_ON ; buzzer off

ret
BIG_DELAY:

MOV R2,#0FFH

X1B: MOV R5,#0FFH

X2B: DJNZ R5,X2B

DJNZ R2,X1B

RET

dly1: MOV R2,#1fH

y1B: MOV R5,#0FFH

y2B: DJNZ R5,y2B

DJNZ R2,y1B

RET

dly1s: lcall BIG_DELAY

lcall BIG_DELAY

lcall BIG_DELAY

ret

dly2: lcall BIG_DELAY

lcall BIG_DELAY

lcall BIG_DELAY

ret

dly2s: lcall BIG_DELAY

lcall BIG_DELAY

lcall BIG_DELAY

ret

dly5: lcall dly2

lcall dly2
lcall dly2

lcall dly2

ret

; **********************************************************

; INITIALIZE THE LCD 4-BIT MODE

; **********************************************************

INITLCD4:

CLR LCD_RS ; LCD REGISTER SELECT LINE

CLR LCD_RW ; READ / WRITE LINE

CLR LCD_E ; ENABLE LINE

MOV R4, #CONFIG; FUNCTION SET - DATA BITS,

; LINES, FONTS

LCALL WRLCDCOM4

RET

; **********************************************************

; SOFTWARE VERSION OF THE POWER ON RESET

; **********************************************************

RESETLCD4:

CLR LCD_RS ; LCD REGISTER SELECT LINE

CLR LCD_RW ; READ / WRITE LINE

CLR LCD_E ; ENABLE LINE

CLR LCD_DB7 ; SET BIT PATTERN FOR...

CLR LCD_DB6 ; ... POWER-ON-RESET

SETB LCD_DB5

SETB LCD_DB4

SETB LCD_E ; START ENABLE PULSE


CLR LCD_E ; END ENABLE PULSE

MOV A, #4 ; DELAY 4 MILLISECONDS

LCALL MDELAY

SETB LCD_E ; START ENABLE PULSE

CLR LCD_E ; END ENABLE PULSE

MOV A, #1 ; DELAY 1 MILLISECOND

LCALL MDELAY

SETB LCD_E ; START ENABLE PULSE

CLR LCD_E ; END ENABLE PULSE

MOV A, #1 ; DELAY 1 MILLISECOND

LCALL MDELAY

CLR LCD_DB4 ; SPECIFY 4-BIT OPERATION

SETB LCD_E ; START ENABLE PULSE

CLR LCD_E ; END ENABLE PULSE

MOV A, #1 ; DELAY 1 MILLISECOND

LCALL MDELAY

MOV R4, #CONFIG; FUNCTION SET

LCALL WRLCDCOM4

MOV R4, #08H ; DISPLAY OFF

LCALL WRLCDCOM4

MOV R4, #1 ; CLEAR DISPLAY, HOME CURSOR

LCALL WRLCDCOM4

MOV R4, #ENTRYMODE ; SET ENTRY MODE

LCALL WRLCDCOM4

AJMP INITLCD4

; **********************************************************

; SUB WRITES A COMMAND WORD TO THE LCD

; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM

; **********************************************************
WRLCDCOM4:

CLR LCD_E

CLR LCD_RS ; SELECT SEND COMMAND

CLR LCD_RW ; SELECT WRITE OPERATION

MOV A, R4 ; PUT DATA BYTE IN ACC

MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS

MOV LCD_DB4, C ; ONE BIT AT A TIME USING...

MOV C, ACC.5 ; BIT MOVE OPERATOINS

MOV LCD_DB5, C

MOV C, ACC.6

MOV LCD_DB6, C

MOV C, ACC.7

MOV LCD_DB7, C

SETB LCD_E ; PULSE THE ENABLE LINE

CLR LCD_E

MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE

MOV LCD_DB4, C

MOV C, ACC.1

MOV LCD_DB5, C

MOV C, ACC.2

MOV LCD_DB6, C

MOV C, ACC.3

MOV LCD_DB7, C

LCALL PULSEEWAIT4; PULSE THE ENABLE LINE...

; AND WAIT FOR BUSY FLAG TO CLEAR

RET

; **********************************************************

; SUB TO WRITE A DATA WORD TO THE LCD


; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM

; **********************************************************

WRLCDDATA:

CLR LCD_E

SETB LCD_RS ; SELECT SEND DATA

CLR LCD_RW ; SELECT WRITE OPERATION

MOV A, R4 ; PUT DATA BYTE IN ACC

MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS

MOV LCD_DB4, C ; ONE BIT AT A TIME USING...

MOV C, ACC.5 ; BIT MOVE OPERATOINS

MOV LCD_DB5, C

MOV C, ACC.6

MOV LCD_DB6, C

MOV C, ACC.7

MOV LCD_DB7, C

SETB LCD_E ; PULSE THE ENABLE LINE

CLR LCD_E

MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE

MOV LCD_DB4, C

MOV C, ACC.1

MOV LCD_DB5, C

MOV C, ACC.2

MOV LCD_DB6, C

MOV C, ACC.3

MOV LCD_DB7, C

LCALL PULSEEWAIT4; PULSE THE ENABLE LINE...

; AND WAIT FOR BUSY FLAG TO CLEAR

RET
; **********************************************************

; GENERATES A POSITIVE PULSE ON THE LCD ENABLE LINE.

; WAITS FOR THE BUSY FLAG TO CLEAR BEFORE RETURNING.

; **********************************************************

PULSEEWAIT4:

CLR LCD_E

SETB LCD_E ; PULSE THE ENABLE LINE

CLR LCD_E

SETB LCD_RW ; PREPARE R/W FOR READ OPERATION

PUSH ACC ; SAVE ACCUMULATOR CONTENTS

PEW:

SETB LCD_E ; START THE ENABLE PULSE

MOV A, LCD_DATA; READ STATUS NIBBLE

CLR LCD_E ; END ENABLE PULSE

SETB LCD_E ; PRETEND READING STATUS LOW NIBBLE

CLR LCD_E

JB ACC.7, PEW ; LOOP WHILE BUSY FLAG IS SET

POP ACC ; RESTORE ACCUMULATOR

RET

; **********************************************************

; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND

; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A

; NULL (0).

; **********************************************************

PRTLCD4:

POP DPH ; POP RETURN ADDRESS INTO DPTR

POP DPL
PRTNEXT:

CLR A ; SET OFFSET = 0

MOVC A, @A+DPTR ; GET CHR FROM CODE MEMORY

CJNE A, #0, CHROK; IF CHR = 0 THEN RETURN

SJMP RETPRTLCD

CHROK:

MOV R4, A

LCALL WRLCDDATA ; SEND CHARACTER

INC DPTR ; POINT AT NEXT CHARACTER

LJMP PRTNEXT ; LOOP TILL END OF STRING

RETPRTLCD:

MOV A, #1H ; POINT TO INSTRUCTION AFTER STRING

JMP @A+DPTR ; RETURN WITH A JUMP INSTRUCTION

; **********************************************************

; SUB SETS THE CURSOR POSITION.

; **********************************************************

PLACECUR4:

DEC ACC ; ACC=0 FOR LINE=1

JNZ LINE2 ; IF ACC=0 THEN FIRST LINE

MOV A, B

ADD A, #080H ; CONSTRUCT CONTROL WORD FOR LINE 1

SJMP SETCUR

LINE2:

MOV A, B

ADD A, #0C0H ; CONSTRUCT CONTROL WORD FOR LINE 2

SETCUR:

MOV R4, A ; PLACE CONTROL WORD

LCALL WRLCDCOM4 ; ISSUE COMMAND


RET

; **********************************************************

; 1 MILLISECOND DELAY ROUTINE

; **********************************************************

MDELAY:

PUSH ACC

MOV A,#0A6H

MD_OLP:

INC A

NOP

NOP

NOP

NOP

JNZ MD_OLP

NOP

POP ACC

RET

org 0600h

db 'AT+CMGF=1'

org 0610h

db 'AT+CMGS="+919500151223"'

org 0630h

db 'Gas Leak Found Send Via GSM modem'

org 0660h

db 'AT+CMGS="+919500151223"'

org 0680h

db 'Fire Accident send Via GSM modem'


END

You might also like