T6963c
Hello, this is a pre-version of a Toshiba T6963c GLCD driver module.
What's not handled:
- Text mode of the T6963c hardware driver is not handled (in this preversion) - this module does not take advantage of the large external RAM associated with T6963c chip to provide multipaging (full version provide this).
All these points are already implemented and will be provided in the full version (under test and will replace this one soon).
With actual pre-version, all Swordfish GLCD graphics primitives and fonts are rendered correctly.
I hope you can find this helpfull.
For any comment, or feedback (or bug report), please post to Swordfish Forum.
VERY IMPORTANT NOTICE concerning Swordfish GLCD module:
In order to integrate the T6963c module in Swordfish Basic GLCD library, the GLCD.BAS file (\Library\GLCD\glcd.bas) has been modified. This modification is mandatory to register the T6963c driver.
The modified version of the GLCD.BAS module is also published at the END of this article.
Example program
{ ************************************************************************* * Name : Test_T6963c.BAS * * Author : Ahmed Lazreg ([email protected]) * * http://www.pocketmt.com * * Notice : Copyright (c) 2006 Pocket MicroTechnics * * : All Rights Reserved * * Date : 01/03/2008 * * Version : 1.0 * * Modified: * * * ************************************************************************* } Program Test_T6963c Device = 18F452 Clock = 20 #option GLCD_MODEL = T6963c '<<<********* Select Toshiba driver #option GLCD_DATA = PORTD // data port #option GLCD_CE = PORTC.3 // chip Enable #option GLCD_RD = PORTC.5 // RD pin #option GLCD_RW = PORTC.4 // RW pin #option GLCD_CD = PORTC.6 // Command/Data High=Cmd , Low=Data #option GLCD_RST = PORTC.7 // reset pin Include "utils.bas" Include "Graphics.bas" Include "GLCD.bas" Include "FixedFont.bas" Include "Arial.bas" Include "Garamond.bas" Include "Tahoma.bas" Include "Verdana.bas" Include "Times.bas" 'Include "SimSunFont.bas" '<*** Unicode Chinese font bloc SetAllDigital() GLCD.Cls GLCD.WriteAt(4,5,"System Font") GLCD.SetFont(ArialBold) GLCD.WriteAt(4,11,"Arial Font") GLCD.SetFont(GaramondBold) GLCD.WriteAt(4,20,"Garamond Font") GLCD.SetFont(TahomaBold) GLCD.WriteAt(4,30,"Tahoma Font") GLCD.SetFont(VerdanaBold) GLCD.WriteAt(4,40,"Verdana Font") GLCD.SetFont(TimesNewRomanBold) GLCD.WriteAt(4,50,"Times New Roman") GLCD.WriteAt(4,68,"Full UNICODE Support in") GLCD.WriteAt(4,78,"SWordFish BASIC with") GLCD.SetFont(TahomaBold) GLCD.WriteAt(4,88,"GLCD Font Creator 2") Line(160,1,200,40) Circle(200,60,38) Rectangle(160,10,220,80)
Module Code
Important Note:
The T6963c module contains a sub named xDelay().
Sub xDelay() 'DelayUS(1) ASM Nop Nop Nop End ASM End Sub
This sub introduces needed delays for the T6963c hardware driver. For my own hardware driver (display bought from MikroE shop), I needed for 1 NOP only at 20MHz clock. Feel free to add additional NOP if needed. For very slow displays, and high PIC clock frequencies, you can completely remove the NOP and replace it with DelayUS(nn) with needed nn delay value.
{ ************************************************************************* * Name : T6963c.BAS * * Author : Ahmed Lazreg ([email protected]) * * http://www.pocketmt.com * * Notice : Copyright (c) 2006 Pocket MicroTechnics * * : All Rights Reserved * * Date : 01/03/2008 * * Version : 1.0 * * Modified: * * Notes : This module handles Toshiba T6963c GLCD drivera * * * ************************************************************************* } Module T6963c #define GLCD_PIXEL_08 #define GLCD_COLOR_01 #define GLCD_XY_16 Include "Graphics.bas" Include "system.bas" Include "utils.bas" #option GLCD_DATA = PORTD // data port #option GLCD_CE = PORTC.3 // chip Enable #option GLCD_RD = PORTC.5 // RD pin #option GLCD_RW = PORTC.4 // RW pin #option GLCD_CD = PORTC.6 // Command/Data High=Cmd , Low=Data #option GLCD_RST = PORTC.7 // reset pin #option GLCD_ASPECT_RATIO = 100 // aspect ratio, smaller number will squeeze y for GLCD circles and box #option GLCD_INIT_DELAY = 100 // initialisation delay (ms) // validate data port... #if IsOption(GLCD_DATA) #if Not IsValidPort(GLCD_DATA) #error GLCD_DATA, "Invalid option. DATA must be a valid port name." #endif #ifdef GLCD_DATA@ Then #error GLCD_DATA@, "Invalid option. DATA port cannot be a single bit value." #endif #endif // validate EN pin... #if IsOption(GLCD_EN) And Not IsValidPortPin(GLCD_EN) #error GLCD_EN, "Invalid option. EN must be a valid port pin." #endif // validate RD pin... #if IsOption(GLCD_RD) And Not IsValidPortPin(GLCD_RD) #error GLCD_RD, "Invalid option. RD must be a valid port pin." #endif // validate RW pin... #if IsOption(GLCD_RW) And Not IsValidPortPin(GLCD_RW) #error GLCD_RW, "Invalid option. RW must be a valid port pin." #endif // validate CD pin... #if IsOption(GLCD_CD) And Not IsValidPortPin(GLCD_CD) #error GLCD_CD, "Invalid option. CD must be a valid port pin." #endif // validate RST pin... #if IsOption(GLCD_RST) And Not IsValidPortPin(GLCD_RST) #error GLCD_RST, "Invalid option. RST must be a valid port pin." #endif // validate initialisation delay... #if IsOption(GLCD_INIT_DELAY) #if Not (GLCD_INIT_DELAY in (0 to 1000)) #error GLCD_INIT_DELAY, "Invalid option. GLCD initialize delay must be between 0 and 1000 (ms)." #endif #endif // now create Data TRIS... #option _GLCD_DATA_TRIS = GetTRIS(GLCD_DATA) Public Const GLCDWidth = 240, GLCDHeight = 128 Const GLCD_NUMBER_OF_LINES = GLCDHeight Const GLCD_PIXELS_PER_LINE= GLCDWidth Const GLCD_FONT_WIDTH = 8 Const GLCD_GRAPHIC_AREA As Word=(GLCD_PIXELS_PER_LINE / GLCD_FONT_WIDTH) Const GLCD_TEXT_AREA As Word = (GLCD_PIXELS_PER_LINE / GLCD_FONT_WIDTH) Const GLCD_GRAPHIC_SIZE As Word = (GLCD_GRAPHIC_AREA * GLCD_NUMBER_OF_LINES) Const GLCD_TEXT_SIZE As Word = (GLCD_TEXT_AREA * (GLCD_NUMBER_OF_LINES/8)) Const GLCD_TEXT_HOME As Word = 0 Const GLCD_GRAPHIC_HOME As Word = (GLCD_TEXT_HOME + GLCD_TEXT_SIZE) Const GLCD_OFFSET_REGISTER = 2 Const GLCD_EXTERNAL_CG_HOME =(GLCD_OFFSET_REGISTER << 11) Const GLCD_EXTERNAL_CG_SIZE = $FF Const T6963_SET_CURSOR_POINTER = $21 Const T6963_SET_OFFSET_REGISTER = $22 Const T6963_SET_ADDRESS_POINTER = $24 Const T6963_SET_TEXT_HOME_ADDRESS = $40 Const T6963_SET_TEXT_AREA = $41 Const T6963_SET_GRAPHIC_HOME_ADDRESS =$42 Const T6963_SET_GRAPHIC_AREA = $43 Const T6963_MODE_SET = $80 Const T6963_DISPLAY_MODE = $90 Const T6963_CURSOR_BLINK_ON = $01 Const T6963_CURSOR_DISPLAY_ON = $02 Const T6963_TEXT_DISPLAY_ON = $04 Const T6963_GRAPHIC_DISPLAY_ON = $08 Const T6963_CURSOR_PATTERN_SELECT = $A0 Const T6963_CURSOR_1_LINE = $00 Const T6963_CURSOR_2_LINE = $01 Const T6963_CURSOR_3_LINE = $02 Const T6963_CURSOR_4_LINE = $03 Const T6963_CURSOR_5_LINE = $04 Const T6963_CURSOR_6_LINE = $05 Const T6963_CURSOR_7_LINE = $06 Const T6963_CURSOR_8_LINE = $07 Const T6963_SET_DATA_AUTO_WRITE = $B0 Const T6963_SET_DATA_AUTO_READ = $B1 Const T6963_AUTO_RESET = $B2 Const T6963_DATA_WRITE_AND_INCREMENT = $C0 Const T6963_DATA_READ_AND_INCREMENT = $C1 Const T6963_DATA_WRITE_AND_DECREMENT = $C2 Const T6963_DATA_READ_AND_DECREMENT = $C3 Const T6963_DATA_WRITE_AND_NONVARIALBE = $C4 Const T6963_DATA_READ_AND_NONVARIABLE = $C5 Const T6963_SCREEN_PEEK = $E0 Const T6963_SCREEN_COPY = $E8 Const T6963_CD_COMMAND = 1, T6963_CD_Data = 0 // x, y position structure... Public Structure TPositionT6963 x As TXY y As Byte End Structure // x, y position... Public Dim Pos As TPositionT6963 Structure T6963Status_Struct STATUS As Byte blink As STATUS.7 error As STATUS.6 clr As STATUS.5 dummyFiller As STATUS.4 dawrdy As STATUS.3 darrdy As STATUS.2 busy2 As STATUS.1 busy1 As STATUS.0 End Structure Dim Data As GLCD_DATA, // data in (PORT) TRISData As _GLCD_DATA_TRIS, // data TRIS CE As GLCD_CE.GLCD_CE@, // EN pin - enable (serves as a strobe) - 6800 mode RD As GLCD_RD.GLCD_RD@, // RD pin - read when L - 8080 mode RW As GLCD_RW.GLCD_RW@, // RW pin - read or write (0 = write, 1 = read) - 6800 mode CD As GLCD_CD.GLCD_CD@, // CD pin - write when L - 8080 mode RST As GLCD_RST.GLCD_RST@ // RES pin - normally RES = 1 but pull to 0 for initialization {Sub xDelay() Dim i As Byte For i = 1 To 4 ASM nop End ASM Next} inline Sub xDelay() 'DelayUS(1) ASM Nop Nop Nop End ASM End Sub Sub WaitForIdle() Dim Timeout As Byte Dim tmp As Byte Timeout = $FF TRISData = $FF // set data bus to input CD = 1 Repeat ClrWDT RD = 0 CE = 0 xDelay() ClrWDT tmp = Data xDelay() CE = 1 RD = 1 Dec(Timeout) Until ((tmp And $03)= $03) Or (Timeout = 0) End Sub Sub WriteByte(pDataByte As Byte, pCD As Byte) WaitForIdle() TRISData = $00 CD = pCD RD = 1 Data = pDataByte xDelay() RW = 0 CE = 0 xDelay() CE = 1 RW = 1 End Sub Sub SetData(pData As Byte) WriteByte(pData, T6963_CD_Data) End Sub Function ReadData() As Byte Dim tmp As Byte WaitForIdle() TRISData = $FF CD = 0 RD = 0 CE = 0 xDelay() result = Data xDelay() CE = 1 RD = 1 CD = 1 End Function Sub Command(pCmd As Byte) WriteByte(pCmd, T6963_CD_COMMAND) End Sub Sub CommandBParam(pCmd As Byte, pParam As Byte) SetData(pParam) Command(pCmd) End Sub Sub CommandWParam(pCmd As Byte, pParam As Word) SetData(pParam.Byte0) SetData(pParam.Byte1) Command(pCmd) End Sub Sub FillMemRegion(pBaseAddr As Word, pSize As Word, pData As Byte = $00) Dim i As Word CommandWParam(T6963_SET_ADDRESS_POINTER, pBaseAddr) For i = 0 To pSize-1 CommandBParam(T6963_DATA_WRITE_AND_INCREMENT, pData) Next End Sub Public Sub ClearGraphic(pBytePattern As Byte = $00) FillMemRegion(GLCD_GRAPHIC_HOME, GLCD_GRAPHIC_SIZE, pBytePattern) End Sub Public Sub ClearText(pChar As Byte = $00) FillMemRegion(GLCD_TEXT_HOME, GLCD_TEXT_SIZE, pChar) End Sub Sub ClearCG(pChar As Byte = $00) FillMemRegion(GLCD_EXTERNAL_CG_HOME, GLCD_EXTERNAL_CG_SIZE, pChar) End Sub Public Sub T6963WriteChar(pChar As Byte) CommandBParam(T6963_DATA_WRITE_AND_INCREMENT, pChar-32) End Sub Public Sub T6963WriteStr(pStr As String) FSR0 = @pStr While INDF0 <> 0 T6963WriteChar(POSTINC0) Wend End Sub Public Sub GoToXY(pX As Byte, pY As Byte) Dim addr As Word addr = GLCD_TEXT_HOME + pX + (GLCD_TEXT_AREA * pY) CommandWParam(T6963_SET_ADDRESS_POINTER, addr) End Sub Public Sub Cls() ClearGraphic() ClearText() End Sub Public Sub SetPixel(pX, pY As TXY) Dim tmp As Byte Dim addr As Word addr = GLCD_GRAPHIC_HOME + (pX / GLCD_FONT_WIDTH) + (GLCD_GRAPHIC_AREA * pY) CommandWParam(T6963_SET_ADDRESS_POINTER, addr) Command(T6963_DATA_READ_AND_NONVARIABLE) tmp = ReadData() If Pen.Color = 0 Then tmp = tmp And (Not (1 << (GLCD_FONT_WIDTH - 1 - (pX Mod GLCD_FONT_WIDTH)))) Else tmp = tmp Or (1 << (GLCD_FONT_WIDTH - 1 - (pX Mod GLCD_FONT_WIDTH))) EndIf CommandBParam(T6963_DATA_WRITE_AND_INCREMENT, tmp) End Sub Public Sub Initialize() Dim i As Word Output(RD) Output(RW) Output(CD) Output(CE) RD = 1 RW = 1 CD = 1 CE = 1 RST = 1 TRISData = $00 Data = $00 #if IsOption(GLCD_RST) Output(RST) RST = 0 DelayMS(100) RST = 1 #endif Pos.x = 0 Pos.y = 0 CommandWParam(T6963_SET_GRAPHIC_HOME_ADDRESS, GLCD_GRAPHIC_HOME) CommandWParam(T6963_SET_GRAPHIC_AREA, GLCD_GRAPHIC_AREA) CommandWParam(T6963_SET_TEXT_HOME_ADDRESS, GLCD_TEXT_HOME) CommandWParam(T6963_SET_TEXT_AREA, GLCD_TEXT_AREA) CommandWParam(T6963_SET_OFFSET_REGISTER, GLCD_OFFSET_REGISTER) CommandWParam(T6963_SET_ADDRESS_POINTER, $00) Command(T6963_DISPLAY_MODE Or T6963_GRAPHIC_DISPLAY_ON Or T6963_TEXT_DISPLAY_ON) // Or T6963_CURSOR_DISPLAY_ON Or T6963_CURSOR_BLINK_ON 'Command(T6963_DISPLAY_MODE Or T6963_GRAPHIC_DISPLAY_ON ) Command(T6963_MODE_SET Or 0) ClearGraphic() ClearText() End Sub Initialize()
Modified GLCD.BAS Module Code
This modified module is to be copied in the \UserLibrary\ sub folder to avoid any modification on original Swordfish module.
Sorry for code. each time I want to post it I got an error from the Wiki server. You can download the module code directly from this link http://www.pocketmt.com/tutors/glcd.zip