;***************************************************************************** ; The timing is base on 8051(in 12MHz). ; Min instruction time is 1us. ;***************************************************************************** ; CHARACTER CONTROLLER ; HD44780, KS0066 Compatible ; RS: Register Select (0: Instruction, 1: Data) ; R_W: Read/Write Select (0: Write, 1: Read) ; EN: Data Latch (1->0 Latch in ) ;***************************************************************************** .SYMBOLS ;***************************************************************************** ; Hardware Setting ;***************************************************************************** RS REG P3.0 R_W REG P3.1 EN REG P3.2 CHAR_ADD EQU 7FH ;***************************************************************************** ORG 00H JMP START START: ;***************************************************************************** ; INITIALIZE ;***************************************************************************** INITIAL: CLR EN MOV A,#38H ;Function Set, 001 D/L-N F X X CALL WRITE_COMMAND_INI ;INITIAL SETTING ONCE MOV R3,#50 ;Set Counter1 = 50 DLP12: MOV R2,#255 ;Set Counter2 = 255 DLP11: DJNZ R2,DLP11 ;Waiting 50*256*2 > 4.1 ms DJNZ R3,DLP12 MOV A,#38H ;Function Set, 001 D/L-N F X X CALL WRITE_COMMAND_INI ;INITIAL SETTING TWICE MOV R2,#80 ;Set Counter = 80 DLP2: DJNZ R2,DLP2 ;Waiting 80*2 > 100us MOV A,#38H ;Function Set, 001 D/L-N F X X CALL WRITE_COMMAND_INI ;8bit ,2 Line ,5*8 Font MOV R2,#80 ;Set Counter = 80 DLP3: DJNZ R2,DLP3 ;Waiting 80*2 > 39us MOV A,#38H ;Function Set, 001 D/L-N F X X CALL WRITE_COMMAND ;8bit ,2 Line ,5*8 Font MOV A,#0CH ;Display ON/OFF, 0000-1 D C B CALL WRITE_COMMAND ;Display ON,Cursor&Blink OFF MOV A,#06H ;Entry Mode Set, 0000-01 I S CALL WRITE_COMMAND ;Increment & Shift OFF MOV A,#02H ;Return Home, 0000-001 X CALL WRITE_COMMAND MOV A,#01H ;Clear Display, 0000-0001 CALL WRITE_COMMAND ;Write "20H"to DDRAM CALL CGRAM ;Write Data to CGRAM ;***************************************************************************** ; Display 16*2 char Max ; Line1: 00H..0FH, Line2: 40H..4FH ;***************************************************************************** SHOW_CHAR: MOV DPTR,#NEWTEC MOV A,#80H ;COMMAND 1???-????(AC6~AC0) CALL WRITE_COMMAND ;Set display data RAM addr=00H MOV R1,#16 ;Set counter 16 SCLOOP1: XRL A,A ;Clear A MOVC A,@A+DPTR ;Get Data from DB(NEWTEC) CALL WRITE_DATA INC DPTR DJNZ R1,SCLOOP1 MOV A,#C0H ;COMMAND 1???-????(AC6~AC0) CALL WRITE_COMMAND ;Set display data RAM addr=40H MOV R1,#16 ;Set counter 16 SCLOOP2: XRL A,A ;Clear A MOVC A,@A+DPTR CALL WRITE_DATA INC DPTR DJNZ R1,SCLOOP2 JMP $ ;Main Program stop ;***************************************************************************** ; SET CG_RAM DATA, 4 Character Only (Total 8 character) ;***************************************************************************** CGRAM: MOV A,#40H ;COMMAND 01??-????(AC5~AC0) CALL WRITE_COMMAND ;SET CG_RAM ADDRESS 000000 MOV DPTR,#S_CHAR MOV R7,#32 ;WRITE 32 BYTE CGLOOP: MOV A,#00H MOVC A,@A+DPTR CALL WRITE_DATA INC DPTR DJNZ R7,CGLOOP RET ;***************************************************************************** CHK_BUSY: MOV P1,#FFH ;Set PORT1=INPUT PORT CLR RS SETB R_W SETB EN MOV C,P1.7 ;CHECK BUSY FLAGE(BIT7) CLR EN JC CHK_BUSY RET ;***************************************************************************** DELAY: MOV R4,#4 DLOOP1: MOV R5,#100 DLOOP2: MOV R6,#250 DLOOP3: DJNZ R6,DLOOP3 DJNZ R5,DLOOP2 DJNZ R4,DLOOP1 RET ;***************************************************************************** WRITE_COMMAND_INI: ;Can't check busy in initial CLR RS CLR R_W SETB EN MOV P1,A CLR EN RET ;***************************************************************************** WRITE_COMMAND: CALL CHK_BUSY CLR RS CLR R_W SETB EN MOV P1,A CLR EN RET ;***************************************************************************** WRITE_DATA: CALL CHK_BUSY SETB RS CLR R_W SETB EN MOV P1,A CLR EN RET ;***************************************************************************** READ_DATA: CALL CHK_BUSY SETB RS SETB R_W SETB EN MOV A,P1 CLR EN RET ;***************************************************************************** ; CGRAM DATA ;***************************************************************************** S_CHAR: DB 1FH,11H,11H,11H,11H,11H,11H,1FH ;00H DB 0AH,15H,0AH,15H,0AH,15H,0AH,15H ;01H DB 15H,0AH,15H,0AH,15H,0AH,15H,0AH ;02H DB FFH,FFH,FFH,FFH,FFH,FFH,FFH,FFH ;03H ;***************************************************************************** ; DISPLAY DATA ;***************************************************************************** NEWTEC: ;1234567890123456789012345678901234567890(40 Char Max.) DB ' Newtec Display ' DB 'LCM Manufacturer' END