Tải bản đầy đủ (.pdf) (41 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (460.15 KB, 41 trang )

LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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


1



LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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.

KHỐI HIỂN THỊ
LCD 16x2

KHỐI ĐIỀU KHIỂN
PIC 16F877A
KHỐI THỜI GIAN THỰC


KHỐI HIỆU CHỈNH

IC DS12C887

NÚT BẤM

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


2


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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.



3


LỊCH VẠN NIÊN DÙNG PIC 16F877A




NGUYỄN ĐỨC TRÍ-DV06

4


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

B.2) CHƯƠNG TRÌNH ĐIỀU KHIỂN
B.2.1) Thuật tốn
B.2.1.1) CHUONG TRINH CHINH

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

Khởi động các port:
D,E: output
B: Input
Gọi: -INIT_LCD: khởi tạo LCD
-INIT_DS12C887: khởi tạo

Gọi: -UPDATE: Dữ liệu vào VDK
-INIT_TRANSFER

Bật bộ ngắt ngoài RB0/INT

TIME_SET

S


Có nhấn?
Đ
Gọi: -HIEUCHINHGIO:
bắt đầu nhập thời gian

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



5


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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
Port C: output

Phát lệnh 0x01:
CLR màn hình


Kết thúc

Phát lệnh RESET 3
lần.( Mỗi lần Delay

Phát lệnh 0x0C: bật

160US để chắc chắn

hiển thò tắt con trỏ

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

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

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

lập chế độ truyền

lập chế độ 2 dòng

4bits

5x7

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.



6


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

Löu vaøo ADD_W ñòa chæ thanh ghi A

Löu vaøo giaù trò 28H
vaøo thanh ghi A

Goïi: CT
WRITE_12C887

Löu vaøo ADD_W ñòa chæ thanh ghi B

Löu vaøo giaù trò 5AH
vaøo thanh ghi B


Goïi: CT
WRITE_12C887

Kết thúc

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).



7


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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

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.



8


LỊCH VẠN NIÊN DÙNG PIC 16F877A


NGUYỄN ĐỨC TRÍ-DV06

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
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

Kết thúc

Thiết lập AS mức cao

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 đọ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

Kết thúc

Thiết lập AS mức cao

Lấy dữ liệu từ DATA_PORT
ra thanh ghi W


9


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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.

RAM_SEC

=0?

Gọi: GIAY_DOI

RAM_MIN
=0?

Gọi: PHUT_DOI

RAM_HOU
=0?

Gọi: GIO_DOI

RAM_DAT
=1?

Gọi: NGAY_DOI

RAM_MON
=0?

Gọi: THANG_DOI

RAM_YEA
=0?

Gọi: NAM_DOI

Kết thúc


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.


10


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

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.


11


LỊCH VẠN NIÊN DÙNG PIC 16F877A


NGUYỄN ĐỨC TRÍ-DV06

- Đố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
Đợi 50ms

Trở về

S

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

Hiệu chỉnh
phút

Đ

TIME_SET
nhấn?
S
TURN_UP
nhấn?


S

Đ

Đ

Đ
Đợi 50ms

Đợi 50ms

TURN_UP
nhấn?

TURN_DOWN
nhấn?

S
XÓA
RAM_HOU

Đ

TURN_DOWN
nhấn?

Đ

S


RAM_HOU
= 23?

RAM_HOU
= 23?
S

TĂNG
RAM_HOU

Xuất ra LCD


Đ

RAM_HOU
= 23

S
GIẢM
RAM_HOU

12


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06


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



13


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

B.2.2) CHUONG TRINH ASM
; DO AN MON HOC 1 - DV06
; FILE NAME: DAMH1SS.asm
; VERSION:1.1
; 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
;------------------------------------------------------------------------PROCESSOR
16f877a
INCLUDE

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF &
_CPD_OFF
;-------------------------------------------DATA_R EQU
0X20
ADD_R
EQU
0X21
RAM_SEC
EQU
0x22
RAM_MIN
EQU
0x23
RAM_HOU
EQU
0x24
RAM_DAY
EQU
0x25
RAM_DAT
EQU
0x26
RAM_MON
EQU

0x27
RAM_YEA
EQU
0x28
W_SAVE
EQU
0x29
STATUS_SAVE EQU
0x2A
PCLATH_SAVE EQU
0x2B
FSR_SAVE
EQU
0x2C
DELAY_REG1
EQU
0X2D
DELAY_REG2
EQU
0X2E
DELAY_REG3
EQU
0X2F
HCHUC
EQU
0X30
HDV
EQU
0X31
MSB

EQU
0X32
LSB
EQU
0X33
DATA_W
EQU
0X34
ADD_W
EQU
0X35
TAM
EQU
0X36
MAXNGAY
EQU
0X37



14


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

COUNT
EQU
0X38

;----------------------------------------------#DEFINE
DS
PORTE,2
#DEFINE
RW
PORTE,1
#DEFINE
AS
PORTE,0
#DEFINE
TIME_SET
PORTB,2
#DEFINE
TURN_UP
PORTB,5
#DEFINE
TURN_DOWN
PORTB,4
#DEFINE
DATAPORT
PORTD
#DEFINE
PORT_LCD
PORTC
#DEFINE
E
PORTC,7
#DEFINE
RS
PORTC,6

;----------------------------------------------ORG
0X0004
; NGAT NGOAI THEO XUNG CLK CUA DS1307 DE XAC DINH
THOI GIAN TRUY XUAT DU LIEU TRONG DS1307
GOTO NGAT
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
MOVF PCLATH,W
MOVLW PCLATH_SAVE ; LUU PCLATH RA NGOAI
MOVF FSR,W
; DOI CHO
MOVLW FSR_SAVE
; LUU FSR RA NGOAI
;--------------------------------; 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
BANKSEL TAM
INCF
TAM
MOVLW D'2'
XORWF TAM,0
BTFSS STATUS,Z
GOTO NEXT_INTERRUPT

VONGLAP
BCF
STATUS,RP0
CLRF
TAM
MOVLW
d'10'
MOVWF
ADD_R
CALL
READ_12C887
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
CALL
TRANSFER_LCD



15


LỊCH VẠN NIÊN DÙNG PIC 16F877A
GOTO

NGUYỄN ĐỨC TRÍ-DV06


NEXT_INTERRUPT

NEXT_INTERRUPT
BCF
INTCON,1
; XOA CO NGAT RB0 DE KHOI DONG NGAT TIEP THEO
;--------------------------------;PHAN KHOI PHUC LAI CAC DU LIEU TRONG THANH GHI
MOVF
PCLATH_SAVE,W
MOVLW
PCLATH
MOVF
STATUS_SAVE,W
MOVLW
STATUS
MOVF
FSR_SAVE,W
MOVLW
FSR
MOVF
W_SAVE,W
RETFIE
;---------------------------------------;THAN CHUONG TRINH CHINH
ORG 0X00
GOTO START
ORG 0X40
START
BANKSEL
INTCON
CLRF

INTCON
; XOA THANH DIEU KHIEN NGAT
BANKSEL
TAM
CLRF
TAM
CALL DELAY_15MS
BSF
STATUS,RP0 ; select BANK1
MOVLW
0x06 ; tat ca cac chan I/O deu la dang so
MOVWF
ADCON1
CLRF
TRISD
CLRF
TRISE
CALL
INIT_12C887
CALL
INIT_LCD
;-----------------------------------------------CALL
UPDATE
CALL
INIT_TRANSFER
BCF
STATUS,RP1
BSF
STATUS,RP0
MOVLW

B'11111111'
;KHOI TAO PORT B NHAP
BANKSEL
TRISB
BANKSEL
OPTION_REG
BCF
OPTION_REG,6
BANKSEL
INTCON
BSF
INTCON,INTE
; BAT BIT DK NGAT NGOAI
BSF
INTCON,PEIE
; BAT BIT DK NGAT NGOAI
BSF
INTCON,GIE
; BAT BIT DK NGAT TOAN CUC
BTFSS
TIME_SET
CALL
HIEUCHINHGIO



16


LỊCH VẠN NIÊN DÙNG PIC 16F877A


NGUYỄN ĐỨC TRÍ-DV06

GOTO
$-2
;-------------------------------------------------------------; KHOI TAO CHO 12C887
;------------------------------------------------------------INIT_12C887
BCF
STATUS,RP0
MOVLW
b'00101111' ; dua gia tri vao thanh ghi "register A"
MOVWF
DATA_W
MOVLW
d'10'
MOVWF
ADD_W
CALL
WRITE_12C887
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
MOVWF
ADD_W
CALL

WRITE_12C887
RETLW 0X00
;---------------------------------------------UPDATE
; CHUONG TRINH DUNG DE UPDATE DU LIEU VAO RAM PIC DE XUAT LCD.
MOVLW
MOVWF
CALL
MOVF
MOVWF

D'00'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY
DATA_R,0
; CHUYEN VAO VAO RAM_SEC
RAM_SEC

MOVLW
MOVWF
CALL
MOVF
MOVWF

D'02'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY
DATA_R,0
; CHUYEN VAO VAO MIN
RAM_MIN


MOVLW
MOVWF
CALL
MOVF
MOVWF

D'04'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY
DATA_R,0
; CHUYEN VAO VAO HOU
RAM_HOU

MOVLW
MOVWF
CALL
MOVF
MOVWF

D'06'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY
DATA_R,0
; CHUYEN VAO VAO THU
RAM_DAY

MOVLW
MOVWF
CALL


D'07'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY



17


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

MOVF
MOVWF

DATA_R,0
RAM_DAT

; CHUYEN VAO VAO NGAY

MOVLW
MOVWF
CALL
MOVF
MOVWF

D'08'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY

DATA_R,0
; CHUYEN VAO VAO THANG
RAM_MON

MOVLW
MOVWF
CALL
MOVF
MOVWF
RETLW

D'09'
ADD_R ; CHUYEN DIA CHI THANH GHI CHU GT GIAY
READ_12C887 ; DOC GIA TRI GIAY
DATA_R,0
; CHUYEN VAO VAO NAM
RAM_YEA
0X00

;-----------------------------------------------------------------WRITE_12C887 ; GHI DU LIEU VAO RTC
BSF
STATUS,RP0
; CHON PORTD LA PORTOUT
CLRF
TRISD
BCF
STATUS,RP0
MOVF
ADD_W,0
; CHUYEN DIA CHI RA TRUOC

MOVWF
DATAPORT
BSF
DS
BSF
RW
NOP
BSF
AS
NOP
BCF
AS
NOP
MOVF
DATA_W,0
; CHUYEN DATA RA SAU
MOVWF
DATAPORT
BCF
RW
NOP
BSF
AS
RETLW
0X00
;--------------------------------------------------------------------------------------------------READ_12C887
; DOC DU LIEU TU RTC
BSF
STATUS,RP0
; CHON PORTD OUT

CLRF
TRISD
BCF
STATUS,RP0
MOVF
ADD_R,0
; CHUYEN DC DU LIEU CAN DOC
MOVWF
DATAPORT
BSF
DS
BSF
RW
NOP
BSF
AS



18


LỊCH VẠN NIÊN DÙNG PIC 16F877A
NOP
BCF
NOP
BCF
NOP
BSF
MOVLW

MOVWF
BCF
MOVF
MOVWF
BSF
RETLW 0X00

NGUYỄN ĐỨC TRÍ-DV06

AS
DS
STATUS,RP0
0xFF
; THIET LAP PORTC IN
TRISD
STATUS,RP0
DATAPORT,0
;CHUYEN DU LIEU RA SAU
DATA_R
AS

;---------------------------------------------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
;-----------------------BCF
STATUS,RP0
MOVLW
D'0'
XORWF

RAM_SEC,0
BTFSS
STATUS,Z
GOTO
GIAY_DOI1
;NEU GIAY KHAC 0 THI CHI DOI GIAY
BCF
MOVLW
XORWF
BTFSS
GOTO

STATUS,RP0
D'0'
RAM_MIN,0
STATUS,Z
PHUT_DOI1

BCF
MOVLW
XORWF
BTFSS
GOTO

STATUS,RP0
D'0'
RAM_HOU,0
STATUS,Z
GIO_DOI1


BCF
MOVLW
XORWF
BTFSS
GOTO

STATUS,RP0
D'1'
RAM_DAT,0
STATUS,Z
NGAY_DOI1

BCF
MOVLW
XORWF

STATUS,RP0
D'1'
RAM_MON,0

;NEU GIAY = 0 THI PHUT DOI



19


LỊCH VẠN NIÊN DÙNG PIC 16F877A
BTFSS
GOTO


STATUS,Z
THANG_DOI1

BCF
MOVLW
XORWF
BTFSS
GOTO

STATUS,RP0
D'1'
RAM_YEA,0
STATUS,Z
NAM_DOI1

CALL
GOTO

GIAY_DOI
KETTHUC

CALL
GOTO

PHUT_DOI
KETTHUC

CALL
GOTO


GIO_DOI
KETTHUC

CALL
GOTO

NGAY_DOI
KETTHUC

CALL
GOTO

THANG_DOI
KETTHUC

CALL

NAM_DOI

RETLW

0X00

NGUYỄN ĐỨC TRÍ-DV06

GIAY_DOI1:

PHUT_DOI1:


GIO_DOI1:

NGAY_DOI1:

THANG_DOI1:

NAM_DOI1:

KETTHUC

;--------------------------------------NAM_DOI
CALL
MOVLW
CALL
MOVLW
CALL
MOVLW
CALL
MOVF
CALL
RETLW 0X00
;----------------------------------THANG_DOI
CALL

THANG_DOI
0X2F
WR_DATA
0X32
WR_DATA


; DAU GACH CHEO

0X30
WR_DATA
RAM_YEA,0
MA_HOA_SO

; GUI GIA TRI YEAR RA LCD

NGAY_DOI



20


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

MOVLW
0X2F
; DAU GACH CHEO
CALL
WR_DATA
MOVF
RAM_MON,0
; GUI GIA TRI MONTH RA LCD
CALL
MA_HOA_SO

RETLW 0X00
;---------------------------------NGAY_DOI
CALL
GIO_DOI
CALL
DVI_NGAY
MOVF
RAM_DAT,0
; GUI GIA TRI DATE RA LCD
CALL
MA_HOA_SO
RETLW 0X00
;--------------------------------------------------GIO_DOI
CALL
DVI_GIO
MOVF
RAM_HOU,0
; GUI GIA TRI SECOND RA LCD
CALL
MA_HOA_SO
MOVLW
0X3A
; DAU HAI CHAM
CALL
WR_DATA
MOVF
RAM_MIN,0
; GUI GIA TRI MIN RA LCD
CALL
MA_HOA_SO

MOVLW 0X3A
; DAU HAI CHAM
CALL
WR_DATA
MOVF RAM_SEC,0
; GUI GIA TRI HOUR RA LCD
CALL
MA_HOA_SO
RETLW 0X00
;-------------------------------------------------PHUT_DOI
CALL
DVI_PHUT
MOVF
RAM_MIN,0
; GUI GIA TRI MIN RA LCD
CALL
MA_HOA_SO
MOVLW
0X3A
; DAU HAI CHAM
CALL
WR_DATA
MOVF
RAM_SEC,0
; GUI GIA TRI HOUR RA LCD
CALL
MA_HOA_SO
RETLW 0X00
;-------------------------------------------------GIAY_DOI
; CHUONG TRINH XUAT LCD CHI GIAY THAY DOI

CALL
DVI_GIAY
MOVF
RAM_SEC,0
; GUI GIA TRI HOUR RA LCD
CALL
MA_HOA_SO
RETLW 0X00
;-----------------------------------------------INIT_TRANSFER
MOVLW
0X80 ; EP CON TRO VE DAU DONG 1
CALL
WR_INS
MOVLW
0X14
;DICH CON TRO QUA BEN PHAI



21


LỊCH VẠN NIÊN DÙNG PIC 16F877A
CALL
MOVLW
CALL
MOVF
CALL
MOVLW
CALL

MOVF
CALL
MOVLW
CALL
MOVF
CALL
MOVLW
CALL
MOVLW
CALL
MOVF
CALL
MOVLW
CALL
MOVF
CALL
MOVLW
CALL
MOVLW
CALL
MOVLW
CALL
MOVF
CALL
RETLW 0X00

NGUYỄN ĐỨC TRÍ-DV06

WR_INS ;GUI LENH DI
0X14

;DICH CON TRO QUA BEN PHAI
WR_INS ;GUI LENH DI
RAM_HOU,0
; GUI GIA TRI SECOND RA LCD
MA_HOA_SO
0X3A
; DAU HAI CHAM
WR_DATA
RAM_MIN,0
; GUI GIA TRI MIN RA LCD
MA_HOA_SO
0X3A
; DAU HAI CHAM
WR_DATA
RAM_SEC,0
; GUI GIA TRI HOUR RA LCD
MA_HOA_SO
0XC0
;
EM CON TRO VE DONG DONG THU 2
WR_INS ;
GUI LENH DI
0X14
WR_INS
RAM_DAT,0
; GUI GIA TRI DATE RA LCD
MA_HOA_SO
0X2F
; DAU GACH CHEO
WR_DATA

RAM_MON,0
; GUI GIA TRI MONTH RA LCD
MA_HOA_SO
0X2F
; DAU GACH CHEO
WR_DATA
0X32
WR_DATA
0X30
WR_DATA
RAM_YEA,0
; GUI GIA TRI YEAR RA LCD
MA_HOA_SO

;----------------------------------------------MA_HOA_SO
;
IN:W
OUT:LCD
CALL
TACHSO ; TACH THANH CHUC VA DON VI
MOVF
HCHUC,W
ADDLW
0X30
CALL
WR_DATA
MOVF
HDV,W
ADDLW
0X30

CALL
WR_DATA
RETLW 0X00
;------------------------------------------------INIT_LCD
;CHUONG TRINH KHOI DONG LCD
BANKSEL
TRISD
; KHOI TAO PORT C XUAT LCD
MOVLW
B'00000000'



22


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

MOVWF
TRISC
BANKSEL
PORT_LCD
MOVLW
0X00
NOP
NOP
MOVWF
PORT_LCD

;------------KHOI DONG LCD
BSF
E
;PHAT LENH RONG DAU TIEN
BCF
E
MOVLW
b'00000011' ;PHAT LENH RESET 3 LAN
MOVWF
PORT_LCD
CALL
DELAY_160US
;DELAY DE DOI CAC CHAN PROT D NHAN DU DU LIEU
BSF
E
BCF
E
CALL
DELAY_5MS
; DOI LCD NHAN XONG
MOVLW
b'00000011'
MOVWF
PORT_LCD
CALL
DELAY_160US
BSF
E
BCF
E

CALL
DELAY_160US ; DOI LCD NHAN XONG
MOVLW
b'00000011'
MOVWF
PORTB
CALL
DELAY_160US
BSF
E
; Send 4 bits
BCF
E
;---------------TRUYEN LENH KHOI DONG
MOVLW
b'00000010'
; DAT CHE DO TRUYEN 4 BIT
MOVWF
PORT_LCD
CALL
DELAY_160US
BSF
E
BCF
E
CALL
DELAY_160US
MOVLW
0X28 ; THIET LAP GUI NHAN 4 BIT; 2DONG 5X7
CALL

WR_INS
MOVLW
0X0C ; BAT HIEN THI TAT CON TRO
CALL
WR_INS
MOVLW
0X06 ;EP CON TRO VE DAU DONG 1
CALL
WR_INS
MOVLW
0X01 ; CLR MAN HINH
CALL
WR_INS
RETLW 0X00
;--------------------------------------WR_INS: ; CT CON XUAT LENH RA LCD IN:W
CALL
CHANGE_NIBLE ; CT CON DUNG TACH TRONG SO CAO RA PORTD
MOVF MSB,W
MOVWF PORT_LCD



23


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

CALL

DELAY_160US ; Send 4 bits MSB
BSF
E
; SET BIT EN CHO TRUYEN NHAN
BCF E
CALL DELAY_5MS
MOVF LSB,W
; SEND 4 BIT LSB
MOVWF PORT_LCD
CALL
DELAY_160US
BSF
E
BCF
E
CALL DELAY_5MS
RETLW
0X00
;-----------------------------------WR_DATA: ; IN:W
CALL
CHANGE_NIBLE ; CT CON DUNG TACH TRONG SO CAO RA PORTD
MOVF MSB,0
MOVWF PORT_LCD
; Send 4 bits MSB
CALL
DELAY_160US
BSF
RS
; BAT CO PHAT DU LIEU
BSF

E
; BAT CO EN
BCF E
CALL DELAY_160US
MOVF LSB,0
MOVWF PORT_LCD
; Send 4 bits LSB
CALL
DELAY_160US
BSF
RS
BSF
E
BCF
E
BCF
RS
CALL DELAY_160US
RETLW 0X00
;-----------------------------------------;CHUONG TRINH DUOI DAY DE DK THOI GIAN TRUOC MAT LA KHOI TAO PORTB
HIEUCHINHGIO ;HIEU CHINH PHAN GIO
banksel PORTB
CALL
DELAY_50MS
BANKSEL
PORTB
BTFSC TIME_SET
; KIEM TRA CON NUT CON NHAN?
RETURN
BANKSEL

INTCON
BCF
INTCON,INTE
; BAT BIT DK NGAT NGOAI
CALL
WAIT
; DOI CHO NUT NAT NHA RA
HIENTHILCD1
;DINH VI TRI LCD:
CALL
DVI_GIO
MOVLW 0X14
;DICH CON TRO QUA BEN PHAI
CALL
WR_INS ;GUI LENH DI
MOVLW 0X0F
; BAT CHE DO NHAP NHAY CON TRO



24


LỊCH VẠN NIÊN DÙNG PIC 16F877A

NGUYỄN ĐỨC TRÍ-DV06

CALL
WR_INS
;KIEM TRA COI SET_TIME CON DUOC BAM KHONG?

;NEU BAM THEM 1 LAN NUA=>HIEUCHINHPHUT
;NEU KHONG: CHUYEN DEN KT NUT TURN_UP
LABEL1:
BANKSEL
PORTB
BTFSS TIME_SET
; KIEM TRA CON NUT CON NHAN?
GOTO HIEUCHINHPHUT
BTFSC TURN_UP
; KIEM TRA CON NUT TANG CO NHAN
GOTO CHINHXUONG1
CALL
BTFSC
GOTO
BCF
MOVF
XORLW
BTFSS
GOTO
CLRF
GOTO
CHUABANG23

XONG1

DELAY_50MS
TURN_UP
; KIEM TRA CON NUT CON NHAN?
LABEL1
STATUS,RP0

RAM_HOU,0
H'23'
STATUS,Z
;SO SANH HDV VOI 23
CHUABANG23 ; NEU CHUA BANG 23
RAM_HOU
; NEU BANG THI XOA VE 00
XONG1
; KHOI NAY THUC HIEN CHUC NANG TANG SO
MOVF RAM_HOU,0
CALL
XULY_TANG
MOVF HCHUC,0
MOVWF RAM_HOU
;XONG KHI TANG XONG CHUYEN RA LCD
CALL
INIT_TRANSFER
GOTO HIENTHILCD1
;TRO VE BAN DAU DE NHAN TIEP LENH TANG

CHINHXUONG1:
BTFSC
GOTO
CALL
BTFSC
GOTO

GIOKHAC0

TURN_DOWN

LABEL1
DELAY_50MS
TURN_DOWN
LABEL1

; KIEM TRA CON NUT TURN DOWN TANG CO NHAN

; KIEM TRA CON NUT CON NHAN?

BCF
STATUS,RP0
MOVF RAM_HOU,0
XORLW H'00'
BTFSS STATUS,Z
;SO SANH HDV VOI 00
GOTO GIOKHAC0
; NEU CHUA BANG 0
MOVLW 0X23
MOVWF RAM_HOU
GOTO XONG1
; KHOI NAY THUC HIEN CHUC NANG GIAM SO
MOVF RAM_HOU,0



25


×