用的FT62FCC单片机, 源码如下:
main函数部分:
while(1)
{
//清看门狗
//CLRWDT();
//按键扫描
static unsigned char last = 0, last_used = 0;
unsigned char cur = 0;
TSC_Scan();
if(TSC_DataProcessing()== 1) //返回1表示所有按键处理完成一次,请和TSC_Scan一起使用,否则影响扫描速度。
{
strongest = TSC_GetCsKey(); //返回当前按压信号最强的按键通道号;
single = TSC_GetLocalKey(); //返回当前按键按下的通道号
cur = single & 0xff;
if(cur > 0) {
if(cur != last) {
last = cur;
if ( cur & 0x0f ) //mode change
{
key_timer_cnt = KEY_TIMER_FUNC_DE;
}else {
if (cur & 0x10)
{
key_timer_cnt = KEY_TIMER_STEAM_DE;
}else {
key_timer_cnt = KEY_TIMER_POWER_DE;
}
}
}else {
if(key_timer_cnt == 0 && last_used != last) {
//process key
last_used = last;
key_process(cur);
}
}
}else {
last = 0;
last_used = 0;
}
}
///////////////////////////////////////////////////////////////////////////////
void key_process(unsigned char kk) {
UART_bag[3] &=0B11000000;
UART_bag[3] |= kk;
Send_Bag();
if(kk < 0x10) {
for(unsigned char i = 0; i < 4; i++) {
if(kk == (1 << (i))) {
led_switch(i+3);
break;
}
}
}
}
/////////////////////////////////////////
定时器部分
void interrupt ISR(void)
{
uint8_t i;
//定时器2的中断处理**********************
if(TMR2IE && TMR2IF) //100us中断一次 = 5KHz
{
TMR2IF = 0;
time_ms++;
if(time_ms>9)
{
if(key_timer_cnt) {
key_timer_cnt--;
}
这个程序在99%的情况下能正确识别触摸按键,偶尔会识别不到,表现为触摸卡死的状态,单片其它部分还在正常运行,比如串口收发
|
|