;THE experiment is to familiarity the use of 12864LCD ;12864LCD with the lib of chinese ;program to display a head of chairman mao ;the configration of hardware ;Please open RA4 pull UP, will S10'S NO.4 in the "on", jump J14 all connect. ;other all the switch and jumpers must disconnection. ;*****************THE definiens of register***************************** #include __CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC #define RS PORTA,5 ;COMMNAD/DATA SELECT #DEFINE RW PORTA,4 ;READ/WRITE SELECT #DEFINE E PORTA,3 ;ENABLE SIGNAL #DEFINE PSB PORTA,2 ;PARALLEL/SERIAL SELECT£¨H/L£© #DEFINE RST PORTA,0 ;RESET SIGNAL ;----------------------------------------------- LCD_X EQU 30H ;PAGE ADDRESS LCD_Y EQU 31H ;Y ADDRESS COUNT EQU 32H ;USED FOR LOOP COUNT COUNT1 EQU 33H ;USED FOR LOOP COUNT COUNT2 EQU 34H ;USED FOR LOOP COUNT COUNT3 EQU 35H POINT EQU 36H ;SEARCH TABLE OFFSET POINT1 EQU 37H ;SEARCH TABLE OFFSET POINT2 EQU 38H ;SEARCH TABLE OFFSET POINT3 EQU 40H TEMP EQU 39H ;TEMPORAY REGISTER TEMP1 EQU 3AH ;TEMPORAY REGISTER ;----------------------------------------------- ORG 0000H ;RESET ADDRESS NOP ;THE NOP INSTRUCTION NEEDED BY ICD GOTO MAIN ;JUMP TO MAIN PROGRAM ;**********************MAIN PROGRAM************************ MAIN BANKSEL TRISA CLRF TRISA ;DEFINE PORT A AS OUTPUT CLRF TRISD ;DEFINE PORT D AS OUTPUT BANKSEL ADCON1 MOVLW 06H MOVWF ADCON1 ;PORT A ARE ALL DIGITAL PORT CLRF STATUS BCF RST ;RESET LCD CALL DELAY ;DELAY FOR SOME TIME BSF RST ;CLEAR RESET SIGNAL NOP BSF PSB ;PARALLEL COMMUNICATION ;**************************INITIALIZATION ********************** MOVLW 30H ;BASIC INSTRUCTION OPERATION CALL SEND_I MOVLW 01H ;CLEAR DISPLAY CALL SEND_I MOVLW 06H ;APPOINT THE CURSOR¡®S MOVE DIRECTION WHEN RD/WR. CALL SEND_I MOVLW 0CH ;ENABLE DISPLAY, DISABLE CURSOR AND BLINK. CALL SEND_I ;***********************DISPLAY CHINESE ************************ HAN_WR2 CALL CLEAR_P ;CLEAR SCREEN HAN_WR2A CALL QUSHU GOTO $ ;************************PREPARE TO WRITE **************************** WR_ZB MOVLW 34H CALL SEND_I MOVFW LCD_Y ;Y ADDRESS CALL SEND_I MOVFW LCD_X ;PAGE ADDRESS CALL SEND_I MOVLW 30H CALL SEND_I RETURN ;***********************CLEAR SCREEN ******************************* CLEAR_P MOVLW 1H ;CLEAR DISPLAY CALL SEND_I RETURN ;***********************GET DATA AND DISPLAY PROGRAM*********************** QUSHU CLRF POINT ;THE LOW BYTE OF GET DATA ADDRESS CLRF POINT+1 ;THE HIGH BYTE OF GET DATA ADDRESS FOR (128/8)*64 DATA TOTAL CLRF POINT2 ;POINT'S TEMPARARY REGISTER CLRF POINT3 ;POINT+1'S TEMPARARY REGISTER MOVLW 02H ;the all screen composed by up/down 2 little screen and 32 lines/every little screen. MOVWF COUNT3 MOVLW 80H ;the start address of up screen. MOVWF LCD_X QUSHU1 MOVLW 80H ;the first byte's address every line. MOVWF LCD_Y MOVLW 20H ;every little scress include 32 lines. MOVWF COUNT2 QUSHU2 MOVLW 10H ;16 bytes every line. (16*8=128) MOVWF COUNT1 CALL WR_ZB ;call the pre-write subroutine. QUSHU3 CALL TAB1 ;search table CALL SEND_D ;write into the lcd's GDROM. CLRF POINT3 INCF POINT,1 ;offset added by 1 and search the next data. BTFSC STATUS,Z ;check the overflow of low byte. INCF POINT+1,1 ;if have,high byte added by one. DECFSZ COUNT1,1 ;check the finish of one line. GOTO QUSHU3 ;no, continue to write. INCF LCD_Y,1 ;yes, write the next line. DECFSZ COUNT2,1 ;check the finish of 32 lines. GOTO QUSHU2 ;no, continue. MOVLW 88H ;yes, write the down half screen. MOVWF LCD_X DECFSZ COUNT3,1 ;check the finish of down half screen. GOTO QUSHU1 ;no, continue. ;yes, open the display. MOVLW 36H ;extended instruction, enable the graphic display. CALL SEND_I MOVLW 30H ;basic instruction CALL SEND_I RETURN ;************************send data to LCD *********************** ;write data subroutine. ;RS=1,RW=0,E=high pulse ,D0-D7=data ;********************************************************** SEND_D MOVWF TEMP1 ;temporary save data CALL CHK_BUSY ;check the busy of line BSF RS BCF RW MOVFW TEMP1 MOVWF PORTD ;send data BSF E NOP NOP BCF E RETURN ;************************send command to lcd *********************** ;write instruction sub routine ;RS=0,RW=0,E=high pulse ,D0-D7=code of instruction ;********************************************************** SEND_I MOVWF TEMP1 ;temporary save data CALL CHK_BUSY ;check the busy of line BCF RS BCF RW MOVFW TEMP1 MOVWF PORTD ;send command BSF E NOP NOP BCF E RETURN ;************************;check the busy of line******************** ;test busy subroutine ;RS=0,RW=1,E=H,D0-D7=status byte ;********************************************************** CHK_BUSY BANKSEL TRISD MOVLW 0FFH MOVWF TRISD ;set port D as input CLRF STATUS MOVLW 0FFH MOVWF PORTD BCF RS BSF RW CHECK_BUSY_1 NOP NOP NOP BSF E NOP NOP NOP BTFSS PORTD,7 ;D7 high indicate busy,low idle. GOTO $+6 NOP NOP NOP BCF E GOTO CHECK_BUSY_1 BCF E BANKSEL TRISD CLRF TRISD ;set port d as output CLRF STATUS RETURN ;***************************delay subroutine *********************** DELAY MOVLW 0afH MOVWF 20H MOVLW 0ffh MOVWF 21H DECFSZ 21H,1 GOTO $-1 DECFSZ 20H,1 GOTO $-5 RETURN ;***************************delay subroutine 1 ************************ ;display blink used DELAY1 MOVLW 05H MOVWF 22H CALL DELAY DECFSZ 22H,1 GOTO $-2 RETURN ;***************************data table ************************* TAB1 MOVLW LOW(TAB1A) ;get the data table entry low byte. ADDWF POINT,0 ;add the low byte of data MOVWF POINT2 ;save into the point2 BTFSC STATUS,C ;check the overflow of low byte INCF POINT3,1 ;yes, high byte added by 1. MOVLW HIGH(TAB1A) ;get the data table entry high byte. ADDWF POINT3,0 ADDWF POINT+1,0 ;add the high byte of data MOVWF PCLATH ;prepare the higher 5 bit of PC. MOVFW POINT2 MOVWF PCL ;prepare the lower 8 bit of PC. TAB1A: ;data table DT 0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00 DT 0X18,0XFC,0XB7,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XE0,0X00,0X00 DT 0X1E,0X7F,0X0C,0X00,0X00,0X07,0XFF,0XFF,0X80,0X00,0X0F,0XF8,0X7F,0XE0,0X03,0XC0 DT 0X1F,0XE7,0X80,0X00,0X00,0X7F,0XFF,0XFF,0XC0,0X00,0X7F,0XE1,0XFF,0XE0,0X0C,0X60 DT 0X1F,0X9B,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XF0,0X01,0X80,0X07,0XFF,0XE0,0X0C,0X60 DT 0X1F,0XCF,0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XF8,0X01,0X00,0X1F,0XFF,0XE0,0X0C,0X60 DT 0X13,0XE4,0XF0,0X00,0X7F,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0XFF,0X0E,0X20,0X0C,0X60 DT 0X10,0XF0,0XF0,0X00,0XFF,0XFE,0XFF,0XFF,0XFF,0X00,0X00,0XF8,0X0E,0X20,0X0C,0X60 DT 0X1C,0X7C,0X38,0X01,0XEF,0XF4,0X0F,0XFF,0XFF,0X80,0X00,0X00,0X7F,0XE0,0X0C,0X60 DT 0X1F,0X1E,0X08,0X03,0X9F,0XC0,0X00,0XFE,0XFF,0XC0,0X00,0X07,0XFF,0XE0,0X0D,0X60 DT 0X1F,0X03,0X80,0X07,0X27,0X80,0X00,0X3F,0X3F,0XE0,0X00,0X7F,0XFF,0XE0,0X0D,0XE0 DT 0X1E,0XE0,0XC0,0X06,0X4F,0X00,0X00,0X3F,0XBF,0XF0,0X00,0XFE,0X1C,0X20,0X07,0XC0 DT 0X1F,0XF0,0X20,0X0E,0X4E,0X00,0X00,0X1F,0XCF,0XF8,0X00,0X00,0X7F,0XA0,0X00,0XC0 DT 0X1F,0XFE,0X00,0X0C,0X9C,0X00,0X00,0X0F,0XFF,0XF8,0X00,0X00,0X7F,0XE0,0X00,0XE0 DT 0X1F,0XFF,0X80,0X1D,0XF8,0X00,0X00,0X0F,0XF3,0XFC,0X00,0X3F,0X8E,0XE0,0X00,0X00 DT 0X1E,0X03,0X00,0X1F,0X78,0X00,0X00,0X07,0XC7,0XFC,0X00,0X0F,0X7F,0XA0,0X00,0X00 DT 0X1F,0X80,0X00,0X1B,0XF0,0X00,0X00,0X09,0XCF,0XFC,0X00,0X00,0X0F,0XE0,0X0F,0X00 DT 0X1F,0XFE,0X00,0X19,0XF0,0X00,0X00,0X07,0XC9,0XFE,0X00,0X07,0X1F,0XE0,0X06,0X00 DT 0X1F,0XFF,0XC0,0X0F,0XE0,0X00,0X00,0X03,0XC1,0XFE,0X00,0XFF,0XFF,0XE0,0X06,0X00 DT 0X1F,0XC0,0X40,0X0F,0XC0,0X00,0X00,0X03,0XE7,0XFE,0X00,0X9F,0XFF,0X20,0X06,0X00 DT 0X1F,0X00,0X00,0X0F,0XC0,0X00,0X00,0X07,0XE7,0XFC,0X00,0X0B,0XCF,0X20,0X06,0X00 DT 0X1F,0X78,0X00,0X0F,0XC0,0X00,0X00,0X07,0XE7,0XFC,0X00,0X00,0X0F,0XE0,0X06,0X00 DT 0X1F,0XFF,0X80,0X07,0XF0,0X00,0X00,0X03,0XEF,0XFC,0X00,0X00,0X3F,0XE0,0X06,0X00 DT 0X13,0XFF,0XE0,0X07,0XFE,0X01,0XE0,0X01,0XCF,0XFC,0X00,0X00,0X3F,0XE0,0X06,0X60 DT 0X1F,0XFC,0X00,0X07,0XE3,0X03,0XF8,0X06,0XDF,0XFC,0X00,0X1F,0XFE,0X60,0X06,0X60 DT 0X1F,0X80,0X00,0X03,0X80,0X80,0XC0,0X01,0XFF,0XF8,0X00,0X0F,0X3F,0XE0,0X0F,0XE0 DT 0X1C,0X00,0X00,0X01,0X80,0X41,0XC0,0X06,0XFF,0XF8,0X00,0X00,0XF3,0XE0,0X00,0X00 DT 0X13,0XFC,0X00,0X03,0XFC,0X41,0XFC,0X03,0X7F,0XF0,0X00,0X00,0X0F,0XE0,0X00,0X00 DT 0X1F,0XFF,0X00,0X03,0XFE,0X40,0XFF,0X00,0XFF,0XF0,0X00,0X07,0XFF,0XE0,0X07,0XC0 DT 0X1F,0XC0,0X00,0X02,0XF0,0X40,0XE1,0X00,0X78,0XF0,0X00,0X3C,0XFC,0X20,0X0C,0X60 DT 0X1E,0X00,0X00,0X02,0XC0,0XC0,0X60,0X00,0XF3,0X70,0X00,0X03,0XFF,0XE0,0X00,0X60 DT 0X10,0X00,0X00,0X02,0X00,0X80,0X60,0X00,0X67,0X30,0X00,0X00,0X7F,0XE0,0X00,0XC0 DT 0X17,0XFF,0X00,0X03,0X01,0X80,0X30,0X00,0XFC,0XB0,0X00,0X3F,0XCF,0XE0,0X01,0X80 DT 0X1F,0XFA,0X00,0X03,0X03,0X80,0X18,0X01,0XFC,0X70,0X00,0X3C,0X8F,0XE0,0X03,0X00 DT 0X1F,0XB0,0X00,0X03,0X0F,0X00,0X0C,0X02,0XFE,0X30,0X00,0X0D,0X3F,0X60,0X06,0X00 DT 0X1F,0X00,0X00,0X03,0X0F,0X00,0X04,0X05,0XEE,0X30,0X00,0X03,0XDF,0X20,0X0C,0X00 DT 0X1C,0X00,0X00,0X02,0X01,0X06,0X00,0X07,0XE3,0X30,0X01,0X00,0XDF,0XE0,0X0C,0X60 DT 0X10,0X1E,0X00,0X03,0X03,0X03,0X80,0X07,0XF1,0X30,0X00,0XE0,0X33,0XE0,0X0F,0XE0 DT 0X1F,0XEC,0X00,0X02,0X03,0X01,0XE0,0X09,0XF0,0X60,0X00,0X3C,0X8E,0X60,0X00,0X00 DT 0X1F,0X30,0X00,0X03,0X03,0X9D,0X30,0X13,0XFC,0X60,0X00,0X1F,0X3F,0XA0,0X00,0X00 DT 0X1F,0XC1,0X8C,0X02,0X81,0XF3,0X10,0X0F,0XF0,0XC0,0X03,0X87,0XC7,0XE0,0X03,0X80 DT 0X1A,0X06,0X30,0X03,0X03,0X80,0X08,0X13,0XE0,0XC0,0X00,0XE3,0XF1,0XE0,0X06,0XC0 DT 0X1C,0X1C,0X40,0X01,0X82,0X00,0X04,0X0F,0XE1,0X80,0X00,0X78,0XFE,0X60,0X0C,0X60 DT 0X13,0XF8,0X80,0X01,0X46,0X00,0X00,0X07,0XE3,0X00,0X00,0X3E,0X7F,0XE0,0X0C,0X60 DT 0X1F,0X63,0X00,0X01,0X8C,0X00,0X00,0X07,0XFE,0X00,0X00,0X0F,0X9F,0XE0,0X0D,0X60 DT 0X1F,0X8E,0X04,0X01,0X47,0XEE,0X00,0X07,0XFE,0X00,0X00,0X87,0XEF,0XE0,0X0D,0X60 DT 0X1E,0X3C,0X1C,0X00,0XA7,0XFF,0X8C,0X03,0XF8,0X00,0X00,0XC1,0XFF,0XE0,0X0C,0X60 DT 0X1F,0X78,0X38,0X00,0XC3,0X93,0X8E,0X07,0XF0,0X00,0X00,0X78,0X7F,0XE0,0X0C,0X60 DT 0X1F,0XF1,0X60,0X00,0XE3,0X80,0X06,0X07,0XF0,0X00,0X00,0X3A,0X1F,0XE0,0X06,0XC0 DT 0X1F,0XE1,0X40,0X00,0X13,0XC8,0X00,0X0B,0XF0,0X00,0X00,0X1E,0X13,0XE0,0X03,0X80 DT 0X17,0X8F,0X84,0X00,0X61,0XF8,0X00,0X17,0XF0,0X00,0X00,0X0F,0XB0,0XE0,0X00,0X00 DT 0X1F,0X1E,0X29,0X80,0X33,0X00,0X00,0X0F,0XFC,0X00,0X00,0X43,0XFD,0X60,0X00,0X00 DT 0X1E,0X7C,0X73,0X00,0X3A,0X10,0X00,0X0F,0XF4,0X00,0X00,0X21,0XFF,0XA0,0X03,0X80 DT 0X15,0XF8,0XE3,0X00,0X1E,0X18,0X00,0X1F,0XF6,0X00,0X00,0X18,0XFF,0XE0,0X06,0XC0 DT 0X1B,0XE1,0X86,0X00,0X1E,0X00,0X00,0X3F,0XE6,0X00,0X03,0X0E,0X7F,0XE0,0X0C,0X60 DT 0X1F,0XC7,0X8C,0X00,0X1E,0X00,0X00,0X7F,0XE7,0X00,0X03,0X85,0X1B,0XE0,0X0C,0X60 DT 0X1F,0X0F,0X39,0X20,0X07,0X00,0X01,0XFF,0XCF,0X00,0X01,0XC3,0XCD,0XE0,0X0D,0X60 DT 0X1E,0X3E,0X73,0X40,0X03,0X80,0X0F,0XFF,0X9F,0X80,0X00,0XF1,0XF0,0X60,0X0D,0X60 DT 0X18,0X7C,0XF6,0X20,0X01,0XE0,0X3F,0XFE,0X3F,0XE0,0X00,0X78,0XFE,0X60,0X0C,0X60 DT 0X11,0XFB,0XE6,0X40,0X01,0XFF,0XFF,0XFC,0X7F,0XFC,0X08,0X3C,0X7F,0XE0,0X0C,0X60 DT 0X1F,0XF7,0XFE,0X40,0X02,0XFF,0XFF,0XF9,0XFF,0XFF,0X00,0X0F,0X3F,0XE0,0X06,0XC0 DT 0X1F,0XFF,0XFC,0X88,0X06,0XFF,0XFD,0XF3,0XFF,0XFF,0XC1,0X8F,0X9F,0XE0,0X03,0X80 DT 0X1F,0XFF,0XB9,0X38,0X0E,0XFE,0X71,0XE7,0XFF,0XFF,0XE8,0XC3,0XEF,0XE0,0X00,0X00 DT 0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00 ;***************************source code ended************************ end