stm32f030 i2c能处理i2c电容触摸屏吗

单片机能处理i2c电容触摸屏吗_百度知道
单片机能处理i2c电容触摸屏吗
我有更好的答案
电容触摸屏远比电阻的复杂,需要专门的驱动芯片,然后用单片机通过IIC或者其他方式读取坐标。
采纳率:44%
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。[转载]STM32通过I2C接口控制STMPE811来控制TFT触摸屏实验(四)
以上完成了LCD的正常显示。下面的工作就是着重调试触摸屏。
触摸屏控制芯片是STMPE811.关于STMPE811的具体,请参阅STMPE811的datasheet.
下面就代码部分说明个人对STMPE811的理解。
先把 main()函数的代码部分贴出来:
#include "stm32f10x.h"
#include "LED.h"
#include "key.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
#include "LCD.h"
#include "misc.h"
#include "RTC.h"
#include "stm32f10x_i2c.h"
#include "math.h"
#include "TS_I2C.h"
extern vu16 ad_value[2];//存储器
void delay(unsigned int t);
void My_NVIC_Init(uint32_t group,IRQn_Type IRQ_Cha,u8 preprio,u8
sub,FunctionalState s);
extern u8 USART_RX_STA;
extern u8 USART_RX_Buf[64];
extern void usart_init(u32 pclk,u32 bound);
extern void exti_init(void);
extern void iwdg_init(u8 PreR,u16 ReloadR);
extern void feed_dog(void);
extern void LCD_Init (void);
extern void GLCD_Clear (unsigned short color);
extern void GLCD_DisplayString (unsigned int ln, unsigned int col,
unsigned char *s) ;
extern void LCD_ShowString(unsigned short x,unsigned short y,const
extern void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,
FunctionalState NewState);
extern void Pen_Int_Set(u8 en);
//void TS_Write(unsigned char reg,unsigned char num,unsigned int
//unsigned int TS_Read(unsigned char reg,unsigned char num);
//u16 TS_Read_XY(unsigned char xy_reg);
extern u8 RTC_Init(void);
extern void EXTI1_Init(void);
void TS_I2C_Init(void);
void ADC_Init1(void);
void DMA_Config(void);
extern void I2C_config(void);
extern void Touch_Adjust(void);
extern void I2C_config(void);
extern void I2C_Start(void);
extern void TS_I2C_Init(void);
extern unsigned int TS_Read(unsigned char reg,unsigned char
extern void TS_Write(unsigned char reg,unsigned char num,unsigned
extern u16 TS_Read_AD(unsigned char reg,unsigned char num);
extern u16 TS_Read_XY(unsigned char xy_reg);
extern void Draw_Big_Point(u16 x,u16 y,u16 color);
extern u8 Read_STMPE811(u16 *x,u16 *y);
extern void Convert_Pos(void);
extern Pen_Holder Pen_P
extern unsigned short TextColor,BackColor,PointC
#include "TS_I2C.h"
int fputc(int ch,FILE *flle)
&USART_SendData(USART2,(u8)ch);//重新定向Printf,因为printf函数是基于fputc的
&while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)!=SET)
void Load_Drow_Dialog(void)
&&LCD_Clear(White);//清屏&
&TextColor=B//设置字体为蓝色
&LCD_ShowString(216,0,"RST");//显示清屏区域
&TextColor=R//设置画笔蓝色
int main(void)
SystemInit();&
&& LED_Init();
//&& usart_init(72,9600);
&& key_init();
&& LCD_Init();
//&& RTC_Init();
//&& ADC_Init1();
//&& DMA_Config();
//&& EXTI1_Init();
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
//&TextColor=R//设置字体为蓝色&
&LCD_ShowString(60,50,"Mini STM32");
&LCD_ShowString(60,70,"TOUCH TEST");
&LCD_ShowString(60,110,"");
&LCD_ShowString(60,130,"Press KEY0 to
&TS_I2C_Init();
&& delay(1500);
&& EXTI1_Init();
TS_Write(0X03,1,0X02);&&//软件复位STMPE811
delay(10);&&
&& TS_Write (0x04, 1,
0x0C);&&&&&&
&& TS_Write (0x0A, 1,
0x07);&&&&&&
&& TS_Write (0x20, 1,
0x69);&&&&&&
delay(2);&&&&&&&&&&
&& TS_Write (0x21, 1,
0x01);&&&&&&
&& TS_Write (0x41, 1,
0xF5);&&&&&&
&& TS_Write (0x4A, 1,
0x01);&&&&&&
&& TS_Write (0x4B, 1,
0x01);&&&&&&
&& TS_Write (0x4B, 1,
0x00);&&&&&&
&& TS_Write (0x56, 1,
0x07);&&&&&&
&& TS_Write (0x58, 1,
0x01);&&&&&&
&& TS_Write (0x40, 1,
0x01);&&&&&&
&& TS_Write (0x0B, 1,
0xFF);&&&&&&
&& TS_Write (0x09, 1,
0x03);&&&&&&
&& Load_Drow_Dialog();
& while (1)
& &key=key_scan();
&if(Pen_Point.Key_Sta==Key_Down)//触摸屏被按下
&&Pen_Int_Set(0);//关闭中断
&&&Pen_Point.Key_Sta=Key_Up;
&&&Convert_Pos();
&&&if((Pen_Point.X0&216)&&(Pen_Point.Y0&16))
&&&&Load_Drow_Dialog();//清除
&&&&Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0,TextColor);//画点
&&&//delay(10);
&&while(PEN==0);//如果
PEN一直有效,则一直执行
&&Pen_Int_Set(1);//开启中断
&delay(1);
&if(key==1)//KEY0 按下,则执行校准程序
&&LCD_Clear(White);//清屏
&&Touch_Adjust();&
//屏幕校准
&&Load_Drow_Dialog();&
void My_NVIC_Init(uint32_t group,IRQn_Type IRQ_Cha,u8 preprio,u8
sub,FunctionalState s)
&NVIC_InitTypeDef NVIC_InitS
&NVIC_PriorityGroupConfig(group);
&NVIC_InitStructure.
NVIC_IRQChannel=IRQ_C&&&&&&&&&&&&&&&&&&&
& &NVIC_InitStructure.
NVIC_IRQChannelPreemptionPriority=&
& &NVIC_InitStructure.
NVIC_IRQChannelSubPriority=&&&&&&&&
& &NVIC_InitStructure.
NVIC_IRQChannelCmd=s;
&NVIC_Init(&NVIC_InitStructure);&&&&&&&&
void delay(unsigned int t)
&for(i=t;i&0;i--)
&&for(j=10000;j&0;j--);
#ifdef& USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
& while (1)
分部说明:
void TS_I2C_Init(void)
&I2C_config();//I2C初始化
&&&&&&&&&&
STMPE811是用I2C和SPI作为接口的,而硬件上已经固化好只能用I2C借口,关于I2C总线的说明如&&&&&&&&
下:I2C连接微控制器和I2C总线,I2C总线提供了多主机功能,控制所有I2C总线特定的时序、协&&&&&&&&
议、总裁和定时。I2C中有两条线,SDA和SCL,其中SDA是数据线,SCL是时钟线,时钟信号是由I2C&&&&&&&
的主机产生的。并且I2C的数据传输总是以起始条件开始,并以终止条件结束。
&&&&&&&&&&
&I2C_Start();//产生一个开始的条件
&I2C_Addr(0X82|0);//发送从机地址
&&&&&&&&&&&&&
&&&&&&&&&&&&&
所以从机地址是0x82,至于为什么要写 0x82|0,是因为accompanying the slave
device&&&&&&&&&&
address is a read/write bit.The......
&&&&&&&&&&&&&&
&I2C_Write(0X40);//选择 4线触摸屏控制寄存器设置
void I2C_config(void)
& RCC-&APB2ENR |= (1
&& 4) | (1
0)|(1&&3);
& RCC-&APB1ENR |= (1
AFIO-&MAPR&& |=
GPIOB-&CRH&& |=
0x000000FF;
I2C1-&CR1&&&&
0x8000;&&&&&&&&&&&&&&
& for (tout = 100; tout--);
I2C1-&CR1&&&&
I2C1-&CR1&&&&
I2C1-&CR2&&&&
I2C1-&CR1&&&&
I2C1-&TRISE&& =
I2C1-&CCR&&&&
I2C1-&CR1&&&
|= 0x0401;
I2C1-&OAR1&&&
void I2C_Start(void)
& I2C1-&CR1 |= 0x0100;
& while (!(I2C_sr() &
0x00001));&
static __inline unsigned int I2C_sr(void)
I2C1-&SR1;
&& sr |= I2C1-&SR2
&& return (sr);
void I2C_Addr(unsigned char adr)
& I2C1-&DR =
& while (!(I2C_sr() &
void I2C_Write(unsigned char c)
& I2C1-&DR =
& while (!(I2C_sr() &
&&&&&&&&&&&
void I2C_Stop(void)
& I2C1-&CR1 |= 0x0200;
& while (I2C_sr() &
0x);&&&&&&&
void EXTI1_Init(void)
&EXTI_InitTypeDef EXTI_InitS
&NVIC_InitTypeDef NVIC_InitS
&GPIO_InitTypeDef GPIO_InitS
&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO, ENABLE);
&GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_1;
& &GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING;
& &GPIO_Init(GPIOB,
&GPIO_InitStructure);
&GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,
GPIO_PinSource1);
&EXTI_InitStructure.EXTI_Line =
EXTI_Line1;
&EXTI_InitStructure.EXTI_Mode =
EXTI_Mode_I
&EXTI_InitStructure.EXTI_Trigger =
EXTI_Trigger_F
&EXTI_InitStructure.EXTI_LineCmd = ENABLE;
&EXTI_Init(&EXTI_InitStructure);
&NVIC_InitStructure.NVIC_IRQChannel =
EXTI1_IRQn;
&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
&NVIC_InitStructure.NVIC_IRQChannelSubPriority =
&NVIC_InitStructure.NVIC_IRQChannelCmd =
&NVIC_Init(&NVIC_InitStructure);&
&算了完整代码贴出来吧,呵呵,有点累,如果有问题请发邮件到
#include "stm32f10x.h"
#include "LED.h"
#include "key.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
#include "LCD.h"
#include "misc.h"
#include "RTC.h"
#include "stm32f10x_i2c.h"
#include "math.h"
#include "TS_I2C.h"
extern vu16 ad_value[2];//存储器
void delay(unsigned int t);
void My_NVIC_Init(uint32_t group,IRQn_Type IRQ_Cha,u8 preprio,u8
sub,FunctionalState s);
extern u8 USART_RX_STA;
extern u8 USART_RX_Buf[64];
extern void usart_init(u32 pclk,u32 bound);
extern void exti_init(void);
extern void iwdg_init(u8 PreR,u16 ReloadR);
extern void feed_dog(void);
extern void LCD_Init (void);
extern void GLCD_Clear (unsigned short color);
extern void GLCD_DisplayString (unsigned int ln, unsigned int col,
unsigned char *s) ;
extern void LCD_ShowString(unsigned short x,unsigned short y,const
extern void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,
FunctionalState NewState);
extern void Pen_Int_Set(u8 en);
//void TS_Write(unsigned char reg,unsigned char num,unsigned int
//unsigned int TS_Read(unsigned char reg,unsigned char num);
//u16 TS_Read_XY(unsigned char xy_reg);
extern u8 RTC_Init(void);
extern void EXTI1_Init(void);
void TS_I2C_Init(void);
void ADC_Init1(void);
void DMA_Config(void);
extern void I2C_config(void);
extern void Touch_Adjust(void);
extern void I2C_config(void);
extern void I2C_Start(void);
extern void TS_I2C_Init(void);
extern unsigned int TS_Read(unsigned char reg,unsigned char
extern void TS_Write(unsigned char reg,unsigned char num,unsigned
extern u16 TS_Read_AD(unsigned char reg,unsigned char num);
extern u16 TS_Read_XY(unsigned char xy_reg);
extern void Draw_Big_Point(u16 x,u16 y,u16 color);
extern u8 Read_STMPE811(u16 *x,u16 *y);
extern void Convert_Pos(void);
extern Pen_Holder Pen_P
extern unsigned short TextColor,BackColor,PointC
#include "TS_I2C.h"
int fputc(int ch,FILE *flle)
&USART_SendData(USART2,(u8)ch);//重新定向Printf,因为printf函数是基于fputc的
&while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)!=SET)
void Load_Drow_Dialog(void)
&&LCD_Clear(White);//清屏&
&TextColor=B//设置字体为蓝色
&LCD_ShowString(216,0,"RST");//显示清屏区域
&TextColor=R//设置画笔蓝色
int main(void)
SystemInit();&
&& LED_Init();
//&& usart_init(72,9600);
&& key_init();
&& LCD_Init();
//&& RTC_Init();
//&& ADC_Init1();
//&& DMA_Config();
//&& EXTI1_Init();
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
//&TextColor=R//设置字体为蓝色&
&LCD_ShowString(60,50,"Mini STM32");
&LCD_ShowString(60,70,"TOUCH TEST");
&LCD_ShowString(60,110,"");
&LCD_ShowString(60,130,"Press KEY0 to
//&& LCD_ShowString(30,70,"2.3'/
2.8' TFTLCDTSET!");
//&& LCD_ShowString(30,90,"I love
LCD_ShowString(60,130,"&&&
LCD_ShowString(60,162,"& :&
&& TS_I2C_Init();
&& delay(1500);
&& EXTI1_Init();
TS_Write(0X03,1,0X02);&&//软件复位STMPE811
delay(10);&&
&& TS_Write (0x04, 1,
0x0C);&&&&&&
&& TS_Write (0x0A, 1,
0x07);&&&&&&
&& TS_Write (0x20, 1,
0x69);&&&&&&
delay(2);&&&&&&&&&&
&& TS_Write (0x21, 1,
0x01);&&&&&&
&& TS_Write (0x41, 1,
0xF5);&&&&&&
&& TS_Write (0x4A, 1,
0x01);&&&&&&
&& TS_Write (0x4B, 1,
0x01);&&&&&&
&//& TS_Write (0x4c, 1,
&& TS_Write (0x4B, 1,
0x00);&&&&&&
&& TS_Write (0x56, 1,
0x07);&&&&&&
&& TS_Write (0x58, 1,
0x01);&&&&&&
&& TS_Write (0x40, 1,
0x01);&&&&&&
&& TS_Write (0x0B, 1,
0xFF);&&&&&&
&& TS_Write (0x09, 1,
0x03);&&&&&&
&& Load_Drow_Dialog();
& while (1)
& &key=key_scan();
&if(Pen_Point.Key_Sta==Key_Down)//触摸屏被按下
&&Pen_Int_Set(0);//关闭中断
&&&Pen_Point.Key_Sta=Key_Up;
&&&Convert_Pos();
&&&if((Pen_Point.X0&216)&&(Pen_Point.Y0&16))
&&&&Load_Drow_Dialog();//清除
&&&&Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0,TextColor);//画点
&&&//delay(10);
&&while(PEN==0);//如果
PEN一直有效,则一直执行
&&Pen_Int_Set(1);//开启中断
&delay(1);
&if(key==1)//KEY0 按下,则执行校准程序
&&LCD_Clear(White);//清屏
&&Touch_Adjust();&
//屏幕校准
&&Load_Drow_Dialog();&
test_value=TS_Read_XY(0x4d);
//&&if(t!=timer.sec)
//&&&t=timer.
//&&&LCD_Show_Num(60,130,test_value,4,16);
//&&&LCD_Show_Num(100,130,timer.w_month,2,16);
//&&&LCD_Show_Num(124,130,timer.w_date,2,16);
//&&switch(timer.week)
//&&&LCD_ShowString(60,148,"Sunday&&
//&&&LCD_ShowString(60,148,"Monday&&
&&LCD_ShowString(60,148,"Tuesday&
//&&&LCD_ShowString(60,148,"Wednesday");
//&&&LCD_ShowString(60,148,"Thursday
//&&&LCD_ShowString(60,148,"Friday&&
//&&&LCD_ShowString(60,148,"Saturday
//&&LCD_Show_Num(60,162,timer.hour,2,16);
//&&LCD_Show_Num(84,162,timer.min,2,16);
//&&LCD_Show_Num(108,162,timer.sec,2,16);
//&&LCD_ShowString(60,180,"ADC_Value:");
//&&LCD_ShowString(60,200,"ADC_Volt:0.000V");
//&&LCD_Show_Num(156,180,(unsigned
short)ad_value[0],4,16);
//&&temp=(float)ad_value[0]*(3.3/4096);
//&&LCD_Show_Num(132,200,adcx,1,16);
//&&temp-=
//&&temp*=1000;
//&&LCD_Show_Num(149,200,temp,3,16);
//&&delay(500);
void My_NVIC_Init(uint32_t group,IRQn_Type IRQ_Cha,u8 preprio,u8
sub,FunctionalState s)
&NVIC_InitTypeDef NVIC_InitS
&NVIC_PriorityGroupConfig(group);
&NVIC_InitStructure.
NVIC_IRQChannel=IRQ_C&&&&&&&&&&&&&&&&&&&
& &NVIC_InitStructure.
NVIC_IRQChannelPreemptionPriority=&
& &NVIC_InitStructure.
NVIC_IRQChannelSubPriority=&&&&&&&&
& &NVIC_InitStructure.
NVIC_IRQChannelCmd=s;
&NVIC_Init(&NVIC_InitStructure);&&&&&&&&
void delay(unsigned int t)
&for(i=t;i&0;i--)
&&for(j=10000;j&0;j--);
#ifdef& USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
& while (1)
#include "stm32f10x_it.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_gpio.h"
#include "TS_I2C.h"
extern Pen_Holder Pen_P
extern u8 Read_STMPE811(u16 *x,u16 *y);
extern void delay(unsigned int t);
extern u8 RTC_Get(void);
extern void LCD_Show_Num(unsigned short x,unsigned short y,unsigned
short num,unsigned char len,unsigned char size);
u8 USART_RX_STA=0;
u8 USART_RX_Buf[64];//即最多接收到64个数据
void USART2_IRQHandler(void)
&if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)
&&USART_ClearITPendingBit(USART2,USART_IT_RXNE);
&&res=USART_ReceiveData(USART2);
&&if((USART_RX_STA&0X80)==0)//如果还没有接受完成,在接收到0X0D的时候接收完成
&&&if(USART_RX_STA&0X40)//如果接收到了0X0D
&&&&if(res!=0X0A)//如果不是接收到一个回车符,继续接收
&&&&&USART_RX_STA&=0X3F;
&&&&else//如果是接收到了一个回车符
&&&&&USART_RX_STA|=0x80;//把接收完成标志置1
&&&else//如果没有接收到0X0D
&&&&if(res==0X0D)//如果收到0X0D
&&&&&USART_RX_STA|=0X40;
&&&&&USART_RX_Buf[USART_RX_STA&0X3F]=//把接收到的数据发到接收缓存区
&&&&&USART_RX_STA++;
&&&&&if(USART_RX_STA&63)
&&&&&&USART_RX_STA=0;//接收错误,重新开始接收&
void EXTI0_IRQHandler(void)
&if(EXTI_GetITStatus(EXTI_Line0)==SET)
&&GPIO_SetBits(GPIOE,GPIO_Pin_3);
&&delay(1000);
&&GPIO_ResetBits(GPIOE,GPIO_Pin_3);
&&delay(1000);
&&EXTI_ClearITPendingBit(EXTI_Line0);
void EXTI9_5_IRQHandler(void)
&if(EXTI_GetITStatus(EXTI_Line7)==SET)
&&GPIO_WriteBit(GPIOE,GPIO_Pin_4,(BitAction)1);
&&delay(1000);
&&GPIO_WriteBit(GPIOE,GPIO_Pin_4,(BitAction)0);
&&delay(1000);
&&EXTI_ClearITPendingBit(EXTI_Line7);
void EXTI15_10_IRQHandler(void)
&if(EXTI_GetITStatus(EXTI_Line13)==SET)
&&GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)1);
&&delay(1000);
&&GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)0);
&&delay(1000);
&&EXTI_ClearITPendingBit(EXTI_Line13);
void RTC_IRQHandler(void)
&if(RTC-&CRL&0x0001)//秒钟中断
&&RTC_Get();//更新时间
&if(RTC-&CRL&0x0002)//闹钟中断
&&RTC-&CRL&=~(0x0002);//清闹钟中断
&&//闹钟处理:
&RTC-&CRL&=0X0FFA;&&&&&&&&
//清除溢出,秒钟中断标志
&while(!(RTC-&CRL&(1&&5)));//等待
RTC 寄存器操作完成
//中断处理函数
void EXTI1_IRQHandler(void)
&u16 x=0,y=0;//x,y是为了显示触摸屏被触摸的物理坐标的测试变量
&if(EXTI_GetITStatus(EXTI_Line1) !=
RESET)//如果触摸屏被触摸
&//&delay(1000);
&&Pen_Point.Key_Sta=Key_D
&//&EXTI-&PR=1&&1;//清除LINE1上的中断标志
//&&Read_STMPE811(&x,&y);//如果被触摸,就保存在x,y中
//&&LCD_Show_Num(100,130,x&0xfff,4,16);
//&&LCD_Show_Num(100,150,y&0xfff,4,16);
&&EXTI_ClearITPendingBit(EXTI_Line1);&
void NMI_Handler(void)
void HardFault_Handler(void)
& while (1)
void MemManage_Handler(void)
& while (1)
void BusFault_Handler(void)
& while (1)
void UsageFault_Handler(void)
& while (1)
void SVC_Handler(void)
void DebugMon_Handler(void)
void PendSV_Handler(void)
void SysTick_Handler(void)
#include "LED.h"
void LED_Init(void)
&RCC-&APB2ENR=1&&6;//使能GPIOE
&GPIOE-&CRL&=0xffff00
&GPIOE-&CRL|=0x;//设置PE_2/PE_3为推拉输出
&GPIOE-&ODR|=3&&2;//初始化PE_2和PE_3为1,即开始点亮LED
#ifndef _LED_H_
#define _LED_H_
#include "stm32f10x.h"
LED0_Set(x)&((x)?(GPIOE-&ODR=1&&2):(GPIOE-&ODR=0&&2));
LED1_Set(x)&((x)?(GPIOE-&ODR=1&&3):(GPIOE-&ODR=0&&3));
void LED_Init(void);
#include "key.h"
extern void delay(unsigned int t);
void key_init(void)
&RCC-&APB2ENR|=1&&3;//使能GPIOB的时钟
&RCC-&APB2ENR|=1&&4;//使能GPIOC的时钟
&RCC-&APB2ENR|=1&&2;//使能GPIOA的时钟
&GPIOB-&CRL&=0X0FFFFFFF;
&GPIOB-&CRL|=0X;&//配置PB7为浮空输入
&GPIOC-&CRH&=0XFF0FFFFF;
&GPIOC-&CRH|=0X;
&GPIOA-&CRL&=0XFFFFFFF0;
&GPIOA-&CRL|=0X;
u8 key_scan(void)
&static u8 key_up=1;
&if((key_up==1)&&(Key_User==0||Key_Tamper==0||Key_WakeUp==1))
&&delay(10);//延时10ms,消除抖动
&&if((key_up==1)&&(Key_User==0||Key_Tamper==0||Key_WakeUp==1))
&&&key_up=0;
&&&if(Key_User==0)return
if(Key_Tamper==0)return 2;
if(Key_WakeUp==1)
if(Key_User==0||Key_Tamper==0||Key_WakeUp==1)
&&key_up=1;
&return 0;
#ifndef _KEY_H
#define _KEY_H
#include "stm32f10x.h"
extern uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,
uint16_t GPIO_Pin);
#define PB_7&((uint16_t)0x0080)
#define PC_13&((uint16_t)0x2000)
#define PA_0&((uint16_t)0x0001)
#define Key_User
&GPIO_ReadInputDataBit(GPIOB,PB_7)
Key_Tamper&GPIO_ReadInputDataBit(GPIOC,PC_13)
#define Key_WakeUp
&GPIO_ReadInputDataBit(GPIOA,PA_0)
void key_init(void);
u8 key_scan(void);
#include "TS_I2C.h"
#include "misc.h"
#include "stm32f10x_exti.h"
#define READ_TIMES 15 //读取次数
#define LOST_VAL 5&& //丢弃值
#include "i2c.h"
#include "stm32f10x_i2c.h"
#include "LCD.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
Pen_Holder Pen_P
extern void delay(unsigned int t);
extern unsigned short TextColor, BackColor,PointC
int tch_int = 0,tch_on = 0;
int tch_x = 0, tch_y = 0 , tch_z& = 0;
void EXTI1_Init(void)
&EXTI_InitTypeDef EXTI_InitS
&NVIC_InitTypeDef NVIC_InitS
&GPIO_InitTypeDef GPIO_InitS
&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO, ENABLE);
&GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_1;
& &GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING;
& &GPIO_Init(GPIOB,
&GPIO_InitStructure);
&GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,
GPIO_PinSource1);
&EXTI_InitStructure.EXTI_Line =
EXTI_Line1;
&EXTI_InitStructure.EXTI_Mode =
EXTI_Mode_I
&EXTI_InitStructure.EXTI_Trigger =
EXTI_Trigger_F
&EXTI_InitStructure.EXTI_LineCmd = ENABLE;
&EXTI_Init(&EXTI_InitStructure);
&NVIC_InitStructure.NVIC_IRQChannel =
EXTI1_IRQn;
&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
&NVIC_InitStructure.NVIC_IRQChannelSubPriority =
&NVIC_InitStructure.NVIC_IRQChannelCmd =
&NVIC_Init(&NVIC_InitStructure);&
void TS_I2C_Init(void)
&I2C_config();//I2C初始化
&I2C_Start();//产生一个开始的条件
&I2C_Addr(0X82|0);//发送从机地址
&I2C_Write(0X40);//选择 4线触摸屏控制寄存器设置
&I2C_Write(3);//选择X Y mode only,enable this
&I2C_Stop();//产生一个停止的条件
void TS_Write(unsigned char reg,unsigned char num,unsigned int
&I2C_Start();//产生一个开始的条件
&I2C_Addr(0X82|0);//发送从机地址
&I2C_Write(reg);//选中要写的寄存器
&while(num--)
&&I2C_Write(val&0XFF);
&&val&&=8;
&I2C_Stop();&
unsigned int TS_Read(unsigned char reg,unsigned char num)
&unsigned int res = 0;
&I2C_Start();&&&
//读数据的步骤:1.Start
&I2C_Addr (0x82 | 0);
&I2C_Write(reg);
&I2C_Start();
&I2C_Addr (0x82 | 1);
&while(num--)
&&res&&=8;
&&res|=I2C_Read((num&=1));
&I2C_Stop();
&return (res);
u16 TS_Read_AD(unsigned char reg,unsigned char num)
&AD_Val=TS_Read(reg,num);
&return (AD_Val);&
u16 TS_Read_XY(unsigned char xy_reg)
&u16 buf[READ_TIMES];
&u16 temp=0;
&for(i=0;i&READ_TIMES;i++)
&&buf[i]=TS_Read(xy_reg,2);//0x38是ADC
CH6的数据寄存器,即是X-转换过来的数据&&
&for(i=0;i&READ_TIMES-1;i++)
&&for(j=i+1;j&READ_TIMES;j++)
&&&if(buf[i]&buf[j])//升序排列
&&&&temp=buf[i];
&&&&buf[i]=buf[j];
&&&&buf[j]=
&for(i=LOST_VAL;i&READ_TIMES-LOST_VAL;i++)&
sum+=buf[i];
&temp=sum/(READ_TIMES-2*LOST_VAL);
u8 Read_STMPE811(u16 *x,u16 *y)
&u16 xtemp,ytemp,xtemp1,ytemp1;
&tch_int = TS_Read (0x0B,
&if (tch_int)
&&if (tch_int &
&&&tch_on ^=
tch_y = 0;
tch_z = 0;
&if (tch_int & 3)
&&xtemp1=TS_Read_XY(0X4D);//读取的X数据
&&ytemp1=TS_Read_XY(0X4F);//读取的y的数据,在滤除噪声以后的
&&tch_on&&
&&tch_z = TS_Read (0xD7,
&&tch_x = (tch_z
0x00000FFF;
&&tch_y = (tch_z
& 0x00000FFF;
&tch_z = (tch_z
& 0x0000000F;
&&TS_Write (0x4B, 1,
0x01);&&&&&&
&&TS_Write (0x4B, 1,
0x00);&&&&&&
&xtemp=tch_x;
&ytemp=tch_y;
&TS_Write (0x0B, 1, tch_int);
//&delay(200);
&if(xtemp&100||ytemp&100)
&return 0;//读数失败
&return 1;//读数成功
#define ERR_RANGE 50 //误差范围
u8 Read_STMPE8112(u16 *x,u16 *y)
&u16 x1,y1;
&u16 x2,y2;
&flag=Read_STMPE811(&x1,&y1);
&if(flag==0)return(0);
&flag=Read_STMPE811(&x2,&y2);
&if(flag==0)return(0);
&if(((x2&=x1&&x1&x2+ERR_RANGE)||(x1&=x2&&x2&x1+ERR_RANGE))&&((y2&=y1&&y1&y2+ERR_RANGE)||(y1&=y2&&y2&y1+ERR_RANGE)))
&&*x=(x1+x2)/2;
&&*y=(y1+y2)/2;
&}else return 0;
void Pen_Int_Set(u8 en);
u8 Read_TP_Once(void)
&Pen_Int_Set(0);//关闭中断
&Pen_Point.Key_Sta=Key_Up;
&Read_STMPE8112(&Pen_Point.X,&Pen_Point.Y);
//&delay(400);
&while((PEN==0)&&(t&=250))
&&delay(10);&
&TS_Write (0x0B, 1, tch_int);
&delay(20);
&Pen_Int_Set(1);//开启中断
&if(t&=250)return 0;//按下 2.5s
&else return 1;
//////////////////////////////////////////////////
//与LCD 部分有关的函数
//画一个触摸点
//用来校准用的
extern void LCD_Draw_Line(unsigned short x1,unsigned short
y1,unsigned short x2,unsigned short y2,unsigned short color);
extern void LCD_DrawPoint(unsigned short xpos,unsigned short
ypos,unsigned short color);
extern void LCD_Draw_Circle(unsigned short x,unsigned short
y,unsigned short r,unsigned short color);
void Drow_Touch_Point(u16 x,u16 y,u16 color)
&LCD_Draw_Line(x-12,y,x+13,y,color);//横线
&LCD_Draw_Line(x,y-12,x,y+13,color);//竖线
&LCD_DrawPoint(x+1,y+1,color);
LCD_DrawPoint(x-1,y+1,color);
&LCD_DrawPoint(x+1,y-1,color);
&LCD_DrawPoint(x-1,y-1,color);
&LCD_Draw_Circle(x,y,6,color);//画中心圈
//画一个大点
//2*2 的点
void Draw_Big_Point(u16 x,u16 y,u16 color)
&LCD_DrawPoint(x,y,color);//中心点
&LCD_DrawPoint(x+1,y,color);
&LCD_DrawPoint(x,y+1,color);
&LCD_DrawPoint(x+1,y+1,color);&
//转换触摸结果
void Convert_Pos(void)
&if(Read_STMPE8112(&Pen_Point.X,&Pen_Point.Y))
&&Pen_Point.X0=Pen_Point.xfac*Pen_Point.X+Pen_Point.
&&Pen_Point.Y0=Pen_Point.yfac*Pen_Point.Y+Pen_Point.
//触摸屏校准代码
//得到四个校准参数
void Touch_Adjust(void)
&u16 pos_temp[4][2];//坐标缓存值
&u8& cnt=0;
&u16 d1,d2;
&u32 tem1,tem2;
&TextColor=B
&BackColor =W
&LCD_Clear(White);//清屏
&TextColor=R//红色
&LCD_Clear(White);//清屏
&Read_STMPE811(&Pen_Point.X,&Pen_Point.Y);//第一次读取初始化
&Drow_Touch_Point(20,20,TextColor);//画点1
&delay(1000);
&Pen_Point.Key_Sta=Key_Up;//消除触发信号
&Pen_Point.xfac=0;//xfac
用来标记是否校准过,所以校准之前必须清掉!以免错误
&&if(Pen_Point.Key_Sta==Key_Down)//按键按下了
&&&delay(1000);
&&&if(Read_TP_Once())//得到单次按键值
&&&&pos_temp[cnt][0]=Pen_Point.X;
&&&&pos_temp[cnt][1]=Pen_Point.Y;
&&&&cnt++;
&&&&delay(100);
&&&switch(cnt)
&&&&&&LCD_Clear(White);//清屏
&&&&&delay(1000);
&&&&&Drow_Touch_Point(220,20,TextColor);//画点2
&&&&&LCD_Clear(White);//清屏
&&&&&delay(1000);
&&&&&Drow_Touch_Point(20,300,TextColor);//画点3
&&&&&LCD_Clear(White);//清屏
&&&&&delay(1000);
&&&&&Drow_Touch_Point(220,300,TextColor);//画点4
4:& //全部四个点已经得到
&&&&//对边相等
&&&&tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
&&&&tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
&&&&tem1*=tem1;
&&&&tem2*=tem2;
&&&&d1=sqrt(tem1+tem2);//得到1,2的距离
&&&&tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
&&&&tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
&&&&tem1*=tem1;
&&&&tem2*=tem2;
&&&&d2=sqrt(tem1+tem2);//得到3,4的距离
&&&&fac=(float)d1/d2;
&&&&if(fac&0.95||fac&1.05||d1==0||d2==0)//不合格
&&&&&cnt=0;
&&&&&LCD_Clear(White);//清屏
&&&&&Drow_Touch_Point(20,20,TextColor);
&&&&tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
&&&&tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
&&&&tem1*=tem1;
&&&&tem2*=tem2;
&&&&d1=sqrt(tem1+tem2);//得到1,3的距离
&&&&tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
&&&&tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
&&&&tem1*=tem1;
&&&&tem2*=tem2;
&&&&d2=sqrt(tem1+tem2);//得到2,4的距离
&&&&fac=(float)d1/d2;
&&&&if(fac&0.95||fac&1.05)//不合格
&&&&&cnt=0;
&&&&&LCD_Clear(White);//清屏
&&&&&Drow_Touch_Point(20,20,TextColor);
&&&&tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x1-x4
&&&&tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y1-y4
&&&&tem1*=tem1;
&&&&tem2*=tem2;
&&&&d1=sqrt(tem1+tem2);//得到1,4的距离
&&&&tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x2-x3
&&&&tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y2-y3
&&&&tem1*=tem1;
&&&&tem2*=tem2;
&&&&d2=sqrt(tem1+tem2);//得到2,3的距离
&&&&fac=(float)d1/d2;
&&&&if(fac&0.95||fac&1.05)//不合格
&&&&&cnt=0;
&&&&&LCD_Clear(White);//清屏
&&&&&Drow_Touch_Point(20,20,TextColor);
&&&&Pen_Point.xfac=(float)200/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac
&&&&Pen_Point.xoff=(240-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//
&&&&Pen_Point.yfac=(float)280/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
&&&&Pen_Point.yoff=(320-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//
得 到yoff&
&&&&TextColor=B
&&&&LCD_Clear(White);//清屏
&&&&LCD_ShowString(35,110,"Touch
Screen Adjust OK!");//校正完成
&&&&delay(1000);
&&&&LCD_Clear(White);//清屏
&&&&//校正完成
//&&&Pen_Point.Key_Sta=Key_Up;
//PEN 中断设置
void Pen_Int_Set(u8 en)
&if(en)EXTI-&IMR|=1&&1;&&
//开启 line1 上的中断
EXTI-&IMR&=~(1&&1);
//关闭 line1 上的中断
#ifndef TS_I2C_H
#define TS_I2C_H
#include "stm32f10x.h"
#define PB_1 ((uint16_t)0x0002)
extern uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
#define PEN GPIO_ReadInputDataBit(GPIOB,PB_1)
void TS_I2C_Init(void);
void TS_Write(unsigned char reg,unsigned char num,unsigned int
unsigned int TS_Read(unsigned char reg,unsigned char num);
//笔杆结构体
typedef struct
&u16 X0;//LCD坐标
&u16 X; //物理坐标/暂存坐标
&u8& Key_S//笔的状态
&//触摸屏校准参数
//按键状态
#define Key_Down (0X01)
#define Key_Up&& (0X00)
#include "I2C.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#define I2C_Speed 10000
void I2C_config(void)
& RCC-&APB2ENR |= (1
&& 4) | (1
0)|(1&&3);
& RCC-&APB1ENR |= (1
AFIO-&MAPR&& |=
GPIOB-&CRH&& |=
0x000000FF;
I2C1-&CR1&&&&
0x8000;&&&&&&&&&&&&&&
& for (tout = 100; tout--);
I2C1-&CR1&&&&
I2C1-&CR1&&&&
I2C1-&CR2&&&&
I2C1-&CR1&&&&
I2C1-&TRISE&& =
I2C1-&CCR&&&&
I2C1-&CR1&&&
|= 0x0401;
I2C1-&OAR1&&&
static __inline unsigned int I2C_sr(void)
I2C1-&SR1;
&& sr |= I2C1-&SR2
&& return (sr);
//void I2C1_Init(void)
//&& RCC-&APB2ENR
|= (1 && 3) | (1
//&& RCC-&APB1ENR
|= (1 && 21);
AFIO-&MAPR&& |=
GPIOB-&CRH&& =
0x000000FF;
I2C1-&CR1&&&&
0x8000;&&&&&&&&&&&&&&
//&& for (tout = 100;
I2C1-&CR1&&&&
I2C1-&CR1&&&&
I2C1-&CR2&&&&
I2C1-&CR1&&&&
I2C1-&TRISE&& =
I2C1-&CCR&&&&
I2C1-&CR1&&&
|= 0x0401;
I2C1-&OAR1&&&
void I2C_Start(void)
& I2C1-&CR1 |= 0x0100;
& while (!(I2C_sr() &
0x00001));&
void I2C_Stop(void)
& I2C1-&CR1 |= 0x0200;
& while (I2C_sr() &
0x);&&&&&&&
void I2C_Addr(unsigned char adr)
& I2C1-&DR =
& while (!(I2C_sr() &
void I2C_Write(unsigned char c)
& I2C1-&DR =
& while (!(I2C_sr() &
&&&&&&&&&&&
unsigned char I2C_Read(int ack)
& if (ack) I2C1-&CR1
|=& 0x0400;
I2C1-&CR1 &= ~0x0400;
& while (!(I2C_sr() &
& return (I2C1-&DR);
#ifndef _I2C_H
#define _I2C_H
#include "stm32f10x.h"
//void I2C_Init(void);
//static unsigned int I2C_Sr(void);
//void I2C_Start(void);
//void I2C_Stop(void);
//void I2C_Addr(unsigned int addr);
//void I2C_Write(unsigned char c);
//unsigned char I2C_Read(int ack);
void I2C_config(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_Addr(unsigned char addr);
void I2C_Write(unsigned char c);
unsigned char I2C_Read(int ack);
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 stm32 i2c例程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信