STM32F103C8T6 和4个RH6016-C 触摸IC 做的 触摸 滑动 代码
[复制链接]
//#include "touch_key.h" 如下
#ifndef __TOUCH_KEY_H
#define __TOUCH_KEY_H
#include "sys.h"
#define TOUCH_KEYPORT GPIOA //定义IO接口组
#define TOUCH_KEY_A GPIO_Pin_12 //定义IO接口
#define TOUCH_KEY_B GPIO_Pin_1 //定义IO接口
#define TOUCH_KEY_C GPIO_Pin_2 //定义IO接口
#define TOUCH_KEY_D GPIO_Pin_15 //定义IO接口
void TOUCH_KEY_Init(void);//初始化
void TOUCH_KEY_SLIDE(void);
void TOUCH_KEY_ABCD(void);
#endif
// 1 GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); LED1接口输出高电平1
// GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1)));取反LED1
// 2 GPIO_SetBits(LEDPORT,LED1);
// 3 GPIO_ResetBits(LEDPORT,LED1);
// 4 GPIO_Write(LEDPORT,0x0001); 直接数值操作将变量值写入LED
//选择IO接口工作方式:
//GPIO_Mode_AIN 模拟输入
//GPIO_Mode_IN_FLOATING 浮空输入
//GPIO_Mode_IPD 下拉输入
//GPIO_Mode_IPU 上拉输入
//GPIO_Mode_Out_PP 推挽输出
//GPIO_Mode_Out_OD 开漏输出
//GPIO_Mode_AF_PP 复用推挽输出
//GPIO_Mode_AF_OD 复用开漏输出
// /* 发送方法1 */
// USART_SendData(USART1 , 0x55); //发送单个数值
// while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位
/* 发送方法2 */
// printf("STM32F103 "); //纯字符串发送数据到串口
// printf("STM32 %d %d ",a,b); //纯字符串和变量发送数据到串口,a符号变量
/* 发送方法3 */
// USART1_printf("STM32 %d %d ",a,b);
// USART1_printf("STM32 %d",b);//==printf("STM32 %d",b);
//a符号的作用:
//%d 十进制有符号整数
//%u 十进制无符号整数
//%f 浮点数
//%s 字符串
//%c 单个字符
//%p 指针的值
//%e 指数形式的浮点数
//%x, %X 无符号以十六进制表示的整数
//%o 无符号以八进制表示的整数
//%g 自动选择合适的表示法
//%p 输出地址符
//#include "touch_key.c" 如下
#include "touch_key.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "oled0561.h"
#include "flash.h"
#include "encoder.h"
#include "pwm.h"
#define KEYA_SPEED1 100 //长按的时间长度(单位10*100mS)
#define KEYA_SPEED2 10 //双击的时间长度(单位20mS)
#define FLASH_START_ADDR 0x0801f000 //写入的起始地址#define FLASH_START_ADDR 0x0801f000 //写入的起始地址
#define FLASH_data2_ADDR 0x0801f010
#define FLASH_data3_ADDR 0x0801f100
extern void OLED_DISPLAY_8x16_BUFFER(u8 row,u8 *str);
extern void TIM3_PWM_Init(u16 arr,u16 psc);
void TOUCH_KEY_Init(void)
{ //触摸按键初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); //APB2外设GPIO时钟使能
GPIO_InitStructure.GPIO_Pin = TOUCH_KEY_A | TOUCH_KEY_B | TOUCH_KEY_C | TOUCH_KEY_D; //选择端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻
GPIO_Init(TOUCH_KEYPORT,&GPIO_InitStructure);
}
void TOUCH_KEY_SLIDE(void)
{
u8 a=0,b,c=0;
u8 s=0; //刚刚结束滑动标志
u16 d=685; u16 tuch_a=10;u16 tuch_b=100;u16 tuch_c=500;u16 tuch_d=710;
u8 buffer[3];
u16 k;
k = FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH
{
//A键开始检测
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))//A 键检测按键是否按下
{ delay_ms(10); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))//再次检测按键是否按下
{
while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&c<KEYA_SPEED1)//是否按下和判断长短键
{
c++;
delay_ms(10); //长按判断的计时
}
if(c>=KEYA_SPEED1)//长键处理
{
k=tuch_a;
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
printf("A键长按 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY A LONG "); //显示字符串
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));
}
else
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))
{
k++; //用于显示的计数值
if(k>=d){k=343;}
printf("A键右滑 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY A to R ");
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
}
if(a==0)
{
for(b=0;b<KEYA_SPEED2;b++)//检测双击
{
delay_ms(20); //检测双击20*10=200ms
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)) //检测确实双击
{
a=1;
//GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));//双击后执行的程序放到此处,LED控制
printf("A键双击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY A two ");
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)); //等待KEYA释放退出
}
}
if(a==0) //判断单击
{
if(s==1)//判断是不是刚执行完滑动操作
{
s=0;//如果是则本次不执行单击处理(因为是滑动的放开操作)
}
else//如果不是,则正常执行单击处理
{
printf("A键单击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY A one ");
}
}
}
}a=0;c=0; //参数清0
}
}
//A按键判断在此结束
//B键开始检测
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))//B 键检测按键是否按下
{ delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))//再次检测按键是否按下
{
while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))&&c<KEYA_SPEED1)//是否按下和判断长短键
{
c++;
delay_ms(10); //长按判断的计时
}
if(c>=KEYA_SPEED1)//长键处理
{
k=tuch_b;
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
printf("B键长按 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY B long ");
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B));
}
else
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))
{
k++; //用于显示的计数值
if(k>=d){k=0;}
printf("B键右滑 %d \r\n",k);
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
OLED_DISPLAY_8x16_BUFFER(6,"KEY B to R ");
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))
{
k--; //用于显示的计数值
if(k==0){k=d;}
printf("B键左滑 %d \r\n",k);
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
OLED_DISPLAY_8x16_BUFFER(6,"KEY B to L ");
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
}
if(a==0)
{
for(b=0;b<KEYA_SPEED2;b++)//检测双击
{
delay_ms(20); //检测双击20*10=200ms
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)) //检测确实双击
{
a=1; //双击标注位
printf("B键双击 \r\n"); //执行双击后的程序放
OLED_DISPLAY_8x16_BUFFER(6,"KEY B two ");
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)); //等待KEYA释放退出
}
}
if(a==0) //判断单击
{
if(s==1)//判断是不是刚执行完滑动操作
{
s=0;//如果是则本次不执行单击处理(因为是滑动的放开操作)
}
else//如果不是,则正常执行单击处理
{
printf("B键单击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY B one ");
}
}
}
}a=0;c=0; //参数清0
}
}
//B按键判断在此结束
//C键开始检测
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))//C 键检测按键是否按下
{ delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))//再次检测按键是否按下
{ while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))&&c<KEYA_SPEED1)//是否按下和判断长短键
{
c++;
delay_ms(10); //长按判断的计时
}
if(c>=KEYA_SPEED1)//长键处理
{
k=tuch_c;
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
printf("C键长按 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY C long ");
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
}
else
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))
{
k++; //用于显示的计数值
printf("C键右滑 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY C to R ");
if(k>=d){k=0;}
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))
{
k--; //用于显示的计数值
if(k==0){k=d;}
printf("C键左滑 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY C to L ");
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
}
if(a==0)
{
for(b=0;b<KEYA_SPEED2;b++)//检测双击
{
delay_ms(20); //检测双击20*10=200ms
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)) //检测确实双击
{
a=1; //双击后执行的程序放到此处
printf("C键双击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY C two ");
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待KEYA释放退出
}
}
if(a==0) //判断单击
{
if(s==1)//判断是不是刚执行完滑动操作
{
s=0;//如果是则本次不执行单击处理(因为是滑动的放开操作)
}
else//如果不是,则正常执行单击处理
{
printf("C键单击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY C one ");
}
}
}
}a=0;c=0; //参数清0
}
}
//C按键判断在此结束
//D键开始检测
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))//D 键检测按键是否按下
{ delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))//再次检测按键是否按下
{
while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))&&c<KEYA_SPEED1)//是否按下和判断长短键
{
c++;
delay_ms(10); //长按判断的计时
}
if(c>=KEYA_SPEED1)//长键处理
{
k=tuch_d;
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
printf("D键长按 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY D long ");
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
}
else
{
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))
{
k--; //用于显示的计数值
if(k==0){k=d;}
FLASH_W(FLASH_START_ADDR,k); //从指定页的地址写入FLASH
printf("D键左滑 %d \r\n",k);
OLED_DISPLAY_8x16_BUFFER(6,"KEY D to L ");
OLED_DISPLAY_8x16(6,13*8,k/100+0x30);
OLED_DISPLAY_8x16(6,14*8,k%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,k%100%10+0x30);
a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
}
if(a==0)
{
for(b=0;b<KEYA_SPEED2;b++)//检测双击
{
delay_ms(20); //检测双击20*10=200ms
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)) //检测确实双击
{
a=1; //双击后执行的程序放到此处
// GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));//LED控制
printf("D键双击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY D two ");
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)); //等待KEYA释放退出
}
}
if(a==0) //判断单击
{
if(s==1)//判断是不是刚执行完滑动操作
{
s=0;//如果是则本次不执行单击处理(因为是滑动的放开操作)
}
else//如果不是,则正常执行单击处理
{
// GPIO_WriteBit(LEDPORT,LED1|LED2,(BitAction)(0));//LED控制
printf("D键单击 \r\n");
OLED_DISPLAY_8x16_BUFFER(6,"KEY D one ");
}
}
}
}a=0;c=0; //参数清0
}
}
//D按键判断在此结束
}
// FLASH_W(FLASH_START_ADDR,k);
TIM4_PWM_Init( 720,0);
TIM_SetCompare3(TIM4,k);
}
void TOUCH_KEY_ABCD(void)
{
u16 a=10;u16 b=50;u16 c=100;u16 d=140;
u16 pwmf=144;
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))//读触摸按键的电平
{
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))
{
{
OLED_DISPLAY_8x16_BUFFER(6," TOUCH_KEY_A "); //显示字符串
OLED_DISPLAY_8x16(6,13*8,a/100+0x30);
OLED_DISPLAY_8x16(6,14*8,a%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,a%100%10+0x30);
printf("STM32F103 TOUCH_KEY_A ");
TIM1_2PWM_Init( pwmf,0);
TIM_SetCompare1(TIM1,a);
TIM_SetCompare3(TIM1,a);
FLASH_W(FLASH_data2_ADDR,a);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)); //等待按键松开
}
}
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))//读触摸按键的电平
{
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))
{
{
OLED_DISPLAY_8x16_BUFFER(6," TOUCH_KEY_B "); //显示字符串
OLED_DISPLAY_8x16(6,13*8,b/100+0x30);
OLED_DISPLAY_8x16(6,14*8,b%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,b%100%10+0x30);
TIM1_2PWM_Init( pwmf,0);
TIM_SetCompare1(TIM1,b);
TIM_SetCompare3(TIM1,b);
printf("STM32F103 TOUCH_KEY_B ");
FLASH_W(FLASH_data2_ADDR,b);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)); //等待按键松开
}
}
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))
{
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))
{
{ //读触摸按键的电平
OLED_DISPLAY_8x16_BUFFER(6," TOUCH_KEY_C "); //显示字符串
printf("STM32F103 TOUCH_KEY_C ");
OLED_DISPLAY_8x16(6,13*8,c/100+0x30);
OLED_DISPLAY_8x16(6,14*8,c%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,c%100%10+0x30);
TIM1_2PWM_Init( pwmf,0);
TIM_SetCompare1(TIM1,c);
TIM_SetCompare3(TIM1,c);
FLASH_W(FLASH_data2_ADDR,c);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)); //等待按键松开
}
}
}
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))
{
delay_ms(20); //延时去抖动
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))
{ //读触摸按键的电平
OLED_DISPLAY_8x16_BUFFER(6," TOUCH_KEY_D "); //显示字符串
OLED_DISPLAY_8x16(6,13*8,d/100+0x30);
OLED_DISPLAY_8x16(6,14*8,d%100/10+0x30);
OLED_DISPLAY_8x16(6,15*8,d%100%10+0x30);
printf("STM32F103 TOUCH_KEY_D ");
TIM1_2PWM_Init( pwmf,0);
TIM_SetCompare1(TIM1,d);
TIM_SetCompare3(TIM1,d);
FLASH_W(FLASH_data2_ADDR,d);
while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)); //等待按键松开
}
}
}
|