Module 8 LED đơn giao tiếp trực tiếp với 8 chân của vi điều khiển từ PA0 đến PA7. Cấu hình port trong CubeMX được minh họa như Hình 4.15.
Phần đánh số 1 là chọn chức năng GPIO_Output cho chân PA7, tương tự cho các chân PA0 đến chân PA6.
Phần đánh số 2 chọn mục GPIO để cấu hình chi tiết cho từng chân. Phần đánh số 3 chọn các mục Parameter Setting như trong Hình 4.15.
Vì đã cấu hình xung clock cho hệ thống ở phần trước nên ta không cấu hình lại các thông số trong mục Clock Configuration nữa.
Sau khi cấu hình xong trong CubeMX ta nhấn Ctrl + S để sinh code tự động. Hình 4.16 là phần code được sinh ra trong chương trình main tương ứng với các mục đã chọn trong CubeMX.
Khi viết 1 chương trình ứng dụng trong file main.c ta không cần khai báo lại cấu hình chân. Và để đơn giản trong việc trình bày code sinh viên thực hiện đề tài chỉ nêu các dòng code chính mà bỏ qua việc trình bày lại phần cấu hình chân cho vi điều khiển.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 63
Hình 4.15:Cấu hình port cho 8 led đơn trong CubeMX
Hình 4.16:Phần code được sinh ra từ CubeMX
4.3.3.Các hàm sử dụng
Hàm thứ 301: là hàm xuất dữ liệu 1 byte ra module 8 led đơn
void xuat_8led_1byte(uint8_t byte) {
GPIOA->ODR = byte;
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 64 Hàm này có chức năng xuất 1 byte dữ liệu ra module 8 led. Thanh ghi ODR có chưng năng xuất dữ liệu trực tiếp ra các port GPIO.
Hàm thứ 302: là hàm xuất dữ liệu 2 16 bit ra module 32 led đơn
void xuat_8led_2x4bit(uint8_t YH,uint8_t YL) {
uint8_t YHL;
YH=(YH<<4)&0x00f0; YL=YL&0x000f; YHL=YH|YL;
GPIOA->ODR = YHL;
}
Hàm này có chức năng xuất 4bit cao và 4 bit thấp ra module 8 led.
Các hàm này được lưu trong file thư viện TV_DATN_1.c và TV_DATN_1.h
Khi sử dụng thư viện này ta tiến hành copy TV_DATN_1.c vào thư mục Src và copy TV_DATN_1.h và thư mục Inc của Project.
4.3.4.Bài tập mẫu
Phần này thực hành các bài điều khiển led dùng vòng lặp for, các chương trình đơn giản dễ hiểu.
a. Mục đích: biết cách viết chương trình điều khiển led đơn chớp tắt. b. Lưu đồ và giải thích lưu đồ:
Tiến hành xuất dữ liệu của biến Y ra led đơn và dữ liệu 8 bit 0 sẽ làm 8 led tắt. Gọi hàm delay với thời gian tùy ý. Đảo biến y đang là 8 bit 0 thì sẽ trở thành 8 bit 1 hay 0xFF, quay trở lại xuất dữ liệu của biến y ra led đơn và làm 8 led sáng. Sau đó 3 công việc này được lặp đi lặp lại vô điều kiện nên trong lưu đồ không có ký hiệu kết thúc end.
Bài mẫu 101. Chương trình điều khiển 8 LED chớp tắt. Lưu tên file là “mau_101_choptat_8LED”.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 65
Hình 4.17:Lưu đồ điều khiển 8 led chớp tắt
c. Chương trình:
#include "main.h" #include "TV_DATN_1.h"
uint8_t y;
int main(void)
{ y=0; while (1) { xuat_8led_1byte(y); HAL_Delay(200); y=~y; } }
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 66 e. Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình.
f. Giải thích chương trình:
Lệnh “uint8_t y;”: khai báo biến y là 8 bit không dấu.
Lệnh “Y=0;”: có chức năng gán dữ liệu cho biến y bằng 0 để điều khiển 8 led tắt. Lệnh “WHILE(TRUE)”: có chức năng thực hiện các lệnh trong vòng lặp vô tận Lệnh “xuat_8led_1byte(y)”: có chức năng xuất 1 byte dữ liệu ra 8 led, hàm này viết sẵn trong thư viện khai báo: "TV_DATN_1.c"
Lệnh “HAL_Delay(200);” có chức năng delay để nhìn thấy led sáng hoặc tắt. Lệnh “y = ~ y;”: có chức năng đảo dữ liệu của biến y từ 00 thành FF để điều khiển led sáng.
Vòng lặp while thực hiện lại từ đầu.
Phần này thực hành các bài điều khiển led dùng vòng lặp for, các chương trình đơn giản dễ hiểu.
a. Mục đích: biết cách viết chương trình điều khiển 8 led sáng dần và tắt dần phải sang trái.
b. Lưu đồ và giải thích lưu đồ:
Tiến hành xuất dữ liệu của biến Y ra led đơn và dữ liệu 8 bit 0 sẽ làm 8 led tắt, gọi hàm delay với thời gian tùy ý, dịch mức 1 vào bên phải của biến Y, tăng biến đếm I, kiểm tra xem bằng 8 hay chưa. Nếu chưa bằng quay trở lại xuất dữ liệu của biến Y ra led đơn sẽ làm 1 led sáng.
Tương tự như vậy sau 8 lần thì 8 led sáng dần lên từ phải sang trái và khi đó biến đếm I bằng 8 thì vòng lặp thứ nhất kết thúc.
Công việc cũng thực hiện tương tự như vòng lặp thứ 2 nhưng dữ liệu dịch vào là mức 0 sẽ làm 8 led tắt dần từ phải sang trái.
Sau 8 lần thì vòng lặp thứ 2 cũng kết thúc và quay trở lại vòng lặp thứ nhất làm lại và cứ thế làm mãi.
Bài mẫu 102. Chương trình điều khiển 8 LED sáng dần và tắt dần phải sang trái.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 67
Hình 4.18:Lưu đồ điều khiển 8 led sáng tắt dần
c. Chương trình:
#include "main.h" #include "TV_DATN_1.c"
uint8_t y,i;
int main(void)
{ y=0; while (1) { for(i=0;i<8;i++) { xuat_8led_1byte(y); y=(y<<1)+0x01; HAL_Delay(200); BEGIN
Khởi tạo các port
i 0
Xuất biến y ra 8 l d đơn, d lay, dịch...
i 8
i 0
Xuất biến y ra 8 l d đơn, d lay, dịch...
i 8 Đ Đ S S
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 68 } for(i=0;i<8;i++) { xuat_8led_1byte(y); y=(y<<1); HAL_Delay(200); } } }
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình.
4.3.5.Các bài tập ứng dụng
4.4.GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED ĐƠN 4.4.1.Sơ đồ phần cứng
Phần này thực hành các bài giao tiếp vi điều khiển với 4 nút nhấn đơn để thực hiện các yêu cầu điều khiển như điều khiển led tắt mở, điều khiển đảo chiều led và các ứng dụng sau này đều có liên quan đến nút nhấn.
Mạch điện giao tiếp vi điều khiển với các nút nhấn như hình 4.19.
Hình 4.19:Sơ đồ nguyên lý giao tiếp vi điều khiển với 4 nút nhấn đơn
Bài tập 101. Hãy hiệu chỉnh chương trình để điều khiển 4 LED chớp tắt. Lưu tên file là “bt_101_choptat_4led”.
Bài tập 102. Viết chương trình để điều khiển 8 LED sáng dần từ trong ra. Lưu tên file là “bt_102_sang_dan_trong_ra_8led”.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 69 Vi điều khiển dùng 4 bit của portE giao tiếp với 4 nút nhấn đơn, các nút nhấn còn lại của bàn phím ma trận thì chưa cần quan tâm đến.
Các nút nhấn bình thường hở nên trạng thái tín hiệu ở mức logic ‘1’, khi nhấn thì ngắn mạch nối mass làm mức logic về ‘0’. Khi nhã phím thì về lại bình thường mức logic ‘1’.
Để kiểm tra có nhấn hay không thì ta kiểm tra trạng thái nếu bằng ‘1’ thì không nhấn phím, bằng ‘0’ thì có nhấn.
Trong mạch có 4 đèn báo hiệu: bình thường thì 4 đèn tắt, khi nhấn 1 phím thì đèn tương ứng sáng.
Khi đèn sáng thì chắc chắn phím nhấn còn tốt. Nhiều bạn lập trình sai thường đổ lỗi cho nút nhấn hỏng.
4.4.2.Cấu hình chân cho vi điều khiển
Module 4 nút nhấn đơn giao tiếp trực tiếp với 4 chân của vi điều khiển từ PE3 đến PE6. Cấu hình port trong CubeMX được minh họa như Hình 4.20.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 70 Chọn chức năng GPIO_Iutput cho chân PE6, tương tự cho các chân PE3 đến chân PE5.
Sau khi cấu hình xong trong CubeMX ta nhấn Ctrl + S để sinh code tự động. Hình 4.21 là phần code được sinh ra trong chương trình main tương ứng với các mục đã cấu hình cho các chân PE3, PE4, PE5, PE6 trong CubeMX.
Hình 4.21:Code cấu hình cho 4 nút nhấn đơn
Định nghĩa tên các nút nhấn trong thư viện “TV_DATN_1.h”
#define BT0_Pin GPIO_PIN_3
#define BT0_Port GPIOE
#define BT1_Pin GPIO_PIN_4
#define BT1_Port GPIOE
#define BT2_Pin GPIO_PIN_5
#define BT2_Port GPIOE
#define BT3_Pin GPIO_PIN_6
#define BT3_Port GPIOE
#define ON_Pin BT0_Pin
#define ON_Port BT0_Port
#define OFF_Pin BT1_Pin
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 71
#define INV_Pin BT2_Pin
#define INV_Port BT2_Port
#define UP_Pin BT0_Pin
#define UP_Port BT0_Port
#define DW_Pin BT1_Pin
#define DW_Port BT1_Port
#define CLR_Pin BT2_Pin
#define CLR_Port BT2_Port
#define MOD_Pin BT3_Pin
#define MOD_Port BT3_Port
Ta sẽ quy ước tên các nút nhấn cho 4 chân PE như sau:
Chân PE3: BT0, ON, UP.
Chân PE4: BT1, OFF, DW.
Chân PE5: BT2, INV, CLR.
Chân PE6: BT3, MOD
Việc định nghĩa này giúp ta thống nhất cách gọi port và pin của các nút nhấn và khi viết chương trình không phải định nghĩa nữa.
4.4.3.Bài tập mẫu
a. Mục đích: biết cách lập trình kiểm tra nút nhấn và điều khiển. b. Lưu đồ và giải thích lưu đồ:
Bài mẫu 201. Chương trình điều khiển 8 LED bằng 2 nút ON và OFF. Khi có điện thì led tắt, khi nhấn ON thì 8 led sáng, khi nhấn OFF thì 8 led tắt.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 72
Hình 4.22:Lưu đồ điều khiển 8 led bằng nút nhấn ON và OFF
c. Chương trình:
#include "main.h" #include "TV_DATN_1.c"
int main(void)
{ xuat_8led_1byte(0x00); while (1) { do{} while(HAL_GPIO_ReadPin(BT0_Port,BT0_Pin)); xuat_8led_1byte(0xff); do{} while(HAL_GPIO_ReadPin(BT1_Port,BT1_Pin)); xuat_8led_1byte(0x00); } }
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 73 d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: sau khi nạp xong chương trình thì nhấn nút ON sẽ làm 8 led sáng, nhấn nút OFF sẽ làm 8 led tắt, nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình.
f. Giải thích chương trình:
a. Mục đích: biết cách lập trình kiểm tra nút nhấn và điều khiển. b. Lưu đồ và giải thích lưu đồ:
Hình 4.23:Lưu đồ điều khiển 8 led sáng tắt bằng nút ON OFF và INV
c. Chương trình:
Bài mẫu 202. Chương trình điều khiển 8 LED bằng 3 nút ON, OFF, INV. Khi có điện thì 8 led tắt, khi nhấn ON thì 4 led sáng, khi nhấn OFF thì led tắt, khi nhấn INV thì 4 led sáng thành tắt, 4 led tắt thành sáng.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 74
#include "main.h" #include "TV_DATN_1.c"
uint8_t y;
int main(void)
{ y=0; xuat_8led_1byte(0); while (1) { do{} while(HAL_GPIO_ReadPin(ON_Port,ON_Pin)); y=0x0f; xuat_8led_1byte(y); do { if(!HAL_GPIO_ReadPin(INV_Port,INV_Pin)) { y=~y; xuat_8led_1byte(y); } } while(HAL_GPIO_ReadPin(OFF_Port,OFF_Pin)); xuat_8led_1byte(0x00); } }
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 75 e. Quan sát kết quả: sau khi nạp xong chương trình thì nhấn nút ON sẽ làm 4 led sáng, nhấn nút OFF sẽ làm 4 led tắt, nhấn nút INV sẽ làm 4 led sáng thành tắt, 4 led tắt thành sáng, nếu kết quả không đúng yêu cầu thì kiểm tra lại chương trình.
f. Giải thích chương trình: Trong chương trình này khi chạy thực tế thì do tốc độ của vi điều khiển quá nhanh, khi nhấn đảo chiều thì do thời gian nhấn phím dài nên vi điều khiển thực hiện đảo led liên tục, ta sẽ nhìn thấy 8 led sáng luôn cho đến khi ta buông phím, hoặc ta nhấn nhanh thì trạng thái đảo của led không thể xác định rõ ràng.
Để điều khiển chính xác thì phải chống dội phím nhấn, rồi xử lý chức năng và kiểm tra buông phím.
Trong bài điều khiển chỉ có phím INV gây ra ảnh hưởng nên lưu đồ và chương trình xử lý phần chống dội và chờ buông phím INV theo sau.
a. Mục đích: chống dội cho nút nhấn gây ra hiện tượng dội, biết cách lập trình chống dội cơ bản.
b. Lưu đồ và giải thích lưu đồ:
Hình 4.24:Lưu đồ điều khiển 8 led sáng tắt bằng nút ON OFF và INV – chống dội
Bài mẫu 203. Chương trình điều khiển 8 LED bằng 3 nút ON, OFF, INV. Khi có điện thì 8 led tắt, khi nhấn ON thì 4 led sáng, khi nhấn OFF thì led tắt, khi nhấn INV thì 4 led sáng thành tắt, 4 led tắt thành sáng, có chống dội phím.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 76 Khi bắt đầu chương trình ta tắt hết các led. Bước vào vòng lặp vô hạn ta kiểm tra nút nhấn ON nếu không nhấn thì quay lại kiểm tra tiếp nút ON, nếu có nhấn thì bật 8 led. Tiếp theo vòng lặp sẽ kiểm tra nếu có nhấn nút OFF thì quay lại vòng lặp nếu không thì thực hiện chương trình xử lý nút nhấn INV.
c. Chương trình: #include "main.h" #include "TV_DATN_1.c" uint8_t y; void phim_inv() { if(!HAL_GPIO_ReadPin(INV_Port,INV_Pin)) { HAL_Delay(20); if(!HAL_GPIO_ReadPin(INV_Port,INV_Pin)) { y=~y; xuat_8led_1byte(y); do{} while(!HAL_GPIO_ReadPin(INV_Port,INV_Pin)); } } }
int main(void)
{ y=0; xuat_8led_1byte(0); while (1) { do{} while(HAL_GPIO_ReadPin(ON_Port,ON_Pin)); y=0x0f;
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 77 xuat_8led_1byte(y); do { if(!HAL_GPIO_ReadPin(INV_Port,INV_Pin)) t6 { y=~y; xuat_8led_1byte(y); } } while(HAL_GPIO_ReadPin(OFF_Port,OFF_Pin)); xuat_8led_1byte(0x00); } }
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: trong bài này chống dội và chờ nhả phím mới thực hiện. f. Giải thích chương trình:
4.4.4.Các bài tập ứng dụng
Bài tập 201. Dùng vi điều khiển giao tiếp với 8 led đơn và 3 nút nhấn được đặt tên là UP, DW, CLR. Khi cấp điện thì 8 led tắt, khi nhấn UP thì led sáng dần lên từ phải sang trái – mỗi lần nhấn thì 1 led sáng, khi nhấn DW thì led tắt dần theo chiều ngược lại, khi nhấn CLR thì xóa hết.
Lưu tên file là “bt_201_8led_up_dw_clr_1”
Bài tập 202. Giống bài 201 như nút nhấn CLR có thêm chức năng đảo chiều sáng và tắt của led: ví dụ khi nhấn UP thì sáng dần từng led từ phải sang trái, thì sau khi nhấn CLR thì khi nhấn UP led sẽ sáng từng led theo chiều từ trái sang phải, tương tự cho nút nhấn DW.
Lưu tên file là “bt_202_8led_up_dw_clr_2”. ”.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 78
4.5.GIAO TIẾP MA TRẬN PHÍM VÀ LED ĐƠN 4.5.1.Sơ đồ phần cứng
Phần này thực hành các bài giao tiếp vi điều khiển với ma trận bàn phím 4x4. Mạch điện giao tiếp vi điều khiển với các nút nhấn như hình 4.25.
Hình 4.25:Sơ đồ nguyên lý giao tiếp vi điều khiển với ma trận phím 4x4
4.5.2.Cấu hình chân cho vi điều khiển
Module ma trận phím 4x4 gồm có 4 hàng và 4 cột với 16 phím, dùng phương pháp quét cột và nhận tín hiệu ở hàng, sử dụng chung 4 chân PE3 đến PE6 của nút nhấn đơn và sử dụng thêm 4 chân PD3, PD6, PD11, PD12 được cấu hình Output để tạo mã cột. Cấu hình port trong CubeMX được minh họa như hình 4.26.
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 79 Chọn chức năng GPIO_Output cho chân PE3, PE6, PD11, PD12.
Ở mục cấu hình GPIO chọn Maximum output speed: Very High cho chân PE3, PE6, PD11, PD12.
Sau khi cấu hình xong trong CubeMX ta nhấn Ctrl + S để sinh code tự động. Hình 4.27 là phần code được sinh ra trong chương trình main tương ứng với các mục đã cấu hình trong CubeMX.
Hình 4.27:Code cấu hình cho ma trận phím
4.5.3.Các hàm sử dụng
Chương trình quét phím lưu trong trong thư viện “TV_DATN_KEY_4x4.c”
int quet_phim() { int xuat_gia_tri_C[4]={0xfff7,0xffbf,0xf7ff,0xefff}; uint8_t cot,hang,maphim; maphim=hang=0xff; for(cot=0;cot<4;cot++) { GPIOD->ODR = xuat_gia_tri_C[cot]; if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3)==0)
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 80 { hang=0; break; } if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==0) { hang=1; break; } if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_5)==0) { hang=2; break; } if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_6)==0) { hang=3; break; } } if(hang!=0xff) maphim=cot*4+hang; return(maphim);
//HAM TICH CUC CANH XUONG
int key_4x4_dw() { uint8_t mpt1,mpt2; mpt1=quet_phim(); if(mpt1!=0xff) { HAL_Delay(10); mpt1=quet_phim();
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH 81 do{mpt2=quet_phim();} while(mpt2==mpt1); } return(mpt1); } 4.5.4.Bài tập mẫu
a. Mục đích: biết cách viết thư viện, biết cách lập trình giao tiếp bàn phím ma trận khi nhấn thì hiển thị mã phím nhị phân trên led.
b. Lưu đồ và giải thích lưu đồ: Sinh viên tự vẽ lưu đồ c. Chương trình:
#include "main.h" #include "TV_DATN_1.c"
#include "TV_DATN_KEY_4x4.c"