serial i/f and busy flag check added for st7920
Code:'****************************************************************'* Name : ST7920-LCD_DEMO.PBP * '* Author : RICHARD * ' * '* Date : 4/8/2017 * '* Version : 1.0 * '* Notes : pic18f26k22 * '* : ST7920-LCD 128X64 * '**************************************************************** #CONFIG CONFIG FOSC = INTIO67 CONFIG PLLCFG = ON CONFIG PRICLKEN = ON CONFIG FCMEN = OFF CONFIG IESO = OFF CONFIG PWRTEN = ON CONFIG BOREN = SBORDIS CONFIG BORV = 190 CONFIG WDTEN = OFF CONFIG WDTPS = 32768 CONFIG CCP2MX = PORTC1 CONFIG PBADEN = OFF CONFIG CCP3MX = PORTB5 CONFIG T3CMX = PORTC0 CONFIG HFOFST = ON CONFIG P2BMX = PORTB5 CONFIG MCLRE = EXTMCLR CONFIG STVREN = ON CONFIG LVP = OFF CONFIG XINST = OFF CONFIG DEBUG = OFF CONFIG CP0 = OFF CONFIG CP1 = OFF CONFIG CP2 = OFF CONFIG CP3 = OFF CONFIG CPB = OFF CONFIG CPD = OFF CONFIG WRT0 = OFF CONFIG WRT1 = OFF CONFIG WRT2 = OFF CONFIG WRT3 = OFF CONFIG WRTC = OFF CONFIG WRTB = OFF CONFIG WRTD = OFF CONFIG EBTR0 = OFF CONFIG EBTR1 = OFF CONFIG EBTR2 = OFF CONFIG EBTR3 = OFF CONFIG EBTRB = OFF #ENDCONFIG DEFINE OSC 64 #DEFINE colours 1 ;1 mono 2 rg or 3 rgb width con 128 ; height con 64 ; 'use serial i/f #define stserial 1 include "grx.pbpMOD" include "st7920.pbpmod" include "font.bas" include "bignum.bas" include "bigchr.bas" BUFF VAR BYTE[32] ani_h var word bank0 ani_r var byte ani_c var byte OSCCON=$70 OSCTUNE.6=1 while ! osccon2.7 :WEND ;wait for pll ANSELB=0 ANSELC=0 ANSELA=0 trisc = %11010101 ;cs,sck,sdo are output gosub st7920_init 'graphic mode SETFONT FONT5x7 gosub grf_clr ani_r=%10101011 ARRAYWRITE BUFF,[bin8 ani_r ,0] DMDSTR 3,4,buff,1 for ani_c=0 to 7 ani_h=ani_h<<2 if ani_r.7 then ani_h=ani_h+3 ani_r=ani_r<<1 next ARRAYWRITE BUFF,[bin16 ani_h ,0] DMDSTR 3,12,buff,1 ani_r=%10101011 ARRAYWRITE BUFF,[bin8 ani_r ,0] DMDSTR 3,20,buff,1 X VAR WORD x = ani_r; x = (x ^ (x << 4)) & $0f0f; x = (x ^ (x << 2)) & $3333; x = (x ^ (x << 1)) & $5555; ani_h = x | (x << 1); ARRAYWRITE BUFF,[bin16 ani_h ,0] DMDSTR 3,28,buff,1 gosub show stopCode:'****************************************************************'* Name : st7920.pbpmod * '* Author : richard * '* Notice : Copyright (c) 2021 caveat emptor * '* : All Rights Reserved * '* Date : 23/10/2021 * '* Version : 1.0 * '* Notes : R/W NOT USED, HAS FRAME BUFFER INSTEAD * '* : LEVERAGES PBP LCD ROUTINES * '**************************************************************** 'SCREEN MAP 128X64 'ROW COLUMNS [WORDS] ' 0 | 0 1... 6 7 ' . | ' . | ' . | ' 30| ' 31| 0 1... 6 7 ' 0 | 8 9...14 15 ' . | ' . | ' 30| ' 31| 8 9...14 15 ' usual LCD defines are used eg ' DEFINE LCD_BITS 4 'defines the number of data interface lines (4 or 8) ' DEFINE LCD_DREG PORTB 'defines the port where data lines are connected to ' DEFINE LCD_DBIT 0 'defines the position of data lines for 4-bit interface (0 or 4) ' DEFINE LCD_RSREG PORTB 'defines the port where RS line is connected to ' DEFINE LCD_RSBIT 6 'defines the pin where RS line is connected to ' DEFINE LCD_EREG PORTB 'defines the port where E line is connected to ' DEFINE LCD_EBIT 4 'defines the pin where E line is connected ' DEFINE LCD_COMMANDUS 1000 'defines the delay after LCDOUT statement ' DEFINE LCD_DATAUS 40 'delay in micro seconds ' DEFINE LCD_RWREG PORTB ' LCD read/write port ' DEFINE LCD_RWBIT 5 ' LCD read/write pin bit ''END of LCD DEFINES st7920_page var byte st7920_gli var byte st7920_inx var word st7920_tmx var word st7920_lfx var word st7920_bf var byte goto overst7920 #ifndef stserial '4 or 8 bit parallel normsl pbp lcd defs st7920_init: lcdout $FE,$24 'In same instruction cannot alter DL, RE and G at once. Make sure that change DL or G first and then RE. lcdout $FE,$26 bgcolour = 0 colour = 1 return st7920_send: 'd in R3 @ L?CALL lcdsend return st7920_busy: TRISB=TRISB&240 ASM MOVLW 0X0F IORWF LCD_DREG+0X12,F bsf LCD_RWREG ,LCD_RWBIT NOP bcf LCD_RSREG ,LCD_RSBIT NOP bsf LCD_EREG ,LCD_EBIT NOP NOP NOP NOP MOVFF LCD_DREG ,_st7920_bf MOVF LCD_DREG,W BANKSEL _st7920_bf MOVWF _st7920_bf bcf LCD_EREG ,LCD_EBIT NOP NOP NOP NOP bsf LCD_EREG ,LCD_EBIT NOP NOP NOP NOP bcf LCD_EREG ,LCD_EBIT NOP NOP NOP NOP bsf LCD_RSREG ,LCD_RSBIT bcf LCD_RWREG ,LCD_RWBIT NOP NOP MOVLW 0XF0 ANDWF LCD_DREG+0X12,F BANKSEL 0 ENDASM RETURN setxy: GOSUB st7920_busy IF st7920_bf.3 THEN GOTO setxy ASM MOVLW 128 BANKSEL _st7920_gli IORWF _st7920_gli,W BANKSEL R3 MOVWF R3 bcf LCD_RSREG ,LCD_RSBIT MOVE?CT 1,FLAGS ,0 L?CALL _st7920_send MOVLW 128 BANKSEL _st7920_page IORWF _st7920_page,W BANKSEL R3 MOVWF R3 bcf LCD_RSREG ,LCD_RSBIT MOVE?CT 1,FLAGS ,0 L?CALL _st7920_send BANKSEL 0 ENDASM return senddat16: GOSUB st7920_busy IF st7920_bf.3 THEN GOTO setxy asm MOVE?BB _st7920_tmx ,R3 bsf LCD_RSREG ,LCD_RSBIT MOVE?CT 1,FLAGS ,0 L?CALL _st7920_send bsf LCD_RSREG ,LCD_RSBIT MOVE?BB _st7920_tmx+1 ,R3 MOVE?CT 1,FLAGS ,0 L?CALL _st7920_send BANKSEL 0 ENDASM return show: 'SEE MAP for st7920_GLi = 0 to 31 st7920_page = 0 gosub setxy st7920_inx = st7920_gli*16 for st7920_page = 0 TO 7 ;IS WORDS 0-7 IN TOP HALF st7920_tmx.lowbyte = fbr[st7920_inx] REV 8 st7920_inx = st7920_inx + 1 st7920_tmx.highbyte = fbr[st7920_inx] REV 8 st7920_inx = st7920_inx + 1 gosub senddat16 next st7920_inx = st7920_gli*16+512 for st7920_page = 0 TO 7 ;IS WORDS 8-15 IN BOTTOM HALF st7920_tmx.lowbyte = fbr[st7920_inx] REV 8 st7920_inx = st7920_inx + 1 st7920_tmx.highbyte = fbr[st7920_inx] REV 8 st7920_inx = st7920_inx + 1 gosub senddat16 next next return ;spi #else st7920_dat var byte 'spi pins used st7920_cs var latc.1 'st7920_sck is latc.3 'st7920_sdi is latc.4 'st7920_sdo is latc.5 st7920_init: SSP1CON1=$22 ;$22 fastest that works @64m SSP1STAT=$40 st7920_cs=1 st7920_dat = %00001100 gosub ST7920Command st7920_cs=0 pause 20 st7920_cs=1 st7920_dat = %00100100 ; //EXTENDED INSTRUCTION SET gosub ST7920Command st7920_dat = %00100110 ; //EXTENDED INSTRUCTION SET gosub ST7920Command st7920_cs=0 bgcolour = 0 colour = 1 return setxy: st7920_dat = st7920_gli| 128 gosub ST7920Command st7920_dat = st7920_page| 128 gosub ST7920Command return ST7920Data: PIR1.3=0 SSP1BUF = %11111010 WHILE !PIR1.3 : wend PIR1.3=0 SSP1BUF = (st7920_dat & %11110000) WHILE !PIR1.3 : wend PIR1.3=0 SSP1BUF = (st7920_dat<< 4) WHILE !PIR1.3 : wend pauseus 50 return ST7920Command: PIR1.3=0 SSP1BUF = %11111000 WHILE !PIR1.3 : wend PIR1.3=0 SSP1BUF = st7920_dat & %11110000 WHILE !PIR1.3 : wend PIR1.3=0 SSP1BUF = (st7920_dat<< 4) WHILE !PIR1.3 : wend pauseus 100 return show: 'SEE MAP for st7920_GLi = 0 to 31 st7920_cs=1 st7920_page = 0 gosub setxy st7920_inx = st7920_gli*16 for st7920_page = 0 TO 7 ;IS WORDS 0-7 IN TOP HALF st7920_dat = fbr[st7920_inx] REV 8 gosub ST7920data st7920_inx = st7920_inx + 1 st7920_dat = fbr[st7920_inx] REV 8 gosub ST7920data st7920_inx = st7920_inx + 1 next st7920_inx = st7920_gli*16+512 for st7920_page = 0 TO 7 ;IS WORDS 8-15 IN BOTTOM HALF st7920_dat = fbr[st7920_inx] REV 8 gosub ST7920data st7920_inx = st7920_inx + 1 st7920_dat = fbr[st7920_inx] REV 8 gosub ST7920data st7920_inx = st7920_inx + 1 next st7920_cs=0 next return senddat16: st7920_dat = st7920_tmx REV 8 gosub ST7920data st7920_dat = (st7920_tmx>>8) REV 8 gosub ST7920data return #endif overst7920:


Reply With Quote

Bookmarks