| ??? 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 |
| Topic | Author | Date |
| 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 |



