;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; This is a base program for clocking in bitmaps to the SED1330 on a 240x320 LCD display ; using 8051 assembly code. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START: MOV 30H,#3EH ;SETS UP THE INNER LOOP TO 62 MOV 31H,#01H ;SETS UP FOR NULL DATA LCALL CK_DATA ;GO GET DATA MOV B,#0F0H ;SETS UP INNER LOOP FOR 240 LINES OF DATA MOV 32H,#008H ;SETS LOWER CURSOR ADDRESS (address where program ends/bitmap begins) MOV 33H,#02AH ;SETS UPPER CURSOR ADDRESS DO_OVER: PUSH B ;STORE VALUE MOV 30H,#28H ;SETS UP THE INNER LOOP TO 40 CHARACTERS PER LINE MOV 31H,#00H ;SETS UP FOR VALID DATA LCALL SET_CUR ;SETS THE INITIAL ADDRESS ON DISPLAY LCALL CK_DATA ;GO GET DATA POP B ;RECALLS INNER LOOP DJNZ B,CONTINUE ;IF NOT ZERO, THEN REDO (moving up one line on display if doing over) RET ; CONTINUE: MOV A,0D0H ;RECALL CARRY FLAG ANL A,#7FH ;CLEAR THE CARRY FLAG MOV 0D0H,A ;STORE FLAG MOV A,32H ;RECALL LOWER CURSOR ADDRESS SUBB A,#28H ;SUBTRACT 40 FROM THIS ADDRESS TO MOVE UP ONE LINE MOV 32H,A ;RESTORE THE NEW LOWER ADDRESS MOV A,0D0H ;RECALL CARRY FLAG ANL A,#80H ;STRIP OFF CARRY FLAG CJNE A,#80H,NO_CARRY ;SEE IF FLAG IS SET (if set then must bump down higher address by 1) MOV A,33H ;RECALL UPPER CURSOR ADDRESS SUBB A,#01H ;SUBTRACT 1 FORM UPPER MOV 33H,A ;RESTORE THE VALUE NO_CARRY: LJMP DO_OVER ;DO INNER ROUTINE OVER AGAIN CK_DATA: MOV A,31H ;RECALL BYTE FOR NULL OR VALID DATA CJNE A,#00H,GET_DATA ;SEE IF NULL DATA OR NOT (selects appropriate subroutine) DATA_IN: LCALL DATA_ARM ;GET THE VALID DATA LCALL WRCHAR ;SEND IT TO THE DISPLAY DJNZ 30H,DATA_IN ;COMPARE LOOP AND DECREMENT UNTIL ZERO RET ; GET_DATA: LCALL DATA_ARM ;GET THE NULL DATA DJNZ 30H,GET_DATA ;SEE IF INNER LOOP IS ZERO RET ; SET_CUR: MOV B,#46H ;SET ADDRESS POINTER LCALL WRCMD ;CLOCK IN MOV B,32H ;RECALL THE LOWER CURSOR POSITION LCALL WRDATA ;CLOCK IN MOV B,33H ;RECALL THE HIGHER CURSOR POSITION LCALL WRDATA ;CLOCK IN RET ; DATA_ARM: MOV 82H,34H ;MOV LOWER DATA POINTER ON THE STACK MOV 83H,35H ;MOV HIGHER DATA POINTER ON THE STACK MOV A,#00H ;CLEAR OUT REGISTER FOR TRUE DATA POINTER MOVC A,@A+DPTR ;GET THE DATA POINTED TO BY THE DATA POINTER MOV B,A ;SWAP DATA TO "B" REGISTER INC DPTR ;INCREMENT THE DATA POINTER MOV 34H,82H ;RESTORE LOWER DATA (includes increment) MOV 35H,83H ;RESTORE HIGHER DATA RET ; WRCHAR: PUSH B ;STORE DATA MOV B,#042H ;SETS WRITE DATA COMMAND LCALL WRCMD ;CLOCK IN POP B ;RECALL DATA XRL B,#0FFH ;INVERSE DATA TO PREVENT INVERSE VIDEO LCALL WRDATA ;GO CLOCK IN RET ; WRDATA: MOV 0C0H,#03H ;SETS WR AND RD HIGH AND A0 LOW MOV 0C0H,#01H ;STROBE WR LOW MOV 090H,B ;PUTS DATA ON PORT 1 MOV 0C0H,#03H ;STROBE WR HIGH RET ; WRCMD: MOV 0C0H,#07H ;SETS WR, RD, AND A0 HIGH MOV 0C0H,#05H ;STROBE WR LOW MOV 090H,B ;PUTS COMMAND ON PORT 1 MOV 0C0H,#07H ;STROBE WR HIGH RET ; .END