; *********************************************** ; Aitendo LCD AD-12864-SPI test program ; Version 0.1 2010/09/14 ; By Minarai Shokunin ; *********************************************** ; INCLUDE P18F24J10.INC ; ********** ビット定義 *************** flag_z equ 2 lcd_rst equ 2 lcd_cs equ 1 lcd_a0 equ 3 lcd_sck equ 4 lcd_sdi equ 5 ; ********** 変数 ***************** work0 equ 0 work1 equ 1 work2 equ 2 lcd_x equ 3 ; to set column address to LCD (0-127) lcd_y equ 4 ; to set page address to LCD (0-7) ; ********* MACRO ***************** LCD_CMD macro command MOVLW command CALL LCD_CMD_WRITE ENDM LCD_DATA macro pixel_data MOVLW pixel_data CALL LCD_DATA_WRITE ENDM ; ******************************************** ; ******** BOOT ************************* ; ******************************************** ; ORG 0x0000 RESET_START: ;*** IO port setting MOVLW 0x00 MOVWF TRISB ;RB7-0 -> LCD control MOVLW 0xe7 MOVWF ADCON1 ;A/D未使用 ; MOVLW 0xff MOVWF PORTB ; LCD initializing CALL LCD_INIT ; Program starts here MOVLW 8 MOVWF work1 CLRF lcd_y CLRF lcd_x LOOP1: CALL LCD_XY_SET MOVLW 128/8 MOVWF work2 LOOP2: LCD_DATA B'00000001' LCD_DATA B'00000011' LCD_DATA B'00000111' LCD_DATA B'00001111' LCD_DATA B'00011111' LCD_DATA B'00111111' LCD_DATA B'01111111' LCD_DATA B'11111111' DECF work2,F BTFSS STATUS,flag_z GOTO LOOP2 INCF lcd_y,F DECF work1,F BTFSS STATUS,flag_z GOTO LOOP1 HALT_LOOP: HALT GOTO HALT_LOOP ;************************************************************************* ; LCD CONTROL ROUTINES ;************************************************************************* ; ***************************************** ; LCD Initializing ; Input:none, output: none ; WREG,work0 is used. ; LCD_INIT: CALL WAIT_100MS BCF PORTB,2 ; RST=L CALL WAIT_100MS CALL WAIT_100MS BSF PORTB,2 ; RST=H CALL WAIT_100MS LCD_CMD 0xaf ; initialization process from Aitendo web site LCD_CMD 0x2f LCD_CMD 0x81 LCD_CMD 0x00 LCD_CMD 0x27 LCD_CMD 0xa2 LCD_CMD 0xc8 LCD_CMD 0xa0 LCD_CMD 0xa4 LCD_CMD 0xa6 LCD_CMD 0xac LCD_CMD 0x00 LCD_CMD 0x40 LCD_CMD 0xe0 LCD_CMD 0xb0 LCD_CMD 0x10 RETURN ; ***************************************** ; LCD Column/page set ; Input:lcd_x,lcd_y , output: none ; WREG,work0 is used. ; LCD_XY_SET: MOVF lcd_x,W ANDLW 0x0f CALL LCD_CMD_WRITE ; set a3-a0 SWAPF lcd_x,W ANDLW 0x0f IORLW 0x10 CALL LCD_CMD_WRITE ; set a7-a4 MOVF lcd_y,W ANDLW 0x07 IORLW 0xb0 CALL LCD_CMD_WRITE ; set y3-y0 RETURN ; ***************************************** ; LCD REGISTER WRITE ; Input:WREG (Not changed), output: none ; work0 is used. ; LCD_CMD_WRITE: MOVWF work0 BCF PORTB,lcd_a0 ; A0 = 0 BCF PORTB,lcd_cs ; CS = 0 ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,7 ; bit 7 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,6 ; bit 6 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,5 ; bit 5 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,4 ; bit 4 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,3 ; bit 3 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,2 ; bit 2 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,1 ; bit 1 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,0 ; bit 0 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BSF PORTB,1 ; CS = H ; RETURN ; ***************************************** ; LCD DATA WRITE ; Input:WREG (Not changed), output: none ; work0 is used. ; LCD_DATA_WRITE: MOVWF work0 BSF PORTB,lcd_a0 ; A0 = 1 BCF PORTB,lcd_cs ; CS = 0 ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,7 ; bit 7 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,6 ; bit 6 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,5 ; bit 5 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,4 ; bit 4 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,3 ; bit 3 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,2 ; bit 2 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,1 ; bit 1 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BCF PORTB,lcd_sdi ; DATA =L BTFSC work0,0 ; bit 0 check BSF PORTB,lcd_sdi BCF PORTB,lcd_sck ; CLK=L BSF PORTB,lcd_sck ; CLK=H ; BSF PORTB,1 ; CS = H ; RETURN ; ******** WAIT ROUTINES ***************************** ; WAIT_50US: MOVLW 1 MOVWF work1 WAIT_50US_2 MOVLW 83 MOVWF work2 WAIT_50US_1 DECFSZ work2 GOTO WAIT_50US_1 DECFSZ work1 GOTO WAIT_50US_2 RETURN ; WAIT_100US: MOVLW 1 MOVWF work1 WAIT_100US_2 MOVLW 166 MOVWF work2 WAIT_100US_1 DECFSZ work2 GOTO WAIT_100US_1 DECFSZ work1 GOTO WAIT_100US_2 RETURN ; WAIT_MS: MOVLW 10 MOVWF work1 WAIT_MS_2 MOVLW 166 MOVWF work2 WAIT_MS_1 DECFSZ work2 GOTO WAIT_MS_1 DECFSZ work1 GOTO WAIT_MS_2 RETURN ; WAIT_10MS: MOVLW 100 MOVWF work1 WAIT_10MS_2 MOVLW 166 MOVWF work2 WAIT_10MS_1 DECFSZ work2 GOTO WAIT_10MS_1 DECFSZ work1 GOTO WAIT_10MS_2 RETURN WAIT_100MS: CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS CALL WAIT_10MS RETURN WAIT_1S: CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS CALL WAIT_100MS RETURN EN