标题:
合泰触控BS83B08C按键,短按用解码方式已做好,如果长按改成持续电平方式如何实现?
[打印本页]
作者:
踮起脚摘苹果
时间:
2020-3-20 10:57
标题:
合泰触控BS83B08C按键,短按用解码方式已做好,如果长按改成持续电平方式如何实现?
本帖最后由 踮起脚摘苹果 于 2020-3-20 10:58 编辑
合泰触控BS83B08C,短按用编码方式,把编码发给STM32F103主控端去解码,主控端对短按按键的解码已经解好,比如合泰触控控制3个按键,KEY1的码值是0XCC => 1100 1100,KEY2的码值是0XBB=>1011 1011 ,KEY3的码值是0XAA=>1010 1010
现在单键长按10s,结果时间大概在长按5s左右松开手,主控端的计时变量仍然在计时,直到记到10s才结束。觉得这个问题并不是STM32F103主控端,而是在BS83B08C触控端,而且在示波器上面双键一前一后长按,只有先按下的那一路脉冲,后按下的脉冲没有;双键长按,示波器上两路波形都没有。现在合泰触控的程序短按保持编码方式,长按如何改成用持续高低电平方式触发?
#include <BS83B08C.H>
#include "USER_PROGRAM.H"
unsigned char child_start_tick = 0,hot_start_tick = 0,ColdStartTick = 0;
unsigned char child_end_tick = 0,hot_end_tick = 0,ColdEndTick = 0;
static unsigned char child_pulse_flag = 0,hot_pulse_flag = 0,ColdPulseFlag = 0;
static unsigned char child_start_flag = 1,hot_start_flag = 1,ColdStartFlag = 1;
static unsigned char child_end_flag = 0,hot_end_flag = 0,ColdEndFlag = 0;
static unsigned char reset_flag = 0;
//延时函数
void delay_ms(int times)
{
int i,j;
for(j=times;j>0;j--)
{
for(i=1000;i>0;i--);
}
}
typedef union BYTEBITSDEF
{
unsigned char uc;
struct
{
unsigned char BIT0:1;
unsigned char BIT1:1;
unsigned char BIT2:1;
unsigned char BIT3:1;
unsigned char BIT4:1;
unsigned char BIT5:1;
unsigned char BIT6:1;
unsigned char BIT7:1;
} b;
} TYPEBYTEBITS;
TYPEBYTEBITS key_max[2];
bit b_ptm_timer_1ms ;
//增加按键灯闪烁的标志位
//增加对按键灯延时函数
unsigned char ChildKeyLEDCount = 0,HotKeyLEDCount = 0,ColdKeyLEDCount = 0;
bit ChildKeyPressFlag;
bit HotKeyPressFlag;
bit ColdKeyPressFlag;
bit ChildKeyOnFlag;
bit HotKeyOnFlag;
bit ColdKeyOnFlag;
//==============================================
//**********************************************
//==============================================
DEFINE_ISR (Interrupt_Extemal, 0x04)
{
GCC_NOP();
}
//==============================================
//**********************************************
//==============================================
DEFINE_ISR(Interrupt_ptm_timer, 0x0c)
{
_ptmaf = 0 ;
b_ptm_timer_1ms = 1 ;
if(child_pulse_flag)
{
child_start_tick++;
}
else if(child_end_flag)
{
child_end_tick++;
}
if(hot_pulse_flag)
{
hot_start_tick++;
}
else if(hot_end_flag)
{
hot_end_tick++;
}
if(ColdPulseFlag)
{
ColdStartTick++;
}
else if(ColdEndFlag)
{
ColdEndTick++;
}
if(reset_flag)
{
switch(child_start_tick)
{
case 1:
case 2:
case 3:
case 4:
case 5:
_pa3 = 0;
break;
case 6:
_pa3 = 1;
break;
case 7:
_pa3 = 0;//start
break;
case 8:
_pa3 = 1;
break;
case 9:
case 10:
_pa3 = 0;
break;
case 11:
_pa3 = 1;
break;
case 12:
_pa3 = 0;
break;
case 13:
_pa3 = 1;
break;
case 14:
case 15:
_pa3 = 0;
break;
case 16:
_pa3 = 1;
break;
case 17:
_pa3 = 0;
break;
case 18:
_pa3 = 1;
break;
case 19:
case 20:
_pa3 = 0;
break;
case 21:
_pa3 = 1;
break;
case 22:
_pa3 = 0;
break;
case 23:
_pa3 = 1;
break;
case 24:
case 25:
_pa3 = 0;//end
break;
case 26:
_pa3 = 1;
child_pulse_flag = 0;
child_start_flag = 0;
child_start_tick = 0;
reset_flag = 0;
break;
default:
break;
}
}
else
{
switch(child_start_tick)//1个case 为1ms
{
case 1:
case 2:
case 3:
case 4:
case 5:
_pa3 = 0;
break;
case 6:
_pa3 = 1;
break;
case 7:
case 8:
_pa3 = 0;//start
break;
case 9:
_pa3 = 1;
break;
case 10:
_pa3 = 0;
break;
case 11:
_pa3 = 1;
break;
case 12:
case 13:
_pa3 = 0;
break;
case 14:
_pa3 = 1;
break;
case 15:
_pa3 = 0;
break;
case 16:
_pa3 = 1;
break;
case 17:
case 18:
_pa3 = 0;
break;
case 19:
_pa3 = 1;
break;
case 20:
_pa3 = 0;
break;
case 21:
_pa3 = 1;
break;
case 22:
case 23:
_pa3 = 0;
break;
case 24:
_pa3 = 1;
break;
case 25:
_pa3 = 0;//end
break;
case 26:
_pa3 = 1;
child_pulse_flag = 0;
child_start_flag = 0;
child_start_tick = 0;
break;
default:
break;
}
}
if(child_start_tick == 0)
{
if(child_end_flag == 1)
{
if(child_end_tick < 10)
{
_pa3 = 0;
}
else if(child_end_tick >= 10)
{
_pa3 = 1;
child_end_flag = 0;
child_end_tick = 0;
}
}
}
switch(hot_start_tick)
{
case 1:
case 2:
case 3:
case 4:
case 5:
_pa4 = 0;
break;
case 6:
_pa4 = 1;
break;
case 7:
case 8:
_pa4 = 0;//start
break;
case 9:
_pa4 = 1;
break;
case 10:
_pa4 = 0;
break;
case 11:
_pa4 = 1;
break;
case 12:
case 13:
_pa4 = 0;
break;
case 14:
_pa4 = 1;
break;
case 15:
case 16:
_pa4 = 0;
break;
case 17:
_pa4 = 1;
break;
case 18:
case 19:
_pa4 = 0;
break;
case 20:
_pa4 = 1;
break;
case 21:
_pa4 = 0;
break;
case 22:
_pa4 = 1;
break;
case 23:
case 24:
_pa4 = 0;
break;
case 25:
_pa4 = 1;
break;
case 26:
case 27:
_pa4 = 0;//end
break;
case 28:
_pa4 = 1;
hot_pulse_flag = 0;
hot_start_flag = 0;
hot_start_tick = 0;
break;
default:
break;
}
if(hot_start_tick == 0)
{
if(hot_end_flag == 1)
{
if(hot_end_tick < 10)
{
_pa4 = 0;
}
else if(hot_end_tick >= 10)
{
_pa4 = 1;
hot_end_flag = 0;
hot_end_tick = 0;
}
}
}
switch(ColdStartTick)
{
case 1:
case 2:
case 3:
case 4:
case 5:
_pa1 = 0;
break;
case 6:
_pa1 = 1;
break;
case 7:
case 8:
_pa1 = 0;//start
break;
case 9:
_pa1 = 1;
break;
case 10:
case 11:
_pa1 = 0;
break;
case 12:
_pa1 = 1;
break;
case 13:
_pa1 = 0;
break;
case 14:
_pa1 = 1;
break;
case 15:
_pa1 = 0;
break;
case 16:
_pa1 = 1;
break;
case 17:
case 18:
_pa1 = 0;
break;
case 19:
_pa1 = 1;
break;
case 20:
case 21:
_pa1 = 0;
break;
case 22:
_pa1 = 1;
break;
case 23:
_pa1 = 0;
break;
case 24:
_pa1 = 1;
break;
case 25:
_pa1 = 0;//end
break;
case 26:
_pa1 = 1;
ColdPulseFlag = 0;
ColdStartFlag = 0;
ColdStartTick = 0;
break;
default:
break;
}
if(ColdStartTick == 0)
{
if(ColdEndFlag == 1)
{
if(ColdEndTick < 10)
{
_pa1 = 0;
}
else if(ColdEndTick >= 10)
{
_pa1 = 1;
ColdEndFlag = 0;
ColdEndTick = 0;
}
}
}
}
//==============================================
//**********************************************
//==============================================
void USER_PROGRAM_INITIAL()
{
_lvrc = 0b01010101;
_pawu = 0x00 ;
_papu = 0x00 ;
_pac = 0x00 ;
_pa = 0x000 ;
_pxrm = 0x00 ;
_pb = 0x88;//1000 1000 ,PB3和PB7输出高接到主控板上面 PB3 -> COLD_WATER_DET PB7-> NORMAL_WATER_DET
_pbpu = 0x00;//合泰输入或者是输出模式
_pbc = 0x00;//GPIOB为输出模式
_ptmc0 = 0b00101000 ;
_ptmc1 = 0b11000001 ;
_ptmrpl= 0x00 ;
_ptmrph= 0x00 ;
_ptmal = 244 ; //timer_over=(1*256+244)/(8mhz/16)=1000us=1ms
_ptmah = 1;
_mfe = 1 ;
_ptmae = 1 ;
_emi = 1 ;
_pa1 = 1; //COLD_KEY
_pa4 = 1; //HOT_KEY
_pa3 = 1; //CHILD_KEY
_pb4 = 0;//Cold key LED1 on "0"点亮 "1"熄灭
_pb5 = 0;//Hot key LED2 on "0"点亮 "1"熄灭
_pb6 = 0;//Child key LED3 on "0"点亮 "1"熄灭
}
//==============================================
//**********************************************
//==============================================
void USER_PROGRAM()
{
if(!TKS_ACTIVEF) return;
if(!SCAN_CYCLEF) return;
GET_KEY_BITMAP();
key_max[0].uc=DATA_BUF[0];
DATA_BUF[3]=0;
if(key_max[0].b.BIT0) DATA_BUF[3]++;
if(key_max[0].b.BIT1) DATA_BUF[3]++;
if(key_max[0].b.BIT2) DATA_BUF[3]++;
if(key_max[0].b.BIT3) DATA_BUF[3]++;
if(key_max[0].b.BIT4) DATA_BUF[3]++;
if(key_max[0].b.BIT5) DATA_BUF[3]++;
if(key_max[0].b.BIT6) DATA_BUF[3]++;
if(key_max[0].b.BIT7) DATA_BUF[3]++;
if(DATA_BUF[3]>2)
{
DATA_BUF[3] = 0 ;
key_max[0].uc=0;
LIBRARY_RESET();
return;
}
//调用ANY_KEY_PRESS函数
if(ANY_KEY_PRESSF)
{
if(key_max[0].uc == 0x03)
{
if(child_start_flag)
{
child_pulse_flag = 1;
child_start_flag = 0;
reset_flag = 1;
}
return;
}
reset_flag = 0;
if(key_max[0].uc == 0x01)
{
if(ColdStartFlag)//冷水键按下
{
ColdPulseFlag = 1;
ColdStartFlag = 0;
ColdKeyPressFlag = 1;
//_pb4 = 0;//Cold key LED on
}
}
//CHILD_KEY
if(key_max[0].uc ==0x04)
{
if(child_start_flag)
{
child_pulse_flag = 1;
child_start_flag = 0;
ChildKeyPressFlag = 1;
//_pb6 = 0;//Child key LED on
}
}
if(key_max[0].uc == 0x02)
{
if(hot_start_flag)
{
hot_pulse_flag = 1;
hot_start_flag = 0;
HotKeyPressFlag = 1;
//_pb5 = 0;//Hot key LED on
}
}
}
else
{
if(ColdKeyPressFlag)
{
if(ColdKeyOnFlag)
{
ColdKeyLEDCount++;
if(ColdKeyLEDCount >= 20)//计数20次,合泰SCAN_CYCLEF计一次10ms,共200ms
{
_pb4 = 0;//Cold key LED on
ColdKeyLEDCount = 0;
ColdKeyPressFlag = 0;
ColdKeyOnFlag = 0;
}
}
else
{
ColdKeyLEDCount++;
if(ColdKeyLEDCount >= 20)
{
_pb4 = 1;//Cold key LED off
ColdKeyOnFlag = 1;
ColdKeyLEDCount = 0;
}
}
}
else
{
if(!ColdStartFlag)
{
ColdEndFlag = 1;
}
ColdStartFlag = 1;
}
if(ChildKeyPressFlag)
{
if(ChildKeyOnFlag)
{
ChildKeyLEDCount++;
if(ChildKeyLEDCount >= 20)//计数20次,合泰SCAN_CYCLEF计一次10ms
{
_pb6 = 0;//Child key LED on
ChildKeyLEDCount = 0;
ChildKeyPressFlag = 0;
ChildKeyOnFlag = 0;
}
}
else
{
ChildKeyLEDCount++;
if(ChildKeyLEDCount >= 20)
{
_pb6 = 1;//Child key LED off
ChildKeyOnFlag = 1;
ChildKeyLEDCount = 0;
}
}
}
else
{
if(!child_start_flag)
{
child_end_flag = 1;
}
child_start_flag = 1;
}
if(HotKeyPressFlag)
{
if(HotKeyOnFlag)
{
HotKeyLEDCount++;
if(HotKeyLEDCount >= 20)//计数20次,合泰SCAN_CYCLEF计一次10ms
{
_pb5 = 0;//Hot key LED on
HotKeyLEDCount = 0;
HotKeyPressFlag = 0;
HotKeyOnFlag = 0;
}
}
else
{
HotKeyLEDCount++;
if(HotKeyLEDCount >= 20)
{
_pb5 = 1;//Hot key LED off
HotKeyOnFlag = 1;
HotKeyLEDCount = 0;
}
}
}
else
{
if(!hot_start_flag)
{
hot_end_flag = 1;
}
hot_start_flag = 1;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1