Chia sẻ STM32_Study: #03-KeyScan module

#1
"KeyScan" module là module giúp chúng ta làm việc với các nút nhấn. Version của module này chỉ tập trung vào cách quét phím chống rung, không phải cách quét phím dùng Interrupt.
  • Xét ví dụ sau:
Cho 4 nút nhấn và 4 led. Hãy viết chương trình quét phím sao cho:
1. Nhấn “BUTTON_1” thì 4 led lần lượt sáng từ led 1 đến 4 chu kỳ 300ms.
2. Nhấn “BUTTON_2” thì 4 led lần lượt sáng từ led 4 đến 1 chu kỳ 300ms.
3. Nhấn “BUTTON_3” thì 4 led chớp tắt chu kỳ 300ms.
4. Nhấn và giữ “BUTTON_4” suốt 3 giây thì 4 led đều sáng. Nhấn và giữ “BUTTON_4” suốt 3 giây thì 4 led đều tắt. Và cứ thế tiếp tục.

P1.png

1. Sơ lược
Ta đã có module “LED” và module “SysTick”, trong bài này ta sẽ làm thêm module “KeyScan” bằng phương pháp scan (quét phím). Cũng giống như module “LED”, module “KeyScan” cũng chỉ dựa vào GPIO thông thường, cho nên cách cấu hình cũng tương tự như module “LED”, chỉ khác ở chỗ ta cấu hình cho Button là ngõ vào.

P2.png


Tại sao ngõ vào Digital Input ta lại cấu hình là GPIO_Mode_IN_FLOATING nhỉ :-<. Thật ra với Digital Input, STM32 cho ta 3 cách cấu hình tùy theo cách ta thiết kế hardware. Đây là sơ đồ khối của GPIO, được diễn tả bằng C code:

P3.png


1. Nếu sử dụng điện trở nội kéo lên VDD, ta khai báo là GPIO_Mode_IPU và khi đọc về thì key được nhấn tương ứng với mức 0.
2. Nếu sử dụng điện trở nội kéo xuống VSS, ta khai báo là GPIO_Mode_IPD và khi đọc về thì key được nhấn tương ứng với mức 1.
3. Nếu không sử dụng điện trở nội, mà sử dụng điện trở bên ngoài kéo lên VCC thì ta khai báo là GPIO_Mode_IN_FLOATING (thả nổi). Khi đó key được nhấn tương ứng với mức 0.
Như vậy ở cách thiết kế theo schematic đầu bài thì ta chọn mẫu 3 GPIO_Mode_IN_FLOATING (thả nổi).

Cách cấu hình và kiểm tra phím nhấn như sau:
P4.png


2. KeyScan module
KeyScan” module dùng để đọc phím nhấn bằng phương pháp quét phím chống rung. Giải thuật cũng không có gì đặc biệt, ta đọc giá trị của phím sau mỗi 10ms. Sau 10 lần đọc, nếu có khoảng 8 (80%) lần phím nhấn thì ta kết luận phím đó được nhấn.
P5.png


Sử dụng “KeyScan” module
File "KeyScan.h" dùng để configure các chân làm Input. Xem lại schematic đầu trang nhé. Như vậy nếu ứng dụng cho các project khác thì các bạn phải khai báo lại các thông số này theo schematic.

P6.png

2a. Khởi tạo module:
Giả sử main.c sử dụng KeyScan module, ta phải include "KeyScan.h". Và sau đó khởi tạo module
Mã:
int main(void)
{
  …
  /* Configure KeyScan module */
  KeyScan_Configuration();
}
Sau khi khởi tạo xong, ta luôn gọi hàm "KeyScan_Scanning()" trong while(1). Và sau đó liên tục kiểm tra xem có phím nào được nhận hay chưa?
Cách làm như sau:

P8.png


3. Ứng dụng giải ví dụ đầu trang
ta thấy với ví dụ đã đưa ra có nhắc đến "chu kỳ 300ms". Khoảng chu kỳ này chúng ta đã implement trong module "SysTick" trước đó, giờ ta chỉ lấy ra dùng lại mà thôi:
Mã:
if (isTimeoutStart == FALSE)
{
  isTimeoutStart = TRUE;
  SysTick_StartTimeout(TIMER_PERIOD); //Khởi tạo 1 lần đầu
}
/* Checking timeout flag and do action */
if (SysTick_IsReachTimeout())
{
  /* action with leds base on key is pressed ...*/
  ...
  /* After done, reset this isTimeoutStart  for next timeout*/
  isTimeoutStart = FALSE;
}
Với ví dụ này, ta có thể chia làm 2 phần:
  1. Phần 1 quét phím
  2. Phần 2: thao tác với LEDs tùy thuộc phím đã nhấn.
P9.png

Okie, đến đây mình xin kết thúc phần module "KeyScan". Các bạn có thể down project về và tham khảo thêm code cho rõ.
Thân chào tạm biệt :D
 

Đính kèm

Quảng cáo Google