標(biāo)題:
合泰觸控BS83B08C按鍵,短按用解碼方式已做好,如果長(zhǎng)按改成持續(xù)電平方式如何實(shí)現(xiàn)?
[打印本頁]
作者:
踮起腳摘蘋果
時(shí)間:
2020-3-20 10:57
標(biāo)題:
合泰觸控BS83B08C按鍵,短按用解碼方式已做好,如果長(zhǎng)按改成持續(xù)電平方式如何實(shí)現(xiàn)?
本帖最后由 踮起腳摘蘋果 于 2020-3-20 10:58 編輯
合泰觸控BS83B08C,短按用編碼方式,把編碼發(fā)給STM32F103主控端去解碼,主控端對(duì)短按按鍵的解碼已經(jīng)解好,比如合泰觸控控制3個(gè)按鍵,KEY1的碼值是0XCC => 1100 1100,KEY2的碼值是0XBB=>1011 1011 ,KEY3的碼值是0XAA=>1010 1010
現(xiàn)在單鍵長(zhǎng)按10s,結(jié)果時(shí)間大概在長(zhǎng)按5s左右松開手,主控端的計(jì)時(shí)變量仍然在計(jì)時(shí),直到記到10s才結(jié)束。覺得這個(gè)問題并不是STM32F103主控端,而是在BS83B08C觸控端,而且在示波器上面雙鍵一前一后長(zhǎng)按,只有先按下的那一路脈沖,后按下的脈沖沒有;雙鍵長(zhǎng)按,示波器上兩路波形都沒有,F(xiàn)在合泰觸控的程序短按保持編碼方式,長(zhǎng)按如何改成用持續(xù)高低電平方式觸發(fā)?
#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;
//延時(shí)函數(shù)
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 ;
//增加按鍵燈閃爍的標(biāo)志位
//增加對(duì)按鍵燈延時(shí)函數(shù)
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個(gè)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"點(diǎn)亮 "1"熄滅
_pb5 = 0;//Hot key LED2 on "0"點(diǎn)亮 "1"熄滅
_pb6 = 0;//Child key LED3 on "0"點(diǎn)亮 "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;
}
//調(diào)用ANY_KEY_PRESS函數(shù)
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)//計(jì)數(shù)20次,合泰SCAN_CYCLEF計(jì)一次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)//計(jì)數(shù)20次,合泰SCAN_CYCLEF計(jì)一次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)//計(jì)數(shù)20次,合泰SCAN_CYCLEF計(jì)一次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;
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1