打印
[应用相关]

通过FSMC驱动Ilitek ILI9325液晶屏以及XPT2046触控芯片

[复制链接]
215|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4y1b3|  楼主 | 2023-5-25 19:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32F407VE单片机通过FSMC驱动Ilitek ILI9325液晶屏以及XPT2046触控芯片
本程序使用的单片机为STM32F407VE,晶振大小为8MHz,用10厘米长的杜邦线和彩屏相连,彩屏为微雪(Waveshare)的3.2inch 320x240 ILI9325 Touch LCD (C)。

程序下载地址:



https://pan.baidu.com/s/1LVQRdv3jZ9n5oAR_7yUZxw(提取码:awib)


(程序里面注释FSMC_D16=>RS写错了,应该是A16才对,D没有16)

运行程序时如果发现LCD ID(0号寄存器)读出来是0,说明很有可能你的彩屏的芯片不是ILI9325,而是ILI9341。ILI9341的0号命令是空操作,是读不出来ID的,而且读写屏幕的代码也有很大的差别。
关于ILI9341彩屏的驱动请参阅:

https://blog.csdn.net/ZLK1214/article/details/107144250









使用特权

评论回复
沙发
4y1b3|  楼主 | 2023-5-25 19:23 | 只看该作者


连线时,最上排的GND 5V-IN不接,由于U1和U2没有焊,所以单片机无法控制背光开启和关闭,不用接BL-VCC以及旁边的GND、NC和BL-VTRL。电源只接最后一排的GND和3V3。

使用特权

评论回复
板凳
lidi911| | 2023-5-25 19:25 | 只看该作者
搞个GBA游戏模拟器还是不错的。

使用特权

评论回复
地板
4y1b3|  楼主 | 2023-5-26 14:32 | 只看该作者
触摸芯片引脚:
TP-IRQ=>PC4(中断引脚,低电平有效,按一次触发一次)
TP-SCK=>PA5
TP-CS=>PA4
TP-SDO=>PA6
TP-SDI=>PA7

使用特权

评论回复
5
4y1b3|  楼主 | 2023-5-26 22:04 | 只看该作者
FSMC引脚:
D0~15是FSMC的16位并行数据线。LCD-CS接PD7,WR接PD5,RST接PD12。
RS接PD11(FSMC_A16),RD接PD4(FSMC_NOE),这两个引脚很容易混淆,千万不要接反了!!!接反了虽然能读出来0号寄存器为0x9325,但是后面的操作都是无效的,程序虽正确但屏幕一直为白屏。

使用特权

评论回复
6
4y1b3|  楼主 | 2023-5-26 22:05 | 只看该作者

用杜邦线连接彩屏会有一定概率出现传输错误。在示例程序中先显示了一张图片,然后再从屏幕中读回来,检查就会发现其中有极个别字节和原来的图像数据不一致。将FSMC的AddressHoldTime和DataSetupTime改到最大就没有错误了,不过刷屏的速率很慢。

使用特权

评论回复
7
4y1b3|  楼主 | 2023-5-26 22:18 | 只看该作者
【主要代码】

main.c:
#include <stdio.h>
#include <stm32f4xx.h>
#include <string.h>
#include "common.h"
#include "images.h"
#include "ILI9325.h"
#include "XPT2046.h"

static void check_display(const void *image, int x, int y, int width, int height)
{
  int i, j, curr;
  int err = 0, count = 0;
  uint16_t pixels[50];
  
  for (i = 0; i < height; i++)
  {
    for (j = 0; j < width; j += curr)
    {
      curr = _countof(pixels);
      if (curr > width - j)
        curr = width - j;
      
      ILI9325_GetPixelsInRect(pixels, x + j, y + i, curr, 1);
      if (memcmp(pixels, (uint16_t *)image + i * width + j, curr * sizeof(uint16_t)) != 0)
        err++;
      count++;
    }
  }
  if (err == 0)
    printf("Display OK!\n");
  else
  {
    // 使用杜邦线连接彩屏时, 有可能会有个别字节传输出错
    // 将FSMC的AddressHoldTime和DataSetupTime改大可以降低错误率
    printf("Display error! err/count=%d/%d\n", err, count);
  }
}

int main(void)
{
  int x, y;
  
  HAL_Init();
  
  clock_init();
  usart_init(115200);
  printf("STM32F407VE FSMC ILI9325\n");
  printf("SystemCoreClock=%u\n", SystemCoreClock);
  
  ILI9325_Init(); // 初始化彩屏
  ILI9325_Clear(ILI9325_COLOR_RED); // 背景色刷为红色
  
  XPT2046_Init(); // 初始化触控
  
  // 彩屏的坐标轴方向: 短边为x轴, 长边为y轴
  // 图片myimage是逆时针旋转了90度后转换成数组的
  HAL_Delay(1000);
  ILI9325_DrawImage(myimage, 0, 36, _countof(myimage[0]), _countof(myimage)); // 在屏幕上显示一张图片
  check_display(myimage, 0, 36, _countof(myimage[0]), _countof(myimage)); // 检查是否显示正确
  
  while (1)
  {
    // 每按一下, 触发一次中断
    if (XPT2046_GetITStatus())
    {
      XPT2046_ReadPosition(&x, &y);
      printf("(%d,%d)\n", x, y);
      ILI9325_SetPixel(x, y, 0x4010);
    }
  }
}

使用特权

评论回复
8
4y1b3|  楼主 | 2023-5-26 22:20 | 只看该作者
ILI9325.c:
#include <stdio.h>
#include <stm32f4xx.h>
#include "ILI9325.h"

// 因为彩屏背面的U1和U2这两个集成电路没有焊, 所以无法通过BL-VTRL引脚控制背光
// 本程序不进行背光控制, 只进行复位控制
#define RST_OFF HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET)
#define RST_ON HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)

NOR_HandleTypeDef hnor;

/* 清屏 */
void ILI9325_Clear(uint16_t color)
{
  int i = ILI9325_CX * ILI9325_CY;
  
  ILI9325_SetRegion(0, 0, ILI9325_CX - 1, ILI9325_CY - 1);
  ILI9325_CMD = ILI9325_CMD_MEMORY_WRITE;
  while (i--)
    ILI9325_DATA = color;
}

/* 显示图片 */
void ILI9325_DrawImage(const void *image, uint16_t x, uint16_t y, uint16_t width, uint16_t height)
{
  const uint16_t *p = image;
  int i = width * height;
  
  ILI9325_SetRegion(x, y, x + width - 1, y + height - 1);
  ILI9325_CMD = ILI9325_CMD_MEMORY_WRITE;
  while (i--)
    ILI9325_DATA = *p++;
}

/* 读取指定区域的屏幕显示内容 */
void ILI9325_GetPixelsInRect(void *pixels, uint16_t x, uint16_t y, uint16_t width, uint16_t height)
{
  int i, j;
  uint16_t *p = pixels;
  
  for (i = 0; i < height; i++)
  {
    for (j = 0; j < width; j++)
    {
      // 手册上有这句话: The address counter is not automatically updated when read data from the internal GRAM
      // 也就是说读数据的时候光标不能自己移动
      ILI9325_SetPos(x + j, y + i);
      ILI9325_CMD = ILI9325_CMD_MEMORY_READ;
      ILI9325_DATA; // dummy read
      *p++ = ILI9325_DATA;
    }
  }
}

/* 初始化显示屏 */
void ILI9325_Init(void)
{
  uint16_t id;
  FSMC_NORSRAM_TimingTypeDef timing = {0};
  GPIO_InitTypeDef gpio;
  
  __HAL_RCC_FSMC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOE_CLK_ENABLE();
  
  // PD12: RST
  RST_ON;
  gpio.Mode = GPIO_MODE_OUTPUT_PP;
  gpio.Pin = GPIO_PIN_12;
  gpio.Pull = GPIO_NOPULL;
  gpio.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOD, &gpio);
  
  // PD0~1: FSMC_D2~3, PD4: FSMC_NOE, PD5: FSMC_NWE, PD7: FSMC_NE1, PD8~11: FSMC_D13~16, PD14~15: FSMC_D0~1
  // FSMC_NOE=>RD, FSMC_NWE=>WR, FSMC_D16=>RS, FSMC_NE1=>CS
  gpio.Alternate = GPIO_AF12_FSMC;
  gpio.Mode = GPIO_MODE_AF_PP;
  gpio.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_14 | GPIO_PIN_15;
  gpio.Pull = GPIO_NOPULL;
  gpio.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOD, &gpio);
  
  // PE7~15: FSMC_D4~12
  gpio.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
  HAL_GPIO_Init(GPIOE, &gpio);
  
  // FSMC一共有6种模式:模式1~2和模式A~D
  // 彩屏使用的是模式2(即NOR Flash模式)而非模式B,这是因为配置FSMC时并没有使能扩展模式
  hnor.Extended = FSMC_Bank1E;
  hnor.Instance = FSMC_Bank1;
  hnor.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  hnor.Init.MemoryType = FSMC_MEMORY_TYPE_NOR;
  hnor.Init.NSBank = FSMC_NORSRAM_BANK1;
  hnor.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  timing.AddressHoldTime = 1;
  timing.AddressSetupTime = 0;
  timing.CLKDivision = 2;
  timing.DataLatency = 2;
  timing.DataSetupTime = 7;
  HAL_NOR_Init(&hnor, &timing, NULL);
  
  HAL_Delay(1);
  RST_OFF;
  HAL_Delay(1);
  
  ILI9325_CMD = 0;
  id = ILI9325_DATA;
  printf("LCD ID: 0x%04x\n", id);
  
  // Set SRAM internal timing
  ILI9325_CMD = 0xe5;
  ILI9325_DATA = 0x78f0;
  // Set Driver Output Control
  ILI9325_CMD = 0x01;
  ILI9325_DATA = 0x0100;
  // Set 1 line inversion
  ILI9325_CMD = 0x02;
  ILI9325_DATA = 0x0700;
  // Set GRAM write direction and BGR=1
  ILI9325_CMD = 0x03;
  ILI9325_DATA = 0x1030; // 设置扫描方向
  // Resize register
  ILI9325_CMD = 0x04;
  ILI9325_DATA = 0x0000;
  // Set the back porch and front porch
  ILI9325_CMD = 0x08;
  ILI9325_DATA = 0x0207;
  // Set non-display area refresh cycle ISC[3:0]
  ILI9325_CMD = 0x09;
  ILI9325_DATA = 0x0000;
  // FMARK function
  ILI9325_CMD = 0x0a;
  ILI9325_DATA = 0x0000;
  // RGB interface setting
  ILI9325_CMD = 0x0c;
  ILI9325_DATA = 0x0000;
  // Frame marker Position
  ILI9325_CMD = 0x0d;
  ILI9325_DATA = 0x0000;
  // RGB interface polarity
  ILI9325_CMD = 0x0f;
  ILI9325_DATA = 0x0000;

  // Power On sequence
  // SAP, BT[3:0], AP, DSTB, SLP, STB
  ILI9325_CMD = 0x10;
  ILI9325_DATA = 0x0000;
  // DC1[2:0], DC0[2:0], VC[2:0]
  ILI9325_CMD = 0x11;
  ILI9325_DATA = 0x0007;
  // VREG1OUT voltage
  ILI9325_CMD = 0x12;
  ILI9325_DATA = 0x0000;
  // VDV[4:0] for VCOM amplitude
  ILI9325_CMD = 0x13;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x07;
  ILI9325_DATA = 0x0001;
  HAL_Delay(20);

  // Dis-charge capacitor power voltage
  // SAP, BT[3:0], AP, DSTB, SLP, STB
  // Set DC1[2:0], DC0[2:0], VC[2:0]
  ILI9325_CMD = 0x10;
  ILI9325_DATA = 0x1090;
  ILI9325_CMD = 0x11;
  ILI9325_DATA = 0x0227;
  ILI9325_CMD = 0x12;
  ILI9325_DATA = 0x001f;
  // VDV[4:0] for VCOM amplitude
  ILI9325_CMD = 0x13;
  ILI9325_DATA = 0x1500;
  // 04 VCM[5:0] for VCOMH
  ILI9325_CMD = 0x29;
  ILI9325_DATA = 0x0027;
  // Set Frame Rate
  ILI9325_CMD = 0x2b;
  ILI9325_DATA = 0x000d;

  // Adjust the Gamma Curve
  ILI9325_CMD = 0x30;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x31;
  ILI9325_DATA = 0x0603;
  ILI9325_CMD = 0x32;
  ILI9325_DATA = 0x0206;
  ILI9325_CMD = 0x35;
  ILI9325_DATA = 0x0206;
  ILI9325_CMD = 0x36;
  ILI9325_DATA = 0x0004;
  ILI9325_CMD = 0x37;
  ILI9325_DATA = 0x0105;
  ILI9325_CMD = 0x38;
  ILI9325_DATA = 0x0401;
  ILI9325_CMD = 0x39;
  ILI9325_DATA = 0x0707;
  ILI9325_CMD = 0x3c;
  ILI9325_DATA = 0x0602;
  ILI9325_CMD = 0x3d;
  ILI9325_DATA = 0x0004;

  // Gate Scan Line
  ILI9325_CMD = 0x60;
  ILI9325_DATA = 0xa700;
  // NDL, VLE, REV
  ILI9325_CMD = 0x61;
  ILI9325_DATA = 0x0001;
  // Set scrolling line
  ILI9325_CMD = 0x6a;
  ILI9325_DATA = 0x0000;

  // Partial Display Control
  ILI9325_CMD = 0x80;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x81;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x82;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x83;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x84;
  ILI9325_DATA = 0x0000;
  ILI9325_CMD = 0x85;
  ILI9325_DATA = 0x0000;
  
  // Panel Control
  ILI9325_CMD = 0x90;
  ILI9325_DATA = 0x0010;
  ILI9325_CMD = 0x92;
  ILI9325_DATA = 0x0600;
  
  // 262K color and display ON
  ILI9325_CMD = 0x07;
  ILI9325_DATA = 0x0133;
}

/* 绘制像素点 */
void ILI9325_SetPixel(uint16_t x, uint16_t y, uint16_t color)
{
  ILI9325_SetRegion(x, y, x, y);
  ILI9325_CMD = ILI9325_CMD_MEMORY_WRITE;
  ILI9325_DATA = color;
}

/* 设置绘图位置 */
void ILI9325_SetPos(uint16_t x, uint16_t y)
{
  ILI9325_CMD = ILI9325_CMD_HORIZONTAL_GRAM_ADDRESS_SET;
  ILI9325_DATA = x;
  ILI9325_CMD = ILI9325_CMD_VERTICAL_GRAM_ADDRESS_SET;
  ILI9325_DATA = y;
}

/* 设置显示区域 */
void ILI9325_SetRegion(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
{
  ILI9325_CMD = ILI9325_CMD_HORIZONTAL_ADDRESS_START_POSITION;
  ILI9325_DATA = x0;
  ILI9325_CMD = ILI9325_CMD_VERTICAL_ADDRESS_START_POSITION;
  ILI9325_DATA = y0;
  
  ILI9325_CMD = ILI9325_CMD_HORIZONTAL_ADDRESS_END_POSITION;
  ILI9325_DATA = x1;
  ILI9325_CMD = ILI9325_CMD_VERTICAL_ADDRESS_END_POSITION;
  ILI9325_DATA = y1;
  
  ILI9325_SetPos(x0, y0);
}

使用特权

评论回复
9
4y1b3|  楼主 | 2023-5-26 22:21 | 只看该作者
ILI9325.h:
#ifndef _ILI9325_H
#define _ILI9325_H

#define ILI9325_CX 240
#define ILI9325_CY 320

#define ILI9325_COLOR_BLACK 0x0000
#define ILI9325_COLOR_BLUE 0x001f
#define ILI9325_COLOR_GREEN 0x07e0
#define ILI9325_COLOR_RED 0xf800
#define ILI9325_COLOR_WHITE 0xffff

#define ILI9325_CMD (*(volatile uint16_t *)0x60000000)
#define ILI9325_DATA (*(volatile uint16_t *)0x60020000)

#define ILI9325_CMD_HORIZONTAL_GRAM_ADDRESS_SET 0x20
#define ILI9325_CMD_VERTICAL_GRAM_ADDRESS_SET 0x21
#define ILI9325_CMD_MEMORY_WRITE 0x22
#define ILI9325_CMD_MEMORY_READ 0x22
#define ILI9325_CMD_HORIZONTAL_ADDRESS_START_POSITION 0x50
#define ILI9325_CMD_HORIZONTAL_ADDRESS_END_POSITION 0x51
#define ILI9325_CMD_VERTICAL_ADDRESS_START_POSITION 0x52
#define ILI9325_CMD_VERTICAL_ADDRESS_END_POSITION 0x53

#define ILI9325_RGB888_TO_565(color) ((((color) >> 8) & 0xf800) | (((color) >> 5) & 0x7e0) | (((color) >> 3) & 0x1f))

void ILI9325_Clear(uint16_t color);
void ILI9325_DrawImage(const void *image, uint16_t x, uint16_t y, uint16_t width, uint16_t height);
void ILI9325_GetPixelsInRect(void *pixels, uint16_t x, uint16_t y, uint16_t width, uint16_t height);
void ILI9325_Init(void);
void ILI9325_SetPixel(uint16_t x, uint16_t y, uint16_t color);
void ILI9325_SetPos(uint16_t x, uint16_t y);
void ILI9325_SetRegion(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);

#endif

使用特权

评论回复
10
4y1b3|  楼主 | 2023-5-26 22:22 | 只看该作者
XPT2046.c:
#include <stdio.h>
#include <stm32f4xx.h>
#include "XPT2046.h"

#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320
#define TOUCH_LEFT 385
#define TOUCH_RIGHT 3439
#define TOUCH_TOP 575
#define TOUCH_BOTTOM 3586

#define CS_0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
#define CS_1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)

SPI_HandleTypeDef hspi1;

int XPT2046_GetITStatus(void)
{
  return HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4) == GPIO_PIN_RESET;
}

void XPT2046_Init(void)
{
  GPIO_InitTypeDef gpio;
  
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_SPI1_CLK_ENABLE();
  
  CS_1;
  gpio.Mode = GPIO_MODE_OUTPUT_PP;
  gpio.Pin = GPIO_PIN_4;
  gpio.Pull = GPIO_NOPULL;
  gpio.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &gpio);
  
  gpio.Alternate = GPIO_AF5_SPI2;
  gpio.Mode = GPIO_MODE_AF_PP;
  gpio.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  gpio.Pull = GPIO_NOPULL;
  gpio.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &gpio);
  
  gpio.Mode = GPIO_MODE_INPUT;
  gpio.Pin = GPIO_PIN_4;
  gpio.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOC, &gpio);
  
  hspi1.Instance = SPI1;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  HAL_SPI_Init(&hspi1);
}

uint16_t XPT2046_Read(uint8_t cmd)
{
  uint8_t data[3] = {cmd};
  
  CS_0;
  HAL_SPI_TransmitReceive(&hspi1, data, data, sizeof(data), HAL_MAX_DELAY);
  CS_1;
  return ((data[1] << 5) | (data[2] >> 3)) & 0xfff;
}

void XPT2046_ReadPosition(int *x, int *y)
{
  float k, b;
  int i;
  uint32_t value_x = 0, value_y = 0;
  
  for (i = 0; i < 50; i++)
  {
    value_x += XPT2046_Read(XPT2046_READX);
    value_y += XPT2046_Read(XPT2046_READY);
  }
  value_x /= i;
  value_y /= i;
  printf("value_x=%u, value_y=%u\n", value_x, value_y);
  
  k = (float)SCREEN_WIDTH / (TOUCH_RIGHT - TOUCH_LEFT);
  b = -k * TOUCH_LEFT;
  *x = k * value_x + b;
  if (*x < 0)
    *x = 0;
  else if (*x > SCREEN_WIDTH - 1)
    *x = SCREEN_WIDTH - 1;
  
  k = (float)SCREEN_HEIGHT / (TOUCH_BOTTOM - TOUCH_TOP);
  b = -k * TOUCH_TOP;
  *y = k * value_y + b;
  if (*y < 0)
    *y = 0;
  else if (*y > SCREEN_HEIGHT - 1)
    *y = SCREEN_HEIGHT - 1;
  *y = (SCREEN_HEIGHT - 1) - *y;
}

使用特权

评论回复
11
4y1b3|  楼主 | 2023-5-26 22:22 | 只看该作者
XPT2046.h:
#ifndef _XPT2046_H
#define _XPT2046_H

#define XPT2046_READX 0x90
#define XPT2046_READY 0xd0

int XPT2046_GetITStatus(void);
void XPT2046_Init(void);
uint16_t XPT2046_Read(uint8_t cmd);
void XPT2046_ReadPosition(int *x, int *y);

#endif

使用特权

评论回复
12
4y1b3|  楼主 | 2023-5-26 22:26 | 只看该作者
【程序运行结果】
STM32F407VE FSMC ILI9325
SystemCoreClock=168000000
LCD ID: 0x9325
Display error! err/count=101/1240
value_x=762, value_y=3218
(29,39)
value_x=766, value_y=3219
(29,39)
value_x=751, value_y=3224
(28,38)
value_x=764, value_y=3222
(29,38)
value_x=757, value_y=3224
(29,38)
value_x=760, value_y=3225
(29,38)
value_x=759, value_y=3225
(29,38)
value_x=750, value_y=3223
(28,38)
value_x=756, value_y=3222
(29,38)
value_x=754, value_y=3221
(28,38)
value_x=835, value_y=3171
(35,44)
value_x=1650, value_y=1172
(99,256)
value_x=1145, value_y=1545
(59,216)
value_x=1168, value_y=1548
(61,216)
value_x=1247, value_y=1585
(67,212)
value_x=1339, value_y=1620
(74,208)
value_x=1407, value_y=1643
(80,206)
value_x=1474, value_y=1668
(85,203)
value_x=1533, value_y=1712
(90,199)
value_x=1581, value_y=1740
(93,196)
value_x=1611, value_y=1769
(96,193)
value_x=1653, value_y=1785
(99,191)
value_x=1693, value_y=1816
(102,188)
value_x=1714, value_y=1835
(104,186)
value_x=1786, value_y=1882
(110,181)
value_x=1847, value_y=1915
(114,177)
value_x=1865, value_y=1937
(116,175)
value_x=1919, value_y=1971
(120,171)
value_x=1946, value_y=1994
(122,169)
value_x=1942, value_y=2005
(122,168)
value_x=1967, value_y=2023
(124,166)
value_x=2009, value_y=2044
(127,163)
value_x=2013, value_y=2053
(127,162)
value_x=2009, value_y=2055
(127,162)
value_x=1998, value_y=2053
(126,162)
value_x=2013, value_y=2057
(127,162)
value_x=2017, value_y=2062
(128,161)
value_x=2017, value_y=2069
(128,161)
value_x=2056, value_y=2019
(131,166)
value_x=2102, value_y=2120
(134,155)
value_x=2095, value_y=2138
(134,153)
value_x=2163, value_y=2183
(139,149)
value_x=2129, value_y=2208
(137,146)
value_x=2137, value_y=2221
(137,145)
value_x=2135, value_y=2243
(137,142)
value_x=2171, value_y=2269
(140,139)
value_x=2180, value_y=2278
(141,139)
value_x=2197, value_y=2283
(142,138)
value_x=2181, value_y=2288
(141,137)
value_x=2188, value_y=2292
(141,137)
value_x=2194, value_y=2304
(142,136)
value_x=2192, value_y=2307
(142,135)
value_x=2189, value_y=2308
(141,135)
value_x=2197, value_y=2310
(142,135)
value_x=2187, value_y=2314
(141,135)
value_x=2212, value_y=2319
(143,134)
value_x=2223, value_y=2328
(144,133)
value_x=2249, value_y=2351
(146,131)
value_x=2250, value_y=2362
(146,130)
value_x=2252, value_y=2380
(146,128)
value_x=2253, value_y=2408
(146,125)
value_x=2243, value_y=2424
(146,123)
value_x=2265, value_y=2440
(147,121)
value_x=2260, value_y=2452
(147,120)
value_x=2279, value_y=2455
(148,120)
value_x=2276, value_y=2464
(148,119)
value_x=2287, value_y=2468
(149,118)
value_x=2296, value_y=2486
(150,116)
value_x=2324, value_y=2504
(152,114)
value_x=2337, value_y=2519
(153,113)
value_x=2345, value_y=2522
(154,113)
value_x=2335, value_y=2530
(153,112)
value_x=2330, value_y=2530
(152,112)
value_x=2348, value_y=2538
(154,111)
value_x=2347, value_y=2543
(154,110)
value_x=2673, value_y=1826
(179,187)
value_x=2426, value_y=2584
(160,106)
value_x=2375, value_y=2623
(156,102)
value_x=2364, value_y=2650
(155,99)
value_x=2408, value_y=2685
(158,95)
value_x=2428, value_y=2700
(160,94)
value_x=2424, value_y=2708
(160,93)
value_x=2411, value_y=2718
(159,92)
value_x=2509, value_y=2328
(166,133)
value_x=2740, value_y=1739
(185,196)
value_x=3835, value_y=24
(239,319)
value_x=2498, value_y=2752
(166,88)
value_x=2452, value_y=2774
(162,86)
value_x=2449, value_y=2797
(162,83)
value_x=2441, value_y=2806
(161,82)
value_x=3617, value_y=378
(239,319)
value_x=2509, value_y=2848
(166,78)
value_x=2507, value_y=2850
(166,78)
value_x=2509, value_y=2840
(166,79)
value_x=2504, value_y=2852
(166,78)
value_x=3156, value_y=2087
(217,159)
value_x=2969, value_y=3197
(203,41)
value_x=2990, value_y=3204
(204,40)
value_x=2979, value_y=3205
(203,40)
value_x=3050, value_y=3251
(209,35)
value_x=3053, value_y=3252
(209,35)
value_x=3052, value_y=3254
(209,35)
value_x=3183, value_y=2535
(219,111)
value_x=3136, value_y=3315
(216,28)
value_x=3134, value_y=3327
(216,27)
value_x=3571, value_y=1424
(239,229)
value_x=3183, value_y=3371
(219,22)
value_x=3208, value_y=3376
(221,22)
value_x=3216, value_y=3381
(222,21)
value_x=3196, value_y=3387
(220,21)
value_x=3217, value_y=3388
(222,21)
value_x=3214, value_y=3392
(222,20)
value_x=3210, value_y=3395
(222,20)
value_x=3203, value_y=3399
(221,19)
value_x=3205, value_y=3402
(221,19)
value_x=3211, value_y=3417
(222,17)
value_x=3273, value_y=3444
(226,15)
value_x=3279, value_y=3463
(227,13)
value_x=3306, value_y=3489
(229,10)
value_x=3312, value_y=3521
(230,6)
value_x=3326, value_y=3529
(231,6)
value_x=3322, value_y=3534
(230,5)
value_x=3325, value_y=3533
(231,5)
value_x=3320, value_y=3539
(230,4)
value_x=3320, value_y=3544
(230,4)
value_x=3327, value_y=3554
(231,3)
value_x=3338, value_y=3579
(232,0)
value_x=3381, value_y=3608
(235,0)
value_x=3391, value_y=3613
(236,0)
value_x=3398, value_y=3617
(236,0)
value_x=3403, value_y=3621
(237,0)
value_x=3417, value_y=3631
(238,0)
value_x=3441, value_y=3651
(239,0)
value_x=3458, value_y=3669
(239,0)
value_x=3466, value_y=3675
(239,0)
value_x=3471, value_y=3683
(239,0)
value_x=3479, value_y=3686
(239,0)
value_x=3486, value_y=3690
(239,0)
value_x=3485, value_y=3690
(239,0)
value_x=3479, value_y=3694
(239,0)
value_x=3486, value_y=3696
(239,0)
value_x=3490, value_y=3700
(239,0)
value_x=3492, value_y=3710
(239,0)
value_x=3498, value_y=3714
(239,0)
value_x=3504, value_y=3349
(239,25)
value_x=3565, value_y=643
(239,312)
value_x=3566, value_y=644
(239,312)
value_x=3703, value_y=386
(239,319)
value_x=3478, value_y=567
(239,319)
value_x=3423, value_y=568
(238,319)
value_x=3391, value_y=577
(236,319)
value_x=3399, value_y=578
(236,319)
value_x=3399, value_y=578
(236,319)
value_x=3395, value_y=579
(236,319)
value_x=3401, value_y=577
(237,319)
value_x=3403, value_y=579
(237,319)
value_x=3394, value_y=575
(236,319)
value_x=3367, value_y=568
(234,319)
value_x=3593, value_y=3790
(239,0)
value_x=3756, value_y=303
(239,319)
value_x=3256, value_y=2378
(225,128)
value_x=3381, value_y=3370
(235,22)
value_x=3366, value_y=3374
(234,22)
value_x=3372, value_y=3375
(234,22)
value_x=3372, value_y=3373
(234,22)
value_x=3386, value_y=3376
(235,22)
value_x=3257, value_y=2903
(225,72)
value_x=3871, value_y=48
(239,319)
value_x=3578, value_y=3702
(239,0)
value_x=3558, value_y=3701
(239,0)
value_x=3561, value_y=3686
(239,0)
value_x=3558, value_y=3690
(239,0)
value_x=3568, value_y=3699
(239,0)
value_x=3565, value_y=3695
(239,0)
value_x=3588, value_y=3704
(239,0)
value_x=3594, value_y=3712
(239,0)
value_x=3592, value_y=3705
(239,0)
value_x=3598, value_y=3709
(239,0)
value_x=3598, value_y=3714
(239,0)
value_x=3593, value_y=3720
(239,0)
value_x=3602, value_y=3720
(239,0)
value_x=3587, value_y=3723
(239,0)
value_x=3595, value_y=3725
(239,0)
value_x=3600, value_y=3724
(239,0)
value_x=3601, value_y=3726
(239,0)
value_x=3601, value_y=3726
(239,0)
value_x=3595, value_y=3728
(239,0)
value_x=3601, value_y=3728
(239,0)
value_x=3598, value_y=3728
(239,0)
value_x=3594, value_y=3728
(239,0)
value_x=3598, value_y=3729
(239,0)
value_x=3597, value_y=3728
(239,0)
value_x=3597, value_y=3727
(239,0)
value_x=3597, value_y=3727
(239,0)
value_x=3590, value_y=3726
(239,0)
value_x=3589, value_y=3726
(239,0)
value_x=3587, value_y=3724
(239,0)
value_x=3593, value_y=3724
(239,0)
value_x=3580, value_y=3724
(239,0)
value_x=3595, value_y=3724
(239,0)
value_x=3598, value_y=3724
(239,0)
value_x=3596, value_y=3722
(239,0)
value_x=3590, value_y=3724
(239,0)
value_x=3587, value_y=3724
(239,0)
value_x=3581, value_y=3723
(239,0)
value_x=3590, value_y=3724
(239,0)
value_x=3574, value_y=3723
(239,0)
value_x=3573, value_y=3722
(239,0)
value_x=3571, value_y=3731
(239,0)
value_x=3566, value_y=3737
(239,0)
value_x=3572, value_y=3738
(239,0)
value_x=3580, value_y=3741
(239,0)
value_x=3578, value_y=3746
(239,0)
value_x=3583, value_y=3749
(239,0)
value_x=3575, value_y=3751
(239,0)
value_x=3581, value_y=3754
(239,0)
value_x=3573, value_y=3756
(239,0)
value_x=3574, value_y=3755
(239,0)
value_x=3584, value_y=3753
(239,0)
value_x=3583, value_y=3753
(239,0)
value_x=3582, value_y=3751
(239,0)
value_x=3587, value_y=3754
(239,0)
value_x=3653, value_y=3742
(239,0)
value_x=3667, value_y=3738
(239,0)
value_x=3647, value_y=3737
(239,0)
value_x=3658, value_y=3737
(239,0)
value_x=3656, value_y=3734
(239,0)
value_x=3659, value_y=3732
(239,0)
value_x=3648, value_y=3730
(239,0)
value_x=3647, value_y=3727
(239,0)
value_x=3650, value_y=3726
(239,0)
value_x=3649, value_y=3724
(239,0)
value_x=3649, value_y=3724
(239,0)
value_x=3650, value_y=3723
(239,0)
value_x=3650, value_y=3723
(239,0)
value_x=3645, value_y=3723
(239,0)
value_x=3645, value_y=3724
(239,0)
value_x=3649, value_y=3722
(239,0)
value_x=3655, value_y=3724
(239,0)
value_x=3638, value_y=3723
(239,0)
value_x=3646, value_y=3723
(239,0)
value_x=3647, value_y=3724
(239,0)
value_x=3641, value_y=3725
(239,0)
value_x=3655, value_y=3728
(239,0)
value_x=3647, value_y=3729
(239,0)
value_x=3649, value_y=3729
(239,0)
value_x=3655, value_y=3732
(239,0)
value_x=3654, value_y=3729
(239,0)
value_x=3647, value_y=3730
(239,0)
value_x=3652, value_y=3730
(239,0)
value_x=3640, value_y=3729
(239,0)
value_x=3642, value_y=3728
(239,0)
value_x=3649, value_y=3728
(239,0)
value_x=3647, value_y=3727
(239,0)
value_x=3642, value_y=3726
(239,0)
value_x=3631, value_y=3725
(239,0)
value_x=3647, value_y=3723
(239,0)
value_x=3644, value_y=3723
(239,0)
value_x=3637, value_y=3721
(239,0)
value_x=3625, value_y=3442
(239,15)
value_x=3654, value_y=461
(239,319)
value_x=3650, value_y=457
(239,319)
value_x=3659, value_y=458
(239,319)
value_x=3650, value_y=457
(239,319)
value_x=3642, value_y=456
(239,319)
value_x=3658, value_y=458
(239,319)
value_x=3656, value_y=460
(239,319)
value_x=3663, value_y=466
(239,319)
value_x=3664, value_y=471
(239,319)
value_x=3671, value_y=469
(239,319)
value_x=3671, value_y=470
(239,319)
value_x=3677, value_y=465
(239,319)
value_x=3688, value_y=464
(239,319)
value_x=3670, value_y=460
(239,319)
value_x=3685, value_y=461
(239,319)
value_x=3689, value_y=463
(239,319)
value_x=3687, value_y=464
(239,319)
value_x=3697, value_y=465
(239,319)
value_x=3679, value_y=463
(239,319)
value_x=3683, value_y=465
(239,319)
value_x=3685, value_y=464
(239,319)
value_x=3684, value_y=465
(239,319)
value_x=3684, value_y=467
(239,319)
value_x=3677, value_y=463
(239,319)
value_x=3672, value_y=463
(239,319)
value_x=3682, value_y=461
(239,319)
value_x=3670, value_y=458
(239,319)
value_x=3682, value_y=458
(239,319)
value_x=3679, value_y=457
(239,319)
value_x=3685, value_y=455
(239,319)
value_x=3691, value_y=457
(239,319)
value_x=3673, value_y=458
(239,319)
value_x=3674, value_y=458
(239,319)
value_x=3681, value_y=460
(239,319)
value_x=3678, value_y=461
(239,319)
value_x=3692, value_y=461
(239,319)
value_x=3684, value_y=459
(239,319)
value_x=3690, value_y=460
(239,319)
value_x=3689, value_y=461
(239,319)
value_x=3678, value_y=461
(239,319)
value_x=3682, value_y=461
(239,319)
value_x=3684, value_y=461
(239,319)
value_x=3684, value_y=463
(239,319)
value_x=3692, value_y=463
(239,319)
value_x=3688, value_y=461
(239,319)
value_x=3686, value_y=460
(239,319)
value_x=3700, value_y=457
(239,319)
value_x=3681, value_y=457
(239,319)
value_x=3688, value_y=456
(239,319)
value_x=3702, value_y=455
(239,319)
value_x=3697, value_y=454
(239,319)
value_x=3696, value_y=454
(239,319)
value_x=3702, value_y=453
(239,319)
value_x=3697, value_y=453
(239,319)
value_x=3702, value_y=452
(239,319)
value_x=3698, value_y=450
(239,319)
value_x=3692, value_y=451
(239,319)
value_x=3696, value_y=452
(239,319)
value_x=3698, value_y=453
(239,319)
value_x=3703, value_y=453
(239,319)
value_x=3680, value_y=453
(239,319)
value_x=3694, value_y=453
(239,319)
value_x=3697, value_y=452
(239,319)
value_x=3697, value_y=452
(239,319)
value_x=3697, value_y=452
(239,319)
value_x=3700, value_y=450
(239,319)
value_x=3692, value_y=451
(239,319)
value_x=3696, value_y=449
(239,319)
value_x=3691, value_y=449
(239,319)
value_x=3687, value_y=449
(239,319)
value_x=3691, value_y=448
(239,319)
value_x=3696, value_y=447
(239,319)
value_x=3696, value_y=446
(239,319)
value_x=3700, value_y=445
(239,319)
value_x=3694, value_y=445
(239,319)
value_x=3691, value_y=444
(239,319)
value_x=3687, value_y=444
(239,319)
value_x=3692, value_y=443
(239,319)
value_x=3696, value_y=443
(239,319)
value_x=3697, value_y=445
(239,319)
value_x=3697, value_y=444
(239,319)
value_x=3697, value_y=444
(239,319)
value_x=3702, value_y=444
(239,319)
value_x=3693, value_y=445
(239,319)
value_x=3693, value_y=445
(239,319)
value_x=3708, value_y=446
(239,319)
value_x=3712, value_y=445
(239,319)
value_x=3702, value_y=445
(239,319)
value_x=3695, value_y=445
(239,319)
value_x=3704, value_y=445
(239,319)
value_x=3705, value_y=444
(239,319)
value_x=3691, value_y=445
(239,319)
value_x=3698, value_y=446
(239,319)
value_x=3693, value_y=443
(239,319)
value_x=3701, value_y=445
(239,319)
value_x=3692, value_y=446
(239,319)
value_x=3695, value_y=445
(239,319)
value_x=3708, value_y=444
(239,319)
value_x=3691, value_y=441
(239,319)
value_x=3685, value_y=441
(239,319)
value_x=3711, value_y=438
(239,319)
value_x=3702, value_y=435
(239,319)
value_x=3693, value_y=436
(239,319)
value_x=3700, value_y=439
(239,319)
value_x=3705, value_y=440
(239,319)
value_x=3698, value_y=445
(239,319)
value_x=3697, value_y=452
(239,319)
value_x=3678, value_y=464
(239,319)
value_x=3660, value_y=466
(239,319)
value_x=3669, value_y=463
(239,319)
value_x=3656, value_y=460
(239,319)
value_x=3638, value_y=458
(239,319)
value_x=3649, value_y=457
(239,319)
value_x=3641, value_y=458
(239,319)
value_x=3864, value_y=26
(239,319)
value_x=3588, value_y=501
(239,319)
value_x=3592, value_y=502
(239,319)
value_x=3632, value_y=446
(239,319)
value_x=3610, value_y=448
(239,319)
value_x=3635, value_y=451
(239,319)
value_x=3667, value_y=542
(239,319)
value_x=3680, value_y=535
(239,319)
value_x=3682, value_y=523
(239,319)
value_x=3687, value_y=519
(239,319)
value_x=3694, value_y=514
(239,319)
value_x=3677, value_y=512
(239,319)
value_x=3683, value_y=509
(239,319)
value_x=3690, value_y=506
(239,319)
value_x=3703, value_y=505
(239,319)
value_x=3701, value_y=504
(239,319)
value_x=3708, value_y=504
(239,319)
value_x=3698, value_y=503
(239,319)
value_x=3699, value_y=504
(239,319)
value_x=3697, value_y=501
(239,319)
value_x=3686, value_y=499
(239,319)
value_x=3682, value_y=498
(239,319)
value_x=3686, value_y=498
(239,319)
value_x=3678, value_y=499
(239,319)
value_x=3678, value_y=500
(239,319)
value_x=3679, value_y=503
(239,319)
value_x=3681, value_y=509
(239,319)
value_x=3676, value_y=508
(239,319)
value_x=3686, value_y=509
(239,319)
value_x=3675, value_y=505
(239,319)
value_x=3676, value_y=503
(239,319)
value_x=3676, value_y=498
(239,319)
value_x=3662, value_y=496
(239,319)
value_x=3672, value_y=497
(239,319)
value_x=3657, value_y=495
(239,319)
value_x=3665, value_y=499
(239,319)
value_x=3674, value_y=505
(239,319)
value_x=3667, value_y=510
(239,319)
value_x=3878, value_y=9
(239,319)
value_x=3709, value_y=273
(239,319)
value_x=2479, value_y=1867
(164,182)
value_x=2482, value_y=1882
(164,181)
value_x=2468, value_y=1890
(163,180)
value_x=2473, value_y=1895
(164,179)
value_x=2470, value_y=1895
(163,179)
value_x=2464, value_y=1894
(163,179)
value_x=2473, value_y=1892
(164,180)
value_x=2472, value_y=1888
(164,180)
value_x=2458, value_y=1883
(162,180)
value_x=2406, value_y=1860
(158,183)
value_x=2398, value_y=1856
(158,183)
value_x=2389, value_y=1856
(157,183)
value_x=2382, value_y=1852
(156,184)
value_x=2393, value_y=1852
(157,184)
value_x=2387, value_y=1850
(157,184)
value_x=2381, value_y=1853
(156,184)
value_x=2390, value_y=1852
(157,184)
value_x=2383, value_y=1852
(157,184)
value_x=2388, value_y=1853
(157,184)
value_x=2377, value_y=1851
(156,184)
value_x=2399, value_y=1853
(158,184)
value_x=2397, value_y=1855
(158,183)
value_x=2390, value_y=1856
(157,183)
value_x=2395, value_y=1858
(157,183)
value_x=2395, value_y=1860
(157,183)
value_x=2408, value_y=1865
(158,182)
value_x=3653, value_y=235
(239,319)
value_x=2380, value_y=1867
(156,182)
value_x=2384, value_y=1865
(157,182)
value_x=2373, value_y=1863
(156,183)
value_x=2369, value_y=1863
(155,183)
value_x=2369, value_y=1862
(155,183)
value_x=1430, value_y=1385
(82,233)
value_x=1439, value_y=1380
(82,234)
value_x=1468, value_y=1383
(85,234)
value_x=1485, value_y=1395
(86,232)
value_x=1501, value_y=1405
(87,231)
value_x=1599, value_y=1381
(95,234)
value_x=1630, value_y=1389
(97,233)
value_x=1687, value_y=1402
(102,232)
value_x=1755, value_y=1394
(107,232)
value_x=1844, value_y=1417
(114,230)
value_x=1954, value_y=1418
(123,230)
value_x=2052, value_y=1436
(131,228)
value_x=2147, value_y=1447
(138,227)
value_x=2224, value_y=1464
(144,225)
value_x=2297, value_y=1476
(150,224)
value_x=2368, value_y=1489
(155,222)
value_x=2451, value_y=1505
(162,221)
value_x=2527, value_y=1516
(168,219)
value_x=2617, value_y=1540
(175,217)
value_x=2700, value_y=1556
(181,215)
value_x=2770, value_y=1572
(187,214)
value_x=2829, value_y=1589
(192,212)
value_x=2869, value_y=1608
(195,210)
value_x=2909, value_y=1619
(198,209)
value_x=2959, value_y=1641
(202,206)
value_x=3005, value_y=1621
(205,208)
value_x=3098, value_y=1655
(213,205)
value_x=2776, value_y=673
(187,309)
value_x=1333, value_y=1754
(74,194)
value_x=1346, value_y=1779
(75,192)
value_x=1364, value_y=1782
(76,191)
value_x=1389, value_y=1797
(78,190)
value_x=1498, value_y=1804
(87,189)
value_x=1631, value_y=1844
(97,185)
value_x=1825, value_y=1890
(113,180)
value_x=2032, value_y=1937
(129,175)
value_x=2187, value_y=1991
(141,169)
value_x=2319, value_y=2024
(151,166)
value_x=2407, value_y=2065
(158,161)
value_x=2513, value_y=2090
(167,158)
value_x=2596, value_y=2127
(173,155)
value_x=2679, value_y=2163
(180,151)
value_x=3595, value_y=433
(239,319)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

124

帖子

0

粉丝