You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					349 lines
				
				16 KiB
			
		
		
			
		
	
	
					349 lines
				
				16 KiB
			|   
											11 years ago
										 | /*
 | ||
|  | 
 | ||
|  |   Touch4WSetup.pde | ||
|  |    | ||
|  |   Use this example to figure out the ranges for of the active area of a 4-wire resistive  | ||
|  |   touch panel. | ||
|  |    | ||
|  |   >>> Before compiling: Please remove comment from the constructor of the  | ||
|  |   >>> connected graphics display (see below). | ||
|  |    | ||
|  |   Universal 8bit Graphics Library, http://code.google.com/p/u8glib/
 | ||
|  |    | ||
|  |   Copyright (c) 2012, olikraus@gmail.com | ||
|  |   All rights reserved. | ||
|  | 
 | ||
|  |   Redistribution and use in source and binary forms, with or without modification,  | ||
|  |   are permitted provided that the following conditions are met: | ||
|  | 
 | ||
|  |   * Redistributions of source code must retain the above copyright notice, this list  | ||
|  |     of conditions and the following disclaimer. | ||
|  |      | ||
|  |   * Redistributions in binary form must reproduce the above copyright notice, this  | ||
|  |     list of conditions and the following disclaimer in the documentation and/or other  | ||
|  |     materials provided with the distribution. | ||
|  | 
 | ||
|  |   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND  | ||
|  |   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,  | ||
|  |   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF  | ||
|  |   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  | ||
|  |   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR  | ||
|  |   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  | ||
|  |   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  | ||
|  |   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  | ||
|  |   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER  | ||
|  |   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,  | ||
|  |   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  | ||
|  |   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF  | ||
|  |   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   | ||
|  |    | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #include "U8glib.h"
 | ||
|  | 
 | ||
|  | // setup u8g object, please remove comment from one of the following constructor calls
 | ||
|  | // IMPORTANT NOTE: The following list is incomplete. The complete list of supported 
 | ||
|  | // devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device
 | ||
|  | //U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGM132 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGM128 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGM128_2X u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
 | ||
|  | //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
 | ||
|  | //U8GLIB_ST7920_128X64_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
 | ||
|  | //U8GLIB_ST7920_128X64_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
 | ||
|  | //U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
 | ||
|  | //U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
 | ||
|  | //U8GLIB_ST7920_192X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
 | ||
|  | //U8GLIB_ST7920_192X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
 | ||
|  | //U8GLIB_ST7920_192X32_1X u8g(13, 11, 10);	// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
 | ||
|  | //U8GLIB_ST7920_192X32_4X u8g(10);		// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
 | ||
|  | //U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
 | ||
|  | //U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
 | ||
|  | //U8GLIB_ST7920_202X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
 | ||
|  | //U8GLIB_ST7920_202X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
 | ||
|  | //U8GLIB_LM6059 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_LM6063 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGXL160_BW u8g(10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
 | ||
|  | //U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
 | ||
|  | //U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); 		// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
 | ||
|  | //U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
 | ||
|  | //U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
 | ||
|  | //U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
 | ||
|  | //U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 );  			// 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
 | ||
|  | //U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
 | ||
|  | //U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED)
 | ||
|  | //U8GLIB_SSD1306_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
 | ||
|  | //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 
 | ||
|  | //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI 
 | ||
|  | //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send AC
 | ||
|  | //U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
 | ||
|  | //U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_SSD1306_128X32 u8g(10, 9);             // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
 | ||
|  | //U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
 | ||
|  | //U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED)
 | ||
|  | //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
 | ||
|  | //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);	// Dev 0, Fast I2C / TWI
 | ||
|  | //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send ACK
 | ||
|  | //U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE);	// I2C
 | ||
|  | //U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE);	// I2C
 | ||
|  | //U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE);	// I2C
 | ||
|  | //U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_UC1611_DOGM240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
 | ||
|  | //U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE);	// I2C
 | ||
|  | //U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
 | ||
|  | //U8GLIB_UC1611_DOGXL240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
 | ||
|  | //U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_LD7032_60x32 u8g(11, 12, 9, 10, 8);	// SPI Com: SCK = 11, MOSI = 12, CS = 9, A0 = 10, RST = 8  (SW SPI Nano Board)
 | ||
|  | //U8GLIB_UC1608_240X64 u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X64 u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X64_2X u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X64 u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_UC1608_240X64_2X u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
 | ||
|  | //U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
 | ||
|  | //U8GLIB_T6963_128X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
 | ||
|  | //U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
 | ||
|  | //U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
 | ||
|  | //U8GLIB_HT1632_24X16 u8g(3, 2, 4);		// WR = 3, DATA = 2, CS = 4
 | ||
|  | //U8GLIB_SSD1351_128X128_332 u8g(13, 11, 8, 9, 7); // Arduino UNO: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
 | ||
|  | //U8GLIB_SSD1351_128X128_332 u8g(76, 75, 8, 9, 7); // Arduino DUE: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
 | ||
|  | //U8GLIB_SSD1351_128X128_332 u8g(8, 9, 7); // Arduino: HW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
 | ||
|  | //U8GLIB_SSD1351_128X128_HICOLOR u8g(76, 75, 8, 9, 7); // Arduino DUE, SW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
 | ||
|  | //U8GLIB_SSD1351_128X128_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
 | ||
|  | //U8GLIB_SSD1351_128X128GH_332 u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)
 | ||
|  | //U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)
 | ||
|  | 
 | ||
|  | //================================================================
 | ||
|  | // Setup 4-Wire Resistive Touch Panel
 | ||
|  | 
 | ||
|  | uint8_t tp_left = A3; | ||
|  | uint8_t tp_right = A5; | ||
|  | uint8_t tp_top = A4; | ||
|  | uint8_t tp_bottom = A2; | ||
|  | 
 | ||
|  | #define X_START 120
 | ||
|  | #define X_END 140
 | ||
|  | #define Y_START 120
 | ||
|  | #define Y_END 140 
 | ||
|  | 
 | ||
|  | #define PULLUP_THRESHOLD 235
 | ||
|  | 
 | ||
|  | //================================================================
 | ||
|  | // Touch Panel Code
 | ||
|  | 
 | ||
|  | /* touch panel dimension */ | ||
|  | struct tpd_struct | ||
|  | { | ||
|  |   /* raw value */ | ||
|  |   uint8_t raw; | ||
|  |    | ||
|  |   /* calibration values  */ | ||
|  |   uint8_t start; | ||
|  |   uint8_t end;		 | ||
|  |    | ||
|  |   /* user values */ | ||
|  |   uint8_t range;	/* result will have range fron 0..range  (including the value of range) */ | ||
|  |    | ||
|  |   uint8_t result;	/* output value: position [0...range] */ | ||
|  |   uint8_t is_pressed;	/* output value: pressed (=1) or not pressed (=0) */ | ||
|  |   uint8_t is_update;	/* will be set to 1 if result or is_pressed has been updated */ | ||
|  | }; | ||
|  | 
 | ||
|  | struct tp_struct | ||
|  | { | ||
|  |   struct tpd_struct x; | ||
|  |   struct tpd_struct y; | ||
|  |   uint8_t is_pressed; /* combination of x.is_pressed && y.is_pressed */ | ||
|  |   uint8_t is_update; | ||
|  | }; | ||
|  | 
 | ||
|  | struct tp_struct tp; | ||
|  | 
 | ||
|  | /* map raw value to 0...range (result) */ | ||
|  | void tpd_map_touch_position(struct tpd_struct *d, uint8_t raw) | ||
|  | { | ||
|  |   uint8_t is_pressed; | ||
|  |   uint16_t p; | ||
|  |   uint8_t start, end; | ||
|  |    | ||
|  |   d->raw = raw; | ||
|  |    | ||
|  |   start = d->start; | ||
|  |   end = d->end; | ||
|  | 
 | ||
|  |   /* check if position is within active area; store result in "is_pressed" */ | ||
|  |   is_pressed = 1;   | ||
|  |   if ( raw >= PULLUP_THRESHOLD ) | ||
|  |   { | ||
|  |     d->result = 0; | ||
|  |     is_pressed = 0; | ||
|  |   } | ||
|  |   else | ||
|  |   { | ||
|  |     /* update start and end */ | ||
|  |     if ( raw < start ) | ||
|  |     { | ||
|  |       start = raw; | ||
|  |       d->start = raw; | ||
|  |     } | ||
|  |     if ( raw > end ) | ||
|  |     { | ||
|  |       end = raw; | ||
|  |       d->end = raw; | ||
|  |     } | ||
|  |   } | ||
|  |    | ||
|  |   /* store "is_pressed" in the global structure, set update flag */ | ||
|  |   if ( d->is_pressed != is_pressed ) | ||
|  |     d->is_update = 1; | ||
|  |   d->is_pressed = is_pressed; | ||
|  |      | ||
|  |   /* map "raw" value into target range */ | ||
|  |   if ( is_pressed != 0 ) | ||
|  |   {     | ||
|  |     p = raw; | ||
|  |     p -= start; | ||
|  |     p *= d->range; | ||
|  |     end -= start; | ||
|  |     p /= end; | ||
|  | 
 | ||
|  |     if ( d->result != p ) | ||
|  |       d->is_update = 1; | ||
|  |     d->result = p; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | void tp_Init(uint8_t width, uint8_t height) | ||
|  | { | ||
|  |   tp.x.start = X_START; | ||
|  |   tp.x.end = X_END; | ||
|  |   tp.x.range = width-1; | ||
|  |    | ||
|  |   tp.y.start = Y_START; | ||
|  |   tp.y.end = Y_END; | ||
|  |   tp.y.range = height-1; | ||
|  |    | ||
|  |   tp.is_update = 1; | ||
|  | } | ||
|  | 
 | ||
|  | void setTouchRawValues(uint8_t x, uint8_t y) | ||
|  | { | ||
|  |       tpd_map_touch_position(&(tp.x), x); | ||
|  |       tpd_map_touch_position(&(tp.y), y); | ||
|  |        | ||
|  |       tp.is_pressed = tp.x.is_pressed && tp.y.is_pressed; | ||
|  |       if ( tp.x.is_update || tp.y.is_update ) | ||
|  | 	tp.is_update = 1; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | uint8_t getTouchPos(uint8_t hiPin, uint8_t lowPin, uint8_t sensePin, uint8_t dcPin) | ||
|  | { | ||
|  |   uint8_t val; | ||
|  |   pinMode(dcPin, INPUT); | ||
|  |   pinMode(sensePin, INPUT_PULLUP); | ||
|  |   pinMode(hiPin, OUTPUT); | ||
|  |   pinMode(lowPin, OUTPUT);   | ||
|  |    | ||
|  |   digitalWrite(hiPin, HIGH); | ||
|  |   digitalWrite(lowPin, LOW); | ||
|  |   delay(10); | ||
|  |   val = analogRead(sensePin) >> 2; | ||
|  |   pinMode(hiPin, INPUT); | ||
|  |   pinMode(lowPin, INPUT);   | ||
|  |   delay(10); | ||
|  |   return val; | ||
|  | } | ||
|  | 
 | ||
|  | void updateTouchPanel(void) | ||
|  | { | ||
|  |   uint8_t tp_raw_x; | ||
|  |   uint8_t tp_raw_y; | ||
|  | 
 | ||
|  |   tp_raw_x = getTouchPos(tp_right, tp_left, tp_bottom, tp_top); | ||
|  |   tp_raw_y = getTouchPos(tp_top, tp_bottom, tp_left, tp_right); | ||
|  |    | ||
|  |   setTouchRawValues(tp_raw_x, tp_raw_y);   | ||
|  | } | ||
|  | 
 | ||
|  | //================================================================
 | ||
|  | // graphics output and picture loop
 | ||
|  | 
 | ||
|  | void center(u8g_uint_t y, const char *str) | ||
|  | { | ||
|  |   u8g_uint_t x; | ||
|  |   x = u8g.getWidth(); | ||
|  |   x -= u8g.getStrWidth(str); | ||
|  |   x /= 2; | ||
|  |   u8g.drawStr(x, y, str); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | void draw(void) { | ||
|  |   u8g.setFont(u8g_font_6x10); | ||
|  |   center( 10, "Touch Panel Setup"); | ||
|  |   u8g.setPrintPos(0, 20); u8g.print("x_start=");u8g.print((int)tp.x.start);u8g.print(" x_end=");u8g.print((int)tp.x.end); | ||
|  |   u8g.setPrintPos(0, 30); u8g.print("y_start=");u8g.print((int)tp.y.start);u8g.print(" y_end=");u8g.print((int)tp.y.end); | ||
|  |   u8g.setPrintPos(0, 40); u8g.print("x=");u8g.print((int)tp.x.raw); | ||
|  |   u8g.setPrintPos(0, 50); u8g.print("y=");u8g.print((int)tp.y.raw); | ||
|  | } | ||
|  | 
 | ||
|  | void setup(void) { | ||
|  |    | ||
|  |   // flip screen, if required
 | ||
|  |   // u8g.setRot180();
 | ||
|  |   u8g.setCursorFont(u8g_font_cursor); | ||
|  |   u8g.setCursorStyle(32); | ||
|  |    | ||
|  |   tp_Init(u8g.getWidth(), u8g.getHeight()); | ||
|  |    | ||
|  |   tp.is_update = 1; | ||
|  | } | ||
|  | 
 | ||
|  | void loop(void) { | ||
|  |    | ||
|  |   // update touch panel and handle return values
 | ||
|  |   updateTouchPanel(); | ||
|  |    | ||
|  |   if ( tp.is_pressed != 0 ) | ||
|  |     u8g.enableCursor(); | ||
|  |   else | ||
|  |     u8g.disableCursor(); | ||
|  |    | ||
|  |   u8g.setCursorPos(tp.x.result, u8g.getHeight()-tp.y.result-1); | ||
|  |    | ||
|  |   // picture loop
 | ||
|  |   if ( tp.is_update != 0 ) | ||
|  |   { | ||
|  |     tp.is_update = 0; | ||
|  |     u8g.firstPage();   | ||
|  |     do { | ||
|  |       draw(); | ||
|  |     } while( u8g.nextPage() ); | ||
|  |   } | ||
|  |    | ||
|  | } | ||
|  | 
 |