单片机/MCU论坛
直播中

kennychiu

12年用户 47经验值
擅长:可编程逻辑 电源/新能源 模拟技术 EDA/IC设计 控制/MCU
私信 关注
[问答]

求教用Atmega16控制2.0寸电阻触摸屏

本帖最后由 kennychiu 于 2015-7-15 21:58 编辑

用Atmega16控制2.0寸电阻触摸屏做图形界面控制的方案,多页面操作,实时监控类的用途;各位高手有设计图,程序么,小弟学习学习。2.0寸TFT显示屏,XPT2046做触摸采集,通过232与其他设备通讯,请教各位高手,做通讯机制的有啥标准的编程。
已退回5积分

回帖(1)

屌丝欧欧

2015-8-30 23:53:24
给一个参考:

触摸屏是四线电阻式的,驱动芯片采用了很常见的ADS7846。ADS7846的典型应用电路图如下图所示。  
20060829103719721.gif
    在笔者的应用中,pin7和pin8都直接连接到GND,即不使用辅助输入通道,pin9和pin10连接在一起,即使用了VCC做为ADS7846的模数转换参考电压源。pin11所接的上拉电阻可以不要,但要设置相应的AVR输入端口上拉电阻使能。pin13做为转换结束指示,可以通过判断此脚电平来决定是否可以读出转换数据,也可以简单的使用延时的方法来留够转换时间。pin16、pin15、pin14、pin12做为一个标准的SPI从机接口与mega16芯片相连接。
    ADS7846支持8位精度和12位精度,即触摸分辨率可以达到1/256或者1/4096,根据不同分辨率的LCD来选择相应的触摸精度。比如128×64的LCD可以采用8位精度,320×240的LCD需要采用12位精度。采集后的数据分两次读出,8位精度的先得到前7位再得到最后一位,12位精度的先得到前7位再得到后5位。
    程序段如下:(编译器使用ICCAVR)

/********************************************************************
SPI Interface file
crystal: 8MHz
********************************************************************/


#include
#include

/*===================================================================
// function: initialize spi interface
// in: void
// retun: void
// date: 2005/8/10
===================================================================*/

void spiinit(void)
{
  DDRB = (1 << PB4) | (1 << PB5) | (1 << PB7);
   // MOSI and SCK port out
  PORTB |= (1 << PB4);
  SPCR = (1 << SPE) | (1 << MSTR) | (0 << SPR0);
// enable spi,master mode, MCLK/4,spi 0 mode
}

/*===================================================================
// function: send data form spi interface
// in: unsigned char real data
// retun: void
// date: 2005/8/10
===================================================================*/

void sendspi(unsigned char data)
{
  SPDR = data;
                                  // send data
  while( !(SPSR & (1 << SPIF)) );
              // wait data transfer end
}

/*===================================================================
// function: receive data form spi interface
// in: void
// retun: unsigned char
// date: 2005/8/10
===================================================================*/

unsigned char readspi(void)
{
  return SPDR;
}


/********************************************************************
touch data read file
crystal: 8MHz
write by han, hanembed@126.com, http://embed.hanyuer.net
********************************************************************/


#include
#include
#include "..incspi.h"

unsigned int positionx;
unsigned int positiony;
unsigned char flgtouch;

/*========================Extern Interrupt==========================*/
#pragma interrupt_handler keydown: iv_INT1

/*===================================================================
// function: initialize all used port
// in: void
// retun: void
// date: 2005/8/10
===================================================================*/

void portini(void)
{
  spiinit();
  endspi();
  DDRD &= ~(1 << PD3);              
// port input
  PORTD |= (1 << PD3);
             // pull-up resistance
//MCUCR |= 1</*===================================================================
// function: small delay
// in: unsigned char delay times
// retun: void
// date: 2005/8/10
===================================================================*/

void smalldelay(unsigned char tmp)
{
  unsigned char i;
  while(tmp--)
  {
    for(i = 0; i < 250; i++)
    {
      NOP();
    }
  }
}

/*===================================================================
// function: read touch data
// in: void
// retun: void
// date: 2005/8/10
===================================================================*/

void keydown(void)
{
  unsigned char tmp;           
// temporary data
  smalldelay(20);
               // delay wait tranquilization
  startspi();                    
// begin data transfer
  smalldelay(1);
  sendspi(0x90);
                // difference conversion, x data
  smalldelay(2);                 
// delay wait x conversion
  sendspi(0x00);
  tmp = readspi();               
// first 7 bit x data
  if(tmp == 0x7F)               //  error read
    return;
  positionx = tmp;
  positionx <<= 5;              
// left shift 5 bit
  sendspi(0xD0);               
// difference conversion, y data
  tmp = readspi();
             // last 5 bit x data
  tmp >>= 3;                    
// right shift 3 bit
  positionx += tmp;            
// real x data
  smalldelay(2);
               // delay wait y conversion
  sendspi(0x00);
  tmp = readspi();
             // first 7 bit y data
  positiony = tmp;
  positiony <<= 5;
  sendspi(0x00);
               // only for read last y data
  tmp = readspi();
  tmp >>= 3;
  positiony += tmp;            
// real y data
  endspi();
}

    经过简单调试,编写了一个PC端软件以显示在触摸屏上滑过的字符,一块8×5cm的触摸屏上约可以写四行汉字

举报

更多回帖

发帖
×
20
完善资料,
赚取积分