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.
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
ILI9340_Driver.cpp@0:d67893e6f32f, 2014-08-28 (annotated)
- Committer:
- Elitism
- Date:
- Thu Aug 28 17:29:23 2014 +0000
- Revision:
- 0:d67893e6f32f
Serial Control of ILI9340C TFT Display.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |