Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
08/13/03 10:17
Read: times


 
#52532 - RE: Source code...
Responding to: ???'s previous message
I request the MCS-51 experts here to go through this code and if you people find that the program can be written much better(documentation,declarations,stack etc...),please suggest.

The program given below is actually a working program...



;THIS IS A WORKING PROGRAM, TESTED ON 8563 RTC IC
;THE SAME CODE CAN BE USED FOR OTHER I2C IC'S WITH MODIFICATION.
;tested on 2/6/03
;works along with lcd display,in 4 bit mode,the lcd
;routines are at the end of this file
;author -->Rajkumar Shetgar (India)
;email --> rajkumar@yashaa.com


WTCMD EQU 10100010B ;8563 WRITE COMMAND
RDCMD EQU 10100011B ;8563 READ COMMAND
ADDRS EQU 70H

SCL EQU P3.4 ;SERIAL CLOCK PIN
SDA EQU P3.5 ;SERIAL DATA PIN


ORG 0000H
LJMP START

ORG 0030H

START: LCALL L_DELAY
SETB LITE ;back light of LCD

LCALL LCD_INIT ;THIS WILL INITIALISE THE LCD FOR 4 BIT MODE
;REMEMBER THIS LCD_INIT SHOULD BE CALLED ONLY ONCE.

MOV DPTR,#TITLE1
LCALL LCD_LINE1 ;THIS WILL DISPLAY THE MESSAGE ON LINE 1 OF THE LCD


START1:
MOV A,#04 ;
MOV ADDRS,A ;READ THE DATA
LCALL READ ;LOCATION POINTED BY ADDRS AND STORE IN R2
MOV A,R2 ;

MOV B,A
ANL A,#0FH
ORL A,#30H
MOV R1,A

MOV A,B
SWAP A
ANL A,#00000111B
ORL A,#30H
MOV R0,A

MOV R5,#04H ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,R0 ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER

MOV R5,#05H ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,R1 ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER


MOV R5,#06H ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,#':' ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER


MOV A,#03 ;
MOV ADDRS,A ;READ THE DATA
LCALL READ ;LOCATION POINTED BY ADDRS AND STORE IN R2
MOV A,R2 ;

MOV B,A
ANL A,#0FH
ORL A,#30H
MOV R1,A

MOV A,B
SWAP A
ANL A,#00000111B
ORL A,#30H
MOV R0,A

MOV R5,#07H ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,R0 ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER

MOV R5,#08H ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,R1 ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER


MOV R5,#09H ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,#':' ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER

MOV A,#02 ;
MOV ADDRS,A ;READ THE DATA
LCALL READ ;LOCATION POINTED BY ADDRS AND STORE IN R2
MOV A,R2 ;

MOV B,A
ANL A,#0FH
ORL A,#30H
MOV R1,A

MOV A,B
SWAP A
ANL A,#00000111B
ORL A,#30H
MOV R0,A

MOV R5,#0AH ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,R0 ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER

MOV R5,#0BH ;R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
MOV TEMP1,R1 ;TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
LCALL LINE2_CHAR;THIS WILL DISPLAY ONLY ONE CHARACTER


LJMP START1


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS IS USED TO WRITE INTO 24C04
;ARGUMENTS1 --> ADDRS => ADDRESS TO BE WRITTEN INTO,IN 24C04 MEMORY
;ARGUMENTS2 --> R1 ==> DATA TO BE WRITTEN
;RETURN --> NONE

WRITE:
MOV A,#WTCMD
CALL OUTS

MOV A,ADDRS
CALL OUT

MOV A,R1
CALL OUT

CALL STOP

RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS SUB ROUTINE IS USED TO READ DATA FROM THE 24C04
;ARGUMENTS --> ADDRS ==> ADDRESS IN 24C04,THE DATA SHOULD BE READ FROM.
;RETURN --> R2(DATA THAT WAS READ)
READ:
MOV A,#WTCMD
CALL OUTS

MOV A,ADDRS
LCALL OUT

MOV A,#RDCMD
LCALL OUTS

LCALL IN
MOV R2,A

LCALL STOP

RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OUTS:
MOV B,#8
SETB SDA
SETB SCL
NOP
CLR SDA
NOP
CLR SCL

OSLOOP:
RLC A
MOV SDA,C
SETB SCL
NOP
CLR SCL
DJNZ B,OSLOOP
SETB SDA
NOP
SETB SCL
NOP
CLR SCL
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OUT:
MOV B,#8
OLOOP:
RLC A
MOV SDA,C
SETB SCL
NOP
CLR SCL
DJNZ B,OLOOP
SETB SDA
NOP
SETB SCL
NOP
CLR SCL
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IN:
MOV B,#8
SETB SDA
INLOOP:
CLR SCL
NOP
SETB SCL
MOV C,SDA
RLC A
DJNZ B,INLOOP
CLR SCL
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
STOP:
CLR SDA
NOP
SETB SCL
NOP
SETB SDA
LCALL DLAYms
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DLAYms:
MOV R6,#150
MOV B,#00
MS1: DJNZ B,$ ;((2*255)+(2*255)*150
DJNZ B,$ ;=153 MILLI SECONDS
DJNZ R6,MS1
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
L_DELAY:
MOV R7,#0AH ;153 MILLISECONDS * 10
LLL: LCALL DLAYms ;1.53 SECONDS
DJNZ R7,LLL
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@






















TEMP1 EQU 6FH
TEMP2 EQU 6EH
TEMP3 EQU 6DH
TEMP4 EQU 6CH
TEMP5 EQU 6BH

LCD_D3 EQU P2.2
LCD_D2 EQU P2.3
LCD_D1 EQU P2.4
LCD_D0 EQU P2.5

EN EQU P2.6
RS EQU P2.7

LITE EQU P2.1




;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;REMEMBER THIS LCD_INIT SHOULD BE CALLED ONLY ONCE.
LCD_INIT:
;***************************************
;THIS IS REQUIRED.
;0010[4 BIT MODE]

CLR RS
NOP
CLR LCD_D3
CLR LCD_D2
SETB LCD_D1
CLR LCD_D0
NOP
SETB EN
NOP
NOP
CLR EN

;***************************************
MOV A,#00101000B ;4 BIT MODE 2 LINE LCD 5*7 FONT
LCALL COMMAND

MOV A,#00000001B ;CLEAR DISPLAY
LCALL COMMAND

MOV A,#00000011B ;DISPLAY AND CURSOR HOME
LCALL COMMAND

MOV A,#00001100B ;DISPLAY ON ,CURSOR NO BLINK
LCALL COMMAND

RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS SUBROUTINE WILL TELL THE LCD THAT THE DATA IS A COMMAND
;ARUGUMENT1 --> ACCUMULATOR ==> COMMAND(ex:clear screen,display on etc)
;RETURN --> NONE

COMMAND:
ACALL LCD_PUT
ACALL LCD_PULSE

SWAP A

ACALL LCD_PUT
ACALL LCD_PULSE

RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ RET

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS WILL PLACE THE ACCUMULATOR'S MSB(4 BITS) ON THE LCD'S 4 DATA PIN'S
;ARGUMENT1 --> ACCUMULATOR(UPPER 4 BITS)
;RETURN --> NONE

LCD_PUT:
MOV C,ACC.7
MOV LCD_D3,C

MOV C,ACC.6
MOV LCD_D2,C

MOV C,ACC.5
MOV LCD_D1,C

MOV C,ACC.4
MOV LCD_D0,C

MOV R5,#5
DJNZ R5,$

RET

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS WILL PUT THE LCD IN COMMAND MODE
;ARGUMENT --> NONE
;RETURN --> NONE

LCD_PULSE:
CLR RS
SETB EN
MOV R4,#5

MOV B,#245
MS11: DJNZ B,$ ;((2*245)+(2*255)*5
DJNZ B,$ ;(490+510)*5
DJNZ R4,MS11 ;=5 MILLI SECONDS
CLR EN
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS WILL DISPLAY THE MESAGE POINTED BY DPTR ON LINE A 2 LINE LCD IN LINE 1
;ARGUMENT1 --> DPTR(HOLDING THE STARTING ADDRESS OF THE MESASGE)
;RETURN --> NONE

LCD_LINE1:
MOV A,#80H
LCALL COMMAND
MOV R7,#8
LCALL DISPLAY_8CHAR
MOV A,#88H
LCALL COMMAND
MOV R7,#8
LCALL DISPLAY_8CHAR
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS WILL DISPLAY THE MESAGE POINTED BY DPTR ON LINE A 2 LINE LCD IN LINE 2
;ARGUMENT1 --> DPTR(HOLDING THE STARTING ADDRESS OF THE MESASGE)
;RETURN --> NONE

LCD_LINE2:
MOV A,#0C0H
LCALL COMMAND
MOV R7,#8
LCALL DISPLAY_8CHAR
MOV R7,#8
LCALL DISPLAY_8CHAR
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS ROUTINE WILL ACTUALLY DISPLAY THE DATA IN ACCUMULATOR ON THE LCD
;ARGUMENT1 --> DPTR
;RETURN --> NONE

DISPLAY_8CHAR:
MOV A,#00
MOVC A,@A+DPTR
LCALL LCD_PUT
LCALL LCD_DATA_MODE
SWAP A
LCALL LCD_PUT
LCALL LCD_DATA_MODE
INC DPTR
DJNZ R7,DISPLAY_8CHAR
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS IS USED TO PUT THE LCD IN DATA MODE
LCD_DATA_MODE:
SETB RS
SETB EN
NOP
NOP
CLR EN
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


TITLE1: DB "DEMO TO TEST RTC"
TITLE2: DB " EMBEDDED DEPT. "
Q0: DB "PRESS PORT0 I/P."
Q1: DB "PORT0 VALUE ."

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


/*
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DLAYms:
MOV R6,#100
MOV B,#245
MS1: DJNZ B,$ ;((2*245)+(2*255)*100
DJNZ B,$ ;(490+510)*100
DJNZ R6,MS1 ;=100 MILLI SECONDS
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
L_DELAY:
MOV R7,#0AH ;100 MILLISECONDS * 10
LLL: LCALL DLAYms ;1 SECOND
DJNZ R7,LLL
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

*/
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LINE1_CHAR:
;THIS ROUTINE WILL DISPLAY ONLY ONE CHARACTER ON LINE ONE OF A 2 LINE LCD
;ARGUMENT1 --> R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
;ARGUMENT2 --> TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
;RETURN --> NONE

MOV A,#80H
ADD A,R5
LCALL COMMAND
LCALL DIS_ONE_CHAR
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LINE2_CHAR:
;THIS ROUTINE WILL DISPLAY ONLY ONE CHARACTER ON LINE TWO OF A 2 LINE LCD
;ARGUMENT1 --> R5 ==> POSITION OF THE CHARACTER ON A 16 CHARACTER LCD(0 TO 15)
;ARGUMENT2 --> TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
;RETURN --> NONE

MOV A,#0C0H
ADD A,R5
LCALL COMMAND
LCALL DIS_ONE_CHAR
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DIS_ONE_CHAR:
;THIS ROUTINE WILL DISPLAY ONLY ONE CHARACTER ON LINE TWO OF A 2 LINE LCD
;ARGUMENT1 --> TEMP1 ==> DATA TO BE DISPLAYED(SHOULD BE IN ASCII)
;RETURN --> NONE

MOV A,TEMP1

LCALL LCD_PUT
LCALL LCD_DATA_MODE
SWAP A
LCALL LCD_PUT
LCALL LCD_DATA_MODE

RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;THIS WILL CONVER THE BINARY NUMBER IN ACCUMULATOR INTO ASCII
;ARGUMENT1 --> ACCUMULATOR ==>THE NUMBER TO BE CONVERTED
;RETURN --> R2 ==> UNITS PLACE
; --> R1 ==> TENTS PLACE
; --> R0 ==> HUNDREDS PLACE

CONVERT:
MOV B,#10
DIV AB
MOV R2,B

MOV B,#10
DIV AB
MOV R1,B

MOV R0,A

MOV A,#30H ;CONVERT THE BCD INTO ASCII
ORL A,R2
MOV R2,A ;R2 ==> UNITS PLACE

MOV A,#30H ;CONVERT THE BCD INTO ASCII
ORL A,R1
MOV R1,A ;R1 ==> TENTS PLACE

MOV A,#30H ;CONVERT THE BCD INTO ASCII
ORL A,R0
MOV R0,A ;R0 ==> HUNDREDS PLACE

RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@




END


List of 14 messages in thread
TopicAuthorDate
RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
   RE: RTC PCF8563 Source code            01/01/70 00:00      
      RE: RTC PCF8563 Source code            01/01/70 00:00      
         Source code...            01/01/70 00:00      
            RE: Source code...            01/01/70 00:00      
               RE: Source code...            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      
RE: RTC PCF8563 Source code            01/01/70 00:00      

Back to Subject List