fl { 128x64 LCD with SPI(controller:ST7567) 2015/02/09 12:42:59 LCD(128x64) Propeller CS ----- P0 SDA ----- P1 SCLK ----- P2 A0 ----- P3 RST ----- P5 3.3V ----- 3.3V 0V ----- 0V The read functions is not available in serial interface mode. } \ 128x64dots buffer[128x64/8bytes] \ Execute before loading this file { reboot ... ... Prop0 Cog6 ok variable buffer d508 allot Prop0 Cog6 ok buffer . 17608 Prop0 Cog6 ok d17608 d1024 + here W! Prop0 Cog6 ok } \ =========================================================================== \ 8X8 Font Characters \ =========================================================================== wvariable Font -2 allot h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h06 c, h5F c, h5F c, h06 c, h00 c, h00 c, h00 c, h00 c, h03 c, h07 c, h00 c, h07 c, h03 c, h00 c, h00 c, h14 c, h7F c, h7F c, h14 c, h7F c, h7F c, h14 c, h00 c, h24 c, h2E c, h2A c, h6B c, h6B c, h3A c, h12 c, h00 c, h46 c, h66 c, h30 c, h18 c, h0C c, h66 c, h62 c, h00 c, h30 c, h7A c, h4F c, h5D c, h37 c, h7A c, h48 c, h00 c, h00 c, h04 c, h07 c, h03 c, h00 c, h00 c, h00 c, h00 c, h00 c, h1C c, h3E c, h63 c, h41 c, h00 c, h00 c, h00 c, h00 c, h41 c, h63 c, h3E c, h1C c, h00 c, h00 c, h00 c, h08 c, h2A c, h3E c, h1C c, h1C c, h3E c, h2A c, h08 c, h08 c, h08 c, h3E c, h3E c, h08 c, h08 c, h00 c, h00 c, h00 c, h80 c, hE0 c, h60 c, h00 c, h00 c, h00 c, h00 c, h08 c, h08 c, h08 c, h08 c, h08 c, h08 c, h00 c, h00 c, h00 c, h00 c, h60 c, h60 c, h00 c, h00 c, h00 c, h00 c, h60 c, h30 c, h18 c, h0C c, h06 c, h03 c, h01 c, h00 c, h3E c, h7F c, h41 c, h49 c, h41 c, h7F c, h3E c, h00 c, h40 c, h42 c, h7F c, h7F c, h40 c, h40 c, h00 c, h00 c, h62 c, h73 c, h59 c, h49 c, h6F c, h66 c, h00 c, h00 c, h22 c, h63 c, h49 c, h49 c, h7F c, h36 c, h00 c, h00 c, h18 c, h1C c, h16 c, h53 c, h7F c, h7F c, h50 c, h00 c, h27 c, h67 c, h45 c, h45 c, h7D c, h39 c, h00 c, h00 c, h3C c, h7E c, h4B c, h49 c, h79 c, h30 c, h00 c, h00 c, h03 c, h03 c, h71 c, h79 c, h0F c, h07 c, h00 c, h00 c, h36 c, h7F c, h49 c, h49 c, h7F c, h36 c, h00 c, h00 c, h06 c, h4F c, h49 c, h69 c, h3F c, h1E c, h00 c, h00 c, h00 c, h00 c, h66 c, h66 c, h00 c, h00 c, h00 c, h00 c, h00 c, h80 c, hE6 c, h66 c, h00 c, h00 c, h00 c, h00 c, h08 c, h1C c, h36 c, h63 c, h41 c, h00 c, h00 c, h00 c, h24 c, h24 c, h24 c, h24 c, h24 c, h24 c, h00 c, h00 c, h00 c, h41 c, h63 c, h36 c, h1C c, h08 c, h00 c, h00 c, h02 c, h03 c, h51 c, h59 c, h0F c, h06 c, h00 c, h00 c, h3E c, h7F c, h41 c, h5D c, h5D c, h1F c, h0E c, h00 c, h7C c, h7E c, h13 c, h13 c, h7E c, h7C c, h00 c, h00 c, h41 c, h7F c, h7F c, h49 c, h49 c, h7F c, h36 c, h00 c, h1C c, h3E c, h63 c, h41 c, h41 c, h63 c, h22 c, h00 c, h41 c, h7F c, h7F c, h41 c, h63 c, h3E c, h1C c, h00 c, h41 c, h7F c, h7F c, h49 c, h5D c, h41 c, h63 c, h00 c, h41 c, h7F c, h7F c, h49 c, h1D c, h01 c, h03 c, h00 c, h1C c, h3E c, h63 c, h41 c, h51 c, h73 c, h72 c, h00 c, h7F c, h7F c, h08 c, h08 c, h7F c, h7F c, h00 c, h00 c, h00 c, h41 c, h7F c, h7F c, h41 c, h00 c, h00 c, h00 c, h30 c, h70 c, h40 c, h41 c, h7F c, h3F c, h01 c, h00 c, h41 c, h7F c, h7F c, h08 c, h1C c, h77 c, h63 c, h00 c, h41 c, h7F c, h7F c, h41 c, h40 c, h60 c, h70 c, h00 c, h7F c, h7F c, h0E c, h1C c, h0E c, h7F c, h7F c, h00 c, h7F c, h7F c, h06 c, h0C c, h18 c, h7F c, h7F c, h00 c, h1C c, h3E c, h63 c, h41 c, h63 c, h3E c, h1C c, h00 c, h41 c, h7F c, h7F c, h49 c, h09 c, h0F c, h06 c, h00 c, h1E c, h3F c, h21 c, h71 c, h7F c, h5E c, h00 c, h00 c, h41 c, h7F c, h7F c, h09 c, h19 c, h7F c, h66 c, h00 c, h26 c, h6F c, h49 c, h49 c, h7B c, h32 c, h00 c, h00 c, h03 c, h41 c, h7F c, h7F c, h41 c, h03 c, h00 c, h00 c, h7F c, h7F c, h40 c, h40 c, h7F c, h7F c, h00 c, h00 c, h1F c, h3F c, h60 c, h60 c, h3F c, h1F c, h00 c, h00 c, h7F c, h7F c, h30 c, h18 c, h30 c, h7F c, h7F c, h00 c, h61 c, h73 c, h1E c, h0C c, h1E c, h73 c, h61 c, h00 c, h07 c, h4F c, h78 c, h78 c, h4F c, h07 c, h00 c, h00 c, h47 c, h63 c, h71 c, h59 c, h4D c, h67 c, h73 c, h00 c, h00 c, h7F c, h7F c, h41 c, h41 c, h00 c, h00 c, h00 c, h01 c, h03 c, h06 c, h0C c, h18 c, h30 c, h60 c, h00 c, h00 c, h41 c, h41 c, h7F c, h7F c, h00 c, h00 c, h00 c, h08 c, h0C c, h06 c, h03 c, h06 c, h0C c, h08 c, h00 c, h80 c, h80 c, h80 c, h80 c, h80 c, h80 c, h80 c, h80 c, h00 c, h00 c, h01 c, h03 c, h06 c, h04 c, h00 c, h00 c, h20 c, h74 c, h54 c, h54 c, h3C c, h78 c, h40 c, h00 c, h41 c, h7F c, h3F c, h48 c, h48 c, h78 c, h30 c, h00 c, h38 c, h7C c, h44 c, h44 c, h6C c, h28 c, h00 c, h00 c, h30 c, h78 c, h48 c, h49 c, h3F c, h7F c, h40 c, h00 c, h38 c, h7C c, h54 c, h54 c, h5C c, h18 c, h00 c, h00 c, h48 c, h7E c, h7F c, h49 c, h03 c, h02 c, h00 c, h00 c, h98 c, hBC c, hA4 c, hA4 c, hF8 c, h7C c, h04 c, h00 c, h41 c, h7F c, h7F c, h08 c, h04 c, h7C c, h78 c, h00 c, h00 c, h44 c, h7D c, h7D c, h40 c, h00 c, h00 c, h00 c, h60 c, hE0 c, h80 c, h80 c, hFD c, h7D c, h00 c, h00 c, h41 c, h7F c, h7F c, h10 c, h38 c, h6C c, h44 c, h00 c, h00 c, h41 c, h7F c, h7F c, h40 c, h00 c, h00 c, h00 c, h7C c, h7C c, h08 c, h38 c, h0C c, h7C c, h78 c, h00 c, h7C c, h7C c, h04 c, h04 c, h7C c, h78 c, h00 c, h00 c, h38 c, h7C c, h44 c, h44 c, h7C c, h38 c, h00 c, h00 c, h84 c, hFC c, hF8 c, hA4 c, h24 c, h3C c, h18 c, h00 c, h18 c, h3C c, h24 c, hA4 c, hF8 c, hFC c, h84 c, h00 c, h44 c, h7C c, h78 c, h4C c, h04 c, h1C c, h18 c, h00 c, h48 c, h5C c, h54 c, h54 c, h74 c, h24 c, h00 c, h00 c, h00 c, h04 c, h3E c, h7F c, h44 c, h24 c, h00 c, h00 c, h3C c, h7C c, h40 c, h40 c, h3C c, h7C c, h40 c, h00 c, h1C c, h3C c, h60 c, h60 c, h3C c, h1C c, h00 c, h00 c, h3C c, h7C c, h60 c, h38 c, h60 c, h7C c, h3C c, h00 c, h44 c, h6C c, h38 c, h10 c, h38 c, h6C c, h44 c, h00 c, h9C c, hBC c, hA0 c, hA0 c, hFC c, h7C c, h00 c, h00 c, h4C c, h64 c, h74 c, h5C c, h4C c, h64 c, h00 c, h00 c, h08 c, h08 c, h3E c, h77 c, h41 c, h41 c, h00 c, h00 c, h00 c, h00 c, h7F c, h7F c, h00 c, h00 c, h00 c, h00 c, h41 c, h41 c, h77 c, h3E c, h08 c, h08 c, h00 c, h00 c, h02 c, h03 c, h01 c, h03 c, h02 c, h03 c, h01 c, h00 c, h4C c, h5E c, h73 c, h01 c, h73 c, h5E c, h4C c, h00 c, \ ------------------------------------------------------- \ Constants \ ------------------------------------------------------- 0 wconstant _cs 1 wconstant _sda 2 wconstant _sclk 3 wconstant _a0 4 wconstant _rst \ --- command --- hAF wconstant DispOn \ Display ON hAE wconstant DispOff \ Display OFF h40 wconstant Set_Line \ Set start Line hB0 wconstant Set_Page \ Set Page Address h10 wconstant Set_Col_MSB \ Set Column Address(MSB) h00 wconstant Set_Col_LSB \ Set Column Address(LSB) hA0 wconstant SEG_dir \ SEG Direction hA6 wconstant Normal \ Normal Display hA7 wconstant Inverse \ Inverse Display hA4 wconstant Pixel_off \ Normal Display hA5 wconstant Pixel_on \ All Pixel On hA2 wconstant Bias \ Bias Select hE0 wconstant R_M_W \ Read-modify-Write hEE wconstant END \ End "Read-modify-Write" hE2 wconstant soft_RST \ Reset hC0 wconstant COM_dir \ COM Direction h2F wconstant PWR_ctl \ Power Control(VB=VR=VF=1) h20 wconstant reguration \ Reguration Ratio h81 wconstant Set_EV \ Set EV hF8 wconstant Set_boost hE3 wconstant NOP 0 wconstant data 1 wconstant command \ ------------------------------------------------------- \ Variables \ ------------------------------------------------------- wvariable page wvariable row_in_page wvariable column wvariable char_x wvariable char_y \ ------------------------------------------------------- \ Main \ ------------------------------------------------------- \ Power off \ ( -- ) : poweroff _rst pinlo 100 delms _rst pinhi d250 delms ; \ Write data/command to ST7567 \ ( n1 n2 -- ) n1:value n2:data/command : wr_st7567 \ Set cs to lo _cs pinlo \ Set A0 to lo if command if _a0 pinlo \ command else _a0 pinhi \ data then h80 8 0 do _sclk pinlo \ Set sclk to lo 2dup and if _sda pinhi \ Set sda to hi else _sda pinlo \ Set sda to lo then _sclk pinhi \ Set sclk to hi 1 rshift \ next bit loop 2drop _cs pinhi ; \ Adjustment for contrast \ Write value to Set_EV \ ( n1 -- ) n1:value : contrast Set_EV command wr_st7567 command wr_st7567 ; \ Initialize LCD(128x64) \ ( -- ) : init_LCD soft_RST command wr_st7567 Bias 1 or command wr_st7567 SEG_dir command wr_st7567 COM_dir 8 or command wr_st7567 reguration 4 or command wr_st7567 d25 contrast PWR_ctl command wr_st7567 Set_Line command wr_st7567 Set_Page command wr_st7567 Set_Col_MSB command wr_st7567 Set_Col_LSB command wr_st7567 \ When writing "1", dot is black.[Background:white] Pixel_off command wr_st7567 Inverse command wr_st7567 \ When writing "1", dot is white.[Background:black] { Pixel_off command wr_st7567 Normal command wr_st7567 } ; \ Write 1-character[8x8] to buffer \ 8x8-FONT on (0,0)-(15,7)[char_x,char_y] \ ( n1 n2 n3 -- ) n1:character n2:x-position[0 - 15] n3:y-position[0 - 7] : lcd_char_8x8 d128 u* \ y * 128 swap 8 u* \ x * 8 + buffer + \ Get buffer's address swap \ ( buffer-address character ) \ Get 8x8-character h20 - 8 u* Font + \ Get Font address \ Copy character to buffer \ ( buffer-address Font-address ) 8 0 do 2dup \ ( buffer-address Font-address buffer-address Font-address ) C@ swap C! \ Copy font-data to buffer 1+ swap 1+ swap \ ( buffer-address+1 Font-address+1 ) loop 2drop ; \ Print 1-character and update only char_x \ ( n1 -- ) n1:character code : print char_x W@ char_y W@ lcd_char_8x8 \ update char_x char_x W@ 1+ char_x W! ; \ Display string to LCD(128x64dots) \ Always display only 1-line \ ( cstr -- ) : lcd_string C@++ dup if bounds do i C@ print loop else 2drop then ; \ Clear buffer and DDRAM \ ( -- ) : clr_scrn \ Clear buffer d256 0 do 0 i 4 u* buffer + L! loop \ Clear DDRAM 8 0 do i Set_Page or command wr_st7567 Set_Col_MSB command wr_st7567 Set_Col_LSB command wr_st7567 d128 0 do 0 data wr_st7567 loop loop ; \ Copy buffer to LCD's DDRAM \ ( -- ) : disp_LCD buffer 8 0 do i Set_Page or command wr_st7567 Set_Col_MSB command wr_st7567 Set_Col_LSB command wr_st7567 d128 0 do dup \ ( buffer buffer ) C@ data wr_st7567 \ ( buffer ) 1+ \ ( buffer+1 ) loop loop drop ; \ Display 8x8font \ ( -- ) : demo1 \ initial setiing _cs 5 0 do dup dup pinhi pinout 1+ loop drop \ Set pin to output and to hi _rst pinlo _rst pinhi \ Reset chip init_LCD \ Initialize ST7567 clr_scrn \ Clear buffer and DDRAM DispOn command wr_st7567 \ Display on 0 char_x W! 0 char_y W! h20 begin dup char_x W@ char_y W@ lcd_char_8x8 \ Update char_x char_x W@ 1+ dup d16 = if drop 0 \ Update char_y char_y W@ 1+ dup 8 = if drop 0 then char_y W! then char_x W! 1+ dup d128 = if drop h20 then \ Copy buffer to DDRAM disp_LCD fkey? swap drop until drop ; \ Display string and move it down \ ( -- ) : demo2 clr_scrn \ Clear buffer and DDRAM 0 char_x W! 0 char_y W! c" propforth5.5" lcd_string disp_LCD d63 begin 1- dup Set_Line or command wr_st7567 dup 0= if drop d63 then d100 delms fkey? swap drop until drop ;