mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
Initial ESP8266 HW SPI implementation
ILI9341 lib as a client for SPI lib
This commit is contained in:
parent
61f3d12909
commit
4626a9df80
95
libraries/SPI/HSPI.cpp
Normal file
95
libraries/SPI/HSPI.cpp
Normal file
@ -0,0 +1,95 @@
|
||||
#include "include\HSPI.h"
|
||||
#include "include\spi_register.h"
|
||||
|
||||
#define __min(a,b) ((a > b) ? (b):(a))
|
||||
|
||||
void HSPI::begin()
|
||||
{
|
||||
spi_fifo = (uint32_t*)SPI_FLASH_C0(hspi_port);
|
||||
//bit9 of PERIPHS_IO_MUX should be cleared when HSPI clock doesn't equal CPU clock
|
||||
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); // gpio12
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI); // gpio13
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK); // gpio14
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0); // gpio15
|
||||
|
||||
uint32_t regvalue = SPI_FLASH_DOUT;
|
||||
regvalue |= SPI_DOUTDIN | SPI_CK_I_EDGE;
|
||||
regvalue &= ~(BIT2 | SPI_FLASH_USR_ADDR | SPI_FLASH_USR_DUMMY | SPI_FLASH_USR_DIN | SPI_USR_COMMAND);
|
||||
|
||||
SET_PERI_REG_MASK(SPI_FLASH_USER(hspi_port), regvalue);
|
||||
|
||||
// SPI clock=CPU clock/8
|
||||
WRITE_PERI_REG(SPI_FLASH_CLOCK(hspi_port),
|
||||
((1&SPI_CLKDIV_PRE)<<SPI_CLKDIV_PRE_S)|
|
||||
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||
|
||||
}
|
||||
|
||||
void HSPI::end()
|
||||
{
|
||||
}
|
||||
|
||||
void HSPI::setDataMode(uint8_t dataMode)
|
||||
{
|
||||
}
|
||||
|
||||
void HSPI::setBitOrder(uint8_t bitOrder)
|
||||
{
|
||||
if (!bitOrder)
|
||||
{
|
||||
WRITE_PERI_REG(SPI_FLASH_CTRL(hspi_port),
|
||||
READ_PERI_REG(SPI_FLASH_CTRL(hspi_port)) & (~(SPI_WR_BIT_ODER | SPI_RD_BIT_ODER)));
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITE_PERI_REG(SPI_FLASH_CTRL(hspi_port),
|
||||
READ_PERI_REG(SPI_FLASH_CTRL(hspi_port)) | (SPI_WR_BIT_ODER | SPI_RD_BIT_ODER));
|
||||
}
|
||||
}
|
||||
|
||||
void HSPI::setClockDivider(uint8_t clockDiv)
|
||||
{
|
||||
uint32_t clock_reg_val = (((clockDiv - 1) & SPI_CLKDIV_PRE) << SPI_CLKDIV_PRE_S) |
|
||||
((1 & SPI_CLKCNT_N) << SPI_CLKCNT_N_S) |
|
||||
((0 & SPI_CLKCNT_H) << SPI_CLKCNT_H_S) |
|
||||
((1 & SPI_CLKCNT_L) << SPI_CLKCNT_L_S);
|
||||
WRITE_PERI_REG(SPI_FLASH_CLOCK(hspi_port), clock_reg_val);
|
||||
}
|
||||
|
||||
uint8_t HSPI::transfer(uint8_t data)
|
||||
{
|
||||
hspi_wait_ready();
|
||||
hspi_prepare_txrx(1);
|
||||
*spi_fifo = data;
|
||||
hspi_start_tx();
|
||||
hspi_wait_ready();
|
||||
return *spi_fifo & 0xFF;
|
||||
}
|
||||
|
||||
uint16_t HSPI::transfer16(uint16_t data)
|
||||
{
|
||||
hspi_wait_ready();
|
||||
hspi_prepare_txrx(2);
|
||||
*spi_fifo = data;
|
||||
hspi_start_tx();
|
||||
hspi_wait_ready();
|
||||
return *spi_fifo & 0xFFFF;
|
||||
}
|
||||
|
||||
void HSPI::transfer(void *buf, size_t count)
|
||||
{
|
||||
uint32_t *_data = (uint32_t*)buf;
|
||||
uint8_t i;
|
||||
|
||||
uint8_t words_to_send = __min((count + 3) / 4, hspi_fifo_size);
|
||||
hspi_prepare_tx(count);
|
||||
for(i = 0; i < words_to_send;i++)
|
||||
spi_fifo[i] = _data[i];
|
||||
hspi_start_tx();
|
||||
}
|
||||
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
*/
|
||||
|
||||
#include "SPI.h"
|
||||
#include "HSPI.h"
|
||||
#include "include\HSPI.h"
|
||||
|
||||
SPIClass SPI;
|
||||
|
||||
@ -38,13 +38,29 @@ void SPIClass::end()
|
||||
_impl = 0;
|
||||
}
|
||||
|
||||
void SPIClass::beginTransaction(SPISettings settings)
|
||||
{
|
||||
if (!_impl)
|
||||
return;
|
||||
_impl->setBitOrder(settings._bitOrder);
|
||||
_impl->setDataMode(settings._dataMode);
|
||||
_impl->setClockDivider(settings._clock);
|
||||
}
|
||||
|
||||
uint8_t SPIClass::transfer(uint8_t data)
|
||||
{
|
||||
if (!_impl)
|
||||
return;
|
||||
return 0;
|
||||
return _impl->transfer(data);
|
||||
}
|
||||
|
||||
uint16_t SPIClass::transfer16(uint16_t data)
|
||||
{
|
||||
if (!_impl)
|
||||
return 0;
|
||||
return _impl->transfer16(data);
|
||||
}
|
||||
|
||||
void SPIClass::transfer(void *buf, size_t count)
|
||||
{
|
||||
if (!_impl)
|
||||
|
@ -14,6 +14,7 @@
|
||||
#define _SPI_H_INCLUDED
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <stdlib.h>
|
||||
#include "include/SPIdef.h"
|
||||
|
||||
|
||||
@ -42,11 +43,11 @@ public:
|
||||
void begin();
|
||||
|
||||
// void usingInterrupt(uint8_t interruptNumber);
|
||||
// void beginTransaction(SPISettings settings);
|
||||
void beginTransaction(SPISettings settings);
|
||||
uint8_t transfer(uint8_t data);
|
||||
// uint16_t transfer16(uint16_t data);
|
||||
uint16_t transfer16(uint16_t data);
|
||||
void transfer(void *buf, size_t count);
|
||||
// void endTransaction(void);
|
||||
void endTransaction(void);
|
||||
|
||||
void end();
|
||||
|
||||
|
@ -14,78 +14,35 @@ extern "C" {
|
||||
class HSPI : public SPIImpl
|
||||
{
|
||||
public:
|
||||
virtual void begin()
|
||||
{
|
||||
//bit9 of PERIPHS_IO_MUX should be cleared when HSPI clock doesn't equal CPU clock
|
||||
WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); // gpio12
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI); // gpio13
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK); // gpio14
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0); // gpio15
|
||||
|
||||
|
||||
SET_PERI_REG_MASK(SPI_USER(HSPI), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND);
|
||||
CLEAR_PERI_REG_MASK(SPI_USER(HSPI), SPI_FLASH_MODE);
|
||||
|
||||
// SPI clock=CPU clock/8
|
||||
WRITE_PERI_REG(SPI_CLOCK(HSPI),
|
||||
((1&SPI_CLKDIV_PRE)<<SPI_CLKDIV_PRE_S)|
|
||||
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||
|
||||
|
||||
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_USR_COMMAND|SPI_USR_MOSI);
|
||||
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE);
|
||||
|
||||
//clear Daul or Quad lines transmission mode
|
||||
CLEAR_PERI_REG_MASK(SPI_CTRL(spi_no), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
|
||||
|
||||
WRITE_PERI_REG(SPI_CLOCK(spi_no),
|
||||
((3&SPI_CLKCNT_N)<<SPI_CLKCNT_N_S)|
|
||||
((1&SPI_CLKCNT_H)<<SPI_CLKCNT_H_S)|
|
||||
((3&SPI_CLKCNT_L)<<SPI_CLKCNT_L_S)); //clear bit 31,set SPI clock div
|
||||
|
||||
//set 8bit output buffer length, the buffer is the low 8bit of register"SPI_FLASH_C0"
|
||||
WRITE_PERI_REG(SPI_USER1(spi_no),
|
||||
((7&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S)|
|
||||
((7&SPI_USR_MISO_BITLEN)<<SPI_USR_MISO_BITLEN_S));
|
||||
|
||||
}
|
||||
|
||||
virtual void end()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void setBitOrder(uint8_t bitOrder)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void setDataMode(uint8_t dataMode)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void setClockDivider(uint8_t clockDiv)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual uint8_t transfer(uint8_t data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void transfer(void *buf, size_t count)
|
||||
{
|
||||
|
||||
}
|
||||
virtual void begin();
|
||||
virtual void end();
|
||||
virtual void setBitOrder(uint8_t bitOrder);
|
||||
virtual void setDataMode(uint8_t dataMode);
|
||||
virtual void setClockDivider(uint8_t clockDiv);
|
||||
virtual uint8_t transfer(uint8_t data);
|
||||
virtual uint16_t transfer16(uint16_t data);
|
||||
virtual void transfer(void *buf, size_t count);
|
||||
|
||||
private:
|
||||
uint32_t _clkDiv;
|
||||
uint32_t *spi_fifo;
|
||||
const uint32_t hspi_port = 1;
|
||||
const uint32_t hspi_fifo_size = 32;
|
||||
|
||||
private:
|
||||
inline void hspi_wait_ready(void){while (READ_PERI_REG(SPI_FLASH_CMD(hspi_port))&SPI_FLASH_USR);}
|
||||
inline void hspi_start_tx(){SET_PERI_REG_MASK(SPI_FLASH_CMD(hspi_port), SPI_FLASH_USR);}
|
||||
inline void hspi_prepare_tx(uint32_t bytecount)
|
||||
{
|
||||
uint32_t bitcount = bytecount * 8 - 1;
|
||||
WRITE_PERI_REG(SPI_FLASH_USER1(hspi_port), (bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S);
|
||||
}
|
||||
inline void hspi_prepare_txrx(uint32_t bytecount)
|
||||
{
|
||||
uint32_t bitcount = bytecount * 8 - 1;
|
||||
WRITE_PERI_REG(SPI_FLASH_USER1(hspi_port), ((bitcount & SPI_USR_OUT_BITLEN) << SPI_USR_OUT_BITLEN_S) |
|
||||
((bitcount & SPI_USR_DIN_BITLEN) << SPI_USR_DIN_BITLEN_S));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
@ -1,20 +1,20 @@
|
||||
#ifndef SPIIMPL_H
|
||||
#define SPIIMPL_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <Arduino.h>
|
||||
class SPIImpl
|
||||
{
|
||||
public:
|
||||
virtual void begin() = 0;
|
||||
virtual uint8_t transfer(uint8_t data) = 0;
|
||||
virtual uint16_t transfer16(uint16_t data) = 0;
|
||||
virtual void transfer(void *buf, size_t count) = 0;
|
||||
virtual void end() = 0;
|
||||
|
||||
virtual void setBitOrder(uint8_t bitOrder) = 0;
|
||||
virtual void setDataMode(uint8_t dataMode) = 0;
|
||||
virtual void setClockDivider(uint8_t clockDiv) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
239
libraries/SPI/include/spi_register.h
Normal file
239
libraries/SPI/include/spi_register.h
Normal file
@ -0,0 +1,239 @@
|
||||
//Generated at 2014-07-29 11:03:29
|
||||
/*
|
||||
* Copyright (c) 2010 - 2011 Espressif System
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SPI_REGISTER_H_INCLUDED
|
||||
#define SPI_REGISTER_H_INCLUDED
|
||||
|
||||
#define REG_SPI_BASE(i) (0x60000200-i*0x100)
|
||||
|
||||
#define SPI_FLASH_CMD(i) (REG_SPI_BASE(i) + 0x0)
|
||||
#define SPI_FLASH_READ (BIT(31))
|
||||
#define SPI_FLASH_WREN (BIT(30))
|
||||
#define SPI_FLASH_WRDI (BIT(29))
|
||||
#define SPI_FLASH_RDID (BIT(28))
|
||||
#define SPI_FLASH_RDSR (BIT(27))
|
||||
#define SPI_FLASH_WRSR (BIT(26))
|
||||
#define SPI_FLASH_PP (BIT(25))
|
||||
#define SPI_FLASH_SE (BIT(24))
|
||||
#define SPI_FLASH_BE (BIT(23))
|
||||
#define SPI_FLASH_CE (BIT(22))
|
||||
#define SPI_FLASH_DP (BIT(21))
|
||||
#define SPI_FLASH_RES (BIT(20))
|
||||
#define SPI_FLASH_HPM (BIT(19))
|
||||
#define SPI_FLASH_USR (BIT(18))
|
||||
|
||||
#define SPI_FLASH_ADDR(i) (REG_SPI_BASE(i) + 0x4)
|
||||
|
||||
#define SPI_FLASH_CTRL(i) (REG_SPI_BASE(i) + 0x8)
|
||||
#define SPI_WR_BIT_ODER (BIT(26))
|
||||
#define SPI_RD_BIT_ODER (BIT(25))
|
||||
#define SPI_QIO_MODE (BIT(24))
|
||||
#define SPI_DIO_MODE (BIT(23))
|
||||
#define SPI_TWO_BYTE_STATUS_EN (BIT(22))
|
||||
#define SPI_WP_REG (BIT(21))
|
||||
#define SPI_QOUT_MODE (BIT(20))
|
||||
#define SPI_SHARE_BUS (BIT(19))
|
||||
#define SPI_HOLD_MODE (BIT(18))
|
||||
#define SPI_ENABLE_AHB (BIT(17))
|
||||
#define SPI_SST_AAI (BIT(16))
|
||||
#define SPI_RESANDRES (BIT(15))
|
||||
#define SPI_DOUT_MODE (BIT(14))
|
||||
#define SPI_FASTRD_MODE (BIT(13))
|
||||
|
||||
#define SPI_FLASH_CTRL1(i) (REG_SPI_BASE (i) + 0xC)
|
||||
#define SPI_T_CSH 0x0000000F
|
||||
#define SPI_T_CSH_S 28
|
||||
#define SPI_T_RES 0x00000FFF
|
||||
#define SPI_T_RES_S 16
|
||||
#define SPI_BUS_TIMER_LIMIT 0x0000FFFF
|
||||
#define SPI_BUS_TIMER_LIMIT_S 0
|
||||
|
||||
#define SPI_FLASH_STATUS(i) (REG_SPI_BASE(i) + 0x10)
|
||||
#define SPI_STATUS_EXT 0x000000FF
|
||||
#define SPI_STATUS_EXT_S 24
|
||||
#define SPI_WB_MODE 0x000000FF
|
||||
#define SPI_WB_MODE_S 16
|
||||
#define SPI_FLASH_STATUS_PRO_FLAG (BIT(7))
|
||||
#define SPI_FLASH_TOP_BOT_PRO_FLAG (BIT(5))
|
||||
#define SPI_FLASH_BP2 (BIT(4))
|
||||
#define SPI_FLASH_BP1 (BIT(3))
|
||||
#define SPI_FLASH_BP0 (BIT(2))
|
||||
#define SPI_FLASH_WRENABLE_FLAG (BIT(1))
|
||||
#define SPI_FLASH_BUSY_FLAG (BIT(0))
|
||||
|
||||
#define SPI_FLASH_CTRL2(i) (REG_SPI_BASE(i) + 0x14)
|
||||
#define SPI_CS_DELAY_NUM 0x0000000F
|
||||
#define SPI_CS_DELAY_NUM_S 28
|
||||
#define SPI_CS_DELAY_MODE 0x00000003
|
||||
#define SPI_CS_DELAY_MODE_S 26
|
||||
#define SPI_MOSI_DELAY_NUM 0x00000007
|
||||
#define SPI_MOSI_DELAY_NUM_S 23
|
||||
#define SPI_MOSI_DELAY_MODE 0x00000003
|
||||
#define SPI_MOSI_DELAY_MODE_S 21
|
||||
#define SPI_MISO_DELAY_NUM 0x00000007
|
||||
#define SPI_MISO_DELAY_NUM_S 18
|
||||
#define SPI_MISO_DELAY_MODE 0x00000003
|
||||
#define SPI_MISO_DELAY_MODE_S 16
|
||||
#define SPI_CK_OUT_HIGH_MODE 0x0000000F
|
||||
#define SPI_CK_OUT_HIGH_MODE_S 12
|
||||
#define SPI_CK_OUT_LOW_MODE 0x0000000F
|
||||
#define SPI_CK_OUT_LOW_MODE_S 8
|
||||
#define SPI_HOLD_TIME 0x0000000F
|
||||
#define SPI_HOLD_TIME_S 4
|
||||
#define SPI_SETUP_TIME 0x0000000F
|
||||
#define SPI_SETUP_TIME_S 0
|
||||
|
||||
#define SPI_FLASH_CLOCK(i) (REG_SPI_BASE(i) + 0x18)
|
||||
#define SPI_CLK_EQU_SYSCLK (BIT(31))
|
||||
#define SPI_CLKDIV_PRE 0x00001FFF
|
||||
#define SPI_CLKDIV_PRE_S 18
|
||||
#define SPI_CLKCNT_N 0x0000003F
|
||||
#define SPI_CLKCNT_N_S 12
|
||||
#define SPI_CLKCNT_H 0x0000003F
|
||||
#define SPI_CLKCNT_H_S 6
|
||||
#define SPI_CLKCNT_L 0x0000003F
|
||||
#define SPI_CLKCNT_L_S 0
|
||||
|
||||
#define SPI_FLASH_USER(i) (REG_SPI_BASE(i) + 0x1C)
|
||||
#define SPI_USR_COMMAND (BIT(31))
|
||||
#define SPI_FLASH_USR_ADDR (BIT(30))
|
||||
#define SPI_FLASH_USR_DUMMY (BIT(29))
|
||||
#define SPI_FLASH_USR_DIN (BIT(28))
|
||||
#define SPI_FLASH_DOUT (BIT(27))
|
||||
#define SPI_USR_DUMMY_IDLE (BIT(26))
|
||||
#define SPI_USR_DOUT_HIGHPART (BIT(25))
|
||||
#define SPI_USR_DIN_HIGHPART (BIT(24))
|
||||
#define SPI_USR_PREP_HOLD (BIT(23))
|
||||
#define SPI_USR_CMD_HOLD (BIT(22))
|
||||
#define SPI_USR_ADDR_HOLD (BIT(21))
|
||||
#define SPI_USR_DUMMY_HOLD (BIT(20))
|
||||
#define SPI_USR_DIN_HOLD (BIT(19))
|
||||
#define SPI_USR_DOUT_HOLD (BIT(18))
|
||||
#define SPI_USR_HOLD_POL (BIT(17))
|
||||
#define SPI_SIO (BIT(16))
|
||||
#define SPI_FWRITE_QIO (BIT(15))
|
||||
#define SPI_FWRITE_DIO (BIT(14))
|
||||
#define SPI_FWRITE_QUAD (BIT(13))
|
||||
#define SPI_FWRITE_DUAL (BIT(12))
|
||||
#define SPI_WR_BYTE_ORDER (BIT(11))
|
||||
#define SPI_RD_BYTE_ORDER (BIT(10))
|
||||
#define SPI_AHB_ENDIAN_MODE 0x00000003
|
||||
#define SPI_AHB_ENDIAN_MODE_S 8
|
||||
#define SPI_CK_OUT_EDGE (BIT(7))
|
||||
#define SPI_CK_I_EDGE (BIT(6))
|
||||
#define SPI_CS_SETUP (BIT(5))
|
||||
#define SPI_CS_HOLD (BIT(4))
|
||||
#define SPI_AHB_USR_COMMAND (BIT(3))
|
||||
#define SPI_AHB_USR_COMMAND_4BYTE (BIT(1))
|
||||
#define SPI_DOUTDIN (BIT(0))
|
||||
|
||||
#define SPI_FLASH_USER1(i) (REG_SPI_BASE(i) + 0x20)
|
||||
#define SPI_USR_ADDR_BITLEN 0x0000003F
|
||||
#define SPI_USR_ADDR_BITLEN_S 26
|
||||
#define SPI_USR_OUT_BITLEN 0x000001FF
|
||||
#define SPI_USR_OUT_BITLEN_S 17
|
||||
#define SPI_USR_DIN_BITLEN 0x000001FF
|
||||
#define SPI_USR_DIN_BITLEN_S 8
|
||||
#define SPI_USR_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_USR_DUMMY_CYCLELEN_S 0
|
||||
|
||||
#define SPI_FLASH_USER2(i) (REG_SPI_BASE(i) + 0x24)
|
||||
#define SPI_USR_COMMAND_BITLEN 0x0000000F
|
||||
#define SPI_USR_COMMAND_BITLEN_S 28
|
||||
#define SPI_USR_COMMAND_VALUE 0x0000FFFF
|
||||
#define SPI_USR_COMMAND_VALUE_S 0
|
||||
|
||||
#define SPI_FLASH_USER3(i) (REG_SPI_BASE(i) + 0x28)
|
||||
#define SPI_FLASH_PIN(i) (REG_SPI_BASE(i) + 0x2C)
|
||||
#define SPI_FLASH_SLAVE(i) (REG_SPI_BASE(i) + 0x30)
|
||||
#define SPI_SYNC_RESET (BIT(31))
|
||||
#define SPI_SLAVE_MODE (BIT(30))
|
||||
#define SPI_SLV_WR_RD_BUF_EN (BIT(29))
|
||||
#define SPI_SLV_WR_RD_STA_EN (BIT(28))
|
||||
#define SPI_SLV_CMD_DEFINE (BIT(27))
|
||||
#define SPI_TRANS_CNT 0x0000000F
|
||||
#define SPI_TRANS_CNT_S 23
|
||||
#define SPI_SLV_LAST_STATE 0x00000007
|
||||
#define SPI_SLV_LAST_STATE_S 20
|
||||
#define SPI_SLV_LAST_COMMAND 0x00000007
|
||||
#define SPI_SLV_LAST_COMMAND_S 17
|
||||
#define SPI_CS_I_MODE 0x00000003
|
||||
#define SPI_CS_I_MODE_S 10
|
||||
#define SPI_INT_EN 0x0000001F
|
||||
#define SPI_INT_EN_S 5
|
||||
#define SPI_TRANS_DONE (BIT(4))
|
||||
#define SPI_SLV_WR_STA_DONE (BIT(3))
|
||||
#define SPI_SLV_RD_STA_DONE (BIT(2))
|
||||
#define SPI_SLV_WR_BUF_DONE (BIT(1))
|
||||
#define SPI_SLV_RD_BUF_DONE (BIT(0))
|
||||
|
||||
#define SPI_FLASH_SLAVE1(i) (REG_SPI_BASE(i) + 0x34)
|
||||
#define SPI_SLV_STATUS_BITLEN 0x0000001F
|
||||
#define SPI_SLV_STATUS_BITLEN_S 27
|
||||
#define SPI_SLV_STATUS_FAST_EN (BIT(26))
|
||||
#define SPI_SLV_STATUS_READBACK (BIT(25))
|
||||
#define SPI_SLV_BUF_BITLEN 0x000001FF
|
||||
#define SPI_SLV_BUF_BITLEN_S 16
|
||||
#define SPI_SLV_RD_ADDR_BITLEN 0x0000003F
|
||||
#define SPI_SLV_RD_ADDR_BITLEN_S 10
|
||||
#define SPI_SLV_WR_ADDR_BITLEN 0x0000003F
|
||||
#define SPI_SLV_WR_ADDR_BITLEN_S 4
|
||||
#define SPI_SLV_WRSTA_DUMMY_EN (BIT(3))
|
||||
#define SPI_SLV_RDSTA_DUMMY_EN (BIT(2))
|
||||
#define SPI_SLV_WRBUF_DUMMY_EN (BIT(1))
|
||||
#define SPI_SLV_RDBUF_DUMMY_EN (BIT(0))
|
||||
|
||||
#define SPI_FLASH_SLAVE2(i) (REG_SPI_BASE(i) + 0x38)
|
||||
#define SPI_SLV_WRBUF_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_WRBUF_DUMMY_CYCLELEN_S 24
|
||||
#define SPI_SLV_RDBUF_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_RDBUF_DUMMY_CYCLELEN_S 16
|
||||
#define SPI_SLV_WRSTA_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_WRSTA_DUMMY_CYCLELEN_S 8
|
||||
#define SPI_SLV_RDSTA_DUMMY_CYCLELEN 0x000000FF
|
||||
#define SPI_SLV_RDSTA_DUMMY_CYCLELEN_S 0
|
||||
|
||||
#define SPI_FLASH_SLAVE3(i) (REG_SPI_BASE(i) + 0x3C)
|
||||
#define SPI_SLV_WRSTA_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_WRSTA_CMD_VALUE_S 24
|
||||
#define SPI_SLV_RDSTA_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_RDSTA_CMD_VALUE_S 16
|
||||
#define SPI_SLV_WRBUF_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_WRBUF_CMD_VALUE_S 8
|
||||
#define SPI_SLV_RDBUF_CMD_VALUE 0x000000FF
|
||||
#define SPI_SLV_RDBUF_CMD_VALUE_S 0
|
||||
|
||||
#define SPI_FLASH_C0(i) (REG_SPI_BASE(i) +0x40)
|
||||
#define SPI_FLASH_C1(i) (REG_SPI_BASE(i) +0x44)
|
||||
#define SPI_FLASH_C2(i) (REG_SPI_BASE(i) +0x48)
|
||||
#define SPI_FLASH_C3(i) (REG_SPI_BASE(i) +0x4C)
|
||||
#define SPI_FLASH_C4(i) (REG_SPI_BASE(i) +0x50)
|
||||
#define SPI_FLASH_C5(i) (REG_SPI_BASE(i) +0x54)
|
||||
#define SPI_FLASH_C6(i) (REG_SPI_BASE(i) +0x58)
|
||||
#define SPI_FLASH_C7(i) (REG_SPI_BASE(i) +0x5C)
|
||||
|
||||
#define SPI_FLASH_EXT0(i) (REG_SPI_BASE(i) + 0xF0)
|
||||
#define SPI_T_PP_ENA (BIT(31))
|
||||
#define SPI_T_PP_SHIFT 0x0000000F
|
||||
#define SPI_T_PP_SHIFT_S 16
|
||||
#define SPI_T_PP_TIME 0x00000FFF
|
||||
#define SPI_T_PP_TIME_S 0
|
||||
|
||||
#define SPI_FLASH_EXT1(i) (REG_SPI_BASE(i) + 0xF4)
|
||||
#define SPI_T_ERASE_ENA (BIT(31))
|
||||
#define SPI_T_ERASE_SHIFT 0x0000000F
|
||||
#define SPI_T_ERASE_SHIFT_S 16
|
||||
#define SPI_T_ERASE_TIME 0x00000FFF
|
||||
#define SPI_T_ERASE_TIME_S 0
|
||||
|
||||
#define SPI_FLASH_EXT2(i) (REG_SPI_BASE(i) + 0xF8)
|
||||
#define SPI_ST 0x00000007
|
||||
#define SPI_ST_S 0
|
||||
|
||||
#define SPI_FLASH_EXT3(i) (REG_SPI_BASE(i) + 0xFC)
|
||||
#define SPI_INT_HOLD_ENA 0x00000003
|
||||
#define SPI_INT_HOLD_ENA_S 0
|
||||
#endif // SPI_REGISTER_H_INCLUDED
|
21
libraries/TFT_Touch_Shield_V2/License.txt
Normal file
21
libraries/TFT_Touch_Shield_V2/License.txt
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Seeed Technology Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
38
libraries/TFT_Touch_Shield_V2/README.md
Normal file
38
libraries/TFT_Touch_Shield_V2/README.md
Normal file
@ -0,0 +1,38 @@
|
||||
TFT_Touch_Shield_V2
|
||||
---------------------------------------------------------
|
||||
|
||||
[](http://www.seeedstudio.com/depot/28-tft-touch-shield-v20-p-1286.html?cPath=34_36)
|
||||
|
||||
This is a multifunctional Arduino/Seeeduino/Arduino Mega compatible resistive touch screen. It can be used as display device or sketch pad.Compared with the previous version, 2.8’’TFT Touch Shield V1.0 , we replaced the screen driver with a more professional chip, ILI9341 driver, providing different pin-saving SPI communication without sacrificing the data transmitting speed. Due to the communication method change, programs developed for the original version need modifications before being transplanted to the new version. With a SD card module integrated also on this shield, this shield reserves great room for other expansions to your project.
|
||||
|
||||
|
||||
**Features**
|
||||
|
||||
- Big screen for easy and comfortable experience
|
||||
- Backlight controllable via programming
|
||||
- 65535 rich colors display
|
||||
- SPI pin-saving communication method
|
||||
- Full screen touch active range
|
||||
|
||||
|
||||
|
||||
<br>
|
||||
For more information, please refer to [wiki page](http://www.seeedstudio.com/wiki/2.8%27%27_TFT_Touch_Shield_v2.0).
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
This software is written by loovee [luweicong@seeedstudio.com](luweicong@seeedstudio.com "luweicong@seeedstudio.com") for seeed studio<br>
|
||||
and is licensed under [The MIT License](http://opensource.org/licenses/mit-license.php). Check License.txt for more information.<br>
|
||||
|
||||
Contributing to this software is warmly welcomed. You can do this basically by<br>
|
||||
[forking](https://help.github.com/articles/fork-a-repo), committing modifications and then [pulling requests](https://help.github.com/articles/using-pull-requests) (follow the links above<br>
|
||||
for operating guide). Adding change log and your contact into file header is encouraged.<br>
|
||||
Thanks for your contribution.
|
||||
|
||||
Seeed Studio is an open hardware facilitation company based in Shenzhen, China. <br>
|
||||
Benefiting from local manufacture power and convenient global logistic system, <br>
|
||||
we integrate resources to serve new era of innovation. Seeed also works with <br>
|
||||
global distributors and partners to push open hardware movement.<br>
|
||||
|
569
libraries/TFT_Touch_Shield_V2/TFTv2.cpp
Normal file
569
libraries/TFT_Touch_Shield_V2/TFTv2.cpp
Normal file
@ -0,0 +1,569 @@
|
||||
/*
|
||||
2012 Copyright (c) Seeed Technology Inc.
|
||||
|
||||
Authors: Albert.Miao & Loovee,
|
||||
Visweswara R (with initializtion code from TFT vendor)
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc.,51 Franklin St,Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
|
||||
void TFT::TFTinit (void)
|
||||
{
|
||||
SPI.begin();
|
||||
|
||||
TFT_CS_HIGH;
|
||||
TFT_DC_HIGH;
|
||||
INT8U i=0, TFTDriver=0;
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
TFTDriver = readID();
|
||||
}
|
||||
delay(500);
|
||||
sendCMD(0x01);
|
||||
delay(200);
|
||||
|
||||
sendCMD(0xCF);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x8B);
|
||||
WRITE_DATA(0X30);
|
||||
|
||||
sendCMD(0xED);
|
||||
WRITE_DATA(0x67);
|
||||
WRITE_DATA(0x03);
|
||||
WRITE_DATA(0X12);
|
||||
WRITE_DATA(0X81);
|
||||
|
||||
sendCMD(0xE8);
|
||||
WRITE_DATA(0x85);
|
||||
WRITE_DATA(0x10);
|
||||
WRITE_DATA(0x7A);
|
||||
|
||||
sendCMD(0xCB);
|
||||
WRITE_DATA(0x39);
|
||||
WRITE_DATA(0x2C);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x34);
|
||||
WRITE_DATA(0x02);
|
||||
|
||||
sendCMD(0xF7);
|
||||
WRITE_DATA(0x20);
|
||||
|
||||
sendCMD(0xEA);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x00);
|
||||
|
||||
sendCMD(0xC0); /* Power control */
|
||||
WRITE_DATA(0x1B); /* VRH[5:0] */
|
||||
|
||||
sendCMD(0xC1); /* Power control */
|
||||
WRITE_DATA(0x10); /* SAP[2:0];BT[3:0] */
|
||||
|
||||
sendCMD(0xC5); /* VCM control */
|
||||
WRITE_DATA(0x3F);
|
||||
WRITE_DATA(0x3C);
|
||||
|
||||
sendCMD(0xC7); /* VCM control2 */
|
||||
WRITE_DATA(0XB7);
|
||||
|
||||
sendCMD(0x36); /* Memory Access Control */
|
||||
WRITE_DATA(0x08);
|
||||
|
||||
sendCMD(0x3A);
|
||||
WRITE_DATA(0x55);
|
||||
|
||||
sendCMD(0xB1);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x1B);
|
||||
|
||||
sendCMD(0xB6); /* Display Function Control */
|
||||
WRITE_DATA(0x0A);
|
||||
WRITE_DATA(0xA2);
|
||||
|
||||
|
||||
sendCMD(0xF2); /* 3Gamma Function Disable */
|
||||
WRITE_DATA(0x00);
|
||||
|
||||
sendCMD(0x26); /* Gamma curve selected */
|
||||
WRITE_DATA(0x01);
|
||||
|
||||
sendCMD(0xE0); /* Set Gamma */
|
||||
WRITE_DATA(0x0F);
|
||||
WRITE_DATA(0x2A);
|
||||
WRITE_DATA(0x28);
|
||||
WRITE_DATA(0x08);
|
||||
WRITE_DATA(0x0E);
|
||||
WRITE_DATA(0x08);
|
||||
WRITE_DATA(0x54);
|
||||
WRITE_DATA(0XA9);
|
||||
WRITE_DATA(0x43);
|
||||
WRITE_DATA(0x0A);
|
||||
WRITE_DATA(0x0F);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x00);
|
||||
|
||||
sendCMD(0XE1); /* Set Gamma */
|
||||
WRITE_DATA(0x00);
|
||||
WRITE_DATA(0x15);
|
||||
WRITE_DATA(0x17);
|
||||
WRITE_DATA(0x07);
|
||||
WRITE_DATA(0x11);
|
||||
WRITE_DATA(0x06);
|
||||
WRITE_DATA(0x2B);
|
||||
WRITE_DATA(0x56);
|
||||
WRITE_DATA(0x3C);
|
||||
WRITE_DATA(0x05);
|
||||
WRITE_DATA(0x10);
|
||||
WRITE_DATA(0x0F);
|
||||
WRITE_DATA(0x3F);
|
||||
WRITE_DATA(0x3F);
|
||||
WRITE_DATA(0x0F);
|
||||
|
||||
sendCMD(0x11); /* Exit Sleep */
|
||||
delay(120);
|
||||
sendCMD(0x29); /* Display on */
|
||||
fillScreen();
|
||||
}
|
||||
|
||||
INT8U TFT::readID(void)
|
||||
{
|
||||
INT8U i=0;
|
||||
INT8U data[3] ;
|
||||
INT8U ID[3] = {0x00, 0x93, 0x41};
|
||||
INT8U ToF=1;
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
data[i]=Read_Register(0xd3,i+1);
|
||||
if(data[i] != ID[i])
|
||||
{
|
||||
ToF=0;
|
||||
}
|
||||
}
|
||||
if(!ToF) /* data!=ID */
|
||||
{
|
||||
Serial.print("Read TFT ID failed, ID should be 0x09341, but read ID = 0x");
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
Serial.print(data[i],HEX);
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
return ToF;
|
||||
}
|
||||
|
||||
void TFT::setCol(INT16U StartCol,INT16U EndCol)
|
||||
{
|
||||
sendCMD(0x2A); /* Column Command address */
|
||||
sendData(StartCol);
|
||||
sendData(EndCol);
|
||||
}
|
||||
|
||||
void TFT::setPage(INT16U StartPage,INT16U EndPage)
|
||||
{
|
||||
sendCMD(0x2B); /* Column Command address */
|
||||
sendData(StartPage);
|
||||
sendData(EndPage);
|
||||
}
|
||||
|
||||
void TFT::fillScreen(INT16U XL, INT16U XR, INT16U YU, INT16U YD, INT16U color)
|
||||
{
|
||||
unsigned long XY=0;
|
||||
unsigned long i=0;
|
||||
|
||||
if(XL > XR)
|
||||
{
|
||||
XL = XL^XR;
|
||||
XR = XL^XR;
|
||||
XL = XL^XR;
|
||||
}
|
||||
if(YU > YD)
|
||||
{
|
||||
YU = YU^YD;
|
||||
YD = YU^YD;
|
||||
YU = YU^YD;
|
||||
}
|
||||
XL = constrain(XL, MIN_X,MAX_X);
|
||||
XR = constrain(XR, MIN_X,MAX_X);
|
||||
YU = constrain(YU, MIN_Y,MAX_Y);
|
||||
YD = constrain(YD, MIN_Y,MAX_Y);
|
||||
|
||||
XY = (XR-XL+1);
|
||||
XY = XY*(YD-YU+1);
|
||||
|
||||
Tft.setCol(XL,XR);
|
||||
Tft.setPage(YU, YD);
|
||||
Tft.sendCMD(0x2c);
|
||||
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
|
||||
INT8U Hcolor = color>>8;
|
||||
INT8U Lcolor = color&0xff;
|
||||
for(i=0; i < XY; i++)
|
||||
{
|
||||
SPI.transfer(Hcolor);
|
||||
SPI.transfer(Lcolor);
|
||||
}
|
||||
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
void TFT::fillScreen(void)
|
||||
{
|
||||
Tft.setCol(0, 239);
|
||||
Tft.setPage(0, 319);
|
||||
Tft.sendCMD(0x2c); /* start to write to display ram */
|
||||
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
for(INT16U i=0; i<38400; i++)
|
||||
{
|
||||
SPI.transfer(0);
|
||||
SPI.transfer(0);
|
||||
SPI.transfer(0);
|
||||
SPI.transfer(0);
|
||||
}
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
|
||||
void TFT::setXY(INT16U poX, INT16U poY)
|
||||
{
|
||||
setCol(poX, poX);
|
||||
setPage(poY, poY);
|
||||
sendCMD(0x2c);
|
||||
}
|
||||
|
||||
void TFT::setPixel(INT16U poX, INT16U poY,INT16U color)
|
||||
{
|
||||
|
||||
sendCMD(0x2A); /* Column Command address */
|
||||
sendData(poX);
|
||||
sendData(poX);
|
||||
|
||||
sendCMD(0x2B); /* Column Command address */
|
||||
sendData(poY);
|
||||
sendData(poY);
|
||||
|
||||
sendCMD(0x2c);
|
||||
|
||||
sendData(color);
|
||||
}
|
||||
|
||||
void TFT::drawChar( INT8U ascii, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
|
||||
{
|
||||
if((ascii>=32)&&(ascii<=127))
|
||||
{
|
||||
;
|
||||
}
|
||||
else
|
||||
{
|
||||
ascii = '?'-32;
|
||||
}
|
||||
for (int i =0; i<FONT_X; i++ ) {
|
||||
INT8U temp = pgm_read_byte(&simpleFont[ascii-0x20][i]);
|
||||
for(INT8U f=0;f<8;f++)
|
||||
{
|
||||
if((temp>>f)&0x01)
|
||||
{
|
||||
fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void TFT::drawString(char *string,INT16U poX, INT16U poY, INT16U size,INT16U fgcolor)
|
||||
{
|
||||
while(*string)
|
||||
{
|
||||
drawChar(*string, poX, poY, size, fgcolor);
|
||||
*string++;
|
||||
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX += FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);
|
||||
void TFT::fillRectangle(INT16U poX, INT16U poY, INT16U length, INT16U width, INT16U color)
|
||||
{
|
||||
fillScreen(poX, poX+length, poY, poY+width, color);
|
||||
}
|
||||
|
||||
void TFT::drawHorizontalLine( INT16U poX, INT16U poY,
|
||||
INT16U length,INT16U color)
|
||||
{
|
||||
setCol(poX,poX + length);
|
||||
setPage(poY,poY);
|
||||
sendCMD(0x2c);
|
||||
for(int i=0; i<length; i++)
|
||||
sendData(color);
|
||||
}
|
||||
|
||||
void TFT::drawLine( INT16U x0,INT16U y0,INT16U x1, INT16U y1,INT16U color)
|
||||
{
|
||||
|
||||
int x = x1-x0;
|
||||
int y = y1-y0;
|
||||
int dx = abs(x), sx = x0<x1 ? 1 : -1;
|
||||
int dy = -abs(y), sy = y0<y1 ? 1 : -1;
|
||||
int err = dx+dy, e2; /* error value e_xy */
|
||||
for (;;)
|
||||
{ /* loop */
|
||||
setPixel(x0,y0,color);
|
||||
e2 = 2*err;
|
||||
if (e2 >= dy) { /* e_xy+e_x > 0 */
|
||||
if (x0 == x1) break;
|
||||
err += dy; x0 += sx;
|
||||
}
|
||||
if (e2 <= dx) { /* e_xy+e_y < 0 */
|
||||
if (y0 == y1) break;
|
||||
err += dx; y0 += sy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TFT::drawVerticalLine( INT16U poX, INT16U poY, INT16U length,INT16U color)
|
||||
{
|
||||
setCol(poX,poX);
|
||||
setPage(poY,poY+length);
|
||||
sendCMD(0x2c);
|
||||
for(int i=0; i<length; i++)
|
||||
sendData(color);
|
||||
}
|
||||
|
||||
void TFT::drawRectangle(INT16U poX, INT16U poY, INT16U length, INT16U width,INT16U color)
|
||||
{
|
||||
drawHorizontalLine(poX, poY, length, color);
|
||||
drawHorizontalLine(poX, poY+width, length, color);
|
||||
drawVerticalLine(poX, poY, width,color);
|
||||
drawVerticalLine(poX + length, poY, width,color);
|
||||
}
|
||||
|
||||
void TFT::drawCircle(int poX, int poY, int r,INT16U color)
|
||||
{
|
||||
int x = -r, y = 0, err = 2-2*r, e2;
|
||||
do {
|
||||
setPixel(poX-x, poY+y,color);
|
||||
setPixel(poX+x, poY+y,color);
|
||||
setPixel(poX+x, poY-y,color);
|
||||
setPixel(poX-x, poY-y,color);
|
||||
e2 = err;
|
||||
if (e2 <= y) {
|
||||
err += ++y*2+1;
|
||||
if (-x == y && e2 <= x) e2 = 0;
|
||||
}
|
||||
if (e2 > x) err += ++x*2+1;
|
||||
} while (x <= 0);
|
||||
}
|
||||
|
||||
void TFT::fillCircle(int poX, int poY, int r,INT16U color)
|
||||
{
|
||||
int x = -r, y = 0, err = 2-2*r, e2;
|
||||
do {
|
||||
|
||||
drawVerticalLine(poX-x, poY-y, 2*y, color);
|
||||
drawVerticalLine(poX+x, poY-y, 2*y, color);
|
||||
|
||||
e2 = err;
|
||||
if (e2 <= y) {
|
||||
err += ++y*2+1;
|
||||
if (-x == y && e2 <= x) e2 = 0;
|
||||
}
|
||||
if (e2 > x) err += ++x*2+1;
|
||||
} while (x <= 0);
|
||||
|
||||
}
|
||||
|
||||
void TFT::drawTraingle( int poX1, int poY1, int poX2, int poY2, int poX3, int poY3, INT16U color)
|
||||
{
|
||||
drawLine(poX1, poY1, poX2, poY2,color);
|
||||
drawLine(poX1, poY1, poX3, poY3,color);
|
||||
drawLine(poX2, poY2, poX3, poY3,color);
|
||||
}
|
||||
|
||||
INT8U TFT::drawNumber(long long_num,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor)
|
||||
{
|
||||
INT8U char_buffer[10] = "";
|
||||
INT8U i = 0;
|
||||
INT8U f = 0;
|
||||
|
||||
if (long_num < 0)
|
||||
{
|
||||
f=1;
|
||||
drawChar('-',poX, poY, size, fgcolor);
|
||||
long_num = -long_num;
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX += FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
}
|
||||
else if (long_num == 0)
|
||||
{
|
||||
f=1;
|
||||
drawChar('0',poX, poY, size, fgcolor);
|
||||
return f;
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX += FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
while (long_num > 0)
|
||||
{
|
||||
char_buffer[i++] = long_num % 10;
|
||||
long_num /= 10;
|
||||
}
|
||||
|
||||
f = f+i;
|
||||
for(; i > 0; i--)
|
||||
{
|
||||
drawChar('0'+ char_buffer[i - 1],poX, poY, size, fgcolor);
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
INT8U TFT::drawFloat(float floatNumber,INT8U decimal,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor)
|
||||
{
|
||||
INT16U temp=0;
|
||||
float decy=0.0;
|
||||
float rounding = 0.5;
|
||||
INT8U f=0;
|
||||
if(floatNumber<0.0)
|
||||
{
|
||||
drawChar('-',poX, poY, size, fgcolor);
|
||||
floatNumber = -floatNumber;
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
f =1;
|
||||
}
|
||||
for (INT8U i=0; i<decimal; ++i)
|
||||
{
|
||||
rounding /= 10.0;
|
||||
}
|
||||
floatNumber += rounding;
|
||||
|
||||
temp = (INT16U)floatNumber;
|
||||
INT8U howlong=drawNumber(temp,poX, poY, size, fgcolor);
|
||||
f += howlong;
|
||||
if((poX+8*size*howlong) < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size*howlong; /* Move cursor right */
|
||||
}
|
||||
|
||||
if(decimal>0)
|
||||
{
|
||||
drawChar('.',poX, poY, size, fgcolor);
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
f +=1;
|
||||
}
|
||||
decy = floatNumber-temp; /* decimal part, 4 */
|
||||
for(INT8U i=0;i<decimal;i++)
|
||||
{
|
||||
decy *=10; /* for the next decimal */
|
||||
temp = decy; /* get the decimal */
|
||||
drawNumber(temp,poX, poY, size, fgcolor);
|
||||
floatNumber = -floatNumber;
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
decy -= temp;
|
||||
}
|
||||
f +=decimal;
|
||||
return f;
|
||||
}
|
||||
|
||||
INT8U TFT::drawFloat(float floatNumber,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor)
|
||||
{
|
||||
INT8U decimal=2;
|
||||
INT16U temp=0;
|
||||
float decy=0.0;
|
||||
float rounding = 0.5;
|
||||
INT8U f=0;
|
||||
if(floatNumber<0.0) /* floatNumber < 0 */
|
||||
{
|
||||
drawChar('-',poX, poY, size, fgcolor); /* add a '-' */
|
||||
floatNumber = -floatNumber;
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
f =1;
|
||||
}
|
||||
for (INT8U i=0; i<decimal; ++i)
|
||||
{
|
||||
rounding /= 10.0;
|
||||
}
|
||||
floatNumber += rounding;
|
||||
|
||||
temp = (INT16U)floatNumber;
|
||||
INT8U howlong=drawNumber(temp,poX, poY, size, fgcolor);
|
||||
f += howlong;
|
||||
if((poX+8*size*howlong) < MAX_X)
|
||||
{
|
||||
poX+=FONT_SPACE*size*howlong; /* Move cursor right */
|
||||
}
|
||||
|
||||
|
||||
if(decimal>0)
|
||||
{
|
||||
drawChar('.',poX, poY, size, fgcolor);
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX += FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
f +=1;
|
||||
}
|
||||
decy = floatNumber-temp; /* decimal part, */
|
||||
for(INT8U i=0;i<decimal;i++)
|
||||
{
|
||||
decy *=10; /* for the next decimal */
|
||||
temp = decy; /* get the decimal */
|
||||
drawNumber(temp,poX, poY, size, fgcolor);
|
||||
floatNumber = -floatNumber;
|
||||
if(poX < MAX_X)
|
||||
{
|
||||
poX += FONT_SPACE*size; /* Move cursor right */
|
||||
}
|
||||
decy -= temp;
|
||||
}
|
||||
f += decimal;
|
||||
return f;
|
||||
}
|
||||
|
||||
TFT Tft=TFT();
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
222
libraries/TFT_Touch_Shield_V2/TFTv2.h
Normal file
222
libraries/TFT_Touch_Shield_V2/TFTv2.h
Normal file
@ -0,0 +1,222 @@
|
||||
/*
|
||||
2012 Copyright (c) Seeed Technology Inc.
|
||||
|
||||
Authors: Albert.Miao & Loovee,
|
||||
Visweswara R (with initializtion code from TFT vendor)
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Modified by Sermus for ESP8266
|
||||
*/
|
||||
#ifndef TFTv2_h
|
||||
#define TFTv2_h
|
||||
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#define SEEEDUINO
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
#include <pgmspace.h>
|
||||
#include <SPI.h>
|
||||
|
||||
//Basic Colors
|
||||
#define RED 0xf800
|
||||
#define GREEN 0x07e0
|
||||
#define BLUE 0x001f
|
||||
#define BLACK 0x0000
|
||||
#define YELLOW 0xffe0
|
||||
#define WHITE 0xffff
|
||||
|
||||
//Other Colors
|
||||
#define CYAN 0x07ff
|
||||
#define BRIGHT_RED 0xf810
|
||||
#define GRAY1 0x8410
|
||||
#define GRAY2 0x4208
|
||||
|
||||
//TFT resolution 240*320
|
||||
#define MIN_X 0
|
||||
#define MIN_Y 0
|
||||
#define MAX_X 239
|
||||
#define MAX_Y 319
|
||||
|
||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
|
||||
#define TFT_CS_LOW {DDRE |= 0x08;PORTE &=~ 0x08;}
|
||||
#define TFT_CS_HIGH {DDRE |= 0x08;PORTE |= 0x08;}
|
||||
#define TFT_DC_LOW {DDRH |= 0x08;PORTH &=~ 0x08;}
|
||||
#define TFT_DC_HIGH {DDRH |= 0x08;PORTH |= 0x08;}
|
||||
#define TFT_BL_OFF {DDRH |= 0x10;PORTH &=~ 0x10;}
|
||||
#define TFT_BL_ON {DDRH |= 0x10;PORTH |= 0x10;}
|
||||
|
||||
#define YP A2 // must be an analog pin, use "An" notation!
|
||||
#define XM A1 // must be an analog pin, use "An" notation!
|
||||
#define YM 54 // can be a digital pin, this is A0
|
||||
#define XP 57 // can be a digital pin, this is A3
|
||||
|
||||
#elif defined(__AVR_ATmega32U4__)
|
||||
|
||||
#define TFT_CS_LOW {DDRC |= 0x40;PORTC &=~ 0x40;}
|
||||
#define TFT_CS_HIGH {DDRC |= 0x40;PORTC |= 0x40;}
|
||||
#define TFT_DC_LOW {DDRD |= 0x80;PORTD &=~ 0x80;}
|
||||
#define TFT_DC_HIGH {DDRD |= 0x80;PORTD |= 0x80;}
|
||||
#define TFT_BL_OFF {DDRE |= 0x40;PORTE &=~ 0x40;}
|
||||
#define TFT_BL_ON {DDRE |= 0x40;PORTE |= 0x40;}
|
||||
|
||||
#define YP A2 // must be an analog pin, use "An" notation!
|
||||
#define XM A1 // must be an analog pin, use "An" notation!
|
||||
#define YM 18 // can be a digital pin, this is A0
|
||||
#define XP 21 // can be a digital pin, this is A3
|
||||
|
||||
#else
|
||||
#define TFT_CS_LOW //ESP8266 hspi has hardware controlled CS
|
||||
#define TFT_CS_HIGH
|
||||
#define TFT_DC_LOW pinMode(2, 0);
|
||||
#define TFT_DC_HIGH pinMode(2, 1);
|
||||
#define TFT_BL_OFF pinMode(0, 0);
|
||||
#define TFT_BL_ON pinMode(0, 1);
|
||||
|
||||
#define YP A2 // must be an analog pin, use "An" notation!
|
||||
#define XM A1 // must be an analog pin, use "An" notation!
|
||||
#define YM 14 // can be a digital pin, this is A0
|
||||
#define XP 17 // can be a digital pin, this is A3
|
||||
|
||||
#endif
|
||||
|
||||
#define TS_MINX 116*2
|
||||
#define TS_MAXX 890*2
|
||||
#define TS_MINY 83*2
|
||||
#define TS_MAXY 913*2
|
||||
|
||||
#ifndef INT8U
|
||||
#define INT8U unsigned char
|
||||
#endif
|
||||
#ifndef INT16U
|
||||
#define INT16U unsigned int
|
||||
#endif
|
||||
|
||||
#define FONT_SPACE 6
|
||||
#define FONT_X 8
|
||||
#define FONT_Y 8
|
||||
|
||||
|
||||
extern INT8U simpleFont[][8];
|
||||
|
||||
class TFT
|
||||
{
|
||||
|
||||
private:
|
||||
|
||||
|
||||
|
||||
public:
|
||||
|
||||
inline void sendCMD(INT8U index)
|
||||
{
|
||||
TFT_DC_LOW;
|
||||
TFT_CS_LOW;
|
||||
SPI.transfer(index);
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
inline void WRITE_DATA(INT8U data)
|
||||
{
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
SPI.transfer(data);
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
inline void sendData(INT16U data)
|
||||
{
|
||||
INT8U data1 = data>>8;
|
||||
INT8U data2 = data&0xff;
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
SPI.transfer(data1);
|
||||
SPI.transfer(data2);
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
void WRITE_Package(INT16U *data, INT8U howmany)
|
||||
{
|
||||
INT16U data1 = 0;
|
||||
INT8U data2 = 0;
|
||||
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
INT8U count=0;
|
||||
for(count=0;count<howmany;count++)
|
||||
{
|
||||
data1 = data[count]>>8;
|
||||
data2 = data[count]&0xff;
|
||||
SPI.transfer(data1);
|
||||
SPI.transfer(data2);
|
||||
}
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
INT8U Read_Register(INT8U Addr, INT8U xParameter)
|
||||
{
|
||||
INT8U data=0;
|
||||
sendCMD(0xd9); /* ext command */
|
||||
WRITE_DATA(0x10+xParameter); /* 0x11 is the first Parameter */
|
||||
TFT_DC_LOW;
|
||||
TFT_CS_LOW;
|
||||
SPI.transfer(Addr);
|
||||
TFT_DC_HIGH;
|
||||
data = SPI.transfer(0);
|
||||
TFT_CS_HIGH;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void TFTinit (void);
|
||||
void setCol(INT16U StartCol,INT16U EndCol);
|
||||
void setPage(INT16U StartPage,INT16U EndPage);
|
||||
void setXY(INT16U poX, INT16U poY);
|
||||
void setPixel(INT16U poX, INT16U poY,INT16U color);
|
||||
|
||||
void fillScreen(INT16U XL,INT16U XR,INT16U YU,INT16U YD,INT16U color);
|
||||
void fillScreen(void);
|
||||
INT8U readID(void);
|
||||
|
||||
void drawChar(INT8U ascii,INT16U poX, INT16U poY,INT16U size, INT16U fgcolor);
|
||||
void drawString(char *string,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
void fillRectangle(INT16U poX, INT16U poY, INT16U length, INT16U width, INT16U color);
|
||||
|
||||
void drawLine(INT16U x0,INT16U y0,INT16U x1,INT16U y1,INT16U color);
|
||||
void drawVerticalLine(INT16U poX, INT16U poY,INT16U length,INT16U color);
|
||||
void drawHorizontalLine(INT16U poX, INT16U poY,INT16U length,INT16U color);
|
||||
void drawRectangle(INT16U poX, INT16U poY, INT16U length,INT16U width,INT16U color);
|
||||
|
||||
void drawCircle(int poX, int poY, int r,INT16U color);
|
||||
void fillCircle(int poX, int poY, int r,INT16U color);
|
||||
|
||||
void drawTraingle(int poX1, int poY1, int poX2, int poY2, int poX3, int poY3, INT16U color);
|
||||
|
||||
INT8U drawNumber(long long_num,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
INT8U drawFloat(float floatNumber,INT8U decimal,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
INT8U drawFloat(float floatNumber,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
|
||||
};
|
||||
|
||||
extern TFT Tft;
|
||||
|
||||
#endif
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
@ -0,0 +1,32 @@
|
||||
/* Demo of draw circle's APP
|
||||
drawCircle(int poX, int poY, int r,INT16U color);
|
||||
fillCircle(int poX, int poY, int r,INT16U color);
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
TFT_BL_ON; //turn on the background light
|
||||
|
||||
Tft.TFTinit(); //init TFT library
|
||||
|
||||
Tft.drawCircle(100, 100, 30,YELLOW); //center: (100, 100), r = 30 ,color : YELLOW
|
||||
|
||||
Tft.drawCircle(100, 200, 40,CYAN); // center: (100, 200), r = 10 ,color : CYAN
|
||||
|
||||
Tft.fillCircle(200, 100, 30,RED); //center: (200, 100), r = 30 ,color : RED
|
||||
|
||||
Tft.fillCircle(200, 200, 30,BLUE); //center: (200, 200), r = 30 ,color : BLUE
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
@ -0,0 +1,31 @@
|
||||
/* Demo of draw line's APP
|
||||
drawLine(unsigned int x0,unsigned int y0,unsigned int x1,unsigned int y1,unsigned int color);
|
||||
drawVerticalLine(unsigned int poX, unsigned int poY,unsigned int length,unsigned int color);
|
||||
drawHorizontalLine(unsigned int poX, unsigned int poY,unsigned int length,unsigned int color);
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
void setup()
|
||||
{
|
||||
TFT_BL_ON; // turn on the background light
|
||||
Tft.TFTinit(); //init TFT library
|
||||
|
||||
Tft.drawLine(0,0,239,319,RED); //start: (0, 0) end: (239, 319), color : RED
|
||||
|
||||
Tft.drawVerticalLine(60,100,100,GREEN); // Draw a vertical line
|
||||
// start: (60, 100) length: 100 color: green
|
||||
|
||||
Tft.drawHorizontalLine(30,60,150,BLUE); //Draw a horizontal line
|
||||
//start: (30, 60), high: 150, color: blue
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
@ -0,0 +1,40 @@
|
||||
/* draw number's APP
|
||||
drawNumber(long long_num,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
drawFloat(float floatNumber,INT8U decimal,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
drawFloat(float floatNumber,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
TFT_BL_ON; // turn on the background light
|
||||
|
||||
Tft.TFTinit(); // init TFT library
|
||||
|
||||
Tft.drawNumber(1024, 0, 0, 1, RED); // draw a integer: 1024, Location: (0, 0), size: 1, color: RED
|
||||
|
||||
Tft.drawNumber(1024, 0, 20, 2, BLUE); // draw a integer: 1024, Location: (0, 20), size: 2, color: BLUE
|
||||
|
||||
Tft.drawNumber(1024, 0, 50, 3, GREEN); // draw a integer: 1024, Location: (0, 50), size: 3, color: GREEN
|
||||
|
||||
Tft.drawNumber(1024, 0, 90, 4, BLUE); // draw a integer: 1024, Location: (0, 90), size:4, color: BLUE
|
||||
|
||||
Tft.drawFloat(1.2345, 0, 150, 4, YELLOW); // draw a float number: 1.2345, Location: (0, 150), size: 4, color: YELLOW
|
||||
|
||||
Tft.drawFloat(1.2345, 2, 0, 200, 4, BLUE); // draw a float number: 1.2345: Location: (0, 200), size: 4, decimal: 2, color: BLUE
|
||||
|
||||
Tft.drawFloat(1.2345, 4, 0, 250, 4, RED); // draw a float number: 1.2345 Location: (0, 250), size: 4, decimal: 4, color: RED
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
@ -0,0 +1,26 @@
|
||||
/* Draw Boxes - Demonstrate drawRectangle and fillRectangle
|
||||
fillScreen(INT16U XL,INT16U XR,INT16U YU,INT16U YD,INT16U color);
|
||||
fillRectangle(INT16U poX, INT16U poY, INT16U length, INT16U width, INT16U color);
|
||||
drawRectangle(INT16U poX, INT16U poY, INT16U length,INT16U width,INT16U color);
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
TFT_BL_ON; // turn on the background light
|
||||
Tft.TFTinit(); // init TFT library
|
||||
|
||||
Tft.fillScreen(80, 160, 50, 150,RED);
|
||||
Tft.fillRectangle(30, 120, 100,65,YELLOW);
|
||||
Tft.drawRectangle(100, 170, 120,60,BLUE);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
}
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
55
libraries/TFT_Touch_Shield_V2/examples/paint/paint.ino
Normal file
55
libraries/TFT_Touch_Shield_V2/examples/paint/paint.ino
Normal file
@ -0,0 +1,55 @@
|
||||
// Paint application - Demonstate both TFT and Touch Screen
|
||||
#include <stdint.h>
|
||||
#include <SeeedTouchScreen.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
int ColorPaletteHigh = 30;
|
||||
int color = WHITE; //Paint brush color
|
||||
unsigned int colors[8] = {BLACK, RED, GREEN, BLUE, CYAN, YELLOW, WHITE, GRAY1};
|
||||
|
||||
// For better pressure precision, we need to know the resistance
|
||||
// between X+ and X- Use any multimeter to read it
|
||||
// The 2.8" TFT Touch shield has 300 ohms across the X plate
|
||||
|
||||
TouchScreen ts = TouchScreen(XP, YP, XM, YM); //init TouchScreen port pins
|
||||
|
||||
void setup()
|
||||
{
|
||||
Tft.TFTinit(); //init TFT library
|
||||
Serial.begin(115200);
|
||||
//Draw the pallet
|
||||
for(int i = 0; i<8; i++)
|
||||
{
|
||||
Tft.fillRectangle(i*30, 0, 30, ColorPaletteHigh, colors[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// a point object holds x y and z coordinates.
|
||||
Point p = ts.getPoint();
|
||||
|
||||
//map the ADC value read to into pixel co-ordinates
|
||||
|
||||
p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
|
||||
p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
|
||||
|
||||
// we have some minimum pressure we consider 'valid'
|
||||
// pressure of 0 means no pressing!
|
||||
|
||||
if (p.z > __PRESURE) {
|
||||
// Detect paint brush color change
|
||||
if(p.y < ColorPaletteHigh+2)
|
||||
{
|
||||
color = colors[p.x/30];
|
||||
}
|
||||
else
|
||||
{
|
||||
Tft.fillCircle(p.x,p.y,2,color);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
23
libraries/TFT_Touch_Shield_V2/examples/shapes/shapes.ino
Normal file
23
libraries/TFT_Touch_Shield_V2/examples/shapes/shapes.ino
Normal file
@ -0,0 +1,23 @@
|
||||
// Draw Boxes - Demonstrate drawRectangle and fillRectangle
|
||||
|
||||
#include <stdint.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
TFT_BL_ON; // turn on the background light
|
||||
Tft.TFTinit(); // init TFT library
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
for(int r=0;r<115;r=r+2) //set r : 0--115
|
||||
{
|
||||
Tft.drawCircle(119,160,r,random(0xFFFF)); //draw circle, center:(119, 160), color: random
|
||||
}
|
||||
delay(10);
|
||||
}
|
||||
/*********************************************************************************************************
|
||||
END FILE
|
||||
*********************************************************************************************************/
|
35
libraries/TFT_Touch_Shield_V2/examples/text/text.ino
Normal file
35
libraries/TFT_Touch_Shield_V2/examples/text/text.ino
Normal file
@ -0,0 +1,35 @@
|
||||
/* draw text's APP
|
||||
drawChar(INT8U ascii,INT16U poX, INT16U poY,INT16U size, INT16U fgcolor);
|
||||
drawString(char *string,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <TFTv2.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
TFT_BL_ON; // turn on the background light
|
||||
Tft.TFTinit(); // init TFT library
|
||||
|
||||
Tft.drawChar('S',0,0,1,RED); // draw char: 'S', (0, 0), size: 1, color: RED
|
||||
|
||||
Tft.drawChar('E',10,10,2,BLUE); // draw char: 'E', (10, 10), size: 2, color: BLUE
|
||||
|
||||
Tft.drawChar('E',20,40,3,GREEN); // draw char: 'E', (20, 40), size: 3, color: GREEN
|
||||
|
||||
Tft.drawChar('E',30,80,4,YELLOW); // draw char: 'E', (30, 80), size: 4, color: YELLOW
|
||||
|
||||
Tft.drawChar('D',40,120,4,YELLOW); // draw char: 'D', (40, 120), size: 4, color: YELLOW
|
||||
|
||||
Tft.drawString("Hello",0,180,3,CYAN); // draw string: "hello", (0, 180), size: 3, color: CYAN
|
||||
|
||||
Tft.drawString("World!!",60,220,4,WHITE); // draw string: "world!!", (80, 230), size: 4, color: WHITE
|
||||
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
}
|
BIN
libraries/TFT_Touch_Shield_V2/examples/tftbmp/flower.BMP
Normal file
BIN
libraries/TFT_Touch_Shield_V2/examples/tftbmp/flower.BMP
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 KiB |
BIN
libraries/TFT_Touch_Shield_V2/examples/tftbmp/hibiscus.bmp
Normal file
BIN
libraries/TFT_Touch_Shield_V2/examples/tftbmp/hibiscus.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 KiB |
BIN
libraries/TFT_Touch_Shield_V2/examples/tftbmp/test.bmp
Normal file
BIN
libraries/TFT_Touch_Shield_V2/examples/tftbmp/test.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 KiB |
235
libraries/TFT_Touch_Shield_V2/examples/tftbmp/tftbmp.ino
Normal file
235
libraries/TFT_Touch_Shield_V2/examples/tftbmp/tftbmp.ino
Normal file
@ -0,0 +1,235 @@
|
||||
/*
|
||||
TFT Touch Shield 2.0 examples - tftbmp
|
||||
|
||||
loovee
|
||||
2013-1-21
|
||||
|
||||
this demo can show specified bmp file in root Directory of SD card
|
||||
please ensure that your image file is 320x240 size.
|
||||
|
||||
change __Gnfile_num and __Gsbmp_files to display your image
|
||||
*/
|
||||
|
||||
#include <SD.h>
|
||||
#include <SPI.h>
|
||||
#include <Streaming.h>
|
||||
|
||||
#include "TFTv2.h"
|
||||
|
||||
#define MAX_BMP 10 // bmp file num
|
||||
#define FILENAME_LEN 20 // max file name length
|
||||
|
||||
|
||||
const int PIN_SD_CS = 4; // pin of sd card
|
||||
|
||||
const int __Gnbmp_height = 320; // bmp hight
|
||||
const int __Gnbmp_width = 240; // bmp width
|
||||
|
||||
unsigned char __Gnbmp_image_offset = 0; // offset
|
||||
|
||||
|
||||
int __Gnfile_num = 3; // num of file
|
||||
|
||||
char __Gsbmp_files[3][FILENAME_LEN] = // add file name here
|
||||
{
|
||||
"flower.BMP",
|
||||
"hibiscus.bmp",
|
||||
"test.bmp",
|
||||
};
|
||||
|
||||
|
||||
File bmpFile;
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
Serial.begin(9600);
|
||||
|
||||
pinMode(PIN_SD_CS,OUTPUT);
|
||||
digitalWrite(PIN_SD_CS,HIGH);
|
||||
|
||||
Tft.TFTinit();
|
||||
|
||||
Sd2Card card;
|
||||
card.init(SPI_FULL_SPEED, PIN_SD_CS);
|
||||
|
||||
if(!SD.begin(PIN_SD_CS))
|
||||
{
|
||||
Serial.println("failed!");
|
||||
while(1); // init fail, die here
|
||||
}
|
||||
|
||||
Serial.println("SD OK!");
|
||||
|
||||
TFT_BL_ON;
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
for(unsigned char i=0; i<__Gnfile_num; i++)
|
||||
{
|
||||
bmpFile = SD.open(__Gsbmp_files[i]);
|
||||
if (! bmpFile)
|
||||
{
|
||||
Serial.println("didnt find image");
|
||||
while (1);
|
||||
}
|
||||
|
||||
if(! bmpReadHeader(bmpFile))
|
||||
{
|
||||
Serial.println("bad bmp");
|
||||
return;
|
||||
}
|
||||
|
||||
bmpdraw(bmpFile, 0, 0);
|
||||
bmpFile.close();
|
||||
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
// This procedure reads a bitmap and draws it to the screen
|
||||
// its sped up by reading many pixels worth of data at a time
|
||||
// instead of just one pixel at a time. increading the buffer takes
|
||||
// more RAM but makes the drawing a little faster. 20 pixels' worth
|
||||
// is probably a good place
|
||||
|
||||
#define BUFFPIXEL 60 // must be a divisor of 240
|
||||
#define BUFFPIXEL_X3 180 // BUFFPIXELx3
|
||||
|
||||
void bmpdraw(File f, int x, int y)
|
||||
{
|
||||
bmpFile.seek(__Gnbmp_image_offset);
|
||||
|
||||
uint32_t time = millis();
|
||||
|
||||
uint8_t sdbuffer[BUFFPIXEL_X3]; // 3 * pixels to buffer
|
||||
|
||||
for (int i=0; i< __Gnbmp_height; i++)
|
||||
{
|
||||
|
||||
for(int j=0; j<(240/BUFFPIXEL); j++)
|
||||
{
|
||||
bmpFile.read(sdbuffer, BUFFPIXEL_X3);
|
||||
uint8_t buffidx = 0;
|
||||
int offset_x = j*BUFFPIXEL;
|
||||
|
||||
unsigned int __color[BUFFPIXEL];
|
||||
|
||||
for(int k=0; k<BUFFPIXEL; k++)
|
||||
{
|
||||
__color[k] = sdbuffer[buffidx+2]>>3; // read
|
||||
__color[k] = __color[k]<<6 | (sdbuffer[buffidx+1]>>2); // green
|
||||
__color[k] = __color[k]<<5 | (sdbuffer[buffidx+0]>>3); // blue
|
||||
|
||||
buffidx += 3;
|
||||
}
|
||||
|
||||
Tft.setCol(offset_x, offset_x+BUFFPIXEL);
|
||||
Tft.setPage(i, i);
|
||||
Tft.sendCMD(0x2c);
|
||||
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
|
||||
for(int m=0; m < BUFFPIXEL; m++)
|
||||
{
|
||||
SPI.transfer(__color[m]>>8);
|
||||
SPI.transfer(__color[m]);
|
||||
}
|
||||
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Serial.print(millis() - time, DEC);
|
||||
Serial.println(" ms");
|
||||
}
|
||||
|
||||
boolean bmpReadHeader(File f)
|
||||
{
|
||||
// read header
|
||||
uint32_t tmp;
|
||||
uint8_t bmpDepth;
|
||||
|
||||
if (read16(f) != 0x4D42) {
|
||||
// magic bytes missing
|
||||
return false;
|
||||
}
|
||||
|
||||
// read file size
|
||||
tmp = read32(f);
|
||||
Serial.print("size 0x");
|
||||
Serial.println(tmp, HEX);
|
||||
|
||||
// read and ignore creator bytes
|
||||
read32(f);
|
||||
|
||||
__Gnbmp_image_offset = read32(f);
|
||||
Serial.print("offset ");
|
||||
Serial.println(__Gnbmp_image_offset, DEC);
|
||||
|
||||
// read DIB header
|
||||
tmp = read32(f);
|
||||
Serial.print("header size ");
|
||||
Serial.println(tmp, DEC);
|
||||
|
||||
|
||||
int bmp_width = read32(f);
|
||||
int bmp_height = read32(f);
|
||||
|
||||
if(bmp_width != __Gnbmp_width || bmp_height != __Gnbmp_height) // if image is not 320x240, return false
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (read16(f) != 1)
|
||||
return false;
|
||||
|
||||
bmpDepth = read16(f);
|
||||
Serial.print("bitdepth ");
|
||||
Serial.println(bmpDepth, DEC);
|
||||
|
||||
if (read32(f) != 0) {
|
||||
// compression not supported!
|
||||
return false;
|
||||
}
|
||||
|
||||
Serial.print("compression ");
|
||||
Serial.println(tmp, DEC);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
// These read data from the SD card file and convert them to big endian
|
||||
// (the data is stored in little endian format!)
|
||||
|
||||
// LITTLE ENDIAN!
|
||||
uint16_t read16(File f)
|
||||
{
|
||||
uint16_t d;
|
||||
uint8_t b;
|
||||
b = f.read();
|
||||
d = f.read();
|
||||
d <<= 8;
|
||||
d |= b;
|
||||
return d;
|
||||
}
|
||||
|
||||
// LITTLE ENDIAN!
|
||||
uint32_t read32(File f)
|
||||
{
|
||||
uint32_t d;
|
||||
uint16_t b;
|
||||
|
||||
b = read16(f);
|
||||
d = read16(f);
|
||||
d <<= 16;
|
||||
d |= b;
|
||||
return d;
|
||||
}
|
348
libraries/TFT_Touch_Shield_V2/examples/tftbmp2/tftbmp2.ino
Normal file
348
libraries/TFT_Touch_Shield_V2/examples/tftbmp2/tftbmp2.ino
Normal file
@ -0,0 +1,348 @@
|
||||
/*
|
||||
TFT Touch Shield 2.0 examples - tftbmp2
|
||||
|
||||
loovee
|
||||
2013-1-21
|
||||
|
||||
this demo can show all bmp file in root Directory of SD card
|
||||
please ensure that your image file is 320x240 size.
|
||||
|
||||
MAX_BMP can config the max file to display
|
||||
FILENAME_LEN can config the max length of file name
|
||||
|
||||
*/
|
||||
|
||||
#include <SD.h>
|
||||
#include <SPI.h>
|
||||
#include <Streaming.h>
|
||||
|
||||
#include "TFTv2.h"
|
||||
|
||||
#define MAX_BMP 10 // bmp file num
|
||||
#define FILENAME_LEN 20 // max file name length
|
||||
|
||||
const int PIN_SD_CS = 4; // pin of sd card
|
||||
|
||||
const long __Gnbmp_height = 320; // bmp hight
|
||||
const long __Gnbmp_width = 240; // bmp width
|
||||
|
||||
long __Gnbmp_image_offset = 0;;
|
||||
|
||||
int __Gnfile_num = 0; // num of file
|
||||
char __Gsbmp_files[MAX_BMP][FILENAME_LEN]; // file name
|
||||
|
||||
File bmpFile;
|
||||
|
||||
// if bmp file return 1, else return 0
|
||||
bool checkBMP(char *_name, char r_name[])
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
if(NULL == _name)return false;
|
||||
|
||||
while(*_name)
|
||||
{
|
||||
r_name[len++] = *(_name++);
|
||||
if(len>FILENAME_LEN)return false;
|
||||
}
|
||||
|
||||
r_name[len] = '\0';
|
||||
|
||||
if(len < 5)return false;
|
||||
|
||||
// if xxx.bmp or xxx.BMP
|
||||
if( r_name[len-4] == '.' \
|
||||
&& (r_name[len-3] == 'b' || (r_name[len-3] == 'B')) \
|
||||
&& (r_name[len-2] == 'm' || (r_name[len-2] == 'M')) \
|
||||
&& (r_name[len-1] == 'p' || (r_name[len-1] == 'P')) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
// search root to find bmp file
|
||||
void searchDirectory()
|
||||
{
|
||||
File root = SD.open("/"); // root
|
||||
while(true)
|
||||
{
|
||||
File entry = root.openNextFile();
|
||||
|
||||
if (! entry)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(!entry.isDirectory())
|
||||
{
|
||||
char *ptmp = entry.name();
|
||||
|
||||
char __Name[20];
|
||||
|
||||
if(checkBMP(ptmp, __Name))
|
||||
{
|
||||
Serial.println(__Name);
|
||||
|
||||
strcpy(__Gsbmp_files[__Gnfile_num++], __Name);
|
||||
}
|
||||
}
|
||||
entry.close();
|
||||
}
|
||||
|
||||
Serial.print("get ");
|
||||
Serial.print(__Gnfile_num);
|
||||
Serial.println(" file: ");
|
||||
|
||||
for(int i=0; i<__Gnfile_num; i++)
|
||||
{
|
||||
Serial.println(__Gsbmp_files[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
Serial.begin(115200);
|
||||
|
||||
pinMode(PIN_SD_CS,OUTPUT);
|
||||
digitalWrite(PIN_SD_CS,HIGH);
|
||||
|
||||
Tft.TFTinit();
|
||||
|
||||
Sd2Card card;
|
||||
card.init(SPI_FULL_SPEED, PIN_SD_CS);
|
||||
|
||||
if(!SD.begin(PIN_SD_CS))
|
||||
{
|
||||
Serial.println("failed!");
|
||||
while(1); // init fail, die here
|
||||
}
|
||||
|
||||
Serial.println("SD OK!");
|
||||
|
||||
searchDirectory();
|
||||
|
||||
TFT_BL_ON;
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
/*
|
||||
static int dirCtrl = 0;
|
||||
for(unsigned char i=0; i<__Gnfile_num; i++)
|
||||
{
|
||||
bmpFile = SD.open(__Gsbmp_files[i]);
|
||||
if (! bmpFile)
|
||||
{
|
||||
Serial.println("didnt find image");
|
||||
while (1);
|
||||
}
|
||||
|
||||
if(! bmpReadHeader(bmpFile))
|
||||
{
|
||||
Serial.println("bad bmp");
|
||||
return;
|
||||
}
|
||||
|
||||
dirCtrl = 1-dirCtrl;
|
||||
bmpdraw(bmpFile, 0, 0, dirCtrl);
|
||||
bmpFile.close();
|
||||
|
||||
delay(1000);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
bmpFile = SD.open("pfvm_1.bmp");
|
||||
|
||||
if (! bmpFile)
|
||||
{
|
||||
Serial.println("didnt find image");
|
||||
while (1);
|
||||
}
|
||||
|
||||
if(! bmpReadHeader(bmpFile))
|
||||
{
|
||||
Serial.println("bad bmp");
|
||||
return;
|
||||
}
|
||||
|
||||
bmpdraw(bmpFile, 0, 0, 1);
|
||||
bmpFile.close();
|
||||
|
||||
while(1);
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
// This procedure reads a bitmap and draws it to the screen
|
||||
// its sped up by reading many pixels worth of data at a time
|
||||
// instead of just one pixel at a time. increading the buffer takes
|
||||
// more RAM but makes the drawing a little faster. 20 pixels' worth
|
||||
// is probably a good place
|
||||
|
||||
#define BUFFPIXEL 60 // must be a divisor of 240
|
||||
#define BUFFPIXEL_X3 180 // BUFFPIXELx3
|
||||
|
||||
|
||||
#define UP_DOWN 1
|
||||
#define DOWN_UP 0
|
||||
|
||||
// dir - 1: up to down
|
||||
// dir - 2: down to up
|
||||
void bmpdraw(File f, int x, int y, int dir)
|
||||
{
|
||||
|
||||
if(bmpFile.seek(__Gnbmp_image_offset))
|
||||
{
|
||||
Serial.print("pos = ");
|
||||
Serial.println(bmpFile.position());
|
||||
}
|
||||
|
||||
uint32_t time = millis();
|
||||
|
||||
uint8_t sdbuffer[BUFFPIXEL_X3]; // 3 * pixels to buffer
|
||||
|
||||
for (int i=0; i< __Gnbmp_height; i++)
|
||||
{
|
||||
if(dir)
|
||||
{
|
||||
bmpFile.seek(__Gnbmp_image_offset+(__Gnbmp_height-1-i)*240*3);
|
||||
}
|
||||
|
||||
for(int j=0; j<(240/BUFFPIXEL); j++)
|
||||
{
|
||||
|
||||
bmpFile.read(sdbuffer, BUFFPIXEL_X3);
|
||||
uint8_t buffidx = 0;
|
||||
int offset_x = j*BUFFPIXEL;
|
||||
|
||||
unsigned int __color[BUFFPIXEL];
|
||||
|
||||
for(int k=0; k<BUFFPIXEL; k++)
|
||||
{
|
||||
__color[k] = sdbuffer[buffidx+2]>>3; // read
|
||||
__color[k] = __color[k]<<6 | (sdbuffer[buffidx+1]>>2); // green
|
||||
__color[k] = __color[k]<<5 | (sdbuffer[buffidx+0]>>3); // blue
|
||||
|
||||
buffidx += 3;
|
||||
}
|
||||
|
||||
Tft.setCol(offset_x, offset_x+BUFFPIXEL);
|
||||
|
||||
if(dir)
|
||||
{
|
||||
Tft.setPage(i, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
Tft.setPage(__Gnbmp_height-i-1, __Gnbmp_height-i-1);
|
||||
}
|
||||
|
||||
Tft.sendCMD(0x2c);
|
||||
|
||||
TFT_DC_HIGH;
|
||||
TFT_CS_LOW;
|
||||
|
||||
for(int m=0; m < BUFFPIXEL; m++)
|
||||
{
|
||||
SPI.transfer(__color[m]>>8);
|
||||
SPI.transfer(__color[m]);
|
||||
|
||||
delay(10);
|
||||
}
|
||||
|
||||
TFT_CS_HIGH;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Serial.print(millis() - time, DEC);
|
||||
Serial.println(" ms");
|
||||
}
|
||||
|
||||
boolean bmpReadHeader(File f)
|
||||
{
|
||||
// read header
|
||||
uint32_t tmp;
|
||||
uint8_t bmpDepth;
|
||||
|
||||
if (read16(f) != 0x4D42) {
|
||||
// magic bytes missing
|
||||
return false;
|
||||
}
|
||||
|
||||
// read file size
|
||||
tmp = read32(f);
|
||||
Serial.print("size 0x");
|
||||
Serial.println(tmp, HEX);
|
||||
|
||||
// read and ignore creator bytes
|
||||
read32(f);
|
||||
|
||||
__Gnbmp_image_offset = read32(f);
|
||||
Serial.print("offset ");
|
||||
Serial.println(__Gnbmp_image_offset, DEC);
|
||||
|
||||
// read DIB header
|
||||
tmp = read32(f);
|
||||
Serial.print("header size ");
|
||||
Serial.println(tmp, DEC);
|
||||
|
||||
int bmp_width = read32(f);
|
||||
int bmp_height = read32(f);
|
||||
|
||||
if(bmp_width != __Gnbmp_width || bmp_height != __Gnbmp_height) // if image is not 320x240, return false
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (read16(f) != 1)
|
||||
return false;
|
||||
|
||||
bmpDepth = read16(f);
|
||||
Serial.print("bitdepth ");
|
||||
Serial.println(bmpDepth, DEC);
|
||||
|
||||
if (read32(f) != 0) {
|
||||
// compression not supported!
|
||||
return false;
|
||||
}
|
||||
|
||||
Serial.print("compression ");
|
||||
Serial.println(tmp, DEC);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
// These read data from the SD card file and convert them to big endian
|
||||
// (the data is stored in little endian format!)
|
||||
|
||||
// LITTLE ENDIAN!
|
||||
uint16_t read16(File f)
|
||||
{
|
||||
uint16_t d;
|
||||
uint8_t b;
|
||||
b = f.read();
|
||||
d = f.read();
|
||||
d <<= 8;
|
||||
d |= b;
|
||||
return d;
|
||||
}
|
||||
|
||||
// LITTLE ENDIAN!
|
||||
uint32_t read32(File f)
|
||||
{
|
||||
uint32_t d;
|
||||
uint16_t b;
|
||||
|
||||
b = read16(f);
|
||||
d = read16(f);
|
||||
d <<= 16;
|
||||
d |= b;
|
||||
return d;
|
||||
}
|
107
libraries/TFT_Touch_Shield_V2/font.c
Normal file
107
libraries/TFT_Touch_Shield_V2/font.c
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
2012 Copyright (c) Seeed Technology Inc.
|
||||
*/
|
||||
|
||||
#include <pgmspace.h>
|
||||
|
||||
const unsigned char simpleFont[][8] PROGMEM=
|
||||
{
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},
|
||||
{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00},
|
||||
{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00},
|
||||
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},
|
||||
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},
|
||||
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00},
|
||||
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},
|
||||
{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},
|
||||
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},
|
||||
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},
|
||||
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},
|
||||
{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00},
|
||||
{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00},
|
||||
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},
|
||||
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},
|
||||
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},
|
||||
{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00},
|
||||
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},
|
||||
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},
|
||||
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},
|
||||
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},
|
||||
{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00},
|
||||
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},
|
||||
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},
|
||||
{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00},
|
||||
{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00},
|
||||
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},
|
||||
{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00},
|
||||
{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00},
|
||||
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},
|
||||
{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00},
|
||||
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},
|
||||
{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},
|
||||
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},
|
||||
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},
|
||||
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},
|
||||
{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00},
|
||||
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},
|
||||
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},
|
||||
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},
|
||||
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},
|
||||
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},
|
||||
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},
|
||||
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},
|
||||
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},
|
||||
{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00},
|
||||
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},
|
||||
{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00},
|
||||
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},
|
||||
{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},
|
||||
{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},
|
||||
{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00},
|
||||
{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},
|
||||
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},
|
||||
{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00},
|
||||
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},
|
||||
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},
|
||||
{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00},
|
||||
{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00},
|
||||
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},
|
||||
{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00},
|
||||
{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00},
|
||||
{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00},
|
||||
{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00},
|
||||
{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00},
|
||||
{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00},
|
||||
{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00},
|
||||
{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00},
|
||||
{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00},
|
||||
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},
|
||||
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},
|
||||
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},
|
||||
{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00},
|
||||
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},
|
||||
{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00},
|
||||
{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00},
|
||||
{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00}
|
||||
};
|
||||
|
||||
|
61
libraries/TFT_Touch_Shield_V2/keywords.txt
Normal file
61
libraries/TFT_Touch_Shield_V2/keywords.txt
Normal file
@ -0,0 +1,61 @@
|
||||
#######################################
|
||||
# Syntax Coloring Map For SeeedTft2.0
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# Datatypes (KEYWORD1)
|
||||
#######################################
|
||||
Tft KEYWORD1
|
||||
TFTv2 KEYWORD1
|
||||
#######################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
#######################################
|
||||
TFTinit KEYWORD2
|
||||
setCol KEYWORD2
|
||||
setPage KEYWORD2
|
||||
setXY KEYWORD2
|
||||
setPixel KEYWORD2
|
||||
sendCMD KEYWORD2
|
||||
WRITE_Package KEYWORD2
|
||||
WRITE_DATA KEYWORD2
|
||||
sendData KEYWORD2
|
||||
Read_Register KEYWORD2
|
||||
fillScreen KEYWORD2
|
||||
drawChar KEYWORD2
|
||||
drawString KEYWORD2
|
||||
fillRectangle KEYWORD2
|
||||
drawLine KEYWORD2
|
||||
drawVerticalLine KEYWORD2
|
||||
drawHorizontalLine KEYWORD2
|
||||
drawRectangle KEYWORD2
|
||||
drawCircle KEYWORD2
|
||||
fillCircle KEYWORD2
|
||||
drawTraingle KEYWORD2
|
||||
drawNumber KEYWORD2
|
||||
drawFloat KEYWORD2
|
||||
|
||||
#######################################
|
||||
# Constants (LITERAL1)
|
||||
#######################################
|
||||
RED LITERAL1
|
||||
GREEN LITERAL1
|
||||
BLUE LITERAL1
|
||||
BLACK LITERAL1
|
||||
YELLOW LITERAL1
|
||||
WHITE LITERAL1
|
||||
CYAN LITERAL1
|
||||
BRIGHT_RED LITERAL1
|
||||
GRAY1 LITERAL1
|
||||
GRAY2 LITERAL1
|
||||
MIN_X LITERAL1
|
||||
MIN_Y LITERAL1
|
||||
MAX_X LITERAL1
|
||||
MAX_Y LITERAL1
|
||||
TFT_BL_ON LITERAL1
|
||||
TFT_BL_OFF LITERAL1
|
||||
TFT_CS_LOW LITERAL1
|
||||
TFT_CS_HIGH LITERAL1
|
||||
TFT_DC_LOW LITERAL1
|
||||
TFT_DC_HIGH LITERAL1
|
||||
RED LITERAL1
|
||||
RED LITERAL1
|
Loading…
x
Reference in New Issue
Block a user