Giao tiếp GPIO STM8S (INPUT) - CONTROL STM8S WITH IAR COMPILER
Xin chào tất cả các bạn, ở bài viết trước mình đã hướng dẫn các bạn sử dụng trình biên dịch IAR để lập trình cho STM8S (STM8S103F3P6) sử dụng chức năng OUTPUT (GPIO) của STM8S để điều khiển nhấp nháy LED tại chân B5. Hôm nay, tiếp theo series tự học lập trình STM8S mình sẽ hướng dẫn các bạn sử dụng chức năng Input (GPIO) để đọc giá trị nút nhấn (dữ liệu) để phục vụ cho project của chúng ta. Nào bắt đầu thôi....
Đầu tiên, chúng ta sẽ xem lại nhưng hàm hỗ trợ cho chức năng INPUT(các bạn có thể xem lại ở bài viết trước của mình để hiểu cách dùng của những hàm này nhé):
Khai báo, cấu hình GPIO chức năng INPUT cho STM8S (đọc giá trị nút nhấn) => cấu hình GPIO chức năng OUTPUT cho STM8S (Điều khiển LED) => Tạo biến để lưu dữ liệu đọc từ nút nhấn => Đọc giá trị nút nhấn tại chân PD4 => Điều khiển LED.
Bước 1: Khai báo, cấu hình GPIO chức năng INPUT cho STM8S (đọc giá trị nút nhấn).
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT); // Khai báo chân PD4 là ngõ vào với chế độ điện trở kéo lên.
Bước 3: Tạo biến để lưu dữ liệu đọc từ nút nhấn.
trong hàm main() mình sẽ thêm dòng code: int data = 0; // Khởi tạo biến data có giá trị bằng 0 để lưu giá trị nút nhấn.
Bước 4: Đọc giá trị nút nhấn tại chân PD4
data = GPIO_ReadInputPin(GPIOD, GPIO_PIN_4); // vì chúng ta chỉ cần đọc giá trị tại 01 chân, nên chúng ta sử dụng hàm này.
Bước 5: Điều khiển LED
SCHEMATIC
Đầu tiên, chúng ta sẽ xem lại nhưng hàm hỗ trợ cho chức năng INPUT(các bạn có thể xem lại ở bài viết trước của mình để hiểu cách dùng của những hàm này nhé):
- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode);
- uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
- uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
- BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin);
Khai báo, cấu hình GPIO chức năng INPUT cho STM8S (đọc giá trị nút nhấn) => cấu hình GPIO chức năng OUTPUT cho STM8S (Điều khiển LED) => Tạo biến để lưu dữ liệu đọc từ nút nhấn => Đọc giá trị nút nhấn tại chân PD4 => Điều khiển LED.
Bước 1: Khai báo, cấu hình GPIO chức năng INPUT cho STM8S (đọc giá trị nút nhấn).
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT); // Khai báo chân PD4 là ngõ vào với chế độ điện trở kéo lên.
Bước 2: Cấu hình GPIO chức năng OUTPUT cho STM8S (Điều khiển LED)
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); // Khai báo chân PB5 là ngõ ra dùng để điều khiển LED.Bước 3: Tạo biến để lưu dữ liệu đọc từ nút nhấn.
trong hàm main() mình sẽ thêm dòng code: int data = 0; // Khởi tạo biến data có giá trị bằng 0 để lưu giá trị nút nhấn.
Bước 4: Đọc giá trị nút nhấn tại chân PD4
Bước 5: Điều khiển LED
GPIO_WriteLow(GPIOB, GPIO_PIN_5); // Nếu nhấn nút, thì giá trị đọc được sẽ là 0 => Bật LED.
GPIO_WriteHigh(GPIOB, GPIO_PIN_5); // Nếu không nhấn nút, thì giá trị đọc được sẽ là 1 => Tắt LED.
SCHEMATIC
![]() |
1. Sơ đồ nguyên lý khi sử dụng điện trở kéo lên |
![]() |
2. Sơ đồ nguyên lý khi không sử dụng điện trở kéo lên |
Tuỳ theo cấu hình trong code, thì chúng ta sẽ sử dụng những sơ đồ nguyên lý khác nhau (sử dụng điện trở kéo lên - không sử dụng điện trở kéo lên). Trong bài viết này, mình sẽ sử dụng điện trở kéo lên bằng cách sử dụng code và chọn sơ đồ 1.
LẬP TRÌNH
#include "stm8s.h"
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
int main( void )
{
int data = 0;
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);
while(1){
data = GPIO_ReadInputPin(GPIOD, GPIO_PIN_4);
if(data == 0){
GPIO_WriteLow(GPIOB, GPIO_PIN_5);
}else{
GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
}
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
int main( void )
{
int data = 0;
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);
while(1){
data = GPIO_ReadInputPin(GPIOD, GPIO_PIN_4);
if(data == 0){
GPIO_WriteLow(GPIOB, GPIO_PIN_5);
}else{
GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
}
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
Leave a Comment