Ported Control Serial Display Via Commands. Uses Highest Speed BAUD Rate Possible. You can DRAW,TYPE Create Menus or whatever you like just by communicating with the mbed over serial connection. I did this a while back however Ian Uploaded most of the files i published a while back to his account.

Dependencies:   mbed

Everything should be working. If not start a discussion and i'll help you asap.

Here is some VB.NET code to help you get started playing with the tft screen through serial. This code will create a menu based graphics which you can select the menu on the left of the screen You can create your own in menu graphics and items however you like, and modify the code to make the mbed do anything you like from inside the windows vb.net application, All you will need is 6 buttons on the form.

VB.NET CODE

Imports System.Threading

Public Class Form1
    dim com_port as string =  "COM6" 'CHANGE THIS TO YOUR MBED COM PORT NUMBER
    'Load/Close
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        SerialPort1.WriteLine("fill,255,255,255")
        SerialPort1.Close()
        Try
            End
        Catch
            Thread.EndThreadAffinity()
        End Try
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        SerialPort1.PortName = com_port
        SerialPort1.Open()
        SerialPort1.WriteLine("fill,255,255,255")
        Thread.Sleep(2000) 'Required
        SerialPort1.WriteLine("rot,3")
        init_menu()
    End Sub

    'Create TFT Graphics
    Public Sub write_text(ByVal msg As String, ByVal x As Integer, ByVal y As Integer, ByVal size As Integer, ByVal rgb As String)
        Dim send_string As String = "text," + msg + "," + x.ToString + "," + y.ToString + "," + size.ToString + "," + rgb
        SerialPort1.WriteLine(send_string)
        Thread.Sleep(40)
    End Sub
    Public Sub create_rect(ByVal sx As Integer, ByVal sy As Integer, ByVal ex As Integer, ByVal ey As Integer, ByVal rgb As String)
        Dim send_string As String = "rect," + sx.ToString + "," + sy.ToString + "," + ex.ToString + "," + ey.ToString + "," + rgb
        SerialPort1.WriteLine(send_string)
        Thread.Sleep(60)
    End Sub
    Public Sub create_fillrect(ByVal sx As Integer, ByVal sy As Integer, ByVal ex As Integer, ByVal ey As Integer, ByVal rgb As String)
        Dim send_string As String = "frect," + sx.ToString + "," + sy.ToString + "," + ex.ToString + "," + ey.ToString + "," + rgb
        SerialPort1.WriteLine(send_string)
        Thread.Sleep(60)
    End Sub
    Public Sub create_line(ByVal sx As Integer, ByVal sy As Integer, ByVal ex As Integer, ByVal ey As Integer, ByVal rgb As String)
        Dim send_string As String = "dline," + sx.ToString + "," + sy.ToString + "," + ex.ToString + "," + ey.ToString + "," + rgb
        SerialPort1.WriteLine(send_string)
        Thread.Sleep(60)
    End Sub
    Public Sub create_circle(ByVal x As Integer, ByVal y As Integer, ByVal size As Integer, ByVal rgb As String)
        Dim send_string As String = "circle," + x.ToString + "," + y.ToString + "," + size.ToString + "," + rgb
        SerialPort1.WriteLine(send_string)
        Thread.Sleep(60)
    End Sub

    'draw main menu UI
    Public Sub init_menu()
        SerialPort1.WriteLine("rot,3")
        write_text("TFT_PANEL", 100, 13, 2, "200,0,0")
        create_line(80, 40, 320, 40, "255,0,0") 'Boarder Horizontal
        create_line(80, 40, 80, 240, "255,0,0") 'Boarder Vertical
        create_fillrect(0, 0, 80, 40, "100,100,100") 'MENU 1
        write_text("Welcome", 12, 17, 1, "0,0,0")
        create_fillrect(0, 40, 80, 40, "100,100,100") 'MENU 2
        write_text("Menu_1", 15, 57, 1, "0,0,0")
        create_fillrect(0, 80, 80, 40, "100,100,100") 'MENU 3
        write_text("Menu_2", 15, 97, 1, "0,0,0")
        create_fillrect(0, 120, 80, 40, "100,100,100") 'MENU 4
        write_text("Menu_3", 15, 137, 1, "0,0,0")
        create_fillrect(0, 160, 80, 40, "100,100,100") 'MENU 5
        write_text("Menu_4", 15, 177, 1, "0,0,0")
        create_fillrect(0, 200, 80, 40, "100,100,100") 'MENU 6
        write_text("Menu_5", 15, 217, 1, "0,0,0")
        'Select Top Menu
        c_menu(0)
    End Sub

    'Unselect previous selected menu tab
    Public Sub unselect()
        If last_selected = 0 Then
            create_fillrect(0, 0, 80, 40, "100,100,100")  'MAIN MENU
            write_text("Welcome", 12, 17, 1, "0,0,0")
        End If
        If last_selected = 1 Then
            create_fillrect(0, 40, 80, 40, "100,100,100") 'MENU 2
            write_text("Menu_1", 15, 57, 1, "0,0,0")
        End If
        If last_selected = 2 Then
            create_fillrect(0, 80, 80, 40, "100,100,100") 'MENU 3
            write_text("Menu_2", 15, 97, 1, "0,0,0")
        End If
        If last_selected = 3 Then
            create_fillrect(0, 120, 80, 40, "100,100,100") 'MENU 4
            write_text("Menu_3", 15, 137, 1, "0,0,0")
        End If
        If last_selected = 4 Then
            create_fillrect(0, 160, 80, 40, "100,100,100") 'MENU 5
            write_text("Menu_4", 15, 177, 1, "0,0,0")
        End If
        If last_selected = 5 Then
            create_fillrect(0, 200, 80, 40, "100,100,100") 'MENU 6
            write_text("Menu_5", 15, 217, 1, "0,0,0")
        End If
    End Sub

    'Select Menu
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        c_menu(0)
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        c_menu(1)
    End Sub
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        c_menu(2)
    End Sub
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        c_menu(3)
    End Sub
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        c_menu(4)
    End Sub
    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        c_menu(5)
    End Sub

    'SELECT MENU GRAPHICS!
    Dim last_selected As Integer
    Public Sub c_menu(ByVal menu As Integer)
        unselect()
        If menu = 0 Then
            last_selected = 0
            create_rect(0, 0, 80, 40, "255,255,255")
            write_text("Welcome", 12, 17, 1, "255,255,255")
            '/IN MENU GRAPHICS
            create_fillrect(81, 41, 320, 240, "200,200,200")
            Thread.Sleep(850) 'Required
            write_text("Welcome_Panel_Menu", 90, 50, 1, "255,0,0")
            write_text("This_Is_A_Welcome_Panel", 90, 70, 1, "255,0,0")
            write_text("Menus_Can_Be_Opened_On_Left", 90, 80, 1, "255,0,0")
            create_circle(100, 100, 5, "255,0,0")
        End If
        If menu = 1 Then
            last_selected = 1
            create_rect(0, 40, 80, 40, "255,255,255")
            write_text("Menu_1", 15, 57, 1, "255,255,255")
            '/IN MENU GRAPHICS
            create_fillrect(81, 41, 320, 240, "200,200,200")
            Thread.Sleep(850) 'Required
            write_text("Menu_1", 90, 50, 1, "255,0,0")
            write_text("THIS_IS_THE_FIRST_MENU", 90, 70, 1, "255,0,0")
            write_text("There_are_more_menus_ahead...", 90, 80, 1, "255,0,0")
        End If
        If menu = 2 Then
            last_selected = 2
            create_rect(0, 80, 80, 40, "255,255,255") 'MENU 3
            write_text("Menu_2", 15, 97, 1, "255,255,255")
            '/IN MENU GRAPHICS
            create_fillrect(81, 41, 320, 240, "200,200,200")
            Thread.Sleep(850) 'Required
            write_text("Menu_2", 90, 50, 1, "255,0,0")
            write_text("THIS_IS_THE_SECOND_MENU", 90, 70, 1, "255,0,0")
            write_text("There_are_more_menus_ahead...", 90, 80, 1, "255,0,0")
        End If
        If menu = 3 Then
            last_selected = 3
            create_rect(0, 120, 80, 40, "255,255,255") 'MENU 3
            write_text("Menu_3", 15, 137, 1, "255,255,255")
            '/IN MENU GRAPHICS
            create_fillrect(81, 41, 320, 240, "200,200,200")
            Thread.Sleep(850) 'Required
            write_text("Menu_3", 90, 50, 1, "255,0,0")
            write_text("THIS_IS_THE_THIRD_MENU", 90, 70, 1, "255,0,0")
            write_text("There_are_more_menus_ahead...", 90, 80, 1, "255,0,0")
        End If
        If menu = 4 Then
            last_selected = 4
            create_rect(0, 160, 80, 40, "255,255,255") 'MENU 4
            write_text("Menu_4", 15, 177, 1, "255,255,255")
            '/IN MENU GRAPHICS
            create_fillrect(81, 41, 320, 240, "200,200,200")
            Thread.Sleep(850) 'Required
            write_text("Menu_4", 90, 50, 1, "255,0,0")
            write_text("THIS_IS_THE_FOURTH_MENU", 90, 70, 1, "255,0,0")
            write_text("There_are_more_menus_ahead...", 90, 80, 1, "255,0,0")
        End If
        If menu = 5 Then
            last_selected = 5
            create_rect(0, 200, 80, 40, "255,255,255") 'MENU 5
            write_text("Menu_5", 15, 217, 1, "255,255,255")
            '/IN MENU GRAPHICS
            create_fillrect(81, 41, 320, 240, "200,200,200")
            Thread.Sleep(850) 'Required
            write_text("Menu_5", 90, 50, 1, "255,0,0")
            write_text("THIS_IS_THE_FIFTH_MENU", 90, 70, 1, "255,0,0")
            write_text("There_are_NO_menus_ahead...", 90, 80, 1, "255,0,0")
        End If
    End Sub
End Class
Committer:
Elitism
Date:
Thu Aug 28 18:34:10 2014 +0000
Revision:
1:993a4757891d
Parent:
0:d67893e6f32f
Added/modified info

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Elitism 0:d67893e6f32f 1 /* ILI9340C
Elitism 0:d67893e6f32f 2 For use with Arduino Lib Ported for mbed */
Elitism 0:d67893e6f32f 3
Elitism 0:d67893e6f32f 4 #include "mbed.h"
Elitism 0:d67893e6f32f 5 #include "ILI9340_Driver.h"
Elitism 0:d67893e6f32f 6 #include "SimpleFont.cpp"
Elitism 0:d67893e6f32f 7
Elitism 0:d67893e6f32f 8 // Constructor, assigns the pins to the SPI object, set orientation, and sets screen dims.
Elitism 0:d67893e6f32f 9 ILI9340_Display::ILI9340_Display(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName rst, PinName dc)
Elitism 0:d67893e6f32f 10 : spi(mosi, miso, sclk), cs(cs), rst(rst), dc(dc)
Elitism 0:d67893e6f32f 11 {
Elitism 0:d67893e6f32f 12 _height = _TFTHEIGHT;
Elitism 0:d67893e6f32f 13 _width = _TFTWIDTH;
Elitism 0:d67893e6f32f 14 orientation = 0;
Elitism 0:d67893e6f32f 15 }
Elitism 0:d67893e6f32f 16
Elitism 0:d67893e6f32f 17 // Command writing code
Elitism 0:d67893e6f32f 18 void ILI9340_Display::WriteCommand(uint8_t command)
Elitism 0:d67893e6f32f 19 {
Elitism 0:d67893e6f32f 20 dc = 0;
Elitism 0:d67893e6f32f 21 cs = 0;
Elitism 0:d67893e6f32f 22 spi.write(command);
Elitism 0:d67893e6f32f 23 cs = 1;
Elitism 0:d67893e6f32f 24 }
Elitism 0:d67893e6f32f 25
Elitism 0:d67893e6f32f 26 // Data writing code
Elitism 0:d67893e6f32f 27 void ILI9340_Display::WriteData(uint8_t data)
Elitism 0:d67893e6f32f 28 {
Elitism 0:d67893e6f32f 29 cs = 0;
Elitism 0:d67893e6f32f 30 dc = 1;
Elitism 0:d67893e6f32f 31 spi.write(data);
Elitism 0:d67893e6f32f 32 cs = 1;
Elitism 0:d67893e6f32f 33 }
Elitism 0:d67893e6f32f 34
Elitism 0:d67893e6f32f 35
Elitism 0:d67893e6f32f 36 // Initilise the display
Elitism 0:d67893e6f32f 37 void ILI9340_Display::DispInit(void)
Elitism 0:d67893e6f32f 38 {
Elitism 0:d67893e6f32f 39 //CtrlOutput();
Elitism 0:d67893e6f32f 40
Elitism 0:d67893e6f32f 41 rst = 0;
Elitism 0:d67893e6f32f 42
Elitism 0:d67893e6f32f 43 // Setup the spi for 8 bit data, high steady state clock,
Elitism 0:d67893e6f32f 44 // second edge capture, with a 1MHz clock rate
Elitism 0:d67893e6f32f 45 //spi.format(8,3);
Elitism 0:d67893e6f32f 46 spi.frequency(24000000); // actually seems to work up to about 20Mhz... way better than the 8mhz as std.
Elitism 0:d67893e6f32f 47
Elitism 0:d67893e6f32f 48 // Toggle rst to reset
Elitism 0:d67893e6f32f 49 rst = 1;
Elitism 0:d67893e6f32f 50 wait(0.005);
Elitism 0:d67893e6f32f 51 rst = 0;
Elitism 0:d67893e6f32f 52 wait(0.020);
Elitism 0:d67893e6f32f 53 rst = 1;
Elitism 0:d67893e6f32f 54 wait(0.150);
Elitism 0:d67893e6f32f 55
Elitism 0:d67893e6f32f 56 WriteCommand(0xEF);
Elitism 0:d67893e6f32f 57 WriteData(0x03);
Elitism 0:d67893e6f32f 58 WriteData(0x80);
Elitism 0:d67893e6f32f 59 WriteData(0x02);
Elitism 0:d67893e6f32f 60
Elitism 0:d67893e6f32f 61 WriteCommand(0xCF);
Elitism 0:d67893e6f32f 62 WriteData(0x00);
Elitism 0:d67893e6f32f 63 WriteData(0xC1);
Elitism 0:d67893e6f32f 64 WriteData(0x30);
Elitism 0:d67893e6f32f 65
Elitism 0:d67893e6f32f 66 WriteCommand(0xED);
Elitism 0:d67893e6f32f 67 WriteData(0x64);
Elitism 0:d67893e6f32f 68 WriteData(0x03);
Elitism 0:d67893e6f32f 69 WriteData(0x12);
Elitism 0:d67893e6f32f 70 WriteData(0x81);
Elitism 0:d67893e6f32f 71
Elitism 0:d67893e6f32f 72 WriteCommand(0xE8);
Elitism 0:d67893e6f32f 73 WriteData(0x85);
Elitism 0:d67893e6f32f 74 WriteData(0x00);
Elitism 0:d67893e6f32f 75 WriteData(0x78);
Elitism 0:d67893e6f32f 76
Elitism 0:d67893e6f32f 77 WriteCommand(0xCB);
Elitism 0:d67893e6f32f 78 WriteData(0x39);
Elitism 0:d67893e6f32f 79 WriteData(0x2C);
Elitism 0:d67893e6f32f 80 WriteData(0x00);
Elitism 0:d67893e6f32f 81 WriteData(0x34);
Elitism 0:d67893e6f32f 82 WriteData(0x02);
Elitism 0:d67893e6f32f 83
Elitism 0:d67893e6f32f 84 WriteCommand(0xF7);
Elitism 0:d67893e6f32f 85 WriteData(0x20);
Elitism 0:d67893e6f32f 86
Elitism 0:d67893e6f32f 87 WriteCommand(0xEA);
Elitism 0:d67893e6f32f 88 WriteData(0x00);
Elitism 0:d67893e6f32f 89 WriteData(0x00);
Elitism 0:d67893e6f32f 90
Elitism 0:d67893e6f32f 91 WriteCommand(ILI9340_PWCTR1); //Power control
Elitism 0:d67893e6f32f 92 WriteData(0x23); //VRH[5:0]
Elitism 0:d67893e6f32f 93
Elitism 0:d67893e6f32f 94 WriteCommand(ILI9340_PWCTR2); //Power control
Elitism 0:d67893e6f32f 95 WriteData(0x10); //SAP[2:0];BT[3:0]
Elitism 0:d67893e6f32f 96
Elitism 0:d67893e6f32f 97 WriteCommand(ILI9340_VMCTR1); //VCM control
Elitism 0:d67893e6f32f 98 WriteData(0x3e); //�Աȶȵ���
Elitism 0:d67893e6f32f 99 WriteData(0x28);
Elitism 0:d67893e6f32f 100
Elitism 0:d67893e6f32f 101 WriteCommand(ILI9340_VMCTR2); //VCM control2
Elitism 0:d67893e6f32f 102 WriteData(0x86); //--
Elitism 0:d67893e6f32f 103
Elitism 0:d67893e6f32f 104 WriteCommand(ILI9340_MADCTL); // Memory Access Control
Elitism 0:d67893e6f32f 105 WriteData(ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR);
Elitism 0:d67893e6f32f 106
Elitism 0:d67893e6f32f 107 WriteCommand(ILI9340_PIXFMT);
Elitism 0:d67893e6f32f 108 WriteData(0x55);
Elitism 0:d67893e6f32f 109
Elitism 0:d67893e6f32f 110 WriteCommand(ILI9340_FRMCTR1);
Elitism 0:d67893e6f32f 111 WriteData(0x00);
Elitism 0:d67893e6f32f 112 WriteData(0x18);
Elitism 0:d67893e6f32f 113
Elitism 0:d67893e6f32f 114 WriteCommand(ILI9340_DFUNCTR); // Display Function Control
Elitism 0:d67893e6f32f 115 WriteData(0x08);
Elitism 0:d67893e6f32f 116 WriteData(0x82);
Elitism 0:d67893e6f32f 117 WriteData(0x27);
Elitism 0:d67893e6f32f 118
Elitism 0:d67893e6f32f 119 WriteCommand(0xF2); // 3Gamma Function Disable
Elitism 0:d67893e6f32f 120 WriteData(0x00);
Elitism 0:d67893e6f32f 121
Elitism 0:d67893e6f32f 122 WriteCommand(ILI9340_GAMMASET); //Gamma curve selected
Elitism 0:d67893e6f32f 123 WriteData(0x01);
Elitism 0:d67893e6f32f 124
Elitism 0:d67893e6f32f 125 WriteCommand(ILI9340_GMCTRP1); //Set Gamma
Elitism 0:d67893e6f32f 126 WriteData(0x0F);
Elitism 0:d67893e6f32f 127 WriteData(0x31);
Elitism 0:d67893e6f32f 128 WriteData(0x2B);
Elitism 0:d67893e6f32f 129 WriteData(0x0C);
Elitism 0:d67893e6f32f 130 WriteData(0x0E);
Elitism 0:d67893e6f32f 131 WriteData(0x08);
Elitism 0:d67893e6f32f 132 WriteData(0x4E);
Elitism 0:d67893e6f32f 133 WriteData(0xF1);
Elitism 0:d67893e6f32f 134 WriteData(0x37);
Elitism 0:d67893e6f32f 135 WriteData(0x07);
Elitism 0:d67893e6f32f 136 WriteData(0x10);
Elitism 0:d67893e6f32f 137 WriteData(0x03);
Elitism 0:d67893e6f32f 138 WriteData(0x0E);
Elitism 0:d67893e6f32f 139 WriteData(0x09);
Elitism 0:d67893e6f32f 140 WriteData(0x00);
Elitism 0:d67893e6f32f 141
Elitism 0:d67893e6f32f 142 WriteCommand(ILI9340_GMCTRN1); //Set Gamma
Elitism 0:d67893e6f32f 143 WriteData(0x00);
Elitism 0:d67893e6f32f 144 WriteData(0x0E);
Elitism 0:d67893e6f32f 145 WriteData(0x14);
Elitism 0:d67893e6f32f 146 WriteData(0x03);
Elitism 0:d67893e6f32f 147 WriteData(0x11);
Elitism 0:d67893e6f32f 148 WriteData(0x07);
Elitism 0:d67893e6f32f 149 WriteData(0x31);
Elitism 0:d67893e6f32f 150 WriteData(0xC1);
Elitism 0:d67893e6f32f 151 WriteData(0x48);
Elitism 0:d67893e6f32f 152 WriteData(0x08);
Elitism 0:d67893e6f32f 153 WriteData(0x0F);
Elitism 0:d67893e6f32f 154 WriteData(0x0C);
Elitism 0:d67893e6f32f 155 WriteData(0x31);
Elitism 0:d67893e6f32f 156 WriteData(0x36);
Elitism 0:d67893e6f32f 157 WriteData(0x0F);
Elitism 0:d67893e6f32f 158
Elitism 0:d67893e6f32f 159 WriteCommand(ILI9340_SLPOUT); //Exit Sleep
Elitism 0:d67893e6f32f 160 wait(0.120);
Elitism 0:d67893e6f32f 161 WriteCommand(ILI9340_DISPON); //Display on
Elitism 0:d67893e6f32f 162
Elitism 0:d67893e6f32f 163 }
Elitism 0:d67893e6f32f 164
Elitism 0:d67893e6f32f 165
Elitism 0:d67893e6f32f 166 // Sets the rotation of the display
Elitism 0:d67893e6f32f 167 void ILI9340_Display::SetRotation(uint8_t m)
Elitism 0:d67893e6f32f 168 {
Elitism 0:d67893e6f32f 169
Elitism 0:d67893e6f32f 170 WriteCommand(ILI9340_MADCTL);
Elitism 0:d67893e6f32f 171 orientation = m % 4; // can't be higher than 3
Elitism 0:d67893e6f32f 172
Elitism 0:d67893e6f32f 173 switch (orientation) {
Elitism 0:d67893e6f32f 174 case 0:
Elitism 0:d67893e6f32f 175 WriteData(ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR);
Elitism 0:d67893e6f32f 176 _width = _TFTWIDTH;
Elitism 0:d67893e6f32f 177 _height = _TFTHEIGHT;
Elitism 0:d67893e6f32f 178 break;
Elitism 0:d67893e6f32f 179 case 1:
Elitism 0:d67893e6f32f 180 WriteData(ILI9340_MADCTL_MV | ILI9340_MADCTL_BGR);
Elitism 0:d67893e6f32f 181 _width = _TFTHEIGHT;
Elitism 0:d67893e6f32f 182 _height = _TFTWIDTH;
Elitism 0:d67893e6f32f 183 break;
Elitism 0:d67893e6f32f 184 case 2:
Elitism 0:d67893e6f32f 185 WriteData(ILI9340_MADCTL_MY | ILI9340_MADCTL_BGR);
Elitism 0:d67893e6f32f 186 _width = _TFTWIDTH;
Elitism 0:d67893e6f32f 187 _height = _TFTHEIGHT;
Elitism 0:d67893e6f32f 188 break;
Elitism 0:d67893e6f32f 189 case 3:
Elitism 0:d67893e6f32f 190 WriteData(ILI9340_MADCTL_MV | ILI9340_MADCTL_MY | ILI9340_MADCTL_MX | ILI9340_MADCTL_BGR);
Elitism 0:d67893e6f32f 191 _width = _TFTHEIGHT;
Elitism 0:d67893e6f32f 192 _height = _TFTWIDTH;
Elitism 0:d67893e6f32f 193 break;
Elitism 0:d67893e6f32f 194 }
Elitism 0:d67893e6f32f 195 }
Elitism 0:d67893e6f32f 196
Elitism 0:d67893e6f32f 197 // Invert the colours of the display in hardware
Elitism 0:d67893e6f32f 198 void ILI9340_Display::InvertDisplay(bool i)
Elitism 0:d67893e6f32f 199 {
Elitism 0:d67893e6f32f 200 WriteCommand(i ? ILI9340_INVON : ILI9340_INVOFF);
Elitism 0:d67893e6f32f 201 }
Elitism 0:d67893e6f32f 202
Elitism 0:d67893e6f32f 203 // Set address window for writing data to.
Elitism 0:d67893e6f32f 204 void ILI9340_Display::SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
Elitism 0:d67893e6f32f 205 {
Elitism 0:d67893e6f32f 206 WriteCommand(ILI9340_CASET); // Column addr set
Elitism 0:d67893e6f32f 207 WriteData(x0 >> 8);
Elitism 0:d67893e6f32f 208 WriteData(x0 & 0xFF); // XSTART
Elitism 0:d67893e6f32f 209 WriteData(x1 >> 8);
Elitism 0:d67893e6f32f 210 WriteData(x1 & 0xFF); // XEND
Elitism 0:d67893e6f32f 211 WriteCommand(ILI9340_PASET); // Row addr set
Elitism 0:d67893e6f32f 212 WriteData(y0>>8);
Elitism 0:d67893e6f32f 213 WriteData(y0); // YSTART
Elitism 0:d67893e6f32f 214 WriteData(y1>>8);
Elitism 0:d67893e6f32f 215 WriteData(y1); // YEND
Elitism 0:d67893e6f32f 216
Elitism 0:d67893e6f32f 217 WriteCommand(ILI9340_RAMWR); // write to RAM
Elitism 0:d67893e6f32f 218 }
Elitism 0:d67893e6f32f 219
Elitism 0:d67893e6f32f 220 // To draw the humble pixel
Elitism 0:d67893e6f32f 221 void ILI9340_Display::DrawPixel(uint16_t x, uint16_t y, uint16_t colour)
Elitism 0:d67893e6f32f 222 {
Elitism 0:d67893e6f32f 223 if((x < 1) ||(x >= _width) || (y < 1) || (y >= _height)) return;
Elitism 0:d67893e6f32f 224
Elitism 0:d67893e6f32f 225 SetAddrWindow(x,y,x+1,y+1);
Elitism 0:d67893e6f32f 226
Elitism 0:d67893e6f32f 227 dc = 1;
Elitism 0:d67893e6f32f 228 cs = 0;
Elitism 0:d67893e6f32f 229
Elitism 0:d67893e6f32f 230 spi.write(colour >> 8);
Elitism 0:d67893e6f32f 231 spi.write(colour);
Elitism 0:d67893e6f32f 232
Elitism 0:d67893e6f32f 233 cs = 1;
Elitism 0:d67893e6f32f 234 }
Elitism 0:d67893e6f32f 235
Elitism 0:d67893e6f32f 236 // Fill the screen with a colour
Elitism 0:d67893e6f32f 237 void ILI9340_Display::FillScreen(uint16_t colour)
Elitism 0:d67893e6f32f 238 {
Elitism 0:d67893e6f32f 239 SetAddrWindow(0,0,_width,_height);
Elitism 0:d67893e6f32f 240
Elitism 0:d67893e6f32f 241 dc = 1;
Elitism 0:d67893e6f32f 242 cs = 0;
Elitism 0:d67893e6f32f 243
Elitism 0:d67893e6f32f 244 unsigned int total = _width * _height;
Elitism 0:d67893e6f32f 245 unsigned int position = 0;
Elitism 0:d67893e6f32f 246
Elitism 0:d67893e6f32f 247 while (position < total) {
Elitism 0:d67893e6f32f 248 spi.write(colour >> 8);
Elitism 0:d67893e6f32f 249 spi.write(colour);
Elitism 0:d67893e6f32f 250 position++;
Elitism 0:d67893e6f32f 251 }
Elitism 0:d67893e6f32f 252 cs = 1;
Elitism 0:d67893e6f32f 253 }
Elitism 0:d67893e6f32f 254
Elitism 0:d67893e6f32f 255 // Draws a vertical line fast
Elitism 0:d67893e6f32f 256 void ILI9340_Display::DrawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t colour)
Elitism 0:d67893e6f32f 257 {
Elitism 0:d67893e6f32f 258 // Rudimentary clipping
Elitism 0:d67893e6f32f 259 if((x >= _width) || (y >= _height)) return;
Elitism 0:d67893e6f32f 260 if((y+h-1) >= _height)
Elitism 0:d67893e6f32f 261 h = _height-y;
Elitism 0:d67893e6f32f 262
Elitism 0:d67893e6f32f 263 SetAddrWindow(x, y, x, y+h-1);
Elitism 0:d67893e6f32f 264
Elitism 0:d67893e6f32f 265 uint8_t hi = colour >> 8, lo = colour;
Elitism 0:d67893e6f32f 266 dc = 1;
Elitism 0:d67893e6f32f 267 cs = 0;
Elitism 0:d67893e6f32f 268
Elitism 0:d67893e6f32f 269 while (h--) {
Elitism 0:d67893e6f32f 270 spi.write(hi);
Elitism 0:d67893e6f32f 271 spi.write(lo);
Elitism 0:d67893e6f32f 272 }
Elitism 0:d67893e6f32f 273 cs = 1;
Elitism 0:d67893e6f32f 274 }
Elitism 0:d67893e6f32f 275
Elitism 0:d67893e6f32f 276 // Draws a horizontal line fast
Elitism 0:d67893e6f32f 277 void ILI9340_Display::DrawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t colour)
Elitism 0:d67893e6f32f 278 {
Elitism 0:d67893e6f32f 279
Elitism 0:d67893e6f32f 280 // Rudimentary clipping
Elitism 0:d67893e6f32f 281 if((x >= _width) || (y >= _height)) return;
Elitism 0:d67893e6f32f 282 if((x+w-1) >= _height) w = _width-x;
Elitism 0:d67893e6f32f 283 SetAddrWindow(x, y, x+w-1, y);
Elitism 0:d67893e6f32f 284
Elitism 0:d67893e6f32f 285 uint8_t hi = colour >> 8, lo = colour;
Elitism 0:d67893e6f32f 286 dc = 1;
Elitism 0:d67893e6f32f 287 cs = 0;
Elitism 0:d67893e6f32f 288 while (w--) {
Elitism 0:d67893e6f32f 289 spi.write(hi);
Elitism 0:d67893e6f32f 290 spi.write(lo);
Elitism 0:d67893e6f32f 291 }
Elitism 0:d67893e6f32f 292 cs = 1;
Elitism 0:d67893e6f32f 293 }
Elitism 0:d67893e6f32f 294
Elitism 0:d67893e6f32f 295 // Draws a filled rectangle
Elitism 0:d67893e6f32f 296 void ILI9340_Display::FillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t colour)
Elitism 0:d67893e6f32f 297 {
Elitism 0:d67893e6f32f 298
Elitism 0:d67893e6f32f 299 // rudimentary clipping (drawChar w/big text requires this)
Elitism 0:d67893e6f32f 300 if((x >= _width) || (y >= _height)) return;
Elitism 0:d67893e6f32f 301 if((x + w - 1) >= _width) w = _width - x;
Elitism 0:d67893e6f32f 302 if((y + h - 1) >= _height) h = _height - y;
Elitism 0:d67893e6f32f 303
Elitism 0:d67893e6f32f 304 SetAddrWindow(x, y, x+w-1, y+h-1);
Elitism 0:d67893e6f32f 305
Elitism 0:d67893e6f32f 306 uint8_t hi = colour >> 8, lo = colour;
Elitism 0:d67893e6f32f 307
Elitism 0:d67893e6f32f 308 dc = 1;
Elitism 0:d67893e6f32f 309 cs = 0;
Elitism 0:d67893e6f32f 310
Elitism 0:d67893e6f32f 311 for(y=h; y>0; y--) {
Elitism 0:d67893e6f32f 312 for(x=w; x>0; x--) {
Elitism 0:d67893e6f32f 313 spi.write(hi);
Elitism 0:d67893e6f32f 314 spi.write(lo);
Elitism 0:d67893e6f32f 315 }
Elitism 0:d67893e6f32f 316 }
Elitism 0:d67893e6f32f 317 cs = 1;
Elitism 0:d67893e6f32f 318 }
Elitism 0:d67893e6f32f 319
Elitism 0:d67893e6f32f 320 // Draw an unfilled rectangle
Elitism 0:d67893e6f32f 321 void ILI9340_Display::DrawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
Elitism 0:d67893e6f32f 322 {
Elitism 0:d67893e6f32f 323 DrawFastHLine(x, y, w, color);
Elitism 0:d67893e6f32f 324 DrawFastHLine(x, y+h-1, w, color);
Elitism 0:d67893e6f32f 325 DrawFastVLine(x, y, h, color);
Elitism 0:d67893e6f32f 326 DrawFastVLine(x+w-1, y, h, color);
Elitism 0:d67893e6f32f 327 }
Elitism 0:d67893e6f32f 328
Elitism 0:d67893e6f32f 329 // draw an unfilled circle
Elitism 0:d67893e6f32f 330 void ILI9340_Display::DrawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t colour)
Elitism 0:d67893e6f32f 331 {
Elitism 0:d67893e6f32f 332 int16_t f = 1 - r;
Elitism 0:d67893e6f32f 333 int16_t ddF_x = 1;
Elitism 0:d67893e6f32f 334 int16_t ddF_y = -2 * r;
Elitism 0:d67893e6f32f 335 int16_t x = 0;
Elitism 0:d67893e6f32f 336 int16_t y = r;
Elitism 0:d67893e6f32f 337
Elitism 0:d67893e6f32f 338 DrawPixel(x0 , y0+r, colour);
Elitism 0:d67893e6f32f 339 DrawPixel(x0 , y0-r, colour);
Elitism 0:d67893e6f32f 340 DrawPixel(x0+r, y0 , colour);
Elitism 0:d67893e6f32f 341 DrawPixel(x0-r, y0 , colour);
Elitism 0:d67893e6f32f 342
Elitism 0:d67893e6f32f 343 while (x<y) {
Elitism 0:d67893e6f32f 344 if (f >= 0) {
Elitism 0:d67893e6f32f 345 y--;
Elitism 0:d67893e6f32f 346 ddF_y += 2;
Elitism 0:d67893e6f32f 347 f += ddF_y;
Elitism 0:d67893e6f32f 348 }
Elitism 0:d67893e6f32f 349 x++;
Elitism 0:d67893e6f32f 350 ddF_x += 2;
Elitism 0:d67893e6f32f 351 f += ddF_x;
Elitism 0:d67893e6f32f 352
Elitism 0:d67893e6f32f 353 DrawPixel(x0 + x, y0 + y, colour);
Elitism 0:d67893e6f32f 354 DrawPixel(x0 - x, y0 + y, colour);
Elitism 0:d67893e6f32f 355 DrawPixel(x0 + x, y0 - y, colour);
Elitism 0:d67893e6f32f 356 DrawPixel(x0 - x, y0 - y, colour);
Elitism 0:d67893e6f32f 357 DrawPixel(x0 + y, y0 + x, colour);
Elitism 0:d67893e6f32f 358 DrawPixel(x0 - y, y0 + x, colour);
Elitism 0:d67893e6f32f 359 DrawPixel(x0 + y, y0 - x, colour);
Elitism 0:d67893e6f32f 360 DrawPixel(x0 - y, y0 - x, colour);
Elitism 0:d67893e6f32f 361 }
Elitism 0:d67893e6f32f 362 }
Elitism 0:d67893e6f32f 363
Elitism 0:d67893e6f32f 364 // Pass 8-bit (each) R,G,B, get back 16-bit packed color
Elitism 0:d67893e6f32f 365 uint16_t ILI9340_Display::Colour565(uint8_t r, uint8_t g, uint8_t b)
Elitism 0:d67893e6f32f 366 {
Elitism 0:d67893e6f32f 367 return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
Elitism 0:d67893e6f32f 368 }
Elitism 0:d67893e6f32f 369
Elitism 0:d67893e6f32f 370 // Writes an ascii character to the display
Elitism 0:d67893e6f32f 371 void ILI9340_Display::DrawAscii(unsigned char ascii, uint16_t x, uint16_t y, uint16_t size, uint16_t colour)
Elitism 0:d67893e6f32f 372 {
Elitism 0:d67893e6f32f 373 SetAddrWindow(x, y, x+size, y+size);
Elitism 0:d67893e6f32f 374
Elitism 0:d67893e6f32f 375 if( (ascii < 0x20) || (ascii > 0x7e) ) { //check for valid ASCII char
Elitism 0:d67893e6f32f 376 ascii = '?'; //char not supported
Elitism 0:d67893e6f32f 377 }
Elitism 0:d67893e6f32f 378 for(unsigned char i=0; i<8; i++) {
Elitism 0:d67893e6f32f 379 unsigned char temp = simpleFont[ascii - 0x20][i];
Elitism 0:d67893e6f32f 380 for(unsigned char f=0; f<8; f++) {
Elitism 0:d67893e6f32f 381 if( (temp>>f) & 0x01 ) {
Elitism 0:d67893e6f32f 382 switch(orientation) {
Elitism 0:d67893e6f32f 383 case '0':
Elitism 0:d67893e6f32f 384 FillRect(x+f*size, y-i*size, size, size, colour);
Elitism 0:d67893e6f32f 385 break;
Elitism 0:d67893e6f32f 386 case '1':
Elitism 0:d67893e6f32f 387 FillRect(x-i*size, x-f*size, size, size, colour);
Elitism 0:d67893e6f32f 388 break;
Elitism 0:d67893e6f32f 389 case '2':
Elitism 0:d67893e6f32f 390 FillRect(x-f*size, y+i*size, size, size, colour);
Elitism 0:d67893e6f32f 391 break;
Elitism 0:d67893e6f32f 392 case '3':
Elitism 0:d67893e6f32f 393 default:
Elitism 0:d67893e6f32f 394 FillRect(x+i*size, y+f*size, size, size, colour);
Elitism 0:d67893e6f32f 395 }
Elitism 0:d67893e6f32f 396 }
Elitism 0:d67893e6f32f 397 }
Elitism 0:d67893e6f32f 398 }
Elitism 0:d67893e6f32f 399 }
Elitism 0:d67893e6f32f 400
Elitism 0:d67893e6f32f 401 // Writes a character array to the display
Elitism 0:d67893e6f32f 402 void ILI9340_Display::DrawString(char *string, uint16_t x, uint16_t y, uint8_t size, uint16_t colour)
Elitism 0:d67893e6f32f 403 {
Elitism 0:d67893e6f32f 404 while(*string) {
Elitism 0:d67893e6f32f 405 DrawAscii(*string, x, y, size, colour);
Elitism 0:d67893e6f32f 406 *string++;
Elitism 0:d67893e6f32f 407 switch(orientation) {
Elitism 0:d67893e6f32f 408 case '0':
Elitism 0:d67893e6f32f 409 if(y > 0) y-=8*size; //Change position to next char
Elitism 0:d67893e6f32f 410 break;
Elitism 0:d67893e6f32f 411 case '1':
Elitism 0:d67893e6f32f 412 if(x > 0) x-=8*size;
Elitism 0:d67893e6f32f 413 break;
Elitism 0:d67893e6f32f 414 case '2':
Elitism 0:d67893e6f32f 415 if(y < _height) y+=8*size;
Elitism 0:d67893e6f32f 416 break;
Elitism 0:d67893e6f32f 417 case '3':
Elitism 0:d67893e6f32f 418 default:
Elitism 0:d67893e6f32f 419 if(x < _width) x+=8*size;
Elitism 0:d67893e6f32f 420 }
Elitism 0:d67893e6f32f 421 }
Elitism 0:d67893e6f32f 422 }
Elitism 0:d67893e6f32f 423
Elitism 0:d67893e6f32f 424 // Converts integers into a character array
Elitism 0:d67893e6f32f 425 void ILI9340_Display::IntToChars (char* buffer, int value, uint8_t spaceonbuffer, uint8_t countbase, uint16_t x, uint16_t y, uint8_t size, uint16_t colour)
Elitism 0:d67893e6f32f 426 {
Elitism 0:d67893e6f32f 427 int workvalue = value;
Elitism 0:d67893e6f32f 428 int i;
Elitism 0:d67893e6f32f 429 int valuetowrite;
Elitism 0:d67893e6f32f 430 int end_i = 0;
Elitism 0:d67893e6f32f 431
Elitism 0:d67893e6f32f 432 if (value < 0) {
Elitism 0:d67893e6f32f 433 workvalue = -value;
Elitism 0:d67893e6f32f 434 end_i = 1;
Elitism 0:d67893e6f32f 435 buffer[0] = '-';
Elitism 0:d67893e6f32f 436 }
Elitism 0:d67893e6f32f 437
Elitism 0:d67893e6f32f 438 for (i = spaceonbuffer - 1; i >= end_i; i--) {
Elitism 0:d67893e6f32f 439 valuetowrite = (workvalue % countbase);
Elitism 0:d67893e6f32f 440 if (workvalue == 0) {
Elitism 0:d67893e6f32f 441 if (i == (spaceonbuffer - 1)) {
Elitism 0:d67893e6f32f 442 buffer[i] = 48; // ASCII 0
Elitism 0:d67893e6f32f 443 } else {
Elitism 0:d67893e6f32f 444 buffer[i] = 32; // ASCII SPACE
Elitism 0:d67893e6f32f 445 }
Elitism 0:d67893e6f32f 446 } else {
Elitism 0:d67893e6f32f 447 if (valuetowrite > 9) {
Elitism 0:d67893e6f32f 448 buffer[i] = valuetowrite + 55; // ASCII A-Z
Elitism 0:d67893e6f32f 449 } else {
Elitism 0:d67893e6f32f 450 buffer[i] = valuetowrite + 48; // ASCII of that character
Elitism 0:d67893e6f32f 451 }
Elitism 0:d67893e6f32f 452 };
Elitism 0:d67893e6f32f 453 workvalue = (workvalue - valuetowrite) / countbase;
Elitism 0:d67893e6f32f 454 }
Elitism 0:d67893e6f32f 455
Elitism 0:d67893e6f32f 456 DrawString(buffer, x, y, size, colour);
Elitism 0:d67893e6f32f 457 }
Elitism 0:d67893e6f32f 458
Elitism 0:d67893e6f32f 459 // Functional code to swap data contents of 16bit registers
Elitism 0:d67893e6f32f 460 void ILI9340_Display::Swap(int16_t *a, int16_t *b)
Elitism 0:d67893e6f32f 461 {
Elitism 0:d67893e6f32f 462
Elitism 0:d67893e6f32f 463 int16_t x = *a;
Elitism 0:d67893e6f32f 464 *a = *b;
Elitism 0:d67893e6f32f 465 *b = x;
Elitism 0:d67893e6f32f 466 }
Elitism 0:d67893e6f32f 467
Elitism 0:d67893e6f32f 468 // Draws a line with any length and orientation
Elitism 0:d67893e6f32f 469 void ILI9340_Display::DrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t colour)
Elitism 0:d67893e6f32f 470 {
Elitism 0:d67893e6f32f 471 int16_t steep = abs(y1 - y0) > abs(x1 - x0);
Elitism 0:d67893e6f32f 472 if (steep) {
Elitism 0:d67893e6f32f 473 Swap(&x0, &y0);
Elitism 0:d67893e6f32f 474 Swap(&x1, &y1);
Elitism 0:d67893e6f32f 475 }
Elitism 0:d67893e6f32f 476
Elitism 0:d67893e6f32f 477 if (x0 > x1) {
Elitism 0:d67893e6f32f 478 Swap(&x0, &x1);
Elitism 0:d67893e6f32f 479 Swap(&y0, &y1);
Elitism 0:d67893e6f32f 480 }
Elitism 0:d67893e6f32f 481
Elitism 0:d67893e6f32f 482 int16_t dx, dy;
Elitism 0:d67893e6f32f 483 dx = x1 - x0;
Elitism 0:d67893e6f32f 484 dy = abs(y1 - y0);
Elitism 0:d67893e6f32f 485
Elitism 0:d67893e6f32f 486 int16_t err = dx / 2;
Elitism 0:d67893e6f32f 487 int16_t ystep;
Elitism 0:d67893e6f32f 488
Elitism 0:d67893e6f32f 489 if (y0 < y1) {
Elitism 0:d67893e6f32f 490 ystep = 1;
Elitism 0:d67893e6f32f 491 } else {
Elitism 0:d67893e6f32f 492 ystep = -1;
Elitism 0:d67893e6f32f 493 }
Elitism 0:d67893e6f32f 494
Elitism 0:d67893e6f32f 495 for (; x0<=x1; x0++) {
Elitism 0:d67893e6f32f 496 if (steep) {
Elitism 0:d67893e6f32f 497 DrawPixel(y0, x0, colour);
Elitism 0:d67893e6f32f 498 } else {
Elitism 0:d67893e6f32f 499 DrawPixel(x0, y0, colour);
Elitism 0:d67893e6f32f 500 }
Elitism 0:d67893e6f32f 501 err -= dy;
Elitism 0:d67893e6f32f 502 if (err < 0) {
Elitism 0:d67893e6f32f 503 y0 += ystep;
Elitism 0:d67893e6f32f 504 err += dx;
Elitism 0:d67893e6f32f 505 }
Elitism 0:d67893e6f32f 506 }
Elitism 0:d67893e6f32f 507 }