( lcd.f 24apr08cht ) HEX ( Epson lcd controller commands ) 0CA CONSTANT DISCTL ( Display control) 0BB CONSTANT COMSCN ( Common scan direction) 0D1 CONSTANT OSCON ( Internal oscillation on) 0AF CONSTANT DISON ( Display on) 0AE CONSTANT DISOFF ( Display off) 094 CONSTANT SLPOUT ( Sleep out) 0A6 CONSTANT DISNOR ( Normal display) 081 CONSTANT VOLCTR ( Electronic volume control) 0A7 CONSTANT DISINV ( Inverse display) 075 CONSTANT PASET ( Page address set) 015 CONSTANT CASET ( Column address set) 0BC CONSTANT DATCTL ( Data scan direction( etc.) 05C CONSTANT RAMWR ( Writing to memory) 020 CONSTANT PWRCTR ( Power control) 025 CONSTANT NOOP ( NOP instruction) ( register addresses) : PIOA 0FFFFF400 + ; : PIOB 0FFFFF600 + ; 000 CONSTANT PIO_PER ( pio enable) 004 CONSTANT PIO_PDR ( pio disable) 010 CONSTANT PIO_OER ( output enable) 030 CONSTANT PIO_SODR ( set output data) 034 CONSTANT PIO_CODR ( clear output data) 038 CONSTANT PIO_ODSR ( output data status) 070 CONSTANT PIO_ASR ( peripheral A select) 074 CONSTANT PIO_BSR ( peripheral B select( 0A0 CONSTANT PIO_OWER ( output write enable) 0FFFE0000 CONSTANT SPI_CR ( spi control) 0FFFE0004 CONSTANT SPI_MR ( spi mode) 0FFFE000C CONSTANT SPI_TDR ( spi transmit data) 0FFFE0010 CONSTANT SPI_SR ( spi status) 0FFFE0030 CONSTANT SPI_CSR ( spi chip select 0) 0FFFFFC10 CONSTANT PMC_PCER ( peripheral clock enable) ( 2 pixel color definitions ) 0FFFFFF CONSTANT WHITE 0000000 CONSTANT BLACK 0F00F00 CONSTANT RED 00F00F0 CONSTANT GREEN 000F00F CONSTANT BLUE 00FF0FF CONSTANT CYAN 0F0FF0F CONSTANT MAGENTA 0FF0FF0 CONSTANT YELLOW 0B22B22 CONSTANT BROWN 0FA0FA0 CONSTANT ORANGE 0F6AF6A CONSTANT PINK ( 5x5 star in a 5x6 box ) CREATE STAR 00F00F , 00F00F , 00F00F , FFF00F , 00F00F , FFF00F , 00FFFF , FFFFFF , 00F00F , 00FFFF , FFFFFF , 00F00F , FFFFFF , FFFFFF , FFF00F , 00F00F , FFF00F , 00F00F , ( lcd_2.txt 25apr08cht ) HEX : DELAY ( n -- ) FOR NEXT ; : Backlight ( state -- ) IF PIO_SODR ELSE PIO_CODR THEN 100000 SWAP PIOB ! ; : WriteSpiCommand ( data -- ) BEGIN SPI_SR @ 200 AND UNTIL 0FF AND SPI_TDR ! ; : WriteSpiData ( data -- ) BEGIN SPI_SR @ 200 AND UNTIL 0100 OR SPI_TDR ! ; : InitSPI 0100000 DUP PIO_PER PIOB ! ( pb20 for lcd_bl ) DUP PIO_OER PIOB ! DUP PIO_OWER PIOB ! PIO_SODR PIOB ! 1004 DUP PIO_PER PIOA ! ( pa2 for lcd_reset ) DUP PIO_OER PIOA ! ( pa12 for cs_lcd ) DUP PIO_OWER PIOA ! PIO_SODR PIOA ! 071000 DUP PIO_PDR PIOA ! ( configure spi ) PIO_ASR PIOA ! 0 PIO_BSR PIOA ! 010 PMC_PCER ! 081 SPI_CR ! 001 SPI_CR ! 0E0011 SPI_MR ! 001010311 SPI_CSR ! ; : InitLCD InitSPI 4 PIO_CODR PIOB ! 5000 DELAY 4 PIO_SODR PIOB ! 5000 DELAY DISCTL WriteSpiCommand 00 WriteSpiData 20 WriteSpiData 00 WriteSpiData COMSCN WriteSpiCommand 01 WriteSpiData OSCON WriteSpiCommand SLPOUT WriteSpiCommand PWRCTR WriteSpiCommand 0F WriteSpiData DISINV WriteSpiCommand DATCTL WriteSpiCommand 01 WriteSpiData 00 WriteSpiData 02 WriteSpiData VOLCTR WriteSpiCommand 20 WriteSpiData 03 WriteSpiData 2800 DELAY DISON WriteSpiCommand ; : LCDmove ( addr count x1 y1 x2 y2-- ) PASET WriteSpiCommand ( send rows ) ROT WriteSpiData WriteSpiData CASET WriteSpiCommand ( send columns ) SWAP WriteSpiData WriteSpiData RAMWR WriteSpiCommand ( addr count ) FOR DUP @ ( get 2 pixels, send 3 bytes ) DUP 16RSHIFT WriteSpiData DUP 8RSHIFT WriteSpiData WriteSpiData CELL+ NEXT DROP NOOP WriteSpiCommand ; : rectangle ( x1 y1 x2 y2 color -- ) >R ROT 2DUP - ABS >R ( save height ) PASET WriteSpiCommand ( send rows ) WriteSpiData WriteSpiData SWAP 2DUP - ABS >R ( save width ) CASET WriteSpiCommand ( send columns ) WriteSpiData WriteSpiData RAMWR WriteSpiCommand R> 1+ R> 1+ * 1+ 2/ ( get pixel pairs ) R> SWAP ( color count ) FOR DUP 16RSHIFT WriteSpiData DUP 8RSHIFT WriteSpiData DUP WriteSpiData NEXT DROP NOOP WriteSpiCommand ; : LCDscreen ( color -- ) >R 0 0 83 83 R> rectangle ; : ShowStar ( x y -- ) PASET WriteSpiCommand ( send rows ) DUP WriteSpiData 5 + WriteSpiData CASET WriteSpiCommand ( send columns ) DUP WriteSpiData 5 + WriteSpiData RAMWR WriteSpiCommand STAR 11 FOR DUP @ ( get 2 pixels, send 3 bytes ) DUP 16RSHIFT WriteSpiData DUP 8RSHIFT WriteSpiData WriteSpiData CELL+ NEXT DROP NOOP WriteSpiCommand ; : 50Stars 15 ( y0 ) 4 FOR 3 ( x0 ) 5 FOR 2DUP SWAP ShowStar 0B + NEXT DROP 0A + NEXT DROP 1A ( y0 ) 3 FOR 8 ( x0 ) 4 FOR 2DUP SWAP ShowStar 0B + NEXT DROP 0A + NEXT DROP ; DECIMAL : USA WHITE LCDscreen 0 20 131 26 RED rectangle 0 34 131 40 RED rectangle 0 48 131 54 RED rectangle 0 62 131 68 RED rectangle 0 76 131 82 RED rectangle 0 90 131 96 RED rectangle 0 104 131 110 RED rectangle 0 20 65 68 BLUE rectangle 50Stars ; InitLCD USA