#include p16f877.inc __config h'3F32' ;TESTS MEMORY ON GAMEB MEM_CON EQU PORTE MEM_CON_TRIS EQU TRISE LATCH EQU 2 MEM_OE EQU 1 MEM_WE EQU 0 MEMOUT EQU 0X44 MEMIN EQU 0X45 MEM_ADDR EQU PORTB MEM_ADDR_TRIS EQU TRISB MEM_DATA EQU PORTD MEM_DATA_TRIS EQU TRISD LCD_CON EQU PORTC LCD_CON_TRIS EQU TRISC LCD_RESET EQU 1 LCD_DC EQU 0 LCD_SCE EQU 2 LCD_DATA EQU 0X46 DELAYT EQU 0X47 TEMP EQU 0X48 OFFSET EQU 0X49 MEM_PAGE EQU 0X4A GOTO STARTUP ORG 0X004 INTERUPT: MOVFW RCREG MOVWF MEMOUT CALL WRITE_MEM INCF MEM_ADDR,F MOVF MEM_ADDR,W ;CHEKC IF REACHED END BTFSC STATUS,Z CALL INC_PAGE MOVLW D'12' SUBWF MEM_PAGE,W BTFSC STATUS,Z GOTO DISPLAY_MEM RETFIE STARTUP: CALL DELAY_SPI ;-------SETUP ASYNC SERIAL PORT------ BSF STATUS,RP0 ;MEM_1 BSF TXSTA,BRGH ;HIGH SPEED BAUD BCF TXSTA,TX9 ;8 BIT TRANSMITION BCF TXSTA,SYNC ;ASYNCRONOUS MODE MOVLW D'64' MOVWF SPBRG ;SET BAUD TO 19200 (@ 20MHZ) BSF TRISC,6 ;ENABLE PORT BSF TRISC,7 BSF PIE1,RCIE ;ENABLE RECIVE INTERUPT BCF PIE1,TXIE ;DISABLE TRANSMIT INTERUPT BSF TXSTA,TXEN ;ENABLE TRANSMITION CLRF MEM_ADDR_TRIS CLRF MEM_CON_TRIS BCF LCD_CON_TRIS,LCD_RESET BCF LCD_CON_TRIS,LCD_DC BCF LCD_CON_TRIS,LCD_SCE BCF TRISC,5 ;-SPI CLK BCF TRISC,3 ;SPI DATA MOVLW 0X06 ;MAKE ALL PORTS DIGITAL NOT ANALOGU MOVWF ADCON1 BCF STATUS,RP0 ;MEM_0 BSF INTCON,PEIE ;ENALBLE PERIFERAL INTERUPTS BSF INTCON,GIE ;ENABLE ALL INTERUPTS BSF RCSTA,SPEN ;ENABLE SERIAL PORT BCF RCSTA,TX9 ;8 BIT MODE BSF RCSTA,CREN ;ENABLE RECEPTION ;------------------SETUP SPI-------- BSF STATUS,RP0 ;MEM_1 BSF SSPSTAT,CKE ;SETS TO SEND OF RISING EDGE OF CLK BCF STATUS,RP0 ;MEM_0 BCF SSPCON,CKP ;CLK NORMALY LOW BCF SSPCON,3 ;SET SPEED TO FSOC/4 (5MBPS) BCF SSPCON,2 BCF SSPCON,1 BCF SSPCON,0 BSF SSPCON,SSPEN ;ENABLE SPI ;----INITIATE LCD MODEULE-------------- BSF LCD_CON,LCD_RESET ;TURN OFF RESET BSF LCD_CON,LCD_SCE ;UN-SELECT LCD MOVLW 0x21 ; // LCD Extended Commands. MOVWF LCD_DATA CALL LCDSEND MOVLW 0xC8 ; // Set LCD Vop (Contrast). MOVWF LCD_DATA CALL LCDSEND MOVLW 0x06 ; // Set Temp coefficent. MOVWF LCD_DATA CALL LCDSEND MOVLW 0x13 ; // LCD bias mode 1:48. MOVWF LCD_DATA CALL LCDSEND MOVLW 0xcb ; // LCD CONTRAST MOVWF LCD_DATA CALL LCDSEND MOVLW 0x20 ; // LCD Standard Commands, Horizontal addressing mode. MOVWF LCD_DATA CALL LCDSEND MOVLW 0x0C ; // LCD in normal mode. MOVWF LCD_DATA CALL LCDSEND ;--SETUP DATA LATCH AND MEM CONTROL LINES--- BCF MEM_CON,LATCH CLRF MEM_ADDR NOP BSF MEM_CON,LATCH BCF MEM_CON,LATCH CLRF MEM_PAGE BSF MEM_CON,MEM_WE BCF MEM_CON,MEM_OE STAY ;call DISPLAY_MEM_LOOP GOTO STAY ;GOTO S1 INC_PAGE: INCF MEM_PAGE,F MOVFW MEM_PAGE MOVWF MEM_ADDR BSF MEM_CON,LATCH NOP BCF MEM_CON,LATCH CLRF MEM_ADDR RETURN ;************************* DISPLAY_MEM: CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS ;CALL DELAY_500NS CALL DELAY_250NS CALL DELAY_125NS CLRF MEM_PAGE CLRF MEM_ADDR ;GET TO FIRST MEM LOCATION BSF MEM_CON,LATCH NOP BCF MEM_CON,LATCH BCF LCD_CON,LCD_SCE ;SELECT CHIP NOP BSF LCD_CON,LCD_DC ;SELECT DATA DISPLAY_MEM_LOOP: MOVFW MEM_DATA MOVWF SSPBUF ;CALL DELAY_SPI INCF MEM_ADDR,F MOVLW D'84' SUBWF MEM_ADDR,W BTFSC STATUS,Z CALL INC_PAGE MOVLW D'6' SUBWF MEM_PAGE,W BTFSC STATUS,Z GOTO DISPLAY_MEM1 GOTO DISPLAY_MEM_LOOP ;************************** DISPLAY_MEM1: CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS ;CALL DELAY_1MS ;CALL DELAY_500NS ;CALL DELAY_125NS ;CALL DELAY_250NS CLRF MEM_ADDR ;GET TO FIRST MEM LOCATION DISPLAY_MEM_LOOP1: MOVFW MEM_DATA MOVWF SSPBUF ;CALL DELAY_SPI INCF MEM_ADDR,F MOVLW D'84' SUBWF MEM_ADDR,W BTFSC STATUS,Z CALL INC_PAGE MOVLW D'12' SUBWF MEM_PAGE,W BTFSC STATUS,Z GOTO DISPLAY_MEM GOTO DISPLAY_MEM_LOOP1 ;******************** FILLMEM: CLRF TEMP CLRF MEM_ADDR FILLMEM_LOOP: MOVFW TEMP MOVWF MEMOUT CALL WRITE_MEM INCF MEM_ADDR,F DECFSZ TEMP,F GOTO FILLMEM_LOOP CLRF OFFSET SCROLL: MOVLW B'10000000' ;SET TO(0,0) MOVWF LCD_DATA CALL LCDSEND MOVLW B'01000000' MOVWF LCD_DATA CALL LCDSEND INCF OFFSET,F MOVFW OFFSET MOVWF MEM_ADDR CLRF TEMP BCF LCD_CON,LCD_SCE ;SELECT CHIP NOP BSF LCD_CON,LCD_DC ;SELECT DATA SCROLL_LOOP INCF MEM_ADDR,F MOVFW MEM_DATA MOVWF SSPBUF CALL DELAY_SPI DECFSZ TEMP,F GOTO SCROLL_LOOP GOTO SCROLL S1: BCF LCD_CON,LCD_SCE ;SELECT CHIP NOP BSF LCD_CON,LCD_DC ;SELECT DATA CLRF LCD_DATA ;------------ S1_LOOP MOVFW LCD_DATA MOVWF SSPBUF CALL DELAY_SPI DECFSZ LCD_DATA,F GOTO S1_LOOP MOVLW D'248' MOVWF TEMP CLRF LCD_DATA S1_LOOP2 MOVFW LCD_DATA MOVWF SSPBUF CALL DELAY_SPI DECFSZ TEMP,F GOTO S1_LOOP2 CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CLRF LCD_DATA CLRF TEMP ;----------- S2_LOOP MOVFW LCD_DATA MOVWF SSPBUF CALL DELAY_SPI DECFSZ LCD_DATA,F GOTO S2_LOOP MOVLW D'248' MOVWF LCD_DATA S2_LOOP2 MOVFW LCD_DATA MOVWF SSPBUF CALL DELAY_SPI DECFSZ LCD_DATA,F GOTO S2_LOOP2 CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS CALL DELAY_1MS GOTO S1_LOOP WRITE_MEM: BCF MEM_CON,MEM_WE BSF STATUS,RP0 ;MEM_1 ;MAKE OUTPUT CLRF MEM_DATA_TRIS BCF STATUS,RP0 ;MEM_0 MOVFW MEMOUT MOVWF MEM_DATA BSF MEM_CON,MEM_OE BCF MEM_CON,MEM_OE BSF STATUS,RP0 ;MEM_1 ;MAKE INPUT MOVLW 0XFF MOVWF MEM_DATA_TRIS BCF STATUS,RP0 ;MEM_0 BSF MEM_CON,MEM_WE RETURN LCDSEND ;--------------SEND LCD COMMAND---------- BCF LCD_CON,LCD_SCE ;SELECT CHIP NOP NOP NOP NOP BCF LCD_CON,LCD_DC ;SELECT COMMAND MOVFW LCD_DATA MOVWF SSPBUF ;SEND DATA?/?..??? ;LCD_SEND_LOOP ; BTFSS PIR1,SSPIF ; GOTO LCD_SEND_LOOP CALL DELAY_1MS ;CALL DELAY_1MS ;CALL DELAY_1MS BSF LCD_CON,LCD_SCE ;UN-SELECT CHIP NOP NOP NOP NOP RETURN DELAY_1MS: MOVLW D'255' MOVWF DELAYT DELAY_1MS_1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_1MS_1 RETURN DELAY_500NS: MOVLW D'180' MOVWF DELAYT DELAY_500NS_1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_500NS_1 RETURN DELAY_250NS: MOVLW D'90' MOVWF DELAYT DELAY_250NS_1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_250NS_1 RETURN DELAY_125NS: MOVLW D'45' MOVWF DELAYT DELAY_125NS_1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_125NS_1 RETURN ;-------------- DELAY_SPI MOVLW D'5' MOVWF DELAYT DELAY_SPI_1 DECFSZ DELAYT,F GOTO DELAY_SPI_1 RETURN ;----------------- OUTPUT_DATA: CLRF MEM_ADDR OUTLOOP INCF MEM_ADDR,F MOVFW MEM_DATA MOVWF TXREG BSF STATUS,RP0 ;MEM_1 WAIT_LOOP: BTFSS TXSTA,TRMT GOTO WAIT_LOOP BCF STATUS,RP0 ;MEM_0 GOTO OUTLOOP END