博客首页 | 排行榜 |

南京老练

个人档案
博文分类
【32位MCU】基于STM32的触摸屏控制技术之一  2010-02-22 13:49

 

     现在随着TFT屏的价格快速滑落,原来旧有的单色屏已经远远跟不上了发展的需要,加上触摸屏的成本也不是很高,因而无论在成本还是技术发展的优势上面,TFT屏发展已经获得了平分秋色的实力。但是在传统意义上面来说,使用TFT屏控制必然考虑到arm体现,因而,性价比较高的STM32就走上了台前。我们现在使用的是一款STM32F103RBT6的芯片。这个芯片具有很好的性价比:ARM Cortex-M3内核,128kB Flash20KB RAM,最高工作时钟72MHz64脚。我们选用的是2.8寸的TFT屏,TFT屏的控制芯片是:ILI9325;其触摸屏控制芯片为ADS7843

    我们首先看到的是TFT屏和该芯片的接口,其接口定义如下:

2.8寸彩色TFT屏模块接脚定义
脚位 功能 描述 脚位 功能 描述
01
3V3 电源正 17 DB14 数据线
02
GND 电源负 18 DB15 数据线
03
DB00 数据线 19 CS 屏片选,低有效
04
DB01 数据线 20 RS 寄存器选择
05
DB02 数据线 21 WR 写使能,低有效
06
DB03 数据线 22 RD 读使能,低有效
07
DB04 数据线 23 RESET 复位,低有效
08
DB05 数据线 24 BACK_LIGHT 背光控制,高有效
09
DB06 数据线 25 MISO SPI主入从出
10
DB07 数据线 26 INT 触摸中断输出
11
DB08 数据线 27 MOSI SPI主出从入
12
DB09 数据线 28 BUSY 触摸芯片忙检测
13
DB10 数据线 29 SCLK SPI时钟
14
DB11 数据线 30 SDA I2C数据线
15
DB12 数据线 31 T_CS 触摸芯片片选
16
DB13 数据线 32 SCL I2C时钟线

现在,我们使用IAR编译,然后通过JLINK下载一个程序进去,然后分析一下程序。

使用IAR的环境就不一一叙述了。下面是ILI9325的控制程序的部分子程序以供参考。详细程序见附件。

/****************************************************************

函数名:Lcd配置函数

功能:配置所有和Lcd相关的GPIO和时钟

引脚分配为:

PB8--PB15——16Bit数据总线低8

PC0--PC7 ——16Bit数据总线高8

PC8 ——Lcd_cs

PC9 ——Lcd_rs*

PC10——Lcd_wr

PC11——Lcd_rd*

PC12——Lcd_rst

PC13——Lcd_blaklight 背光靠场效应管驱动背光模块

*****************************************************************/

void Lcd_Configuration(void)

{

       GPIO_InitTypeDef GPIO_InitStructure;

       /*开启相应时钟 */

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); 

       /*所有Lcd引脚配置为推挽输出*/

       /*16位数据低8*/

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

       GPIO_Init(GPIOB, &GPIO_InitStructure);

       /*16位数据高8*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

       GPIO_Init(GPIOC, &GPIO_InitStructure);

       /*控制脚*/

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;

       GPIO_Init(GPIOC, &GPIO_InitStructure);

       /*背光控制*/

       GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;

       GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

void DataToWrite(u16 data)

{

       u16 temp;

       temp = GPIO_ReadOutputData(GPIOB);

       GPIO_Write(GPIOB, (data<<8)|(temp&0x00ff));

       temp = GPIO_ReadOutputData(GPIOC);

       GPIO_Write(GPIOC, (data>>8)|(temp&0xff00));

}

 

/****************************************************************************

*     称:u16 CheckController(void)

*     能:返回控制器代码

* 入口参数:无

* 出口参数:控制器型号

*     明:调用后返回兼容型号的控制器型号

* 调用方法:code=CheckController();

****************************************************************************/

u16 CheckController(void)

{

      u16 tmp=0,tmp1=0,tmp2=0;

       GPIO_InitTypeDef GPIO_InitStructure;

 

      DataToWrite(0xffff);//数据线全高

       Set_Rst;

       Set_nWr;

       Set_Cs;

       Set_Rs;

       Set_nRd;

       Set_Rst;

       Delay_nms(1);

       Clr_Rst;

       Delay_nms(1);

       Set_Rst;

       Delay_nms(1);

       LCD_WR_REG(0x0000,0x0001);  //start oscillation

       Delay_nms(1);

 

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

       GPIO_Init(GPIOB, &GPIO_InitStructure);

       /*16位数据高8*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

       GPIO_Init(GPIOC, &GPIO_InitStructure);

 

      GPIO_ResetBits(GPIOC,GPIO_Pin_8);

 

      GPIO_SetBits(GPIOC,GPIO_Pin_9);

 

      GPIO_ResetBits(GPIOC,GPIO_Pin_11);

 

      tmp1 = GPIO_ReadInputData(GPIOB);

       tmp2 = GPIO_ReadInputData(GPIOC);

 

       tmp = (tmp1>>8) | (tmp2<<8);

 

      GPIO_SetBits(GPIOC,GPIO_Pin_11);

 

      GPIO_SetBits(GPIOC,GPIO_Pin_8);

 

       /*16位数据低8*/

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

       GPIO_Init(GPIOB, &GPIO_InitStructure);

       /*16位数据高8*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

       GPIO_Init(GPIOC, &GPIO_InitStructure);

 

      return tmp;

}

 

/**********************************************

函数名:Lcd初始化函数

功能:初始化Lcd

入口参数:无

返回值:无

***********************************************/

void Lcd_Initialize(void)

{

      u16 i;

       Lcd_Light_ON;

       DataToWrite(0xffff);//数据线全高

       Set_Rst;

       Set_nWr;

       Set_Cs;

       Set_Rs;

       Set_nRd;

       Set_Rst;

       Delay_nms(1);

       Clr_Rst;

       Delay_nms(1);

       Set_Rst;

       Delay_nms(1);

      

/*     

#ifdef ILI9325       

       LCD_WR_REG(0x00e3,0x3008);

       LCD_WR_REG(0x00e7,0x0010);

       LCD_WR_REG(0x00ef,0x1231);  //Set the internal vcore voltage

       LCD_WR_REG(0x0001,0x0100); //When SS = 0, the shift direction of outputs is from S1 to S720                                                       

#endif                                    //When SS = 1, the shift direction of outputs is from S720 to S1.

#ifdef ILI9320

       LCD_WR_REG(0x00e5,0x8000);

       LCD_WR_REG(0x0000,0x0001);

       LCD_WR_REG(0x0001,0x0100);//S

       Delay_nms(10);

#endif       

       LCD_WR_REG(0x0002,0x0700);//Line inversion       

#if   ID_AM==000      

       LCD_WR_REG(0x0003,0x0000);//屏幕旋转控制 TFM=0,TRI=0,SWAP=1,16 bits system interface  swap RGB to BRG,此处ORGHWM 0

#elif ID_AM==001       

       LCD_WR_REG(0x0003,0x0008);     

#elif ID_AM==010 

       LCD_WR_REG(0x0003,0x0010);       

 

类别:杂谈 |
上一篇:念奴娇 雪后秦淮 | 下一篇:使用NEC单片机保护您的设计(转帖)
以下网友评论只代表其个人观点,不代表本网站的观点或立场