lOMoARcPSD| 45470709
Câu 3 (3 điểm)
Thiết kế mạch và viết chương trình điều khiển 2 led 7 đoạn loại Cathode chung mắc
kiểu nối thẳng (Led hàng đơn vị nối với các chân PA6, PA7, PA8, PA9, PA10, PA11, PA12,
PA15. Led hàng chục nối với các chân PB0, PB1, PB3, PB4, PB5, PB6, PB7, PB8) hiển
thị đếm như sau: + Đếm tăng 2 từ 00 đến 80
(Chú ý: Phải lập bảng tìm điều khiển Led 7 đoạn viết chương trình theo code lập
trình bằng Arduino IDE)
Mã led 1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
dp
x
x
g
f
e
d
c
b
a
x
x
x
x
x
x
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
0
0x0fc0
1
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0x0180
2
0
0
0
1
0
1
1
0
1
1
0
0
0
0
0
0
0x16c0
3
0
0
0
1
0
0
1
1
1
1
0
0
0
0
0
0
4
0
0
0
1
1
0
0
1
1
0
0
0
0
0
0
0
5
0
0
0
0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
0
7
0
0
0
0
0
0
0
0
0
8
0
0
0
0
0
0
0
0
0
9
0
0
0
0
0
0
0
0
0
Mã led 2
15
14
13
11
10
9
8
7
6
5
4
3
2
1
0
X
X
X
X
X
X
dp
g
f
e
d
c
X
b
a
0
0
0
0
0
0
0
0
0
1
1
1
1
0
1
1
0x007b
1
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0x000a
2
0
0
0
0
0
0
0
0
0x00
3
0
0
0
0
0
0
0
0
0x00
4
0
0
0
0
0
0
0
0
lOMoARcPSD| 45470709
5
0
0
0
0
0
0
0
0
6
0
0
0
0
0
0
0
0
7
0
0
0
0
0
0
0
0
8
0
0
0
0
0
0
0
0
9
0
0
0
0
0
0
0
0
Nhị phân
Hexa
0
0
0
0
0
0
0
0
1
1
0
0
1
0
2
0
0
1
1
3
0
1
0
0
4
0
1
0
1
5
0
1
1
0
6
0
1
1
1
7
1
0
0
0
8
1
0
0
1
9
1
0
1
0
A
1
0
1
1
B
1
1
0
0
C
1
1
0
1
D
1
1
1
0
E
1
1
1
1
F
CODE
int maled_dv[10] = { 0x0fc0, 0x0180……. };
int maled_chuc[10] = { 0x007b,0x000a ……. };
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT
{ pinMode(PA6, OUTPUT);
pinMode(PA7, OUTPUT);
pinMode(PA8, OUTPUT);
pinMode(PA9, OUTPUT);
pinMode(PA10, OUTPUT);
lOMoARcPSD| 45470709
pinMode(PA11, OUTPUT);
pinMode(PA12, OUTPUT);
pinMode(PA15, OUTPUT);
pinMode(PB0, OUTPUT);
pinMode(PB1, OUTPUT);
pinMode(PB3, OUTPUT);
pinMode(PB4, OUTPUT);
pinMode(PB5, OUTPUT);
pinMode(PB6, OUTPUT);
pinMode(PB7, OUTPUT);
pinMode(PB8, OUTPUT);
}
void loop()
{
Dem_00_den_80();
}
Void Dem_00_den_80()
{
For(int so_dem = 0; so_dem < 81; so_dem=so_dem+2)
{
Hien_thi(so_dem);
Delay(1000);
}
}
Void Hien_thi(int gia_tri)
lOMoARcPSD| 45470709
{
GPIOB->ODR = maled_chuc [gia_tri/10];
GPIOA->ODR = maled_dv [gia_tri%10];
}
Câu 2 (3 điểm)
Thiết kế mạch và viết chương trình điều khiển 2 led 7 đoạn loại Anode chung mắc
kiểu quét kết nối với các chân PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7 PB4, PB5
hiển thị đếm như sau: + Đếm tăng 1 từ 00 đến 59
+ Đếm giảm 2 từ 58 về 00
(Chú ý: Phải lập bảng tìm điều khiển Led 7 đoạn viết chương trình theo code lập
trình bằng Arduino IDE)
CODE
#define Led_hang_chuc PB4
#define Led_hang_dv PB5
int maled [10] = { ……………………………..};
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT
{ pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
pinMode(PA4, OUTPUT);
pinMode(PA5, OUTPUT);
pinMode(PA6, OUTPUT);
pinMode(PA7, OUTPUT);
lOMoARcPSD| 45470709
pinMode(PB4, OUTPUT);
pinMode(PB5, OUTPUT);
}
void loop()
{
Dem_00_den_59();
Dem_58_den_00();
}
Void Dem_00_den_59()
{
For(int so_dem = 0; so_dem < 60; so_dem++)
{
For(int lan_lap = 0; lan_lap < 100; lan_lap ++)
{
Hien_thi(so_dem);
}
}
}
Void Dem_00_den_59()
{
For(int so_dem = 58; so_dem >=0; so_dem= so_dem-2)
{
For(int lan_lap = 0; lan_lap < 100; lan_lap ++)
{
Hien_thi(so_dem);
}
lOMoARcPSD| 45470709
}
}
Void Hien_thi(int gia_tri)
{
GPIOA->ODR = maled [gia_tri/10];
digitalWrite(Led_hang_chuc, LOW);
delay(1);
digitalWrite(Led_hang_chuc, HIGH);
GPIOA->ODR = maled
[gia_tri%10];
digitalWrite(Led_hang_dv, LOW);
delay(1); digitalWrite(Led_hang_dv,
HIGH);
}
Câu 4 (4 điểm)
Thiết kế mạch và viết chương trình sử dụng 2 nút nhấn kiểu tích cực âm kết nối với
2 chân tuỳ chọn đđiều khiển 2 led 7 đoạn loại Anode chung mắc kiểu nối thẳng (Led hàng
đơn vị nối với các chân PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13. Led ng chục
nối với các chân PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7) sao cho:
+ Khi nhấn nút nhấn 1: Trên 2 Led 7 đoạn hiển thị đếm Tăng 2
+ Khi nhấn nút nhấn 2: Trên 2 Led 7 đoạn hiển thị đếm Giảm 2
(Chú ý: Phải lập bảng tìm điều khiển Led 7 đoạn viết chương trình theo code lập
trình bằng Arduino IDE) b
CODE
#define Nutnhan1 PB0
#define Nutnhan2 PB1
lOMoARcPSD| 45470709
int maled_dv[10] = { ……………………. };
int maled_chuc[10] = { ………….. ……. };
int so_dem = 0;
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT
{ pinMode(PB6, OUTPUT);
pinMode(PB7, OUTPUT);
pinMode(PB8, OUTPUT);
pinMode(PB9, OUTPUT);
pinMode(PB10, OUTPUT);
pinMode(PB11, OUTPUT);
pinMode(PB12, OUTPUT);
pinMode(PB13, OUTPUT);
pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
pinMode(PA4, OUTPUT);
pinMode(PA5, OUTPUT);
pinMode(PA6, OUTPUT);
pinMode(PA7, OUTPUT);
pinMode(Nutnhan1, INPUT);
pinMode(Nutnhan2, INPUT);
}
void loop()
{
lOMoARcPSD| 45470709
Kiem_tra_phim();
}
Void Kiem_tra_phim ()
{ if(digitalRead(Nutnhan1)==0)//Nếu đọc về giá trị Nutnhan1 mà bằng 0
{ so_dem= so_dem+2;
if(so_dem==101)
{ so_dem = 1;
}
if(so_dem==100)
{ so_dem = 0; }
Hien_thi(so_dem);
while(digitalRead(Nutnhan1)==0)
}
if(digitalRead(Nutnhan2)==0)//Nếu đọc về giá trị Nutnhan2 mà bằng 0
{ so_dem= so_dem-2;
if(so_dem==-1)
{ so_dem = 99;
} if(so_dem==-
2)
{ so_dem = 98;
}
Hien_thi(so_dem);
while(digitalRead(Nutnhan2)==0)
}
}
Void Hien_thi(int gia_tri)
lOMoARcPSD| 45470709
{
GPIOB->ODR = maled_chuc [gia_tri/10];
GPIOA->ODR = maled_dv [gia_tri%10];
}
Câu 5 (4 điểm)
Thiết kế mạch và viết chương trình sử dụng 2 nút nhấn kiểu tích cực dương kết nối
với 2 chân tuỳ chọn để điều khiển 2 led 7 đoạn loại Anode chung mắc kiểu quét kết nối
với các chân PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7 và PB8, PB9 sao cho:
+ Khi nhấn nút nhấn 1: Trên 2 Led 7 đoạn hiển thị đếm Tăng 2
+ Khi nhấn nút nhấn 2: Trên 2 Led 7 đoạn hiển thị đếm Giảm 2
(Chú ý: Phải lập bảng tìm điều khiển Led 7 đoạn viết chương trình theo code lập
trình bằng Arduino IDE)
PA
7
6
5
4
3
2
1
0
Hex
Số
dp
g
f
e
d
c
b
a
0
1
2
3
4
5
6
7
8
9
CODE
#define Nutnhan1 PB0
#define Nutnhan2 PB1
int maled [10] = { ……………………. };
int so_dem = 0;
lOMoARcPSD| 45470709
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT
{ pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
pinMode(PA4, OUTPUT);
pinMode(PA5, OUTPUT);
pinMode(PA6, OUTPUT);
pinMode(PA7, OUTPUT);
pinMode(PB9, OUTPUT);
pinMode(PB10, OUTPUT);
pinMode(Nutnhan1, INPUT);
pinMode(Nutnhan2, INPUT);
}
void loop()
{
Hien_thi(so_dem);
Kiem_tra_phim();
}
Void Kiem_tra_phim ()
{ if(digitalRead(Nutnhan1)==1)//Nếu đọc về giá trị Nutnhan1 mà bằng 1
{ so_dem= so_dem+2;
if(so_dem==101)
{ so_dem = 1;
}
if(so_dem==100)
lOMoARcPSD| 45470709
{ so_dem = 0;
}
while(digitalRead(Nutnhan1)==1)
{
Hien_thi(so_dem);
}
}
if(digitalRead(Nutnhan2)==1)//Nếu đọc về giá trị Nutnhan2 mà bằng 1
{ so_dem= so_dem-2;
if(so_dem==-1)
{ so_dem = 99; }
if(so_dem==-2)
{ so_dem = 98; }
while(digitalRead(Nutnhan2)==1
)
{
Hien_thi(so_dem);
}
}
}
Void Hien_thi(int gia_tri)
{
GPIOA->ODR = maled [gia_tri/10];
digitalWrite(Led_hang_chuc, LOW);
delay(1);
lOMoARcPSD| 45470709
digitalWrite(Led_hang_chuc, HIGH);
GPIOA->ODR = maled
[gia_tri%10];
digitalWrite(Led_hang_dv, LOW);
delay(1); digitalWrite(Led_hang_dv,
HIGH);
}
Câu 3 (4 điểm)
Thiết kế mạch và viết chương trình sử dụng 2 nút nhấn kiểu tích cực dương kết nối
với 2 chân tuỳ chọn để điều khiển LCD 1602 kết nối với các chân của PA0, PA1, PA2, PA3,
PA4, PA5 (kết nối kiểu 4 bit) sao cho:
Dòng 1 trên LCD hiển thị tên trường
Dòng 2 trên LCD hiển thị dòng chữ “DIEN AP: 2V” và
+ Khi nhấn nút nhấn 1: Giá trị điện áp Tăng 0.1
+ Khi nhấn nút nhấn 2: Giá trị điện áp Giảm 0.1
(Chú ý: Viết chương trình theo code lập trình bằng Arduino IDE)
CODE
#define Nutnhan1 PB0
#define Nutnhan2 PB1
#include <LiquidCrystal.h>
float dien_ap = 2;
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT
{ pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
lOMoARcPSD| 45470709
pinMode(PA4, OUTPUT);
pinMode(PA5, OUTPUT);
pinMode(Nutnhan1, INPUT);
pinMode(Nutnhan2, INPUT); //Khởi tạo các chân
kết nối với lcd(RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4,
PA5); lcd.begin(16,2); //Cài đặt khởi tạo cho
LCD loại 1602 lcd.setCursor(0,0);//Đưa con tr
về toạ độ cột 0 dòng trên lcd.print("TRUONG
DH KTKTCN");
lcd.setCursor(0,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới
lcd.print("DIEN AP: ");
}
void loop()
{
Kiem_tra_phim();
}
Void Kiem_tra_phim ()
{ if(digitalRead(Nutnhan1)==1)//Nếu đọc về giá trị Nutnhan1 mà bằng 0
{ dien_ap = dien_ap + 0.1;
if(dien_ap >10)
{ dien_ap = 10;
}
Hien_thi(dien_ap);
while(digitalRead(Nutnhan1)==1)
lOMoARcPSD| 45470709
}
if(digitalRead(Nutnhan2)==1)//Nếu đọc về giá trị Nutnhan2 mà bằng 0
{ dien_ap = dien_ap – 0.1;
if(dien_ap < 0)
{ dien_ap = 0; }
Hien_thi(dien_ap);
while(digitalRead(Nutnhan2)==1)
}
}
Void Hien_thi(int gia_tri)
{ lcd.setCursor(9,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới
lcd.print(gia_tri);
}
Câu 2 (3 điểm)
Thiết kế mạch và viết chương trình điều khiển 1 led đơn tích cực dương kết nối với
chân PB5 sáng tắt liên tục đếm số xung trả về từ Encoder (sử dụng chân tuỳ chọn) để
điều khiển LCD 1602 kết nối với các chân của PA0, PA1, PA2, PA3, PA4, PA5 (kết nối
kiểu 4 bit) sử dụng ngắt ngoài sao cho:
Dòng 1 trên LCD hiển thị dòng chữ “DEM XUNG ENCODER”
Dòng 2 trên LCD hiển thị dòng chữ “SO XUNG: 0” và
+ Mỗi lần có 1 xung: Số xung tăng lên 1 (tăng đến 10.000 thì quay về 0)
(Chú ý: Viết chương trình theo code lập trình bằng Arduino IDE)
#define xung PB0
#include <LiquidCrystal.h>
int so_xung = 0;
lOMoARcPSD| 45470709
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT
{ pinMode(PA0, OUTPUT);
pinMode(PA1, OUTPUT);
pinMode(PA2, OUTPUT);
pinMode(PA3, OUTPUT);
pinMode(PA4, OUTPUT);
pinMode(PA5, OUTPUT);
pinMode(xung, INPUT);
//Khởi tạo các chân kết nối với lcd(RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
lcd.begin(16,2); //Cài đặt khởi tạo cho LCD loại 1602
lcd.setCursor(0,0);//Đưa con trỏ về toạ độ cột 0 dòng trên
lcd.print("DEM XUNG ENCODER");
lcd.setCursor(0,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới
lcd.print("SO XUNG: "); attachInterrupt(digitalPinToInterrupt(xung),
Dem_xung, CHANGE);
}
void loop()
{
}
Void Dem_xung ()
lOMoARcPSD| 45470709
{ so_xung++; if(so_xung
>10000)
{ so_xung = 0; }
Hien_thi(so_xung);
}
Void Hien_thi(int gia_tri)
{ lcd.setCursor(10,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới
lcd.print(gia_tri);
}

Preview text:

lOMoAR cPSD| 45470709 Câu 3 (3 điểm)
Thiết kế mạch và viết chương trình điều khiển 2 led 7 đoạn loại Cathode chung mắc
kiểu nối thẳng (Led hàng đơn vị nối với các chân PA6, PA7, PA8, PA9, PA10, PA11, PA12,
PA15. Led hàng chục nối với các chân PB0, PB1, PB3, PB4, PB5, PB6, PB7, PB8) hiển
thị đếm như sau: + Đếm tăng 2 từ 00 đến 80
(Chú ý: Phải lập bảng tìm mã điều khiển Led 7 đoạn và viết chương trình theo code lập
trình bằng Arduino IDE) Mã led 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 dp x x g f e d c b a x x x x x x 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0x0fc0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0x0180 2 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0x16c0 3 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 4 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 Mã led 2 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 X X X X X X X dp g f e d c X b a 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0x007b 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0x000a 2 0 0 0 0 0 0 0 0 0 0x00 3 0 0 0 0 0 0 0 0 0 0x00 4 0 0 0 0 0 0 0 0 0 lOMoAR cPSD| 45470709 5 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 Nhị phân Hexa 0 0 0 0 0 0 0 0 1 1 0 0 1 0 2 0 0 1 1 3 0 1 0 0 4 0 1 0 1 5 0 1 1 0 6 0 1 1 1 7 1 0 0 0 8 1 0 0 1 9 1 0 1 0 A 1 0 1 1 B 1 1 0 0 C 1 1 0 1 D 1 1 1 0 E 1 1 1 1 F CODE
int maled_dv[10] = { 0x0fc0, 0x0180……. };
int maled_chuc[10] = { 0x007b,0x000a ……. };
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT { pinMode(PA6, OUTPUT); pinMode(PA7, OUTPUT); pinMode(PA8, OUTPUT); pinMode(PA9, OUTPUT); pinMode(PA10, OUTPUT); lOMoAR cPSD| 45470709 pinMode(PA11, OUTPUT); pinMode(PA12, OUTPUT); pinMode(PA15, OUTPUT); pinMode(PB0, OUTPUT); pinMode(PB1, OUTPUT); pinMode(PB3, OUTPUT); pinMode(PB4, OUTPUT); pinMode(PB5, OUTPUT); pinMode(PB6, OUTPUT); pinMode(PB7, OUTPUT); pinMode(PB8, OUTPUT); } void loop() { Dem_00_den_80(); } Void Dem_00_den_80() {
For(int so_dem = 0; so_dem < 81; so_dem=so_dem+2) { Hien_thi(so_dem); Delay(1000); } } Void Hien_thi(int gia_tri) lOMoAR cPSD| 45470709 {
GPIOB->ODR = maled_chuc [gia_tri/10];
GPIOA->ODR = maled_dv [gia_tri%10]; } Câu 2 (3 điểm)
Thiết kế mạch và viết chương trình điều khiển 2 led 7 đoạn loại Anode chung mắc
kiểu quét kết nối với các chân PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7 và PB4, PB5
hiển thị đếm như sau: + Đếm tăng 1 từ 00 đến 59
+ Đếm giảm 2 từ 58 về 00
(Chú ý: Phải lập bảng tìm mã điều khiển Led 7 đoạn và viết chương trình theo code lập
trình bằng Arduino IDE) CODE #define Led_hang_chuc PB4 #define Led_hang_dv PB5
int maled [10] = { ……………………………..};
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT { pinMode(PA0, OUTPUT); pinMode(PA1, OUTPUT); pinMode(PA2, OUTPUT); pinMode(PA3, OUTPUT); pinMode(PA4, OUTPUT); pinMode(PA5, OUTPUT); pinMode(PA6, OUTPUT); pinMode(PA7, OUTPUT); lOMoAR cPSD| 45470709 pinMode(PB4, OUTPUT); pinMode(PB5, OUTPUT); } void loop() { Dem_00_den_59(); Dem_58_den_00(); } Void Dem_00_den_59() {
For(int so_dem = 0; so_dem < 60; so_dem++) {
For(int lan_lap = 0; lan_lap < 100; lan_lap ++) { Hien_thi(so_dem); } } } Void Dem_00_den_59() {
For(int so_dem = 58; so_dem >=0; so_dem= so_dem-2) {
For(int lan_lap = 0; lan_lap < 100; lan_lap ++) { Hien_thi(so_dem); } lOMoAR cPSD| 45470709 } } Void Hien_thi(int gia_tri) {
GPIOA->ODR = maled [gia_tri/10];
digitalWrite(Led_hang_chuc, LOW); delay(1);
digitalWrite(Led_hang_chuc, HIGH); GPIOA->ODR = maled [gia_tri%10];
digitalWrite(Led_hang_dv, LOW);
delay(1); digitalWrite(Led_hang_dv, HIGH); } Câu 4 (4 điểm)
Thiết kế mạch và viết chương trình sử dụng 2 nút nhấn kiểu tích cực âm kết nối với
2 chân tuỳ chọn để điều khiển 2 led 7 đoạn loại Anode chung mắc kiểu nối thẳng (Led hàng
đơn vị nối với các chân PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13. Led hàng chục
nối với các chân PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7) sao cho:
+ Khi nhấn nút nhấn 1: Trên 2 Led 7 đoạn hiển thị đếm Tăng 2
+ Khi nhấn nút nhấn 2: Trên 2 Led 7 đoạn hiển thị đếm Giảm 2
(Chú ý: Phải lập bảng tìm mã điều khiển Led 7 đoạn và viết chương trình theo code lập
trình bằng Arduino IDE) b CODE #define Nutnhan1 PB0 #define Nutnhan2 PB1 lOMoAR cPSD| 45470709
int maled_dv[10] = { ……………………. };
int maled_chuc[10] = { ………….. ……. }; int so_dem = 0;
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT { pinMode(PB6, OUTPUT); pinMode(PB7, OUTPUT); pinMode(PB8, OUTPUT); pinMode(PB9, OUTPUT); pinMode(PB10, OUTPUT); pinMode(PB11, OUTPUT); pinMode(PB12, OUTPUT); pinMode(PB13, OUTPUT); pinMode(PA0, OUTPUT); pinMode(PA1, OUTPUT); pinMode(PA2, OUTPUT); pinMode(PA3, OUTPUT); pinMode(PA4, OUTPUT); pinMode(PA5, OUTPUT); pinMode(PA6, OUTPUT); pinMode(PA7, OUTPUT); pinMode(Nutnhan1, INPUT); pinMode(Nutnhan2, INPUT); } void loop() { lOMoAR cPSD| 45470709 Kiem_tra_phim(); } Void Kiem_tra_phim ()
{ if(digitalRead(Nutnhan1)==0)//Nếu đọc về giá trị Nutnhan1 mà bằng 0 { so_dem= so_dem+2; if(so_dem==101) { so_dem = 1; } if(so_dem==100) { so_dem = 0; } Hien_thi(so_dem);
while(digitalRead(Nutnhan1)==0) }
if(digitalRead(Nutnhan2)==0)//Nếu đọc về giá trị Nutnhan2 mà bằng 0 { so_dem= so_dem-2; if(so_dem==-1) { so_dem = 99; } if(so_dem==- 2) { so_dem = 98; } Hien_thi(so_dem);
while(digitalRead(Nutnhan2)==0) } } Void Hien_thi(int gia_tri) lOMoAR cPSD| 45470709 {
GPIOB->ODR = maled_chuc [gia_tri/10];
GPIOA->ODR = maled_dv [gia_tri%10]; } Câu 5 (4 điểm)
Thiết kế mạch và viết chương trình sử dụng 2 nút nhấn kiểu tích cực dương kết nối
với 2 chân tuỳ chọn để điều khiển 2 led 7 đoạn loại Anode chung mắc kiểu quét kết nối
với các chân PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7 và PB8, PB9 sao cho:
+ Khi nhấn nút nhấn 1: Trên 2 Led 7 đoạn hiển thị đếm Tăng 2
+ Khi nhấn nút nhấn 2: Trên 2 Led 7 đoạn hiển thị đếm Giảm 2
(Chú ý: Phải lập bảng tìm mã điều khiển Led 7 đoạn và viết chương trình theo code lập
trình bằng Arduino IDE) PA 7 6 5 4 3 2 1 0 Hex Số dp g f e d c b a 0 1 2 3 4 5 6 7 8 9 CODE #define Nutnhan1 PB0 #define Nutnhan2 PB1
int maled [10] = { ……………………. }; int so_dem = 0; lOMoAR cPSD| 45470709
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT { pinMode(PA0, OUTPUT); pinMode(PA1, OUTPUT); pinMode(PA2, OUTPUT); pinMode(PA3, OUTPUT); pinMode(PA4, OUTPUT); pinMode(PA5, OUTPUT); pinMode(PA6, OUTPUT); pinMode(PA7, OUTPUT); pinMode(PB9, OUTPUT); pinMode(PB10, OUTPUT); pinMode(Nutnhan1, INPUT); pinMode(Nutnhan2, INPUT); } void loop() { Hien_thi(so_dem); Kiem_tra_phim(); } Void Kiem_tra_phim ()
{ if(digitalRead(Nutnhan1)==1)//Nếu đọc về giá trị Nutnhan1 mà bằng 1 { so_dem= so_dem+2; if(so_dem==101) { so_dem = 1; } if(so_dem==100) lOMoAR cPSD| 45470709 { so_dem = 0; }
while(digitalRead(Nutnhan1)==1) { Hien_thi(so_dem); } }
if(digitalRead(Nutnhan2)==1)//Nếu đọc về giá trị Nutnhan2 mà bằng 1 { so_dem= so_dem-2; if(so_dem==-1) { so_dem = 99; } if(so_dem==-2) { so_dem = 98; } while(digitalRead(Nutnhan2)==1 ) { Hien_thi(so_dem); } } } Void Hien_thi(int gia_tri) {
GPIOA->ODR = maled [gia_tri/10];
digitalWrite(Led_hang_chuc, LOW); delay(1); lOMoAR cPSD| 45470709
digitalWrite(Led_hang_chuc, HIGH); GPIOA->ODR = maled [gia_tri%10];
digitalWrite(Led_hang_dv, LOW);
delay(1); digitalWrite(Led_hang_dv, HIGH); } Câu 3 (4 điểm)
Thiết kế mạch và viết chương trình sử dụng 2 nút nhấn kiểu tích cực dương kết nối
với 2 chân tuỳ chọn để điều khiển LCD 1602 kết nối với các chân của PA0, PA1, PA2, PA3,
PA4, PA5 (kết nối kiểu 4 bit) sao cho:
Dòng 1 trên LCD hiển thị tên trường
Dòng 2 trên LCD hiển thị dòng chữ “DIEN AP: 2V” và
+ Khi nhấn nút nhấn 1: Giá trị điện áp Tăng 0.1
+ Khi nhấn nút nhấn 2: Giá trị điện áp Giảm 0.1
(Chú ý: Viết chương trình theo code lập trình bằng Arduino IDE) CODE #define Nutnhan1 PB0 #define Nutnhan2 PB1 #include float dien_ap = 2;
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT { pinMode(PA0, OUTPUT); pinMode(PA1, OUTPUT); pinMode(PA2, OUTPUT); pinMode(PA3, OUTPUT); lOMoAR cPSD| 45470709 pinMode(PA4, OUTPUT); pinMode(PA5, OUTPUT); pinMode(Nutnhan1, INPUT);
pinMode(Nutnhan2, INPUT); //Khởi tạo các chân
kết nối với lcd(RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4,
PA5); lcd.begin(16,2); //Cài đặt khởi tạo cho
LCD loại 1602 lcd.setCursor(0,0);//Đưa con trỏ
về toạ độ cột 0 dòng trên lcd.print("TRUONG DH KTKTCN");
lcd.setCursor(0,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới lcd.print("DIEN AP: "); } void loop() { Kiem_tra_phim(); } Void Kiem_tra_phim ()
{ if(digitalRead(Nutnhan1)==1)//Nếu đọc về giá trị Nutnhan1 mà bằng 0 { dien_ap = dien_ap + 0.1; if(dien_ap >10) { dien_ap = 10; } Hien_thi(dien_ap);
while(digitalRead(Nutnhan1)==1) lOMoAR cPSD| 45470709 }
if(digitalRead(Nutnhan2)==1)//Nếu đọc về giá trị Nutnhan2 mà bằng 0 { dien_ap = dien_ap – 0.1; if(dien_ap < 0) { dien_ap = 0; } Hien_thi(dien_ap);
while(digitalRead(Nutnhan2)==1) } } Void Hien_thi(int gia_tri)
{ lcd.setCursor(9,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới lcd.print(gia_tri); } Câu 2 (3 điểm)
Thiết kế mạch và viết chương trình điều khiển 1 led đơn tích cực dương kết nối với
chân PB5 sáng tắt liên tục và đếm số xung trả về từ Encoder (sử dụng chân tuỳ chọn) để
điều khiển LCD 1602 kết nối với các chân của PA0, PA1, PA2, PA3, PA4, PA5 (kết nối
kiểu 4 bit) sử dụng ngắt ngoài sao cho:
Dòng 1 trên LCD hiển thị dòng chữ “DEM XUNG ENCODER”
Dòng 2 trên LCD hiển thị dòng chữ “SO XUNG: 0” và
+ Mỗi lần có 1 xung: Số xung tăng lên 1 (tăng đến 10.000 thì quay về 0)
(Chú ý: Viết chương trình theo code lập trình bằng Arduino IDE) #define xung PB0 #include int so_xung = 0; lOMoAR cPSD| 45470709
void setup() //Hàm chạy 1 lần khi bắt đầu chạy CT { pinMode(PA0, OUTPUT); pinMode(PA1, OUTPUT); pinMode(PA2, OUTPUT); pinMode(PA3, OUTPUT); pinMode(PA4, OUTPUT); pinMode(PA5, OUTPUT); pinMode(xung, INPUT);
//Khởi tạo các chân kết nối với lcd(RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
lcd.begin(16,2); //Cài đặt khởi tạo cho LCD loại 1602
lcd.setCursor(0,0);//Đưa con trỏ về toạ độ cột 0 dòng trên
lcd.print("DEM XUNG ENCODER");
lcd.setCursor(0,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới
lcd.print("SO XUNG: "); attachInterrupt(digitalPinToInterrupt(xung), Dem_xung, CHANGE); } void loop() { } Void Dem_xung () lOMoAR cPSD| 45470709 { so_xung++; if(so_xung >10000) { so_xung = 0; } Hien_thi(so_xung); } Void Hien_thi(int gia_tri)
{ lcd.setCursor(10,1);//Đưa con trỏ về toạ độ cột 2 dòng dưới lcd.print(gia_tri); }