Microcontroller programming for IVRS system
ASM:-
;*******************************************LCD ********************************************************************************; IST LINE HOME ADDRESS ;80H 81H _ _ 8F; 2ND LINE HOME ADDRESS ;C0H C1H _ _ CF
cblock 0x20READBACKCOUNTERLCD_CMDLCD_DATALCD_READBACKPRCOUNTERREVDATACOUNTTEMPH_BYTEM_BYTEL_BYTER0 R1 R2 RSDATARSDATA1RSDATA2RSDATA3RSDATA4BYTE_COUNTDTMFDTMFPDTMFDFLAG0NO_COUNTRING_COUNT
endcBAUD_CONSTANT EQU D'103'; BAUDRATE= 9600;****************************************************PINS DECLARATION****************************************************************#DEFINE EN PORTA,0 ; FOR LCD#DEFINE RW PORTA,1 ; FOR LCD#DEFINE RS PORTA,2 ; FOR LCD#DEFINE DT_DIS FLAG0,0 ;
#DEFINE RING PORTA,5 ;#DEFINE HOOK PORTA,3 ;
;****************************************INTRUPT ROUTINE REGISTERS**************************************************************TEMPW EQU H'7B'TEMPSTATUS EQU H'7C'TEMPPCLATH EQU H'7D';****************************************RAM CLEANING ROUTINE REGISTERS*******************************************************************COUNT_REG1 EQU H'7E'TMP_COUNT EQU H'7F';************************************************************************************************************************************
ERRORLEVEL-302BANK0 MACRO ;macro to select data RAM bank 0
BCF STATUS,RP0BCF STATUS,RP1ENDM
BANK1 MACRO ;macro to select data RAM bank 1
BSF STATUS,RP0BCF STATUS,RP1ENDM
BANK2 MACRO ;macro to select data RAM bank 2
BCF STATUS,RP0BSF STATUS,RP1ENDM
BANK3 MACRO ;macro to select data RAM bank 3
BSF STATUS,RP0BSF STATUS,RP1ENDM
include "P16F877.inc" org 0
GOTO INITIALIZE org 4 GOTO INTERRUPT
ASCII ANDLW B'00001111' ADDWF PCL,F RETLW H'30';0 RETLW H'31';1 RETLW H'32';2
RETLW H'33';3 RETLW H'34';4 RETLW H'35';5 RETLW H'36';6 RETLW H'37';7 RETLW H'38';8 RETLW H'39';9 RETLW H'41';A RETLW H'42';B RETLW H'43';C RETLW H'44';D RETLW H'45';E RETLW H'46';F
;***********************************************I SR****************************************************************************
INTERRUPTMOVWF TEMPW ; TRANSFER DATA OF W TO
TEMPWSWAPF STATUS, W ; SWAP AND TRANSFER DATA OF
STATUS TO WCLRF STATUS ; CLEAR STATUSMOVWF TEMPSTATUS ; TRANSFER DATA OF W TO
TEMPSTATUSMOVF PCLATH, W ; TRANSFER DATA OF PCLATH TO WMOVWF TEMPPCLATH ; TRANSFER DATA OF W TO
TEMPPCLATHCLRF PCLATH ; CLEAR PCLATHCLRWDT ;CLEAR WATCH DOG
TIMERBTFSC RCSTA,FERRGOTO FERR_ERRBTFSC RCSTA,OERRGOTO OVER_ERRBTFSC PIR1,RCIF ;CHECK WHETHER
INTERRUPT GENERATED BY THE TIMER1 IF NO THEN SKIPGOTO RX_INTERRUPT ;GOTO TIMER1 INTERRUPT
PROCESSING
DATA_RETURNMOVF TEMPPCLATH, W ; TRANSFER DATA OF
TEMPPCLATH TO WMOVWF PCLATH ; TRANSFER DATA
OF W TO PCLATHSWAPF TEMPSTATUS, W ; TRANSFER DATA OF
TEMPSTATUS TO WMOVWF STATUS ; TRANSFER DATA
OF W TO STATUSMOVF TEMPW, W ; TRANSFER DATA OF
TEMPW TO WRETFIE ; RETURN FROM
INTERRUPT
FERR_ERRMOVFW RCREGCLRWBCF RCSTA,FERRGOTO RESET_BYTE_COUNT
OVER_ERRBCF RCSTA,CRENMOVFW RCREGCLRWCALL DELAY255BSF RCSTA,CRENGOTO RESET_BYTE_COUNT
RX_INTERRUPTBCF PIR1,RCIFMOVFW RCREGMOVWF RSDATAMOVFW BYTE_COUNTXORLW H'01'BTFSC STATUS,ZGOTO CHECK_B1MOVFW BYTE_COUNTXORLW H'02'BTFSC STATUS,ZGOTO STORE_1BMOVFW BYTE_COUNTXORLW H'03'BTFSC STATUS,ZGOTO STORE_2BMOVFW BYTE_COUNTXORLW H'04'BTFSC STATUS,ZGOTO STORE_3BGOTO RESET_BYTE_COUNT
CHECK_B1MOVFW RSDATAXORLW "{"BTFSS STATUS,ZGOTO RESET_BYTE_COUNT
INC_BYTE_COUNTINCF BYTE_COUNT,FGOTO DATA_RETURN
RESET_BYTE_COUNTMOVLW H'01'MOVWF BYTE_COUNTGOTO DATA_RETURN
STORE_1BMOVFW RSDATAMOVWF RSDATA1GOTO INC_BYTE_COUNT
STORE_2BMOVFW RSDATAMOVWF RSDATA2GOTO INC_BYTE_COUNT
STORE_3BMOVFW RSDATAXORLW "}"BTFSC STATUS,ZGOTO RS232RECIVEGOTO RESET_BYTE_COUNT
RS232RECIVEMOVFW RSDATA1XORLW "B"BTFSS STATUS,ZGOTO RESET_BYTE_COUNTMOVFW RSDATA2XORLW "R"BTFSS STATUS,ZGOTO RESET_BYTE_COUNTGOTO INITIALIZEGOTO RESET_BYTE_COUNT
;*********************************************************PROGRAM STARTS*************************************************************INITIALIZE
CALL CHECK_RAM1 CALL PORT_INTITIALIZE
CALL RS232_INITIALIZATIONCALL LCD_INITIALIZATIONCALL FETCHMOVFW DTMFMOVWF DTMFPBCF HOOKMOVLW H'0F'MOVWF RING_COUNTCALL SCREEN
STARTBCF HOOK
HOUBTFSS RINGGOTO $-1CLRWCALL PR_DELAYCLRWCALL PR_DELAYCLRWCALL PR_DELAYCLRWCALL PR_DELAYCLRWCALL PR_DELAY
DECFSZ RING_COUNT,FGOTO HOUMOVLW H'0F'MOVWF RING_COUNT
MOVLW "{"CALL TX_COM
MOVLW "C"CALL TX_COM
MOVLW "O"CALL TX_COM
MOVLW "}"CALL TX_COM
BSF HOOKSTART1
CALL DISPLAYCALL FETCHCALL DISPLAY_DTMFGOTO START1
;*****************************************************************************************************************************************************************
;MAIN DISPLAY;*****************************************************************************************************************************************************************
SCREENMOVLW H'01' ;cursor HOME POSTION
positonMOVWF LCD_CMDCALL CMD_WRITEMOVLW H'80' ;cursor HOME POSTION
positonMOVWF LCD_CMDCALL CMD_WRITEMOVLW "O"MOVWF LCD_DATACALL DATA_WRITEMOVLW "R"MOVWF LCD_DATACALL DATA_WRITEMOVLW "I"MOVWF LCD_DATACALL DATA_WRITEMOVLW "E"MOVWF LCD_DATA
CALL DATA_WRITEMOVLW "N"MOVWF LCD_DATACALL DATA_WRITEMOVLW "T"MOVWF LCD_DATACALL DATA_WRITEMOVLW "A"MOVWF LCD_DATACALL DATA_WRITEMOVLW "L"MOVWF LCD_DATACALL DATA_WRITEMOVLW "."MOVWF LCD_DATACALL DATA_WRITEMOVLW " "MOVWF LCD_DATACALL DATA_WRITEMOVLW "B"MOVWF LCD_DATACALL DATA_WRITEMOVLW "P"MOVWF LCD_DATACALL DATA_WRITEMOVLW "L"MOVWF LCD_DATACALL DATA_WRITEMOVLW "."MOVWF LCD_DATACALL DATA_WRITERETURN
;*****************************************************************************************************************************************************************
;COMING DISPLAY;*****************************************************************************************************************************************************************
DISPLAYBTFSC DT_DISRETURNBSF DT_DISMOVLW H'01' ;cursor HOME POSTION
positonMOVWF LCD_CMDCALL CMD_WRITEMOVLW H'80' ;cursor HOME POSTION
positonMOVWF LCD_CMD
CALL CMD_WRITEMOVLW "I"MOVWF LCD_DATACALL DATA_WRITEMOVLW "N"MOVWF LCD_DATACALL DATA_WRITEMOVLW "C"MOVWF LCD_DATACALL DATA_WRITEMOVLW "O"MOVWF LCD_DATACALL DATA_WRITEMOVLW "M"MOVWF LCD_DATACALL DATA_WRITEMOVLW "I"MOVWF LCD_DATACALL DATA_WRITEMOVLW "N"MOVWF LCD_DATACALL DATA_WRITEMOVLW "G"MOVWF LCD_DATACALL DATA_WRITEMOVLW "."MOVWF LCD_DATACALL DATA_WRITEMOVLW " "MOVWF LCD_DATACALL DATA_WRITEMOVLW "N"MOVWF LCD_DATACALL DATA_WRITEMOVLW "o"MOVWF LCD_DATACALL DATA_WRITEMOVLW "s"MOVWF LCD_DATACALL DATA_WRITEMOVLW "."MOVWF LCD_DATACALL DATA_WRITEMOVLW H'C0' ;cursor HOME POSTION
positonMOVWF LCD_CMDCALL CMD_WRITERETURN
;*****************************************************************************************************************************************************************
;FETCHDTMF DISPLAY
;*****************************************************************************************************************************************************************FETCH
BTFSC PORTC,1RETURNBTFSC PORTC,4BSF DTMF,0BTFSS PORTC,4BCF DTMF,0BTFSC PORTC,5BSF DTMF,1BTFSS PORTC,5BCF DTMF,1BTFSC PORTC,3BSF DTMF,2BTFSS PORTC,3BCF DTMF,2BTFSC PORTC,2BSF DTMF,3BTFSS PORTC,2BCF DTMF,3RETURN
;*****************************************************************************************************************************************************************
;DTMF DISPLAY;*****************************************************************************************************************************************************************DISPLAY_DTMF
MOVFW DTMFXORWF DTMFP,WBTFSC STATUS,ZRETURNMOVFW DTMFMOVWF DTMFPANDLW H'0F'CALL ASCIIMOVWF LCD_DATACALL DATA_WRITEINCF NO_COUNT,FMOVLW H'0F'SUBWF NO_COUNT,WBTFSC STATUS,CBCF DT_DISMOVLW H'0F'SUBWF NO_COUNT,WBTFSC STATUS,CCLRF NO_COUNT
MOVLW "{"CALL TX_COMMOVLW "0"CALL TX_COMMOVFW DTMFANDLW H'0F'CALL ASCIICALL TX_COMMOVLW "}"CALL TX_COMRETURN
;*****************************************************************************************************************************************************************
;MAIN LCD DATA_READ ROUTINE;*****************************************************************************************************************************************************************; TAKE THE ADDRESS IN LCD_CMD GIVE U A DATAA IN
LCD_READBACKDATA_READ
CALL CMD_WRITECALL READYCALL READBACK_LCDRETURN
;*****************************************************************************************************************************************************************
;MAIN LCD CMD_WRITE SEND ROUTINE;*****************************************************************************************************************************************************************
; TAKE COMMAND IN LCD_CMDCMD_WRITE
CALL READYCALL CMDWRTRETURN
;*****************************************************************************************************************************************************************
;MAIN LCD DATA SEND ROUTINE;*****************************************************************************************************************************************************************; TAKE COMMAND IN LCD_DATADATA_WRITE
CALL READYCALL DATAWRTRETURN
;;*****************************************************************************************************************************************************************
;LCD DATA SEND ROUTINE
;*****************************************************************************************************************************************************************DATAWRT
BSF RS ;RS PULL TO HIGHBCF RW ;RW PULL TO HIGHBTFSC LCD_DATA,0BSF REVDATA,7BTFSS LCD_DATA,0BCF REVDATA,7BTFSC LCD_DATA,1BSF REVDATA,6BTFSS LCD_DATA,1BCF REVDATA,6BTFSC LCD_DATA,2BSF REVDATA,5BTFSS LCD_DATA,2BCF REVDATA,5BTFSC LCD_DATA,3BSF REVDATA,4BTFSS LCD_DATA,3BCF REVDATA,4BTFSC LCD_DATA,4BSF REVDATA,3BTFSS LCD_DATA,4BCF REVDATA,3BTFSC LCD_DATA,5BSF REVDATA,2BTFSS LCD_DATA,5BCF REVDATA,2BTFSC LCD_DATA,6BSF REVDATA,1BTFSS LCD_DATA,6BCF REVDATA,1BTFSC LCD_DATA,7BSF REVDATA,0BTFSS LCD_DATA,7BCF REVDATA,0MOVFW REVDATA ;LCD COMMAND TRANFER TO W MOVWF PORTB ;LCD DATA COMMAND TO LCD PINS BSF EN ;EN THE TRANSFERNOP NOPBCF ENNOP NOPRETLW H'00'
;;*****************************************************************************************************************************************************************
;LCD COMMAND SEND ROUTINE
;*****************************************************************************************************************************************************************CMDWRT
BCF RS ;RS PULL TO LOWBCF RW ;RW PULL TO LOWBTFSC LCD_CMD,0BSF REVDATA,7BTFSS LCD_CMD,0BCF REVDATA,7BTFSC LCD_CMD,1BSF REVDATA,6BTFSS LCD_CMD,1BCF REVDATA,6BTFSC LCD_CMD,2BSF REVDATA,5BTFSS LCD_CMD,2BCF REVDATA,5BTFSC LCD_CMD,3BSF REVDATA,4BTFSS LCD_CMD,3BCF REVDATA,4BTFSC LCD_CMD,4BSF REVDATA,3BTFSS LCD_CMD,4BCF REVDATA,3BTFSC LCD_CMD,5BSF REVDATA,2BTFSS LCD_CMD,5BCF REVDATA,2BTFSC LCD_CMD,6BSF REVDATA,1BTFSS LCD_CMD,6BCF REVDATA,1BTFSC LCD_CMD,7BSF REVDATA,0BTFSS LCD_CMD,7BCF REVDATA,0MOVFW REVDATA ;LCD COMMAND TRANFER TO W MOVWF PORTB ;LCD DATA COMMAND TO LCD PINS BSF EN ;EN THE TRANSFERNOP NOP BCF ENNOP NOPRETLW H'00'
;;*****************************************************************************************************************************************************************
;DATAREAD FRM LCD ROUTINE
;*****************************************************************************************************************************************************************READBACK_LCD
BSF RSBSF RWBANK1
MOVLW H'FF'MOVWF TRISB ; MAKE ALL PINS INPUT TO RECIVE DATABANK0BSF ENNOP NOP BTFSC PORTB,0BSF REVDATA,7BTFSS PORTB,0BCF REVDATA,7BTFSC PORTB,1BSF REVDATA,6BTFSS PORTB,1BCF REVDATA,6BTFSC PORTB,2BSF REVDATA,5BTFSS PORTB,2BCF REVDATA,5BTFSC PORTB,3BSF REVDATA,4BTFSS PORTB,3BCF REVDATA,4BTFSC PORTB,4BSF REVDATA,3BTFSS PORTB,4BCF REVDATA,3BTFSC PORTB,5BSF REVDATA,2BTFSS PORTB,5BCF REVDATA,2BTFSC PORTB,6BSF REVDATA,1BTFSS PORTB,6BCF REVDATA,1BTFSC PORTB,7BSF REVDATA,0BTFSS PORTB,7BCF REVDATA,0MOVFW REVDATA ;LCD COMMAND TRANFER TO W MOVWF LCD_READBACKBCF ENNOP NOPBANK1
CLRF TRISB ; MAKE ALL PINS OUTPUT
BANK0RETLW H'00'
;;*****************************************************************************************************************************************************************
;LCD BUSY CHECK ROUTINE;*****************************************************************************************************************************************************************READY
BCF PORTB,0BANK1BSF TRISB,0BANK0BCF RS ;FOR READING LCDBSF RW ;FOR READING LCDBCF ENNOP NOP BSF ENNOP NOPBTFSC PORTB,0GOTO READYBANK1BCF TRISB,0BANK0BCF RWRETURN
;;*****************************************************************************************************************************************************************
;BINARY TO BCD CONVERION;*****************************************************************************************************************************************************************B2_BCD
BCF STATUS,0 ; clear the carry bitMOVLW .24MOVWF COUNTCLRF R0CLRF R1CLRF R2
LOOP16 RLF L_BYTE, FRLF M_BYTE , FRLF H_BYTE , FRLF R2, FRLF R1, FRLF R0, FDECFSZ COUNT, FGOTO ADJDEC RETLW 0
ADJDEC MOVLW R2MOVWF FSRCALL ADJBCDMOVLW R1MOVWF FSRCALL ADJBCDMOVLW R0MOVWF FSRCALL ADJBCDGOTO LOOP16
ADJBCD MOVLW 3ADDWF 0,WMOVWF TEMPBTFSC TEMP,3 ; test if result > 7MOVWF 0MOVLW 30ADDWF 0,WMOVWF TEMPBTFSC TEMP,7 ; test if result > 7MOVWF 0 ; save as MSDRETLW 0
;;*****************************************************************************************************************************************************************
;LCD INTIALIZATION;*****************************************************************************************************************************************************************LCD_INITIALIZATION
CALL PR_DELAY ;30 MSEC START DELAY FOR LCD TO RISE POWER
CALL PR_DELAY ;30 MSEC START DELAY FOR LCD TO RISE POWER
MOVLW H'3B' ;FUNCTION SET[0,0,0,1(FOR LCD REQ.),1(DL, DATA LENGTH 8),1(N SET 2 LINES),1(F -FONT 5X10 DOTS,X,X)
MOVWF LCD_CMD ; NO READY HAS BEEN CHECKED
CALL CMDWRTCALL DELAY255MOVLW H'0C' ;LCD
SETTING(0,0,0,0,1(ALWAYS),1(D,TO INCREMENT ADDRESS AUTO),1(C-ON THE CURSOR),1(BTO BLINK THE CURSOR))
MOVWF LCD_CMDCALL CMD_WRITEMOVLW H'01' ;LCD
SETTING(0,0,0,0,1(ALWAYS),1(D,TO INCREMENT ADDRESS AUTO),1(C-ON THE CURSOR),1(BTO BLINK THE CURSOR))
MOVWF LCD_CMDCALL CMD_WRITE
MOVLW H'80' ;cursor HOME POSTION positon
MOVWF LCD_CMDCALL CMD_WRITERETURN
;*******************************************COMPUTER TRANSMITTING ROUTINE************************************************************TX_COM
MOVWF TXREGBANK1BTFSS TXSTA,TRMTGOTO $-1BANK0CALL DELAY255RETURN
;;*****************************************************************************************************************************************************************
;PORTINTIALIZATION ROUTINE
;*****************************************************************************************************************************************************************PORT_INTITIALIZE
BANK1 MOVLW B'11110000'
MOVWF TRISA CLRF TRISB
MOVLW B'10111111' ;C6 TX IS O/P AND ALL ARE INPUTMOVWF TRISC ;TRANSFER TO PORTC
DIRECTION REGISTERMOVLW B'00000111'MOVWF ADCON1BANK0
CLRF PORTA CLRF PORTB
CLRF PORTC MOVLW B'11000000' ; TRANSFER THE DATA FOR
ENABLEING GENERAL AND PERIPHERAL INTERPPT TO WMOVWF INTCON ; TRANSFER THE DATA FOR
ENABLEING GENERAL AND PERIPHERAL INTERPPT TO INTERRUPT CONTROL REGISTER
RETURN;;*****************************************************************************************************************************************************************
;RS232 INTIALIZE ROUTINE;*****************************************************************************************************************************************************************RS232_INITIALIZATION
CLRF STATUS ; SELECT BANK0MOVLW BAUD_CONSTANT ;9600BSF STATUS,RP0 ; SELECT BANK1
MOVWF SPBRGMOVLW B'10100100'
;CSRC=1,TX9=0,TXEN=1,SYNC=0(ASYS),UM=0,BRG=1(HIGH SPEED),TRMT=0,TX9D=0
MOVWF TXSTABSF PIE1,RCIE ;RECIVE INTRUPT
ENABLECLRF STATUS ; SELECT BANK0MOVLW B'10010000'
;SPEN=1,RX9=0,SREN=0,CREN=1,ADDEN=0,FERR=0,OERR=0,RX9D=0MOVWF RCSTAMOVLW B'11000000' ; TRANSFER THE DATA FOR
ENABLEING GENERAL AND PERIPHERAL INTERPPT TO WMOVWF INTCON ; TRANSFER THE
DATA FOR ENABLEING GENERAL AND PERIPHERAL INTERPPT TO INTERRUPT CONTROL REGISTER
RETURN;;*****************************************************************************************************************************************************************
;PROGRAMABLE DELAY ROUTINE;*****************************************************************************************************************************************************************PR_DELAY
MOVWF PRCOUNTEROO1
CALL DELAY255DECFSZ PRCOUNTER,FGOTO OO1RETURN
;;*****************************************************************************************************************************************************************
;255 CYCLE DELAY ROUTINE;*****************************************************************************************************************************************************************DELAY255
DECFSZ COUNTER,FGOTO DELAY255RETURN
;;*****************************************************************************************************************************************************************
;RAM CLEANING ROUNTINE;*****************************************************************************************************************************************************************CHECK_RAM1
MOVLW D'20' ;THIS IS FOR INITIAL POWER UP DELAY
MOVWF COUNT_REG1 ;TRANSFER TO COUNT_REG1 REGISTER
CHECK_RAM2
CALL CHECK_RAM ;CALL SUBROUTINE FOR CHECKING THE RAM
CLRWDT ;CLEAR WATCHDOG TIMER
DECFSZ COUNT_REG1,F ;DECREASE COUNT_REG1 AND AND CHECK IF ZERO THEN SKIP
GOTO CHECK_RAM2 ;GOTO CHECK_RAM2 LABELRETURN
CHECK_RAMCLRF STATUS ;GOTO BANK0MOVLW H'50' ;THIS IS FOR RAM
REGISTER COUNT TO BE CLEAREDMOVWF TMP_COUNT ;TRANSFER TO
TMP_COUNT REGISTERMOVLW H'70' ;THIS IS START RAM
REGISTER MOVWF FSR ;TRANSFER
TO FSR REGISTER FOR INDIRECT ADDRESSINGMOVLW H'FF' ;MAKE ALL BITS OF
THE REGISTER UNDER CONSIDERATION TO 1STEP1
MOVWF INDF ;TRANSFER TO FSR REGISTER DIRECTED REGISTER
DECF FSR,F ;DECREASE FSR FOR FOR NEXT REGISTER TO GO
DECFSZ TMP_COUNT,F ;DECREASE TMP_COUNT AND CHECH WHETHER ALL
REGISTERED AS DESIRED MADE "FF"GOTO STEP1 ;IF NOT GOTO 3 STEPS UPMOVLW H'50' ;THIS IS FOR RAM
REGISTER COUNT TO BE CLEAREDMOVWF TMP_COUNT ;TRANSFER TO
TMP_COUNT REGISTERMOVLW H'70' ;THIS IS START RAM
REGISTER MOVWF FSR ;TRANSFER
TO FSR REGISTER FOR INDIRECT
ADDRESSINGSTEP2
MOVLW H'FF' ;FEED ALL BITS OF W 1
XORWF INDF,F ;XOR WITH THE INDIRECTLY ADDRESSED REGISTER
BTFSS STATUS,Z ;SKIP IF ALL BITS IN W ARE ZERO
GOTO CHECK_RAM ;ELSE GOTO CHECK_RAM LABEL
DECF FSR,F ;DECREASE FSR FOR FOR NEXT REGISTER TO GO
DECFSZ TMP_COUNT,F ;DECREASE TMP_COUNT AND CHECH WHETHER ALL REGISTERED AS DESIRED MADE "00"
GOTO STEP2 ;IF NOT GOTO 5 STEPS UPRETURN ;RETURN
FROM THE SUB ROUTINE END