This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我有一个具有 Captouch 的 msp430G2553微控制器。
如果我按下 Captouch 上的中央按钮、LED 应亮起。
下面是介绍:
使用2个阈值、并跟踪最新按钮状态。 如果当前未按下按钮、则将最新样本与"较低"阈值进行比较。 如果低于该值、则将按钮状态更改为"pressed"(已按下)。 如果最新按钮状态为"pressed"、则将最新样本与"更高"的阈值进行比较。 如果高于此值、则将按钮状态更改为"未按下"。 这可以有效地为您提供"噪声容限"。 基本上会忽略介于2个阈值之间的任何样本-这些样本将是在按下按钮中途传入的样本。
每次按下按钮时、LED 应切换。 您将需要一个 SW 去抖机制。
我得到了我的 BASE_LINE 地址、它是0xD3。 此外、当我不触摸 PAD 时、它会为我提供0xD0。 当我触摸垫时、它会为我提供 C0。
我知道我需要从基线减去4和10来设置两个阈值。
但是、我很难表达汇编代码。
请帮帮我。
;------------------------------------------------------------------
;与 TI Code Composer Studio 一起使用的 MSP430汇编器代码模板
;当电容式触控传感器上的"键"居中时,切换中心 LED
;“已按下”
;------------------------------------------------------------------
cdecls C、list、"msp430.h";包含器件头文件
SWDELAY .equ 0x0006;SW 定时器使用的延迟值
;------------------------------------------------------------------
;为基线测量分配2个字节
;------------------------------------------------------------------
.data
.bss meas 基础,2;
;------------------------------------------------------------------
;为最新的测量分配另外2个字节
;------------------------------------------------------------------
.bss meas _latest,2;
;------------------------------------------------------------------
.text;汇编到程序存储器中
.retain;覆盖 ELF 条件链接
;并保留当前部分
.retainrefs;另外保留任何段
;具有电流基准
;部分
;------------------------------------------------------------------
重置 mov.w #_stack_end、SP;初始化 stackpointer
StopWDT mov.w #WDTPW|WDTHOLD、&WDTCTL;停止看门狗计时器
;------------------------------------------------------------------
;从此处开始的主循环
;------------------------------------------------------------------
;设置 P1.0以驱动中心 LED
;------------------------------------------------------------------
BIS.b #0xff、&P1DIR;将 P1设置为输出
BIC.b #0xff、&P1OUT;P1输出0
;------------------------------------------------------------------
;将 P2.5设置为引脚振荡模式
;------------------------------------------------------------------
BIC.b #BIT5、&P2DIR;P2.5输入
BIC.b #BIT4、P2SEL;
BIS.b #BIT5,和 P2SEL2;
;------------------------------------------------------------------
;P2.5的振荡驱动 TA0的 INCLK 输入
;此时钟源没有分频
;------------------------------------------------------------------
MOV #tassel_3,&TA0CTL;
;------------------------------------------------------------------
;设置为在上升沿或下降沿捕捉 TAR 的值
;使用基于软件的触发器
;------------------------------------------------------------------
MOV #CM_3 + CCIS_2 + CAP,&TA0CCTL1;
;------------------------------------------------------------------
;获取基线读数
;------------------------------------------------------------------
;清除 TAR 并在连续模式中启动 TA0;使用 BIS 而不是 MOV
;这样您就不会取消以前的设置
;------------------------------------------------------------------
BIS #MC_2 + TACLR,&TA0CTL;
;------------------------------------------------------------------
;调用 SW 延迟例程,此处用于提供累积
; period;可以使用从 VLO 馈送的 ACLK
;------------------------------------------------------------------
调用#SWtimer;
;------------------------------------------------------------------
;现在,在累积周期结束后,生成基于 SW 的软件
;通过切换 CCIS0来捕获触发器
;------------------------------------------------------------------
XOR #CCIS0、&TA0CCTL1;
;------------------------------------------------------------------
;将捕获的基线值保存在 meas 基础中
;------------------------------------------------------------------
MOV TA0CCR1,meas 基础;请注意符号 AM 的使用
BIC #MC1+MC0、&TA0CTL;停止 TA
SUB #2,meas _BASE;调整基线
;------------------------------------------------------------------
;从这里反复检查传感器的状态
;如果它被"按下",即 meas _latest =/= meas _BASE,则切换中央 LED
;------------------------------------------------------------------
CheckAgain bis #TACLR,&TA0CTL;清除 TAR
BIS #MC_2,&TA0CTL;连续模式
调用#SWtimer;
XOR #CCIS0、&TA0CCTL1;
MOV TA0CCR1,meas 最新;
BIC #MC1+MC0、&TA0CTL;
CMP meas 最新,meas 基础;
Jeq NoKey;
XOR #1、P1OUT;如果按键"按下"、则切换中心 LED
NoKey nop;在这里可以做很多有用的事情
;在这里为键“未按下”执行操作
JMP CheckAgain;
;------------------------------------------------------------------
SWTIMER:MOV #SWDELAY、R6;R5中的负载延迟值
Reloadr5 mov #SWdelay、R5;R6中的负载延迟值
ISr50解码 R5;保留此 PW 一段时间
jnz ISr50;总 SW 延迟计数为
DEC R6;= SWdelay * SWdelay
jnz Reloadr5;
RET;从此子例程返回
;------------------------------------------------------------------
;堆栈指针定义
;------------------------------------------------------------------
.global __stack_end
.sect .stack
;------------------------------------------------------------------
;中断矢量
;------------------------------------------------------------------
.sect ".reset";MSP430复位矢量
短路复位
您好!
这是重复的帖子。 回答了另一个问题。 将关闭这个。