Cái này là em dùng code của bạn Nghiem Hiep, em đang cần dùng là nút bấm với chức năng bấm-thả và bấm giữ..Nhưng mà cái code của em hình như hơi có vấn đề..Mọi người giúp em với ạ
1. Khi vào chức năng bấm-giữ thì nó chạy chức năng bấm-thả trước
Led đỏ sáng trước rồi Led xanh mới sáng trong khi em muốn là nó chỉ sáng led xanh thôi
2. cái touch_count em phải để cái giá trị gần nhau nó mới nhận
VD: touch_count<100 (push) với touch_count>100 (hold) chứ nếu để touch_count>200 (hold) thì không được
3. Cái này hỏi bạn Nghiem Hiep là nếu mình chuyển qua SMCLK thì nên chỉnh lại cái nào? Vì khi chuyển qua thì giá trị nó giảm đi 1 nửa ở Count_Edge/Default. touch_count sẽ đọc giá trị gì? vì trong code chỉ thấy lúc gán và lúc debug chỉ thấy touch_count tất cả là dấu "." không à :(..
Help me please :(
1. Khi vào chức năng bấm-giữ thì nó chạy chức năng bấm-thả trước
Led đỏ sáng trước rồi Led xanh mới sáng trong khi em muốn là nó chỉ sáng led xanh thôi
2. cái touch_count em phải để cái giá trị gần nhau nó mới nhận
VD: touch_count<100 (push) với touch_count>100 (hold) chứ nếu để touch_count>200 (hold) thì không được
3. Cái này hỏi bạn Nghiem Hiep là nếu mình chuyển qua SMCLK thì nên chỉnh lại cái nào? Vì khi chuyển qua thì giá trị nó giảm đi 1 nửa ở Count_Edge/Default. touch_count sẽ đọc giá trị gì? vì trong code chỉ thấy lúc gán và lúc debug chỉ thấy touch_count tất cả là dấu "." không à :(..
Help me please :(
Code:
#include <msp430g2553.h>
int count_default[3], count_edge[3];
char touch_count[3], j, i;
const char sensivity = 20; //Threshold
void push()
{
P1OUT = BIT0;
}
void hold()
{
P1OUT = BIT6;
}
void Init(void) //OK in main
{
P1DIR |= 0xff;
P2DIR |= 0xff;
P2SEL &= ~(BIT3 + BIT4 + BIT5); // Pin-Osc: PxSEL.x = 0; PxSEL2.x = 1;
P2OUT &= ~(BIT3 + BIT4 + BIT5);
//Config timer A
TA0CTL = TASSEL_3+MC_2; // TACLK, cont mode
TA0CCTL1 = CM_3+CCIS_3+CAP; // Pos&Neg,GND,Cap
}
void Get_info(void)
{
for (j = 0; j < 3; j++)
{
P2SEL2 &= ~(BIT3 + BIT4 + BIT5);
P2SEL2 |= 0x08 << j; // Mask from SW1 to SW3
TA0CTL |= TACLR; // Clear Timer_A TAR
_delay_cycles(500); // Delay to count
TA0CCTL1 ^= CCIS0; // Create SW capture of CCR1 (CCIxA)
count_edge[j] = TACCR1; // Save result
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //Stop Watchdog Timer
Init(); //
//10 measurements
for (i = 0; i < 10; i++)
{
Get_info();
for (j = 0; j < 3; j++)
count_default[j] = (count_default[j] + count_edge[j]) /2;
}
while (1)
{
Get_info();
P1OUT &= ~(BIT0 + BIT6);
for (i = 0; i < 3; i++)
{
if ((count_edge[i] + sensivity)< count_default[i])
{
if (touch_count[i] > 0)
touch_count[i]++;
}
else
{
touch_count[i] = 1;
}
if ((touch_count[0] > 100) && (touch_count[0] < 200))
{
push();
}
if (touch_count[0] > 200)
{
hold();
}
}
}
}