stm32驱动ADS7843.docx
- 文档编号:8376310
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:20
- 大小:19.64KB
stm32驱动ADS7843.docx
《stm32驱动ADS7843.docx》由会员分享,可在线阅读,更多相关《stm32驱动ADS7843.docx(20页珍藏版)》请在冰豆网上搜索。
stm32驱动ADS7843
stm32驱动ADS7843
#include“stm32f10x_lib.h”
#include“integer.h”
#include“touch.h”
#include“TFTdriver.h”
#定义cstouch_hgpiob->BSRR=GPIO_Pin_0
即#defineCSTOUCH_LGPIOB->=GPIO_Pin_0
#定义get_pen_int(GPIOB->IDR&GPIO_Pin_12)
空白Touch_Config(空白)
{
SPI_InitTypeDefSPI_InitStructure;
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,使);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,使);
/*PB15-MOSI2、PB13-SCK2PB14-MISO2*/
GPIO_InitStructure。
gpiopin13gpiopin14gpiopin15;
GPIO_InitStructure。
GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure。
GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB&GPIO_InitStructure);
/*PB0-CS*/
GPIO_SetBits(GPIOBGPIO_Pin_0);//预置为高
GPIO_InitStructure。
GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure。
GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure。
GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB&GPIO_InitStructure);
/*PB12-INT,输入*/
GPIO_InitStructure。
GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure。
GPIO_Mode=GPIO_Mode_IPU;//上拉
GPIO_Init(GPIOB&GPIO_InitStructure);
/**/SPI2配置
SPI_Cmd(SPI2,禁用);//必须先禁能,才能改变模式
SPI_InitStructure。
SPI_Direction=
SPI_Direction_2Lines_FullDuplex;//两线全双工
SPI_InitStructure。
SPI_Mode=SPI_Mode_Master;//主
SPI_InitStructure。
SPI_DataSize=SPI_DataSize_8b;//8位
SPI_InitStructure。
SPI_CPOL=SPI_CPOL_High;//CPOL=1时钟悬空x
SPI_InitStructure。
SPI_CPHA=SPI_CPHA_2Edge;//CPHA=1数据捕获第x
SPI_InitStructure。
SPI_NSS=SPI_NSS_Soft;//软件NSS
SPI_InitStructure。
SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;//32米/16=2m
SPI_InitStructure。
SPI_FirstBit=SPI_FirstBit_MSB;//高位在前
SPI_InitStructure。
SPI_CRCPolynomial=7;//CRC7
SPI_Init(SPI2&SPI_InitStructure);
SPI_Cmd(SPI2,使);
}
静态与SPIByte(与字节)
{
在没有emplty/登记的时候
而(SPI_I2S_GetFlagStatus(SPI2SPI_I2S_FLAG_TXE)==重置);
/通过SPI2外围/发送字节
SPI_I2S_SendData(SPI2字节);
/等待接收一个字节/
而(SPI_I2S_GetFlagStatus(SPI2SPI_I2S_FLAG_RXNE)==重置);
/返回从SPI总线/读取的字节
返回SPI_I2S_ReceiveData(SPI2);
}
u16X_Buf[10],Y_Buf[10];
静态与LCD_BufX;
静态u16LCD_BufY;
/******************************
*******************************
*
**functionname:
GetTouchCoordinate
**function:
getthecoordinatesofthetouchscreen
**note:
thisisafunctionthattakesphysicalcoordinates,callsthephysicalinterfacetoread2046,returnsX,Y's12BITcoordinates.
**inputcoordinatesaretheX,YPointerstotheresult,andiftheobtainedtouchpointsarevalid,thenTRUEisreturned
**touchpointsarevalidandthevalidcoordinatesofthePENareadopted,otherwiseitisajitter.
***************************************************************/
/*isuselessinthetouchscreenmanagementsystem
(u16*p_x,u16*p_y)
{
U8I;
Under-16TMP.
If(GET_PEN_INT)
ReturnFALSE;
CSTOUCH_L;
__nop();
Xd0SPIByte(0);
For(I=0;I<10;I++)
{
TMP=SPIByte(0);
TMP<<=8;
TMP|=SPIByte(0);
TMP>>=3;
SPIByte(0x90);
X_Buf[I]=TMP;
TMP=SPIByte(0);
TMP<<=8;
TMP|=SPIByte(0);
TMP>>=3;
Xd0SPIByte(0);
Y_Buf[I]=TMP;
If(GET_PEN_INT)
{
CSTOUCH_H;
ReturnFALSE;
}
}
CSTOUCH_H;
//filtering,with0xfff,isduetothemodifiedtouch's
hardwaredirection
*p_x=0xfff-digitfilter(X_Buf,10);
*p_y=0xfff-digitfilter(Y_Buf,10);
ReturnTRUE;
}
*/
BoolGetPenTouch(void)
{
If(GET_PEN_INT)
ReturnTRUE;
Theelse
ReturnFALSE;
}
*********
**functionname:
GetOneCoordinate
**function:
getacoordinateandplaceitonthespecifiedbuffer
*note:
noisthebuffernumber,whichismanagedbythetouchscreenmanagerandtheuserdoesnotneedtocall
************************************************************************************************************
VoidGetOneCoordinate(u8no)
{
Under-16TMP.
CSTOUCH_L;
__nop();
Xd0SPIByte(0);
__nop();
TMP=SPIByte(0);
TMP<<=8;
TMP|=SPIByte(0);
TMP>>=3;
SPIByte(0x90);
X_Buf[no]=TMP;
TMP=SPIByte(0);
TMP<<=8;
TMP|=SPIByte(0);
TMP>>=3;
Xd0SPIByte(0);
Y_Buf[no]=TMP;
CSTOUCH_H;
}
U16DigitFilter(u16*buf,u8no)
{
U8I,j;
Under-16TMP.
U8cut_no=0;
//sorting
"For"(I=0;I { "For"(j=0;j { If(buf[j]>buf[j+1]) { TMP=buf[j]; Buf[j]=buf[j+1]; Buf[j+1)=TMP; } } } If(no>5) { Cut_no=no/5; } //anaverage TMP=0; For(I=cut_no;I n-2*cut_no,average TMP+=buf[I]; Return(TMP/(no-2*cut_no)); } /************************************************************* **functionname: TouchFilter **function: thefilteringofthetouchcoordinates,andthecorrection,accordingtothedirectionofthescreen,theupperleftcorneristheorigincoordinate *note: *************************************************************/ Void,TouchFilter. { //filtering,with0xfff,isduetothemodifiedtouch'shardwaredirection #ifTOUCH_TYPE==1 *p_x=0xfff-digitfilter(X_Buf,10); *p_y=0xfff-digitfilter(Y_Buf,10); #elifTOUCH_TYPE==2 *p_x=DigitFilter(X_Buf,10); *p_y=DigitFilter(Y_Buf,10); #endif } /************************************************************** Theupperpartofthetouch,whichisnotrelatedtotheGUI,CountingTouch,andtheManageTouchiscalledinthe1MStimer,andtheuserreferencesseveralexternalfunctionstoreadthevalueofthetouch ***************************************************************/ Thestaticu8Touch_Flag=0;//keymark Thestaticu8Filter_No=0;//filtercounter Staticu8Touch_Cnt_Time=0;//timeoff Staticu16T_Push_X=0,T_Push_Y=0;//theXY(ADvalue) Staticu16T_Hold_X=0,T_Hold_Y=0;//keepXY(AD) Staticu16T_Release_X=0,T_Release_Y=0;//releasedXY(ADvalue) Thestaticunder-16Pain_Color=RED; /************************************************************** **functionname: ManageTouch **function: touchmanagement *attention: research...Whenthepeninterruptisvalid,itbeginstoshake(non-blockingdelay),->enterstheeffectivereadTOUCH,eachcyclereadanddetectsthepeninterrupt,enoughfor10cyclestofilteroutthevalue. ***************************************************************/ VoidManageTouch(void) { Touch_Cnt_Time++; /************************************************************** PENasinvalideffect ***************************************************************/ If(GET_PEN_INT) { If(Touch_Flag&TOUCH_F_RELEASE) { //ifthereisaHOLDsign,thedelegateisreleased If(Touch_Flag&TOUCH_F_HOLD) { Touch_Flag=TOUCH_F_NULL; Touch_Flag|=TOUCH_F_RELEASE|TOUCH_F_HOLD; T_Release_X=T_Hold_X; T_Release_Y=T_Hold_Y; If(T_Hold_X,T_Hold_Y,&LCD_BufY)==TRUE) { If(LCD_BufX<40){Pain_Color=RED;} Elseif(LCD_BufX<80){Pain_Color=GREEN;} Elseif(LCD_BufX<120){Pain_Color=BLUE;} Elseif((LCD_BufX<160),){Pain_Color=BLACK;} Elseif(LCD_BufX<200){Pain_Color=WHITE;} Elseif((LCD_BufX<240)){TFTRectFill(0,0,240,300,WHITE, 0x00);} } } //otherwiseonlythePUSHflag,andtherelease Elseif(Touch_Flag&TOUCH_F_PUSH) { Touch_Flag=TOUCH_F_NULL; Touch_Flag|=TOUCH_F_RELEASE|TOUCH_F_PUSH; T_Release_X=T_Push_X; T_Release_Y=T_Push_Y; } } Thereturn; } /************************************************************** PENforeffective ***************************************************************/ //ifthereisarelease,youstarttojudgethetouch If(Touch_Flag&TOUCH_F_RELEASE) { Gotonew_touch; } //-1.TheTOUCH_F_WAIT_HOLDflagrepresentsthebeginning ofthecalculationofwaitingtime If(Touch_Flag&TOUCH_F_WAIT_HOLD) { If(Touch_Cnt_Time>=TOUCH_CNT_WAIT_HOLD_TIME) { Touch_Flag|=TOUCH_F_HOLD; Touch_Flag&=~TOUCH_F_WAIT_HOLD; T_Hold_X=T_Release_X; T_Hold_Y=T_Release_Y; If(T_Hold_X,T_Hold_Y,&LCD_BufY)==TRUE) {if(LCD_BufY<300) {TFTRectFill(lcd_bufx-1,lcd_bufy-1,lcd_buffx+1,lcd_buf0+ 1,LCD_BufY+1,Pain_Color,0x00);} } } } //-1.HOLDandunfilteredmark Elseif(Touch_Flag&touch_f_control)) { Touch_Flag|=TOUCH_F_FILTERING;//startfiltering Filter_No=0; } //-3.pushflagandunfilteredflag Elseif(Touch_Flag&TOUCH_F_PUSH).) { If(Touch_Cnt_Time>=TOUCH_CNT_HOLD_TIME)//thenstartto calculateBPK,timetofilteragain { Touch_Flag|=TOUCH_F_FILTERING; Filter_No=0; } } //-3.FLITERING-whenPUSHisnotpushed,itwillenterhere once Elseif(Touch_Flag&TOUCH_F_FILTERING) { GetOneCoordinate(Filter_No); If((++Filter_No)==MAX_TOUCH_FILTER_NO) { If(theTouch_Flag&TOUCH_F_PUSH))//thereisnoPUSHbefore, thisisaPUSHfiltering { TouchFilter(&T_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 驱动 ADS7843