You are on page 1of 4

THỰC HÀNH VI ĐIỀU KHIỂN

BÀI 3: GPIO - LCD


BÁO CÁO THỰC HÀNH
Bài 1: Đếm số lần nhấn nút SW1 sử dụng LCD 16x2 để hiển thị
int main(void) {
uint16_t a = 0; // Khai báo biến a kiểu uint16_t (16-bit không dấu) và gán giá trị ban đầu là 0.
HAL_Init(); // Khởi tạo các cấu hình cần thiết cho HAL
SystemClock_Config(); //Thiết lập cấu hình của hệ thống clock.
MX_GPIO_Init(); //Khởi tạo cấu hình của các GPIO
LCD_init(); //Khởi tạo và cấu hình màn hình LCD.
LCD_clear(); //xóa tất cả trên màng hình, chuẩn bị cho việc hiển thị mới.
while (1) { // chương trình sẽ lặp lại các lệnh vô hạn
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0) {
// Kiểm tra trạng thái của chân GPIOB_PIN_1, nếu nút được nhấn (được kết nối với chân này
và được đặt về mức logic thấp), thực hiện lệnh bên dưỡi.
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){}
// chờ cho đến khi nút không được nhấn nữa, khi nút vẫn được nhấn (được đọc là mức logic
thấp), vòng lặp sẽ tiếp tục chờ.
a = a + 1; // Mỗi khi nút được nhấn, giá trị của biến a sẽ tăng lên 1 đơn vị.
}
LCD_setCursor(0,0); // đặt con trỏ tại hàng 0 cột 0
LCD_printf("%d",a); // hiện thị giá trị của biến a lên màn hình LCD.
}}

Bài 2: Chạy chữ “FETEL” trên LCD 16x2 theo kiểu đụng biên thì dội ngược
lại.
int main(void){
uint8_t a = 0; //Khai báo hai biến a và b kiểu uint8_t (unsigned 8-bit integer) và gán giá trị ban
uint8_t b = 0; đầu cho chúng là 0.
HAL_Init(); SystemClock_Config(); MX_GPIO_Init();
// khởi tạo HAL, thiết lập cấu hình hệ thống clock và khởi tạo cấu hình GPIO.
LCD_init();
LCD_clear();
//Khởi tạo và xóa màn hình LCD.
while (1){
LCD_setCursor(0,a);
LCD_printf("FETEL");
//Đặt con trỏ hiển thị tại hàng 0, cột a trên màn hình LCD và hiển thị chuỗi "FETEL".
HAL_Delay(100); //hiện chữ “FETEL” trong 100ms
LCD_clear(); Xóa màn hình LCD sau khi hiện trong 100ms
if(b == 0){ // nếu b = 0 nghĩa là chữ đang chạy từ trái sang phải thì thực hiện lệnh bên dưới
if(a < 11){
a = a + 1;
} //tăng a lên cho tới khi a = 10, tức đến khi đụng biên. ( LCD có 16 cột, chuỗi “FETEL”
chiếm 5 cột, giá trị ban đầu của a là 0)
}
else{
b = 1; //Chữ chạy từ phải qua trái
} // Nếu b bằng 0, và a nhỏ hơn 11, thì tăng a lên 1. Ngược lại, đặt b thành 1.
if(b == 1){ //chữ đang chạy từ phải sang trái thì thực hiện lệnh bên dưới
if(a > 0){
a = a - 1;
} //giảm a đến khi a đụng biên trái (a = 0)
}
else{
b = 0; // Chữ chạy từ trái qua phải
a = a + 1; // cho a tăng lên 1 đơn vị, nếu không chuỗi “FETEL” sẽ hiện ở cột 0-4 trong
200ms thay vì 100ms như mong muốn.
}
}
// Nếu b bằng 1, và a lớn hơn 0, thì giảm a đi 1. Ngược lại, đặt b thành 0, tăng a lên 1
Bài 3: Cho LCD hiển thị số đếm lên từ 0000 đến 9999. Luôn hiển thị số dưới
dạng 4 chữ số.
int main(void){
uint16_t a = 0; //khai báo biến a kiểu uint16_t (unsigned 16-bit integer), xem biến a như một
biến đếm từ 0000 tới 9999
uint8_t b = 0; // khai báo biến b dùng để lưu giá trị của vị trí con trỏ
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
// khởi tạo HAL, thiết lập cấu hình hệ thống clock và khởi tạo cấu hình GPIO.
LCD_init();
LCD_clear();
// Khởi tạo và xóa màn hình LCD.
LCD_setCursor(0,0);
LCD_printf("0000");
// Đặt con trỏ hiển thị tại hàng 0, cột 0 trên màn hình LCD và hiển thị chuỗi "0000".
while (1)
// Nếu a nhỏ hơn 10, b sẽ là 3; nếu a nhỏ hơn 100, b sẽ là 2; nếu a nhỏ hơn 1000, b sẽ là 1; nếu
không, b sẽ là 0.
if (a < 10) {
b = 3; // Đặt con trỏ tại cột thứ 4, nên khi hiển thị sẽ không làm tắt ba số 0 phía trước
}
else if (a < 100) {
b = 2; // Đặt con trỏ tại cột thứ 3,
}
else if (a < 1000) {
b = 1; // Đặt con trỏ tại cột thứ 2,
}
else {
b = 0; } // Đặt con trỏ tại cột đầu tiên,
LCD_setCursor(0, b);
LCD_printf("%d", a);
// Đặt con trỏ hiển thị tại hàng 0, cột b trên màn hình LCD và hiển thị giá trị của biến a.
HAL_Delay(100); //delay 100ms
if (a < 9999) a = a + 1; //Nếu a nhỏ hơn 9999, tăng giá trị của a lên 1.
}

You might also like