找回密码
 立即注册
查看: 44|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-26 08:52:59
已绑定手机

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 昨天 09:11 | 显示全部楼层 |阅读模式
触摸按键手摸和隔玻璃摸的阈值是不同的,又要兼容不同环境都能触发,是怎么调整阈值。代码用的官方提供的触摸代码例程

原理图

原理图
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:479
  • 最近打卡:2025-06-27 05:45:51
已绑定手机

80

主题

5202

回帖

9277

积分

超级版主

DebugLab

积分
9277
发表于 昨天 09:16 | 显示全部楼层
出厂组装好不触摸上电校准一次存EEPROM
使用过程中每次上电都读取一次实际值,和出厂值比较,如果没有触摸,就用上电值代替出厂值(RAM中代替,EEPROM中的出厂值永不擦除)
上电过程中使用零点跟踪算法
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-26 08:52:59
已绑定手机

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 昨天 09:51 | 显示全部楼层
Debu*** 发表于 2025-6-26 09:16
出厂组装好不触摸上电校准一次存EEPROM
使用过程中每次上电都读取一次实际值,和出厂值比较,如果没有触摸 ...

有代码参考嘛

点评

触摸按键: 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: [attachimg]1  详情 回复 发表于 昨天 13:20
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:479
  • 最近打卡:2025-06-27 05:45:51
已绑定手机

80

主题

5202

回帖

9277

积分

超级版主

DebugLab

积分
9277
发表于 昨天 13:20 | 显示全部楼层

触摸按键:

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:
截图202506261319551393.jpg

  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sfr     P0M1    =   0x93;
  4. sfr     P0M0    =   0x94;
  5. sfr     P1M1    =   0x91;
  6. sfr     P1M0    =   0x92;
  7. sfr     P2M1    =   0x95;
  8. sfr     P2M0    =   0x96;
  9. sfr     P3M1    =   0xb1;
  10. sfr     P3M0    =   0xb2;
  11. sfr     P4M1    =   0xb3;
  12. sfr     P4M0    =   0xb4;
  13. sfr     P5M1    =   0xc9;
  14. sfr     P5M0    =   0xca;
  15. sfr     IAP_DATA    =   0xC2;
  16. sfr     IAP_ADDRH   =   0xC3;
  17. sfr     IAP_ADDRL   =   0xC4;
  18. sfr     IAP_CMD     =   0xC5;
  19. sfr     IAP_TRIG    =   0xC6;
  20. sfr     IAP_CONTR   =   0xC7;
  21. sfr     IAP_TPS     =   0xF5;
  22. void IapIdle()
  23. {
  24.     IAP_CONTR = 0;                              //关闭IAP功能
  25.     IAP_CMD = 0;                                //清除命令寄存器
  26.     IAP_TRIG = 0;                               //清除触发寄存器
  27.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  28.     IAP_ADDRL = 0;
  29. }
  30. char IapRead(int addr)
  31. {
  32.     char dat;
  33.     IAP_CONTR = 0x80;                           //使能IAP
  34.     IAP_TPS = 12;                               //设置等待参数12MHz
  35.     IAP_CMD = 1;                                //设置IAP读命令
  36.     IAP_ADDRL = addr;                           //设置IAP低地址
  37.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  38.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  39.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  40.     _nop_();
  41.     dat = IAP_DATA;                             //读IAP数据
  42.     IapIdle();                                  //关闭IAP功能
  43.     return dat;
  44. }
  45. void IapProgram(int addr, char dat)
  46. {
  47.     IAP_CONTR = 0x80;                           //使能IAP
  48.     IAP_TPS = 12;                               //设置等待参数12MHz
  49.     IAP_CMD = 2;                                //设置IAP写命令
  50.     IAP_ADDRL = addr;                           //设置IAP低地址
  51.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  52.     IAP_DATA = dat;                             //写IAP数据
  53.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  54.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  55.     _nop_();
  56.     IapIdle();                                  //关闭IAP功能
  57. }
  58. void IapErase(int addr)
  59. {
  60.     IAP_CONTR = 0x80;                           //使能IAP
  61.     IAP_TPS = 12;                               //设置等待参数12MHz
  62.     IAP_CMD = 3;                                //设置IAP擦除命令
  63.     IAP_ADDRL = addr;                           //设置IAP低地址
  64.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  65.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  66.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  67.     _nop_();                                    //
  68.     IapIdle();                                  //关闭IAP功能
  69. }
  70. void main()
  71. {
  72.     P0M0 = 0x00;
  73.     P0M1 = 0x00;
  74.     P1M0 = 0x00;
  75.     P1M1 = 0x00;
  76.     P2M0 = 0x00;
  77.     P2M1 = 0x00;
  78.     P3M0 = 0x00;
  79.     P3M1 = 0x00;
  80.     P4M0 = 0x00;
  81.     P4M1 = 0x00;
  82.     P5M0 = 0x00;
  83.     P5M1 = 0x00;
  84.     IapErase(0x0400);
  85.     P0 = IapRead(0x0400);                       //P0=0xff
  86.     IapProgram(0x0400, 0x12);
  87.     P1 = IapRead(0x0400);                       //P1=0x12
  88.     while (1);
  89. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-27 12:59 , Processed in 0.154259 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表