You are on page 1of 26

fKHÓA SỐ ĐIỆN TỬ

I – MỤC TIÊU
- Thiết kế khóa số điện tử bằng mật khẩu (6 số) sử dụng chip vi xử lí họ msp430.
- Dùng bàn phím hex (16 phím) thực hiện chức năng giao tiếp.
- Dùng động cơ một chiều đóng – mở khóa bằng cách điều – khiển đảo chiều động
cơ.
- Mật khẩu có thể thay đổi được.
- Báo động ra loa và treo hệ thống khi mật khẩu nhập sai 3 lần.
II – PHƯƠNG PHÁP GIẢI QUYẾT
- Thiết kế khối điều khiển đảo chiều động cơ để đóng – mở cửa.
- Thiết kế khối báo động.
- Tìm hiểu chip xử lí và các linh kiện được sử dụng.
- Viết chương trình theo sơ đồ giải thuật.
- Liên kết các khối.
- Ráp mạch kiểm tra và chạy thử.
III – NỘI DUNG
1. SƠ ĐỒ KHỐI

KHỐI
BÀN PHÍM KHỐI XỬ LÍ

KHỐI KHỐI KHỐI


HIỂN THỊ ĐIỀU KHIỂN BÁO ĐỘNG
ĐỘNG CƠ

Hình 1: Sơ đồ khối hệ thống

Trang 1
Hình 2: Sơ đồ giải thuật cho chương trình chính
Hình 3: Sơ đồ giải thuật cho chương trình con “Change”
3. TÌM HIỂU CHIP MSP430G2x52

Hình 4: Sơ đồ chân của MSP430G2x52

Hình 5: Sơ đồ khối chức năng của MSP430G2x52


4. BÀN PHÍM HEX
4.1. CẤU TẠO
Bàn phím Hex cấu tạo gồm16 phím xếp thành ma trận 4 hàng và 4 cột (Như
hình 6).

P0

P1

P2

P3

P4

P5

P6

P7

Hình 6: Cấu tạo bàn phím Hex

4.2. NGUYÊN TẮC HOẠT ĐỘNG CỦA BÀN PHÍM HEX


Khi một phím nào đó được nhấn thì tương ứng hàng và cột của bàn phím Hex
sẽ kết nối với nhau.
Để thực hiện kiểm tra một phím thì ta phải cho trước hàng (hoặc cột) chứa
phím tương ứng ở mức logic 0, sau đó kiểm tra cột (hoặc hàng) của phím, nếu cột
(hoặc hàng) = 0 thì có nhấn phím ngược lại thì không nhấn phím.
Như vậy để nhận biết phím nào được nhấn ta phải lần lược quét các cột, cố
định hàng hoặc quét các hàng, cố định cột.
4.3. SƠ ĐỒ BÀN PHÍM HOÀN CHỈNH

1 2 3 OPEN
R4R3R2 R1
33k33k33k 33k

P1.0 4 5 6 CLOSE

P1.1 P1.2 P1.3 P1.4 P1.5 P1.6


P1.7
7 8 9 CHANGE

EXIT 0 CLEAR OK

Hình 7: Bàn phím Hex Hoàn Chỉnh

Các hàng và cột của bàn phím kết nối với Port 1. Bit 0,1,2,3 của Port 1 sẽ làm
ngỏ ra và kết nối với các hàng của bàn phím. Còn các bit 4,5,6,7 làm ngỏ ngỏ vào
kết nối với các cột của bàn phím.
4.4. CHỐNG DỘI CHO BÀN PHÍM
Do thời gian dội của phím vào khoảng 20ms nên để chống dội ta sẽ chống
dội bằng phần mềm để phần cứng được đơn giản.
Đoạn chương trình chống dội:
n=0;
while ( n==0 )
{
if ((P1IN&COTX) == 0) //Nút đang nhấn giữ.
n=0;
else //Nút nhả ra.
n=1;
}
Ngoài ra giữa các lần chọn hàng (hoặc cột) để quét phím ta thêm đoạn delay:
delay_cycles(5000);
5. KHỐI ĐIỀU KHIỂN ĐỘNG CƠ
5.1. SƠ ĐỒ MẠCH ĐIỀU KHIỂN ĐẢO CHIỀU ĐỘNG CƠ ĐÓNG – MỞ
CỬA

3V 3V

D1 RL2
10BQ040 RL1 D2
10BQ040

Px R1 Q2 Q1 R2 Py
330R C828 3V 330R
C828

Hình 8: Sơ đồ mạch điều khiển động cơ.


Hai ngõ vào Px, Py dùng để điều khiển đảo chiều động cơ.
5.2. ĐIỀU KHIỂN TỐC ĐỘ ĐỘNG CƠ
Điều khiển tốc độ động cơ theo chế độ PWM (Pluse Width Modulation–Biến
điệu độ rộng xung).
Đoạn chương trình điều khiển:
n=0;
while ( n<4 )
{
P2OUT |= COTX;
delay_cycles(35000);
P2OUT &= ~COTX;
delay_cycles(35000);
delay_cycles(35000);
n++;
}
Với tốc độ động cơ bằng 1/3 tốc độ trung bình.
6. SƠ ĐỒ MẠCH BÁO ĐỘNG
3V
Pz

RC1 RB2RB1 RC2 RC1 RB2RB1 RC2


820R 8k28k2 820R 180R 1k51k5 180R

R10 C1C2 C1 C2 C5
330R Q6 R5 Q3 ra
A1015 Ngo
C828 330R
10u 10u Q4 1u 1u 10u LS1
Q5 C828 Q2 Q1 SPEAKER
C828 C828 C828

Khối 1 Khối 2

Hình 11: Tín hiệu ngỏ ra ở khối 1.

- Tín hiệu ngỏ ra ở khối 2 sẽ như hình 12 với chu kỳ T:


6
T = (C1R B2 + C2 R
B1 )Ln2 = 2.1500.10 Ln2 = 0.0021S

Hình 12: Tín hiệu ngỏ ra ở khối 2.


sẽ

Khi kết hợp hai khối lại cung hoạt động thì tín hiêu ở ngỏ ra cấp cho loa như hình 13:

Hình 13: Tín hiệu ngỏ ra cấp cho loa.

7. SƠ ĐỒ MẠCH HOÀN CHỈNH


3V

RC1 RB2 RB1 RC2


820R
RC3
180R
RB4RB3
1k51k5
RC4
180R
820R 8k2 8k2

C1 C2 R15 Q3 C3 C4 C5
Q6 ra
Ngo
330R A1015
C828
Q4 1u 1u 10u LS1
R10 Q5 10u 10u C828 Q2 Q1 SPEAKER
C828
330R C828 C828

Pz

3V

1 2 3 OPEN
R4 R3 R2 R1
33k33k33k 33k
U1 124
P2.0/ACLK/CA2 P2.1/INCLK/CA3 5 6 CLOSE
8 13
P1.0/TACLK P1.1/TA0
9 14
10 15
11 P2.2/CAOUT/TA0/CA4 P1.2/TA1 16
12 P2.3/TA1/CA0 P1.3/TA2 17 7 8 9 CHANGE
3 P2.4/TA2/CA1 P1.4/SMCLK/TCK 18
P1.5/TA0/TMS
P2.5/CA5 P1.6/TA1/TDI/TCLK P1.7/TA2/TDO/TDI
19
20
EXIT 0 CLOSE OK
7 XIN/P2.6/CA6 6
RST/NMI TEST
1 XOUT/P2.7/CA7 5
MSP430G2452

3V 3V 3V

3V 3V
D3 D4 D5 R7
LED-RED LED-RED LED-RED D1 D2 4k7
10 RL1 RL2 10

R12 R13 R14 Px Py


100R 100R 100R
R5 R6C6
R8 R9 R11 330R 330R 10u
330R 330R 330R
Q12 Q13
Q7 Q8 Q9 C828
C828
C828 C828 C828

Hình 14: Sơ đồ mạch hoàn chỉnh.


8. MỘT SỐ ĐOẠN CHƯƠNG TRÌNH
8.1. ĐỊNH NGHĨA BIT
#define COT0 BIT0
#define COT1 BIT1
#define COT2 BIT2
#define COT3 BIT3
#define COT4 BIT4
#define COT5 BIT5
#define COT6 BIT6
#define COT7 BIT7

8.2. ĐOẠN QUÉT PHÍM


i=0;
While(i<6)
{
P1OUT = 0x0E; //Chọn hàng thứ 1.
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Cột 1 nhấn.
{………………}
else if ((P1IN&COT5) == 0) //Cột 2 nhấn.
{ ……………...}
else if ((P1IN&COT6) == 0) //Cột 3 nhấn.
{………………}
else if ((P1IN&COT6) == 0) //Cột 4 nhấn.
{………………}
else //Không nhấn.
{………………}
P1OUT = 0x0D; // Chọn hàng thứ 2
…………………
P1OUT = 0x0B; // Chọn hàng thứ 3
…………………
P1OUT = 0x07; // Chọn hàng thứ 4
…………………
}
8.3. ĐOẠN SO SÁNH PASSWORD
if (*i==0)
{ if(nhappass[*i] == a)
{
*i = *i+1;
if(nhappass[*i] == b)
{
*i = *i+1;
if(nhappass[*i] == c)
{
*i = *i+1;
if(nhappass[*i] == d)
{
*i = *i+1;
if(nhappass[*i] == e)
{ *i = *i+1;
if(nhappass[*i] == h)
*i = *i+1; } } } } } }
else
*i = 7;

8.4. ĐOẠN TREO HỆ THỐNG


int j;
P2OUT |= COT3;
j=0;
while (j<=60)
{
delay_cycles(1000000);
j++;
}
P2OUT &= ~COT3;

8.5. ĐOẠN ĐIỀU KHIỂN ĐÈN CHỚP


int j=0;
while (j<=10)
{
P2OUT ^= COT3;
delay_cycles(50000); j+
+;
}
P2OUT &= ~COT3;
9. PHƯƠNG HƯỚNG PHÁT TRIỂN
- Có thể đảm bảo giữ password đã thay đổi khi bị mất điện hay khi reset hệ thống.
- Hiển thị chương trình lên LCD để người dùng dễ sử dụng.
- Thiết kế phần cứng gọn hơn.
10. ĐOẠN CHƯƠNG TRÌNH CHÍNH
/*…………………………………………………………………………………*/
/*_ _ _ _ _ _ _ _ _ _Nguyên tắc hoạt động cửa chương trình________________*/

- Khi mới bắt đầu, chương trình thực hiện quét phím số và phím close (phím close
chỉ có tác dụng nếu ta chưa nhấn một phím số nào). Ở đây, chương trình yêu cầu
nhập password (6 số). Ngoài ra, ta có thể dùng phím clear để xóa số vừa nhập sai.
Khi nhấn một phím chương trình sẽ báo hiệu (đèn sáng) một lần.
- Khi nhập password xong ta nhấn ok:
+ Nếu password sai thì báo động và cho nhập lại, khi nhập sai 3 lần, hệ thống
treo trong 1 phút sau đó trở về chương trinh ban đầu và cho nhập tiếp.
+ Nếu password đúng sẽ báo hiệu (đèn chớp), sau đó chương trình thực hiện đến
đoạn quét phím chức năng.
- Ở đoạn chương trình quét phím chức năng:
+ Nếu nhấn open thì ra lệnh điều khiển mở rồi trở về đoạn quét phím chức năng.
+ Nếu nhấn close thì ra lệnh đóng và trở về chương trinh ban đầu.
+ Nếu nhấn change để thay đổi password sau đó trở về chương trinh ban đầu.
- Sau khi nhấn phím change, ta cần thực hiện nhập password hai lần (cách nhập
pass tương tự như ở đầu chương trình, tức là sau khi nhập đủ 6 số ta cần nhấn
phím ok), chương trình sẽ ra báo hiệu giữa hai lần nhập.
+ Nếu password giữa hai lần nhập không giống nhau thì ra báo động sau đó cho
nhập tiếp. Nếu sai 3 lần hệ thống bị treo trong 1 phút rồi trở về chương trình ban
đầu.
+ Nếu password giữa hai lần nhập giống nhau, chương trình sẽ lưu và thay đổi
password sau đó trở về chương trình ban đầu.
Ngoai ra, ta có thể nhấn Exit để trở về chương trình ban đầu khi không muốn thay
đổi password nữa.
/*…………………………………………………………………………………*/

#include "io430.h"
#include "intrinsics.h"
#define COT0 BIT0
#define COT1 BIT1
#define COT2 BIT2
#define COT3 BIT3
#define COT4 BIT4
#define COT5 BIT5
#define COT6 BIT6
#define COT7 BIT7
intrinsic void delay_cycles(unsigned long cycles);
/*........................Doan quet phim so va nhap pass.....................*/
void quetphim (int *nhappass,int *p)
{
int i=0,n=0;
while(i < 6)
{
P1OUT = 0x0E; /*.................Chon hang thu 1...............*/
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Nhap so 1
{
P2OUT |= COT3;
nhappass[i] = 1;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT5) == 0) //Nhap so 2
{
P2OUT |= COT3;
nhappass[i] = 2;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT6) == 0) //Nhap so 3
{
P2OUT |= COT3;
nhappass[i] = 3;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else //Khong nhap
P2OUT &= ~COT3;
P1OUT = 0x0D; /*.................Chon hang thu 2...............*/
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Nhap so 4
{
P2OUT |= COT3;
nhappass[i] = 4;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT5) == 0) //Nhap so 5
{
P2OUT |= COT3;
nhappass[i] = 5;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT6) == 0) //Nhap so 6
{
P2OUT |= COT3;
nhappass[i] = 6;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT7) == 0) //Nhan close.
{
if (*p==1)
{
if (i==0)
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=0;
while ( n<4 )
{
P2OUT |= COT1;
delay_cycles(35000);
P2OUT &= ~COT1;
delay_cycles(35000);
delay_cycles(35000); n+
+;
}
n=1;
}
}
}
}
}
else //Khong nhap
P2OUT &= ~COT3;
P1OUT = 0x0B; /*.................Chon hang thu 3...............*/
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Nhap so 7
{
P2OUT |= COT3;
nhappass[i] = 7;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT5) == 0) //Nhap so 8
{
P2OUT |= COT3;
nhappass[i] = 8;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT6) == 0) //Nhap so 9
{
P2OUT |= COT3;
nhappass[i] = 9;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else //Khong nhap
P2OUT &= ~COT3;
P1OUT = 0x07; /*.................Chon hang thu 4...............*/
delay_cycles(5000);
if (*p==0)
{
if ((P1IN&COT4) == 0) //Nhan nut Exit
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
{ n=
1;
i=7;
*p = *p+1;
P2OUT &= ~COT3;
}
}
}
}
if ((P1IN&COT5) == 0) //Nhap so 0
{
P2OUT |= COT3;
nhappass[i] = 0;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
{ n=
1;
P2OUT &= ~COT3;
}
}
}
else if ((P1IN&COT6) == 0) //Xoa so vua nhap
{
if ( i >0 ) //Neu bang i = 1 khong xoa
{
i--;
P2OUT |= COT3;
}
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else //Khong nhap
P2OUT &= ~COT3;
/*......................Chon nhan ok hay exit hoac clear.....................*/
while (i==6) //Xoa so vua nhap khi i = 5.
{
P1OUT = 0x07; //chon hang thu
4 if ((P1IN&COT7) == 0) //Nhan
ok
{
P2OUT |= COT3;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{ n=
1;
P2OUT &= ~COT3;
}
}
}
else if ((P1IN&COT6) == 0) //Xoa so vua nhap
{
if ( i > 0 ) //Neu bang i = 0 khong xoa
{
i--;
P2OUT |= COT3;
}
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else if (*p==0)
{
if ((P1IN&COT4) == 0) //Nhan nut Exit
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
{ n=
1;
i=7;
*p = *p+1;
P2OUT &= ~COT3;
}
}
}
}
else //Khong nhap
P2OUT &= ~COT3;
}
/*................Ket thuc doan cho nhan ok hay exit hoac clear..............*/
}
}
/*.....................Ket thuc doan quet phim so va nhap pass...............*/
/*...........................Doan so sanh pass...............................*/
void sosanh (int nhappass[6],int *i,int a,int b,int c,int d,int e,int h)
{
if (*i==0)
{
if(nhappass[*i] == a)
{
*i = *i+1;
if(nhappass[*i] == b)
{
*i = *i+1;
if(nhappass[*i] == c)
{
*i = *i+1;
if(nhappass[*i] == d)
{
*i = *i+1;
if(nhappass[*i] == e)
{
*i = *i+1;
if(nhappass[*i] == h)
*i = *i+1;
}
}
}
}
}
}
else
*i = 7;
}
/*.........................Ket thuc doan so sanh pass........................*/
/*............................Doan treo he thong.............................*/
void treohethong (void)
{
int j;
P2OUT |= COT3;
j=0;
while (j<=60)
{
delay_cycles(1000000); j+
+;
}
P2OUT &= ~COT3;
}
/*...........................Ket thuc doan treo he thong.....................*/
/*............................Doan den chop tat..............................*/
void denchop (void)
{
int j=0;
while (j<=10)
{
P2OUT ^= COT3;
delay_cycles(50000);
j++;
}
P2OUT &= ~COT3;
}
/*...........................Ket thuc doan den chop tat......................*/
/*.................................Doan lo keu...............................*/
void loakeu(void)
{
P2OUT |= COT0;
delay_cycles(500000);
P2OUT &= ~COT0;
}
/*............................Ket thuc doan lo keu...........................*/
/*.....................Doan khai bao bien ngoai chuong trinh.................*/
int j=0,i,k,n,m,p,g;
int nhappass[6],passdoi[6];
int
a=3,b=5,c=7,d=1,e=5,h=9;
/*.....................Doan chuong trinh chinh...............................*/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 =
CALBC1_1MHZ; DCOCTL =
CALDCO_1MHZ; P2DIR =
0xFF;
P2OUT = 0x00;
P1DIR = 0x0F; //port 1.0,1.1,1.2,1.3 ngo ra,port 1.4,1.5,1.6,1.7 ngo
vao. while(1)
{
P2OUT = 0x00;
p=1;
quetphim(nhappass,&p);
i=0;
sosanh(nhappass,&i,a,b,c,d,e,h);
/*...............Doan kiem tra ket qua so sanh pass.............*/
k=0;
while (k==0)
{
if ( i == 6 )//Nhap pass dung.
{
denchop ();
m=0; //Cho phep vong lap quet phim chuc nang hoat dong.
j=0; //Gan j=0 de dem so lan nhap pass sai trong lan nhap moi.
k=1; //Gan k=1 de thoat khoi vong lap so sanh pass.
}
else //Nhap sai pass mot lan.
{ j+
+;
if (j==3)//So sanh da sai du 3 lan chua.
{
loakeu();
treohethong ();
j=0; //Gan j=0 dem so lan nhap pass sai trong lan nhap moi.
k=1; //Gan k=1 de thoat khoi vong lap so sanh pass.
m=1;
}
else //Nhap sai chua qua 3 lan.
{
loakeu();
k=1; //Gan k=1 thoat khoi doan sanh pass de nhap tiep khi j<3.
m=1; //Khong phep vong lap quet phim chuc nang hoat dong.
}
}
}
/*...................Ket thuc doan kiem tra ket qua so sanh pass.............*/
/*..............................Doan quet phim chuc nang.....................*/
while (m==0)
{
P1OUT = 0x0E; /*Quet phim open.*/
delay_cycles(5000);
if ((P1IN&COT7) == 0) /*Nhan open.*/
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=0;
while ( n<4 )
{
P2OUT |= COT2;
delay_cycles(35000);
P2OUT &= ~COT2;
delay_cycles(35000);
delay_cycles(35000);
n++;
}
n=1;
}
}
}
P1OUT = 0x0D; /*Quet phim close.*/
delay_cycles(5000);
if ((P1IN&COT7) == 0) /*Nhan close.*/
{ m=
1;
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=0;
while ( n<4 )
{
P2OUT |= COT1;
delay_cycles(35000);
P2OUT &= ~COT1;
delay_cycles(35000);
delay_cycles(35000);
n++;
}
n=1;
}
}
}
P1OUT = 0x0B; /*Quet phim change.*/
delay_cycles(5000);
if ((P1IN&COT7) == 0) /*Nhan chance de thay doi pass.*/
{
P2OUT |= COT3;
delay_cycles(500000);
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=1;
}
}
p=0; //Gan p=0 lam bien cho vong lap thay doi pass.
g=0; //Gan g=0 lam bien so sanh nhap pass sai may lan khi chon
change. while (p==0)
{
quetphim(nhappass,&p); //Nhap pass lan dau.
if (p==0)
{
P2OUT |= COT3;
delay_cycles(1000000);
P2OUT &= ~COT3;
quetphim(passdoi,&p); //Nhap pass lan hai xac nhan.
}
else
m=1;
if (p==0)
{
k=0;
while (k<6)
{
if(nhappass[k]==passdoi[k]) //So sanh hai pass vua nhap.
k++;
else
k=7;
}
if (k==6) //Luu pass vua nhap vao.
{
denchop ();
a = nhappass[0];
b = nhappass[1];
c = nhappass[2];
d = nhappass[3];
e = nhappass[4];
h = nhappass[5];
p=1; //Gan p=1 de thoat khoi vong lap khi pass da thay doi.
m=1; //Gan m=1 de thoat doan quet phim chuc nang roi ve ban dau.
}
else
{
g++; //Tang g len 1 khi nhap pass sai.
if (g == 3)
{
loakeu();
treohethong (); //Treo he thong.
p=1; //Gan p=1 de thoat khoi vong lap khi pass da thay doi.
m=1; //Gan m=1 thoat doan quet phim chuc nang roi ve ban
dau.
}
else //Nhap sai chua qua 3 lan.
{
loakeu();
}
}
}
else
m=1;
}
}
}
/*.......................Ket thuc doan quet phim chuc nang...................*/
}
/*..................Ket thuc doan kiem tra ket qua so sanh pass..............*/
}

You might also like