3098545223 发表于 3 天前

触摸按键手摸和隔玻璃摸的阈值是不同的,又要兼容不同环境都能触发,是怎么调整阈值

触摸按键手摸和隔玻璃摸的阈值是不同的,又要兼容不同环境都能触发,是怎么调整阈值。代码用的官方提供的触摸代码例程

DebugLab 发表于 3 天前

出厂组装好不触摸上电校准一次存EEPROM
使用过程中每次上电都读取一次实际值,和出厂值比较,如果没有触摸,就用上电值代替出厂值(RAM中代替,EEPROM中的出厂值永不擦除)
上电过程中使用零点跟踪算法

3098545223 发表于 3 天前

DebugLab 发表于 2025-6-26 09:16
出厂组装好不触摸上电校准一次存EEPROM
使用过程中每次上电都读取一次实际值,和出厂值比较,如果没有触摸 ...

有代码参考嘛

DebugLab 发表于 3 天前

3098545223 发表于 2025-6-26 09:51
有代码参考嘛

触摸按键:

https://www.stcaimcu.com/data/download/Tools/%E8%A7%A6%E6%91%B8%E6%8C%89%E9%94%AE%E9%85%8D%E5%A5%97%E4%B8%8A%E4%BD%8D%E6%9C%BA%E6%B5%8B%E8%AF%95%E8%BD%AF%E4%BB%B6.zip

EEPROM:


#include "reg51.h"
#include "intrins.h"

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

sfr   IAP_DATA    =   0xC2;
sfr   IAP_ADDRH   =   0xC3;
sfr   IAP_ADDRL   =   0xC4;
sfr   IAP_CMD   =   0xC5;
sfr   IAP_TRIG    =   0xC6;
sfr   IAP_CONTR   =   0xC7;
sfr   IAP_TPS   =   0xF5;

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                              //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 1;                              //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                           //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 2;                              //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                           //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 3;                              //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    IapErase(0x0400);
    P0 = IapRead(0x0400);                     //P0=0xff
    IapProgram(0x0400, 0x12);
    P1 = IapRead(0x0400);                     //P1=0x12

    while (1);
}



页: [1]
查看完整版本: 触摸按键手摸和隔玻璃摸的阈值是不同的,又要兼容不同环境都能触发,是怎么调整阈值