qiu_ 发表于 2024-4-25 16:47:38

求助,为什么,我串口输出按键值和零点值都是0



#include "main.h"
sbit LED_W = P3^3;
sbit LED_R = P3^4;
sbit BEE = P5^4;
unsigned int sys_tick=0;
unsigned int t0_count=0;
unsigned int t1_count=0;
unsigned int t2_count=0;
volatile bit busy;
unsigned char buffer;

u16      xdata TK_cnt;      // 按键计数值, 16位
u16      xdata TK_zero;      // 按键0点值, 16位
bit      KeyState;                        // 按键状态, 每个bit对应一个键, 1为按下, 0为释放
u8      read_cnt;                        // 读次数
bit      B_TK_Lowpass;                // 低通允许, 1允许, 0禁止

u8      cmd;      //串口命令
u8      T_KEY_FLAG = 0;      // 串口发送忙标志

u16 code T_KeyPress=1300;      //触摸后的变化值
u16 code T_KeyState=0x0001;      //16个键对应的状态, 0为未触摸,1为触摸



/***********************************************************
* @brief串口1中断函数,串口1用于调试
* @return Null
***********************************************************/
void UartIsr() interrupt 4
{
    if (TI){
      TI = 0;
      busy = 0;
    }
    if (RI){
      RI = 0;
//      buffer= SBUF;
    }
}

//========================================================================
// 函数: void      TKSU_ISR(void) interrupt TKSU_VECTOR
// 描述: 触摸按键中断服务函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2023-10-11
// 备注:
u8      isr_index;

void      AUXR_ISR(void) interrupt 13
{
      u8 j;
      j=TSSTA2;

      if(j & 0x40)      //数据溢出, 错误处理(略)
      {
                TSSTA2 |= 0x40;      //写1清零
                T_KEY_FLAG |= 2;
      }
      else T_KEY_FLAG &= ~0x02;
      
      if(j & 0x80)      //扫描完成
      {
                TK_cnt = TSDAT;      //保存通道的读数      1.1us @24MHz               

                TSSTA2 |= 0x80;      //写1清零
                T_KEY_FLAG |= 0x08;
               
                LED_W = 0;//开灯
      }
      else {T_KEY_FLAG &= ~0x08;LED_W = 1;}
}

void main()
{
      P_SW2 |= 0x80;      //允许访问XSF(特殊功能寄存器)               
      P3n_push_pull(0x18);      //P3.3~P3.4线设置为推挽输出
      P5n_push_pull(0x10);      //P5.4线设置为推挽输出
      P1n_pure_input(0x01);      //P1.0 Touch Key设置为高阻
      
      Timer_Init();
      
      
      TSCHEN1 = 0x01;      //TK00~TK07      
      TSCHEN2 = 0x00;      //TK00~TK07               
      TSRT = 0x00;                //没有LED分时扫描      

      TSCFG1= (3<<4) + 3;      //开关电容工作频率 = fosc/(2*(TSCFG1+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
      TSCFG2= 1;//配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)1(1/2)2(5/8)3(3/4)
      TSCTRL = 0x80;      //开始自动扫描, 无平均, B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
//      TSTH00H = 0xff;

      IE2 |= 0x80;                        //使能触摸中断      
      delay_ms(50);                //延时一下
      
//      key_init();
      EA = 1;          //开总中断
//    P_SW2 = 0x00;                   //这个一定要关掉不了会导致程序不能运行      
      
      B_TK_Lowpass = 0;      //禁止低通滤波      
      BEE = 0;      
      for(read_cnt=0; read_cnt<5; read_cnt++)      //扫描10次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
      {
      //      TSCTRL = (1<<7) + (1<<6) +3;      //开始扫描, 4次平均
                TSCTRL = (1<<7) + (1<<6);                //开始扫描, 无平均
                delay_ms(50);      //延时一下, 等待扫描完成
      }
      TK_zero= TK_cnt;      //保存0点
      B_TK_Lowpass = 1;      //允许低通滤波
      KeyState = 0;
      read_cnt = 0;      
      printf("零点值:%u\n",TK_zero);      
      TSCTRL = 1<<7;                //开始扫描, 无平均      
      while(1)
      {
                delay_ms(500);                //延时一下, 根据实际扫描速度调整
                printf("按键值:%u\n",TSDAT);               
                printf("按键值:%u\n",TK_cnt);

                if(T_KEY_FLAG & 0x02)printf("数据溢出\n");      
                if(T_KEY_FLAG & 0x08)printf("扫描完成\n");                     
      
      }
}

梁工 发表于 2024-5-6 11:37:57

请参考我的例程测试。触摸按键读数基本不会为0,读数为0可能你根本没有启动触摸按键。请参考我的例子进行测试。
页: [1]
查看完整版本: 求助,为什么,我串口输出按键值和零点值都是0