1. Trang chủ
  2. » Luận Văn - Báo Cáo

Sử dụng vi điều khiển PIC 16f877a thực hiện lịch vạn niên bao gồm hiện thị giờ; phút; giây; ngày; tháng; năm hiệu chỉnh thời gian thông qua nút bấm bên ngoài

41 906 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 41
Dung lượng 460,15 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Sử dụng vi điều khiển PIC 16f877a thực hiện lịch vạn niên bao gồm hiện thị giờ; phút; giây; ngày; tháng; năm hiệu chỉnh thời gian thông qua nút bấm bên ngoài

Trang 1

Lời mở đầu

Hầu hết các ứng dụng của vi xử lý có mặt ở tất cả các ngành nghề Ờ các nước phát triển

công nghệ xử lý bằng máy tính đã rất thông dụng Việc xuất hiện phát triển của các bộ vi xử lý

giúp con nguòi đạt được những thành tựu vượt bậc trong thời gian ngắn Tuy ảnh hưởng của các

chip vi xử lý là vô cùng to lớn đối với cuộc sống con người và không có người nào có thể tính

toán vượt qua chip vi xử lý, nhưng các chip vi xử lý này vẫn phải chịu sự điểu khiển của con

người Với đề tài: ứng dụng vi điều khiển pic 16F877A làm lịch vạn niên cho thấy các vi điều

khiển đã được sử dụng rộng rãi, gẫn gũi với cuộc sống hằng ngày Việc thực hiện đề tài đã mang

lại nhiều kinh nghiệm trong việc tiếp cận với một vi điểu khiển mới, qua đó mở ra nhiều thuận

lợi cho việc phát triển đề tài cũng như làm quen các vi điều khiển hiện đại hơn

ĐỂ TÀI:

Sử dụng vi điều khiển PIC 16F877A thực hiện lịch vạn niên bao

gồm hiện thị giờ; phút; giây; ngày; tháng; năm Hiệu chỉnh thời gian

thông qua nút bấm bên ngoài

Ý tưởng thực hiện:

Khối thời gian: Sử dụng IC đếm thời gian thực DS12C887+ để thực hiện việc đếm

thời gian Vì con RTC (real time counter) chuyên dùng để đếm thời gian thực với sai số thấp

(điều kiện lý tưởng sai số 1 tháng là 1 giây) Ngoài ra, RTC còn hỗ trợ việc định thời mở rộng

các ứng dụng về sau Đặc biệt DS12C887+ sử dụng thạch anh nội tự dao động thông qua nguồn

pin được tích hợp sẵn bên trong Điều này giúp giảm sai sót trong việc thiết kế mạch thach anh

Trang 2

http://www.ebook.edu.vn 2

và pin bên ngoài Bên cạnh đó việc giao tiếp song song với VĐK tạo điều kiện thuận lợi hơn với

giao tiếp nối tiếp

Khối nút bấm điều khiển : bao gồm 3 nút Nút 1 (SET_TIME) cho phép truy cập

vào phần hiệu chỉnh thời gian Nút 2 (INC): tăng giá trị Nút 3(DEC): giảm giá trị Thiết kế bộ

nút bấm là đơn giản và dễ sử dụng nhất Khi nút 1 bấm, đồng hồ ngừng và truy cập vào phần

hiệu chỉnh và đợi lệnh tiếp theo Sau đó sẽ dựa vào nút tăng và giảm để xử lý Bấm bút 1 để

chuyển qua mục tiếp theo Sau khi đã hết các 6 mục, việc bấm nút 1 sẽ quay lại việc chạy đồng

hồ

Khối hiển thị: sử dụng LCD 16x2 Bộ LCD 16x2 là một trong những cách hiển thị

thông dụng bên cạnh dùng LED Ưu điểm việc dùng LCD là rất dễ hiện thị và điều khiển, bên

cạnh đó việc mở rộng đề tài cũng đơn giản hơn Với 2 dòng chữ, mỗi dòng gồm 16 ký tự là đủ để

hiển thị

Bộ điểu khiển: vi điểu khiển PIC 16F877A Công việc chủ yếu của PIC là điều khiển

giao tiếp với các phần khác trong mạch, cho nên việc sử dụng PIC 16F877A là hơi phí phạm vì

PIC có nhiều công dụng tốt hơn Các công dụng này có thể dùng trong phần mở rộng đề lài

B TÍNH TOÁN THI CÔNG VÀ THIẾT KẾ

B.1) KẾT NỐI và THIẾT KẾ

B.1.1) PIC và LCD

Giao tiếp giữa PIC và LCD theo sơ đồ tổng quát là đơn công Tức dữ liệu được truyền từ

PIC ra LCD Chế độ của LCD là chế độ truyền nhận 4 bit Cổng giao tiếp với LCD là port C, với

KHỐI ĐIỀU KHIỂN PIC 16F877A

KHỐI HIỂN THỊ LCD 16x2

KHỐI THỜI GIAN THỰC

IC DS12C887

KHỐI HIỆU CHỈNH NÚT BẤM

Trang 3

bit 0-3 của port C nối với bit D4-D7 của LCD (D0-D3 không sử dụng nối đất) Bit 6 của port C

nối chân EN; bit 7 nối RS Do ta không có nhu cầu lấy dữ liệu từ LCD nên chân W/R của LCD

coi như nối đất, xác định chỉ ghi Thiết kế này là tiết kiệm nhất với số lượng bit dùng chỉ là 6 bit

để giao tiếp

Mạch hiển thị (LCD): Thiết kế mạch hiển thị LCD bao gồm 1 bộ LCD 16x2 dùng hiển thị

Một biến trở để điều chỉnh độ tương phản cho LCD Và một điện trở để hạ áp cho LED đèn nền

của LCD

B.1.2) PIC và DS12C887

Giao tiếp giữa PIC và DS12C887 là giao tiếp song song theo kiểu bán song công Tức là tại

một thời điểm chỉ truyền theo một chiều duy nhất Ta kết nối như sau: portD của PIC là port

truyền dữ liệu nối với AD0-AD7 của RTC Port E của PIC là port điều

khiển nối với các chân DS,RW,AS của RTC

Mạch thời gian thực (DS12C887): do tính ưu việt hơn các IC thời

gian thực khác là đã tích hợp thạch anh và nguồn pin dữ trự sẵn trong IC

nên mạch thời gian thực rất đơn giản chỉ gồm 1 IC và tụ 104 để nối chân

dương và âm của IC

B.1.3) PIC và nút nhấn

Giao tiếp này thực hiện qua port B của pic với nút TIME_SET là bit2;

INC la bit 5; DEC là bit 4 Lý do cho việc sắp xếp này là đáp ứng việc

chạy dây trên mạch thực tế đơn giản trên một lớp mạch

Mạch hiệu chỉnh (nút bấm): Do PIC hoạt động ở 20mAvà 5V trên các

chân Khi chưa bấm nút thì nguồn 5V được nối với chân của PIC Nếu

trong trường hợp nào đó chân input của PIC chuyển thành output thì yêu

cầu là dòng vào phải nhỏ hơn hoặc bằng 20mA Như vậy trong thiết kế ta

dùng R có giá trị 4.7K Khi đó I=5/4.7K < 20mA là đạt ưu cầu thiết kế

B.1.4) Mạch điều khiển (PIC):

Sử dụng thạch anh 4Mhz, chế độ XT Theo datasheet của vi điều khiển PIC (trang 2-7)

thì giá trị tụ được chọn là từ 15-30pF Trong mạch này ta chọn giá trị của tụ bằng 22pF Bên

cạnh đó ta có tụ 104 nối giữa Vss và Vdd của PIC để giảm tình trạng sốc điện

Trang 4

http://www.ebook.edu.vn 4

Trang 5

B.2) CHƯƠNG TRÌNH ĐIỀU KHIỂN

B.2.1) Thuật tốn

B.2.1.1) CHUONG TRINH CHINH

Giải thích: Ta bắt đầu khởi tạo các port sau khi ra tắt bộ ngắt, nhằm tránh tình trạng chưa thiết lập

xong đã ngắt dẫ đến sự mất điều khiển hệ thống Sau đó gọi các trình con khởi động cho LCD; RTC

Ta phải con chương trình con UPDATE (Nvụ: cập nhật dữ liệu từ RTC vào ô nhớ trong PIC); với mục

đích là thiết lập giá trị ban đầu cho PIC Sau đó ta gọi INIT_TRANSFER (Nvụ: xuất toàn bộ hiển thị

các gia trị ra LCD); với mục đích là thiết lập hiển thị ban đâu cho LCD vì lần sau khi hiển thị ra LCD,

ta chỉ cập nhật các thông số bị thay đổi Sau khi đã thiết lập, ta bật bộ ngắt để nhận xung clk để cập

Tắt ngắt ngoài RB0/INT

Khởi động các port:

S

Đ

Trang 6

http://www.ebook.edu.vn 6

nhật thời gian từ RTC Sau đó KT coi nut SET_TIME được nhấn, nếu có gọi chương trình SET_GIO;

nếu không; quay về và KT tiếp

B.2.1.2) CHUONG TRINH CON INIT_LCD

Giải thích: Port C là port giao tiếp ra LCD (với bit 3-0:truyền dữ liệu; bit 7: EN; bit 6: RS) Mỗi lần

khởi động cho LCD cần 15ms Sau đó ta phải RESET 3 lần đảm bảo không còn dũ liệu trong RAM

của LCD (lần 1 delay 5ms; 2 lần sau delay 160ms) Các giá trị delay tính theo datasheet của LCD

Rồi các lệnh phát về sau chỉ delay 160ms Các lệnh khởi động được đề cập trong bảng tập lệnh điều

hiển LCD trang xx

B.2.1.3) CHUONG TRINH CON INIT_DS12C887

Giải thích

Truyền giá trị 00101111 vào thanh ghi A của RTC; mục đích: x010xxxx : cho phép RTC hoạt

động đếm theo TA nội, và xxxx1111: thiết lập chế độ tạo xung CLK 2Hz ở chân SWQ với mục đích

xác định thời điểm cập nhật dữ liệu vào VĐK

Tuyền giá trị 01011010 vào thanh ghi B của RTC; much đích: cho phép ngắt định thời; cho phép

bật cờ ngắt định thời; bâth chế độ phát xung SWQ; chế đọ lưu là BCD; đếm 24h/ngày

Port C: output

Phát lệnh RESET 3

lần.( Mỗi lần Delay

160US để chắc chắn

LCD nhận được lệnh)

Phát lệnh 0x02: thiết

lập chế độ truyền

4bits

Phát lệnh 0x28: thiết lập chế độ 2 dòng 5x7

Phát lệnh 0x0C: bật hiển thị tắt con trỏ

Phát lệnh 0x01:

CLR màn hình Kết thúc Phát lệnh 0x01:

CLR màn hình

Trang 7

B.2.1.4) CHUONG TRINH CON UPDATE(IN:RTC; OUT:RAM)

Giaỉ thích:

Nguyên tăc update đơn giản chỉ là truy cập vào các địa chỉ các ơ nhớ thời gian trong RTC

và lấy dữ liệu ra (thong qua trình con: READ_12C887), lưu vào RAM VĐK

Các giá trị lấy ra gồm: giây(0x00); phút(0x02); giờ(0x04); ngày(0x07); tháng(0x08);

năm(0x09)

Lưu vào ADD_W địa chỉ thanh ghi A

Lưu vào giá trị 28H vào thanh ghi A

Lưu vào ADD_W địa chỉ thanh ghi B

Lưu vào giá trị 5AH vào thanh ghi B

Gọi: CT WRITE_12C887

Gọi: CT WRITE_12C887

Kết thúc

Trang 8

http://www.ebook.edu.vn 8

B.2.1.5) CHUONG TRINH CON INIT_TRANSFER (IN: RAM;OUT:LCD)

Mục đích của CT con này là chuyển 1 lần đầu tất cả các giá trị lên LCD để tránh tinh trạng mỗi

lần cập nhật là phải chuyển hết lại, điều này sẽ làm LCD nhấp nháy khi cập nhật

Do chỉ là thiết lập ban đầu nên chỉ để quy địnnh vị trí từng biến thời gian

Trình con này không vẽ sơ đồ do thuật toán đơn giản, có thể hiểu trực tiếp được

B.2.1.6) CHUONG TRINH CON WRITE_12C887 (IN:ADD_W , DATA_W; OUT:RTC)

Mục đích của trình con này là đi dữ liệu từ RAM nội VĐK qua RAM nội của RTC Theo nghiên

cứu qua datasheet của RTC (theo tiêu chuẩn Intel, MOT=0) thì có thể tóm tắt các bước như sau:

B1: Đưa chân DS và RW lên mức cao

B2: Xuất giá trị cần ghi lên RAM của RTC ra các chân của DATAPORT (portD)

B3: Tạo cạnh xuống tại chân AS

B4: Đưa dữ liệu cần ghi vào đia chỉ ô nhớ vừa định của RTC

B5: Đưa chân RW về mức thấp

B6: Tạo cạnh lên tại chân AS

Chuyển địa chỉ chứa biến giây vào ADD_R

Gọi trình con: READ_12C887 Lưu giá tri DATA_R vào RAM_SEC

Chuyển địa chỉ chứa biến năm vào ADD_R

Gọi trình con: READ_12C887

Lưu giá tri DATA_R vào RAM_YEA

Kết thúc

Trang 9

Khởi tạo port

D là port xuất

Chuyển địa chỉ cần đọc ra DATAPORT

Thiết lập DS, RW, AS mức cao

Tạo cạnh xuóng tại chân AS

Tạo cạnh xuóng tại chân DS

Khởi tạo port D là port nhập Lấy dữ liệu từ DATA_PORT

ra thanh ghi W

Thiết lập AS mức cao

Kết thúc

Trong ASM của CT con này có rất nhiểu lệnh NOP với mục đích là tạo trễ 1 chu

kỳ máy để đảm bảo thời gian chuyển mức cho các chân

Chuyển địa chỉ cần ghi ra DATAPORT

B.2.1.7) CHUONG TRINH CON READ_RTC (IN: ADD_R;OUT:DATA_R)

B1: đưa chân DS, RW, AS lên mức cao

B2: Đưa địa chỉ của thanh ghi cần đọc của RTC vào DATA_PORT

B3: Tạo cạnh xuống tại chân AS

B4: Tạo cạnh xuống tại chân DS

B5: Khởi tạo DATA_PORT thành port nhập để lấy dữ liệu ra tư RTC

B6: Dưa chân AS lên mức cao

Khởi tạo port

D là port xuất

Chuyển địa chỉ cần ghi ra DATAPORT

Thiết lập DS, RW mức cao

Tạo xung lên ở chân AS

Chuyển giá trị cần ghi ra DATAPORT

Thiết lập RW mức thấp

Thiết lập AS mức cao Kết thúc

Trang 10

http://www.ebook.edu.vn 10

B.2.1.8) CHUONG TRINH CON TRANSFER_LCD

Giải thích: Chuyển các giá trị thời gian vào LCD Ý tưởng là chỉ có những phần nào thay

đổi thì mới được cập nhật vào LCD Thực hiện bằng cách: kiểm tra cách giá trị thời gian, nếu

bằng giá trị đầu tiên (0: đối với giây, phút, giờ; 1: đối với ngày, tháng, năm) thì sẽ được quét đến

giá trị cao hơn

B.2.1.9) CHUONG TRINH CON WRITE_DATA

Mục đích: ghi dữ liệu thời gian trong PIC ra LCD Chương trình này khác với CT con Write_ins

(ghi lệnh điều khiển LCD) Hai chương trìng này đều có lưu đồ giống nhau Điểm khác nhau duy

nhất là: Đối với write_data: ta khời động thêm chân RS (RS=1) của LCD (nhận biết là byte đó là

byte dữ liệu), và ngược lại đối với write_ins

Trang 11

Nguyên tăc thực hiện:

B1: tách 1 byte 8 bit thành 2 phần 4 bit (do nguyên tăc kết nối là 4 bit)

B2: Chuyển dữ liệu (MSB) ra port_LCD Mục đích chuyển ra trước tạo sự ổn định do dữ liệu

B3: bật và tắt EN (cho phép gửi bit ra LCD) Đối với CT write_data thì ta phải bật RS trước khi

bật và tắt EN, còn đv CT write_ins thì không cần

B4: delay 1 khoảng 160 us, chắc chắn là LCD đã nhận được dữ liệu

B5: tiếp tục thực hiện tiếp đv 4 bit thấp và thực hiện lại bước 1

B.2.1.10) CHUONG TRINH NGAT

Loại ngắt: sử dụng ngắt ngoài RB0/INT

Mục đích của trình ngắt: nhận xung clock từ RTC để báo hiệu thời gian cầp nhật dữ liệu, do

LCD khác với LED ở chỗ là LCD chỉ cần truyền qua 1 lần thì giá trị đó được giữ; còn LED phải

truyền phát lien tục(quét led)

Cách thực hiện: do RTC 12C887 chỉ có thể tạo xung clk ra chân SQW với tốc độ tối

thiểu là 2Hz, tương đương 0.5s Ta cần xung 1s nên dẫn đến việc đùng 1 biến tạm Với giá trị

mặc định ban đầu là 2, sau 2 lần ngắt thì sẽ nhận 1 lần tức bằng 1s

Sau khi đã phát hiện 1s đã trôi qua, ta cần kiểm tra RTC xem coi RTC đã sẵn sang cho

việ truy xuất dữ liệu Bit cho phép truy xuất là bit thứ 7 của thanh ghi A của RTC Nếu là 1: cho

phép; 0 là từ chối

Sau khi được cho phép, gọi trình con UPDATE để cập nhật và xuất ra LCD luôn Sau đó

thiết lập lại chế độ ngắt

Lưu ý: mỗi khi thực hiện chương trình ngắt ta cần lưu lại tất cả các giá trị của thanh ghi w;

thanh ghi status và vị trí con trỏ chạy chương trình (PClath) và FSR

B.2.1.11) CHUONG TRINH HIEU CHINH GIO

Cách hiệu chình: Để vào phần hiệu chỉnh thì thông qua nút bấm SET_TIME Sau khi

truy cập vào phần hiệu chỉnh thời gian thi hiệu chỉnh tuần tự theo giờ, phút, năm, tháng, ngày

Mỗi lần chuyển sẽ thông qua việc bấm nút SET_TIME Theo nguyên tắc tăng giảm từng giá trị

thời gian thông qua 2 nút bấm(TURN_UP và TURN_DOWN) Sau khi đã đi hết 1 lượt các giá

trị hiệu chỉnh thì bấm lại nút SET_TIME để khởi động lại chương trình Đối với phần hiệu chỉnh

sẽ luôn xuất hiện con trỏ nhấp nháy ngay hàng đơn vị của mỗi giá trị đang được hiệu chỉnh

Mục đích việc sắp xếp thứ tự hiệu chỉnh: vì lý do kiểm soát giá trị tối đa ngày của từng

tháng nên cần phải xác định năm trước, để chọn maxngày bằng 28 hay 29; sau đó việc hiệu chỉnh

tháng sẽ giúp xác định maxngay chính xác, tránh tình trạng nhập lố số ngày đối với mỗi tháng,

dẫn đến RTC hoạt động sai

Cách thực hiện:

- Đối với phần hiệu chỉnh giờ dựa trên lưu đồ sau đây Giải thuật của phần hiệu chỉnh phút,

năm, tháng cũng tương tự như trên Điểm khác nhau duy nhất là giá trị khi đem so sánh Đối với

giờ thì so sánh với 23; phút thì là: 59; năm thì là: 99; tháng thì là: 12 Cũng theo nguyên tắc đó ta

cũng cần thay đổi giá trị gán cho từng biến thời gian

Trang 12

http://www.ebook.edu.vn 12

Đợi 50ms

TIME_SET nhấn?

Trở về

Tắt bộ ngắt Đợi cho nút nhả ra Định vị trí giờ Bật và nhấp nháy con trỏ

TIME_SET nhấn?

Hiệu chỉnh

phút

TURN_UP nhấn?

Đợi 50ms

TURN_UP nhấn?

TURN_DOWN nhấn?

Đợi 50ms

TURN_DOWN nhấn?

RAM_HOU

= 23?

GIẢM RAM_HOU

- Đối với phần hiệu chỉnh ngày thì công việc phức tạp hơn Ta cần kiểm tra tháng trước

Nếu là tháng 4, 6, 9, 11 thì maxngay là 30 Đối với tháng 2 thì phải xét thêm năm Nếu năm chia

hết cho 4 thì maxngay la 29 ngược lại là 28 òn lại là: 31 ngày Như vậy công việc cần làm duy

nhất là xác định giá trị maxngay Î Chương trình tim max ngay

Trang 13

B.2.1.12) CHUONG TRINH CON TIM_MAXNGAY

Cách thực hiện: đầu tiên xét giá trị của tháng Nếu tháng là 4 6 9 11 thì maxngay là 30

Nếu tháng là 2 thì ta xét đến năm Phương pháp xét năm nhuần như sau Đưa năm về dạng BIN,

sau đó kiểm tra 2 trọng số thấp nhất của giá trị năm đó Nếu cả 2 trọng số đó đều bằng 0 thì năm

đó là năm nhuần Vì tất cả dữ liệu thời gian đều lưu dưới dạng BCD nén, ta dung thuật toán để

chuyển lại bin nhưng để ý là ta đã tách BCD nén được thành BCD không nén Ta chỉ cần cộng

thêm MSB lần số 10 và LSB là ta đã có số BIN

MACH IN

Trang 14

; DE TAI: DUNG PIC 16F887A TAO LICH VAN NIEN KY THUAT SO XUAT RA LCD 16X2

; NGUOI THUC HIEN: NGUYEN DUC TRI

; NGAY HOAN THANH: 30/10/2009

; -

; GIAO VIEN HUONG DAN: NGUYEN QUYNH ANH

; NGAY KIEM TRA: //2009

; -

;VERSION 1.1:

; KHOI DEM THOI GIAN: DUNG DS12C887(RTC)

; KHOI XU LY: PIC 16F877A

; KHOI HIEN THI: LCD 16X2

; KHOI DIEU KHIEN: BUTTON 3 NUT

Trang 15

#DEFINE TIME_SET PORTB,2

#DEFINE TURN_UP PORTB,5

#DEFINE TURN_DOWN PORTB,4

#DEFINE DATAPORT PORTD

#DEFINE PORT_LCD PORTC

#DEFINE RS PORTC,6

; -

ORG 0X0004 ; NGAT NGOAI THEO XUNG CLK CUA DS1307 DE XAC DINH

THOI GIAN TRUY XUAT DU LIEU TRONG DS1307

NGAT

; -

; PHAN LUU LAI CAC GIA TRI VI KHI NGAT RAT CO THE CAC GIA TRI TREN SE BI THAY DOI

MOVLW W_SAVE ; LUU W RA THANH GHI NGOAI MOVF STATUS,W ; DOI DO W VA STATUS MOVLW STATUS_SAVE ; LUU W LUC DO DANG CHUA GIA TRI STATUS

; PHAN BAT DAU CHUONG TRINH NGAT

BTFSS INTCON,1 ; BIT KIEM TRA COI CO XAY RA NGAT BR0 GOTO NEXT_INTERRUPT; NEU GIA TRI CUA HAM SS TREN TRA VE O (KO CO NGAT RB0) THI THUC HIEN NGAT TIEP THEO

BTFSC DATA_R,7 ; Du lieu da san sang de truy xuat??

GOTO VONGLAP ; neu chua, Doi CALL UPDATE ; neu roi, cap nhat gia tri moi

Trang 17

MOVLW b'01011010' ; dua gia tri vao thanh ghi "register B"

MOVWF DATA_W ; dang du lieu 24 gio

MOVLW d'11' ; dang du lieu BCD

Trang 18

WRITE_12C887 ; GHI DU LIEU VAO RTC

BSF STATUS,RP0 ; CHON PORTD LA PORTOUT

READ_12C887 ; DOC DU LIEU TU RTC

BSF STATUS,RP0 ; CHON PORTD OUT

Trang 19

TRANSFER_LCD ; CHUYEN CAC GIA TRI THOI GIAN VAO LCD

;Y TUONG LA CHI NHUNG GIA TRI NAO THAY DOI THI MOI DUOC CAP NHAT LEN LCD

;THUC HIEN: KT GIA TRI DAU CUA MOI MUC THOI GIAN, NEU GIA TRI THANH GHI THOI GIAN

;BANG VOI GIA TRI BAN DAU (O HAY 1) THI SE DUOC QUET TIEP DEN TH TIEP THEO

Ngày đăng: 15/11/2015, 15:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w