Đề tài Đồng hồ hiển thị thời gian thực trên LCD có hẹn giờ

LỜI NÓI ÐẦU 2

CHÝÕNG I: GIỚI THIỆU ÐỀ TÀI 2

1.1. Giới thiệu 2

1.2. Sõ ðồ khối 2

1.3. Chức nãng các khối 2

CHÝÕNG II: GIỚI THIỆU PHẦN CỨNG 2

2.1. Sõ ðồ mạch 2

2.2. Giới thiệu về các linh kiện trong mạch 2

2.2.1. Giới thiệu chung về vi ðiều khiển AT98C51 2

2.2.2. LCD 2

2.2.3. IC thời gian thực DS1307 2

CHÝÕNG III: THIẾT KẾ CHÝÕNG TRÌNH 2

1.1. Mạch mô phỏng 2

1.2. Thuật toán 2

3.2. Chýõng trình 2

TỔNG KẾT 2

TÀI LIỆU THAM KHẢO 2

 

 

 

 

 

 

 

 

 

docx58 trang | Chia sẻ: lethao | Lượt xem: 3302 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Đồng hồ hiển thị thời gian thực trên LCD có hẹn giờ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ợc lấy làm chân cấp nguồn 12V lập trình cho ROM. RST (chân 9): Cho phép reset AT89C51 khi ngõ vào tín hiệu đưa lên mức “1” trong ít nhất là 2 chu kỳ máy. X1,X2(Chân 18.19): Ngõ vào và ngõ ra bộ dao động, khi sử dụng có thể chỉ cần kết nối thêm thạch anh và các tụ như hình vẽ trong sơ đồ. Tần số thạch anh thường sử dụng cho AT89C51 là 12Mhz. Hình 2.6: Sơ đồ kết nối thạch anh 2.2.2. LCD Cấu trúc cơ bản của LCD: + Cấu Tạo: Tính chất quang học của các tinh thể lỏng chúng được sử dụng trong các hiển thị LCD (Liquid Crystal Display) .Các tinh thể bình thường chúng ở thể rắn với sự định hướng đặc biệt . Tuy nhiên ở đây các thẻ lỏng được cấu trúc từ các tinh thể động. Các tinh thể này có thể điều chỉnh bởi một điện trường đây là một cách để điều khiển chất lỏng thay đổi từ trong suốt đến trạng thái mờ đục(Chắn sáng). Sơ đồ cấu trúc cơ bản của LCD như hình dưới: Hình 2.7: Sơ đồ cấu trúc của LCD + Nguyên Lý: Tinh thể lỏng thì được chứa giữa hai tấm thủy tinh.Các điện cực chúng được làm bay hơi và nắng đọng lên bên trong của các tấm thủy tinh,các điện cực thì được cách li bởi tinh thể lỏng.Các tấm lọc phân cực sáng thì nằm bên ngoài trên tấm thủy tinh.Có thể phụ thuộc vào vị trí của mặt phẳng phân cực ,mà ánh sáng tới đi qua các điện cực có thể lọt qua tế bào hoặc không.Tương ứng với mặt phẳng phân cực, tế bào không được điều khiển xuất hiện hoàn toàn sáng hoặc tối.Ngày nay,hiển thị LCD được chế tạo chủ yếu là sáng khi không có điều khiển.Để hiển thị các hệ thống chữ số hoặc ma trận điểm,thì các điện cực phải được chế tạo theo dạng như vậy. Nếu một điện áp được cung cấp cho các điện cực và một điện trường sẽ được tạo ra giữa các điện cực ,các phân tử của tinh thể lỏng được điều chỉnh .Những ảnh tối tương ứng với hình dạng của điện cực được tạo ra trong trường hợp màn hình hoàn toàn trong suốt ,trong lúc đó những ảnh được tạo ra trong trường hợp màn hình hiển thị ở trạng thái cực mờ(chắn sáng:Ảnh trắng nền đen). Màn hình hiển thị LCD vì vậy không phát sáng, do đó một nguồn sáng bên ngoài thì luôn cần phải có. Với vấn đề chiếu sáng của màn hình LCD ,có 3 cách khác nhau: -Chế độ phản chiếu(Reflective Mode). Trong chế độ này ánh sáng được chiếu tới từ phía trước của màn hình qua các tấm lọc phân cực và điện cực rồi gặp đến gương(Mirror) phản xạ trở lại tạo nguồn sáng xuyên qua màn hình đến mắt người.Trong trường hợp này ánh sáng ban ngày hoặc ánh sáng trong phòng cũng đủ để làm nguồn sáng. -Chế độ xuyên thẳng(Transflective Mode). Trong chế độ này ánh sáng được chiếu từ phía trước và phía sau của màn hình để tăng hiệu quả chiếu sáng. Gương phản xạ được sử dụng ở đây là một lớp bán dẫn trong suốt chỉ cho ánh sáng từ phía sau đi qua và ánh sáng từ phía trước tới. -Chế độ truyền(Transmission Mode). Trong chế độ này ánh sáng được chiếu từ phía saucuar màn hình bằng một nguồn sáng nhân tạo có thẻ là một bóng đèn hoặc LED thậm chí là một miếng phát sáng đặc biệt. Tùy theo nhà sản xuất và loại LCD mà nguồn cung cấp từ 3 đến 15v. Chúng được mô tả như hình vẽ dưới đây: Hình 2.8: Các kiểu cấu trúc của màn hình LCD Chức năng các chân: Chân Tên Chức Năng 1 Vss Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với GND của mạch điều khiển 2 Vdd Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với Vcc=5V của mạch điều khiển 3 Vee Chân này dùng để điều chỉnh độ tương phản của LCD 4 RS Chân chọn thanh ghi (Register select). + Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read) + Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD. 5 RW Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với logic “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc. 6 E Chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E. + Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E. + Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low- to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp. 7 14 DB0- DB7 Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU. Có 2 chế độ sử dụng 8 đường bus này : + Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7. + Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7. 15,16 A,K Đèn của LCD 2.2.3. IC thời gian thực DS1307 Chức năng các chân: Hình 2.9: Sơ đồ chân DS1307 X1,X2: nối với thạch anh 32,768 kHz Vcc,GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào 5V. Khi 5V được cung cấp thì thiết bị có thể truy cập hoàn chỉnh và dữ liệu có thể đọc và viết. Khi pin 3V được nối tới thiết bị này và Vcc nhỏ hơn 1,25Vbat thì quá trình đọc và viết không được thực thi,tuy nhiên chức năng timekeeping không bị ảnh hưởng bởi điện áp vào thấp. Khi Vcc nhỏ hơn Vbat thì RAM và timekeeper sẽ được ngắt tới nguồn cung cấp trong (thường là nguồn 1 chiều 3V). Vbat: Đầu vào pin cho bất kỳ một chuẩn pin 3V. Điện áp pin phải được giữ trong khoảng từ 2,5 đến 3V để đảm bảo cho sự hoạt động của thiết bị. SDA(serial data input/out): là chân vào ra cho 2 đường dây nối tiếp. Chân SDA thiết kế theo kiểu cực máng hở , đòi hỏi phải có một điện trở kéo trong khi hoạt động. SCL(serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên đường dây nối tiếp SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được thiết lập, chân SQW/OUT phát đi 1 trong 4 tần số (1Hz, 4kHz, 8kHz, 32kHz). Chân này cũng được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một điện trở kéo trong. Chân này sẽ hoạt động khi cả Vcc và Vbat được cấp. Một vài thông số kỹ thuật: DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời gianvà ngày tháng với 56 bytes NV SRAM. Địa chỉ và dữliệu được truyền nối tiếp qua 2 đường bus 2 chiều. Nó cung cấp thông tin về giờ,phút,giây ,thứ,ngày ,tháng, năm. Ngày cuối tháng sẽ tự động được điều chỉnh với các tháng nhỏ hơn 31 ngày, bao gồm cả việc tự động nhảy năm. Đồng hồ có thể hoạt động ở dạng 24h hoặc 12h với chỉ thị AM/PM. DS1307 có một mạch cảm biến điện áp dùng để dò các điện áp lỗi và tự động đóng ngắt với nguồn pin cung cấp. DS 1307 hoạt động với vai trò slave trên đường bus nối tiếp. Việc truy cập được thi hành với chỉ thị START và một mã thiết bị nhất định được cung cấp bởi địa chỉ các thanh ghi. Tiếp theo đó các thanh ghi sẽ được truy cập liên tục đến khi chỉ thị STOP được thực thi. Sơ đồ khối của DS1307: Hình 2.10: Sơ đồ khối của DS1307 Địa chỉ Ram và RTC: Thông tin về thời gian và ngày tháng được lấy ra bằng cách đọc các byte thanh ghi thích hợp. Thời gian và ngày tháng được thiết lập cũng thông qua các byte thanh ghi này bằng cách viết vào đó những giá trị thích hợp. nội dung của các thanh ghi dưới dạng mã BCD(binary coded decreaseimal). Bit 7 của thanh ghi seconds là bit clock halt(CH), khi bit này được thiết lập 1 thì dao động disable, khi nó được xoá về 0 thì dao động được enable. Bảng 2.2: Bảng địa chỉ RAM DS1307 có thể chạy ở chế độ 24h cũng như 12h. Bit thứ 6 của thanh ghi hours là bit chọn chế độ 24h hoặc 12h. khi bit này ở mức cao thì chế độ 12h được chọn. ở chế độ 12h thì bit 5 là bit AM/PM với mức cao là là PM. ở chế độ 24h thì bit 5 là bit chỉ 20h(từ 20h đến 23h). + OUT(output control): Bit này điều khiển mức ra của chân SQW/OUT khi đầu raxung vuông bị cấm. Nếu SQWE=0 thì mức logic ở chân SQW/OUT sẽ là 1 nếu OUT=1,và =0 nếu OUT=0 + SQWE(square wave enable): Bit này được thiết lập 1 sẽ cho phép đầu ra của bộ tạo dao động. Tần số của đầu ra sóng vuông phụ thuộc vào giá trị của RS1 và RS0. Hoạt động: DS1307 hỗ trợ truyền dữ liệu bus 2 dây 2 chiều. Một thiết bị gửi dữ liệu lên đường truyền được định nghĩa như là 1 máy phát và một thiết bị nhận dữ liệu như là máy nhận. Thiết bị điều khiển thông điệp gọi là Master. Thiết bị được điều khiển bởi Master được gọi là Slaver. Đường truyền (Bus) phải được điều khiển bởi thiết bị master mà phát ra xung nối tiếp (Serial Clock_SCL) điều khiển sự truy cập đường truyền và phát ra điều kiện bắt đầu, dừng (Start ,Stop condition). DS1307 hoạt động như là Slave trên bus 2 dây. Hình 11: Cấc hình bus 2 dây điển hình Việc truyền dữ liệu chỉ có thể được bắt đầu khi bus không bận Trong lúc truyền dữ liệu, đường dữ liệu phải ổn định bất cứ khi nào đường Clock là cao (High). Do đó, các điều kiền về đường truyền sau được định nghĩa: Bus not busy:cả đường dữ liệu và xung đều ở mức cao (High) Start data transfer: một sự thay đổi trong trang thái của đường dữ liệu từ HIGH - LOW trong khi xung clock vẫn cao (H), đây là điều kiện bắt đầu (Start Condition). Stop data transfer: một sự thay đổi trong trang thái của đường dữ liệu từ LOW - HIGH trong khi xung clock vẫn cao (H), đây là điều kiện dừng (Stop Condition) . Data valid: trạng thái của đường dữ liệu biểu diễn dữ liệu hợp lệ khi mà : sau điều kiện Start đường dữ liệu ổn định trong khoảng thời gian chu kỳ cao (HIGH) của tín hiệu clock. Dữ liệu trên đường phải thay đổi trong chu kỳ thấp (LOW) của tín hiệu clock. Có 1 xung clock/ 1 bit dữ liệu. Mỗi dữ liệu truyền đi với điều kiện Start và kết thúc với điều kiện Stop. Số byte dữ liệu truyền giữa điều kiện Start và Stop là không giới hạn và được quyết định bởi thiết bị master. Sau khi một byte được truyền thì được báo nhận ở bộ thu với bit thứ 9. Acknowledge: Mỗi thiết bị nhận khi được định địa chỉ thì phải phát ra tín hiệu báo nhận sau khi nhận mỗi byte. Thiết bị master phải phat ra thêm 1 xung clock để ghép với bit báo nhận này. Thiết bị báo nhận phải kéo đường SDA xuống trong suốt xung clock báo nhận như là cách mà đường SDA ổn định thấp trong chu kỳ High của xung clock báo nhận. Dĩ nhiên, thời gian thiết lập và thời gian giữ (chờ) phải được tính toán đến. Master phải báo hiệu kết thúc dữ liệu đến Slave bằng cách không phát ra một bit báo nhận trên byte cuối cùng mà được ghi vào Slave. Trong trường hơp này, Slave phải để đường dữ liệu ở mức cao (H) để cho phép Master phát ra điều kiện STOP. Hai chế độ hoạt động của DS1307: DS1307 có thể hoạt động ở 2 chế độ sau: Chế độ slave nhận( chế độ DS1307 ghi):chuỗi dữ liệu và chuỗi xung clock sẽ được nhận thông qua SDA và SCL. Sau mỗi byte được nhận thì 1 bit acknowledge sẽ được truyền. các điều kiện START và STOP sẽ được nhận dạng khi bắt đầu và kết thúc một truyền 1 chuỗi. nhận dạng địa chỉ được thực hiện bởi phần cứng sau khi chấp nhận địa chỉ của slave và bit chiều. Byte địa chỉ là byte đầu tiên nhận được sau khi điều kiện START được phát ra từ master. Byte địa chỉ có chứa 7 bit địa chỉ của DS1307, là 1101000, tiếp theo đó là bit chiều (R/ w ) cho phép ghi khi nó bằng 0. sau khi nhận và giải mã byte địa chỉ thì thiết bị sẽ phát đi 1 tín hiệu acknowledge lên đường SDA. Sau khi DS1307 nhận dạng được địa chỉ và bit ghi thì master sẽ gửi một địa chỉ thanh ghi tới DS1307 , tạo ra một con trỏ thanh ghi trên DS1307 và master sẽ truyền từng byte dữ liệu cho DS1307 sau mỗi bit acknowledge nhận được. sau đó master sẽ truyền điều kiện STOP khi việc ghi hoàn thành. Chế độ slave phát ( chế độ DS1307 đọc): byte đầu tiên slave nhận được tương tự như chế độ slave ghi. Tuy nhiên trong chế độ này thì bit chiều lại chỉ chiều truyền ngược lại. Chuỗi dữ liệu được phát đi trên SDA bởi DS 1307 trong khi chuỗi xung clock vào chân SCL. Các điều kiện START và STOP được nhận dạng khi bắt đầu hoặc kết thúc truyền một chuỗi. byte địa chỉ nhận được đầu tiên khi master phát đi điều kiện START. Byte địa chỉ chứa 7 bit địa chỉ của slave và 1 bit chiều cho phép đọc là 1. sau khi nhận và giải mã byte địa chỉ thì thiết bị sẽ nhận 1 bit acknowledge trên đường SDA. Sau đó DS1307 bắt đầu gửi dữ liệu tới địa chỉ con trỏ thanh ghi thông qua con trỏ thanh ghi. nếu con trỏ thanh ghi không được viết vào trước khi chế độ đọc được thiết lập thì địa chỉ đầu tiên được đọc sẽ là địa chỉ cuối cùng chứa trong con trỏ thanh ghi. DS1307 sẽ nhận được một tín hiệu Not Acknowledge khi kết thúc quá trình đọc. CHƯƠNG III: THIẾT KẾ CHƯƠNG TRÌNH Mạch mô phỏng Thuật toán Đ S OUT_CMD A=[0] A=@A+DPTR A=END_SIG CMD DPTR++ RET S Đ Check BF RS=[0] RW=[1] LCD_PORT=#0FFH E=[1] E=[0] RET BF=[1] DTA E=[0] E=[1] RS=[1] RW=[0] LCD_PORT=A BF=[1] RET S Đ RS=[0] RW=[0] LCD_PORT=A E=[0] E=[1] BF=[1] RET CMD Đ S EX1ISR ALARM_FLAG A_RING=[0] ALARM_FLAG=[0] ALARM_PORT=[1] A_RING=[0]? ALARM OFF RET HEX_DEC B=[10H] A\B 70H=B B=[0AH] RET A.B A=A+70H STO_COND SDA=[0] SDA=[1] _2W_BUSY=[1] RET SCL_HIGH No Yes Đ SDA=[0] RET STA_COND _2W_BUSY=[1] ACK=[0] SDA=[1] SCL_HIGH HOLD SCL=[0] DELAY 5Oms PUSH ms TIMER 0,MODE 1 TH 0=#HIGH(50000) TL 0=#LOW(50000) TRO=[1] TRO=[0] TF0=[0] ms-- TF0=0? PUSH ms RET ms=0? No Yes No Yes Yes No Yes Yes Noo No A_Hour = Hour ? Yes _ A Min = Minute ? N DISP_RTC Đặt Vị Trí Con trỏ Hiển Thị Thời Gian Alarm_ON=1? A_Ring = 0 A_Ring = 1 RET A_Min = Minute? A_Hour = Hour? A&0FH A=A+[30H] A=A+[30H] POP ACC PUSH ACC A & OFH DTA DTA POP ACC RET DISP_VAL PUSL ACC SWAP A 2 1 4 3 1 4 3 2 Chương trình $include(reg51.inc) E bit p1.0 RW bit p1.1 RS bit p1.2 SCL bit p3.0 SDA bit p3.1 Time_Key bit p3.2 Alarm_Key bit p3.3 Down bit p3.4 Up bit p3.5 Alarm_Port bit p3.7 ;Noi den coi bip BF bit p2.7 Lcd_Port equ p2 Flag data 20h Last_Read bit Flag.0 Mode_12 bit Flag.1 Mode_AM bit Flag.2 Ack bit Flag.3 _2W_Busy bit Flag.4 OSC bit Flag.5 Time_flag bit Flag.6 Alarm_FLag bit Flag.7 Alarm_On bit 08h Alarm_ring bit 09h Byte_Count data 30h Second data 28h Minute data 29h Hour data 2Ah Day data 2bh Date data 2ch Month data 2dh Year data 2eh Sig data 2Fh A_hour data 50h A_Minute data 31h DS1307W equ 0D0h DS1307R equ 0D1h End_Sig equ 11010000b ;dau hieu bao ket thuc chuoi lenh ;hoac chuoi cac ki tu hien thi Mode8Bit equ 38h ;2 hang, ma tran 5x7 Disp_Off equ 08h ;Tat hien thi, DDR khong bi anh huong Disp_On equ 0Ch ;bat hien thi Cursor_On equ 0Eh ;Bat hien thi, bat con tro Disp_All equ 0Fh ;Bat hien thi, bat con tro, bat nhap nhay Clr_Disp equ 01h ;xoa DDR, AC=1, tat hien thi Cursor_Home equ 03h ;AC=0 ;============Thiet lap che do==================== Inc_Ctrl equ 06h ;Tang AC moi khi co hoat dong doc, ghi toi LCD Dec_Ctrl equ 04h ;Giam AC moi khi co hoat dong doc, ghi toi LCD L_Ctrl equ 07h ;Dich trai DDR moi khi co hoat dong doc, ; ghi toi LCD R_Ctrl equ 05h ;Dich phai DDR moi khi co hoat dong doc, ; ghi toi LCD ;========Dich con tro va hien thi==== L_Cur equ 10h ;Giam AC, dich con tro sang trai R_Cur equ 14h ;Tang AC, dich con tro sang phai L_Disp equ 18h ;Dich toan bo DDR, hien thi sang trai, ;con tro cung dich theo R_Disp equ 1Ch ;Dich toan bo DDR, hien thi ; sang phai, con tro cung dich theo Org 00h jmp Main Org 03h Setb Time_Flag ;Ngat ngoai 0, chinh gio reti Org 13h jmp EX1ISR ;----------CHUONG TRINH CHINH--------------------------- Org 30h Main: ; Chuong trinh chinh mov ie,#85h ;Cho phep ngat ngoai 0 va ngat ngoai 1 mov r2,#01h call delayms mov dptr,#Ready ;Khoi tao LCD, 8bit, bat hien thi call Out_Cmd mov dptr,#CGRAM call Out_Cg mov r2,#15 mov dptr,#Mes1 call Out_Str call delayms mov a,#0C1h call Cmd mov a,#01h call Cmd mov dptr,#Mes2 call Out_Str mov a,#0C1h call Cmd mov dptr,#Mes3 call Out_Str mov r2,#1 call Delayms mov a,#Clr_Disp call Cmd mov r2,#01h clr Time_Flag clr Alarm_Flag clr Alarm_ON clr Alarm_ring setb Alarm_Port mov a_hour,#00h mov a_Minute,#00h call Sta_Cond mov a,#DS1307W call Send mov a,#08h call send call Sto_Cond call Sta_cond mov a,#DS1307R call Send call recv call Sto_Cond cjne a,#'~',done sjmp Read_Clock done: mov a,#01h call Cmd mov Second,#00h mov Minute,#0 mov Hour,#10h mov day,#06h mov date,#12h mov month,#06h mov year,#09h mov sig,#'~' mov r1,#second mov r0,#00h kk: mov a,#DS1307W call Send mov a,r0 mov a,@r1 call Send inc r1 inc r0 call Sto_Cond cjne r0,#9,kk call Sto_Cond ;---Doc va hien thi dong ho--------------------------------------------- Read_Clock: mov r1,#28h ;bat dau cua vung nho tam ma doc duoc tu DS1307 mov byte_count,#00h ;dem so byte clr Last_Read call Sta_cond mov a,#DS1307W call Send mov a,#00h ;tro den thanh ghi 00h chua DS1307 call Send call Sto_cond call Sta_cond mov a,#DS1307R call Send Read_Loop: mov a,byte_count ;kiem tra xem phai byte cuoi cung chua cjne a,#07h,No_Last setb Last_Read No_Last: call Recv call Sto_Cond mov @r1,a mov a,byte_count cjne a,#00h,Not_First ;nhay neu khong phai dang doc ;thanh ghi dau tien clr OSC mov a,@r1 jnb acc.7,Not_First ;neu bit 7 la 1, co OSC=1 setb OSC clr ACC.7 mov @r1,a Not_First: inc r1 inc byte_count mov a,byte_count cjne a,#08h,Read_Loop call Sto_Cond call Disp_RTC jnb Time_Flag,Check2 clr EA clr Time_Flag call Set_time clr Time_Flag setb EA jmp Read_Clock Check2: jnb Alarm_Flag,Check3 clr Alarm_Flag setb Alarm_On call Set_Alarm jnb Alarm_on,Check3 mov dptr,#ready call Out_Cmd mov dptr,#D_A_ok call Out_STr mov a,#0C5h call Cmd mov a,a_Hour call Disp_Val mov a,#':' call Dta mov a,A_Minute call Disp_Val push 2 mov r2,#50 call Delayms pop 2 mov a,#01h call Cmd setb ea jmp Read_Clock Check3: ;kiem tra den gio hen thi do chuong jnb Alarm_Ring,aa call Alarm_Alarm aa: jmp Read_Clock EX1ISR: Setb Alarm_Flag ;Ngat ngoai 1, chinh gio jnb Alarm_ring,ii setb Alarm_port mov a,#01h call Cmd mov dptr,#D_No_Alarm call Out_Str mov r2,#50 call Delayms mov a,#01 call Cmd mov r2,#01 clr Alarm_on clr alarm_ring clr Alarm_Flag ii: reti ;----Cai dat thoi gian------------------------------------ Set_Time: call Bip jnb Time_Key,$ mov a,#Clr_Disp call Cmd mov r2,#01h mov dptr,#M_Set_Time call Out_Str mov r2,#50 call Delayms Set_Hour: mov a,#Clr_Disp call Cmd mov r2,#01h mov dptr,#M_Set_Hour call Out_Str mov a,#0C7h call Cmd mov a,hour anl a,#3Fh ;che do 24h mov r4,a call Disp_Val L_Set_hour1: mov a,#0c7h call cmd mov a,r4 ;lay so gio call hex_dec jb Up,Ch_Down_31 call Bip call De_bounce inc a cjne a,#24,Conti_31 mov a,#00 Conti_31: call Dec_Hex call Disp_Val mov r4,a jmp L_Set_Hour1 Ch_Down_31: ;kiem tra nhan phim DOWN jb Down,Ch_Time_key_31 call Bip call De_bounce dec a cjne a,#0FFh,Conti_31 ;Tiep tuc giam neu gio chua ve 0 mov a,#23 jmp Conti_31 Ch_Time_Key_31: jb Time_Key,Ch_Alarm_Key_31 call Bip call De_bounce call dec_hex ;dua tro ve lai ma BCD de dua vao thanh ghi mov Hour,a jmp Set_Minute Ch_Alarm_Key_31: jb Alarm_Key,L_Set_Hour1 call Bip call De_Bounce call dec_hex ;dua tro ve lai ma BCD de dua vao thanh ghi mov Hour,a jmp Set_Finish ;------------------ Set phut (minute) --------------------------------------------- Set_Minute: mov dptr,#Clear call Out_Cmd mov r2,#01h mov dptr,#M_Set_Minute call Out_Str mov a,#0c7h call Cmd mov a,Minute push acc call Disp_Val pop acc call Hex_Dec L_Set_Minute: push acc mov a,#0c7h call cmd pop acc jb up,Ch_Down_8 call Bip call De_bounce inc a cjne a,#60,Conti_8 mov a,#00 Conti_8: call Dec_Hex call Disp_Val call Hex_Dec jmp L_Set_Minute Ch_Down_8: jb Down,Ch_Time_Key_8 call Bip call De_bounce dec a cjne a,#0FFh,Conti_8 mov a,#59 jmp Conti_8 ;vi khi da nhan phim tang hoac giam ;thi deu hien thi giong nhau Ch_Time_Key_8: jb Time_Key,Ch_Alarm_Key_8 call Bip call De_Bounce call Dec_Hex mov Minute,a jmp Set_Second Ch_Alarm_Key_8: jb Alarm_Key,L_Set_Minute call Bip call De_bounce call Dec_Hex mov Minute,a jmp Set_Finish ;------- Set giay (Second) ---------------------------------------------------- Set_Second: mov dptr,#Clear call Out_Cmd mov r2,#01h mov dptr,#M_Set_Second call Out_Str mov a,#0c7h call Cmd mov a,Second push acc call Disp_Val pop acc call Hex_Dec L_Set_Second: push acc mov a,#0c7h call cmd pop acc jb up,Ch_Down_9 call Bip call De_bounce inc a cjne a,#60,Conti_9 mov a,#00 Conti_9: call Dec_Hex call Disp_Val call Hex_Dec jmp L_Set_Second Ch_Down_9: jb Down,Ch_Time_Key_9 call Bip call De_bounce dec a cjne a,#0FFh,Conti_9 mov a,#59 jmp Conti_9 Ch_Time_Key_9: jb Time_Key,Ch_Alarm_Key_9 call Bip call De_Bounce call Dec_Hex mov Second,a jmp Set_Day Ch_Alarm_Key_9: jb Alarm_Key,L_Set_Second call Bip call De_bounce call Dec_Hex mov Second,a jmp Set_Finish ;-------------------------Day (thu)------------------------------------------------ Set_Day: mov dptr,#Clear call Out_Cmd mov r2,#01h mov dptr,#M_Set_Day call Out_Str mov a,#0C5h call Cmd mov a,Day call Disp_Day L_Set_Day: Push acc mov a,#0C5h call Cmd pop acc jb Up,Ch_Down_4 call Bip call De_bounce inc a cjne a,#8,Conti_41 mov a,#01 Conti_41: call Disp_Day jmp L_Set_Day Ch_Down_4: jb Down,Ch_Time_Key_4 call Bip call De_Bounce dec a jnz Conti_42 ;Neu a #0 thi tiep tuc, con khong thi set a=7 mov a,#07 Conti_42: call Disp_Day jmp L_Set_Day Ch_Time_Key_4: jb Time_Key,Ch_Alarm_Key_4 call Bip call De_bounce call Dec_Hex mov Day,a jmp Set_date Ch_Alarm_Key_4: jb Alarm_Key,L_Set_Day call Bip call De_bounce call Dec_Hex mov Day,a jmp Set_Finish ;------- Set ngay (date) ---------------------------------------------------- Set_Date: mov dptr,#Clear call Out_Cmd mov r2,#01h mov dptr,#M_Set_Date call Out_Str mov a,#0c7h call Cmd mov a,date push acc call Disp_Val pop acc call Hex_Dec L_Set_Date: push acc mov a,#0c7h call cmd pop acc jb up,Ch_Down_5 call Bip call De_bounce inc a cjne a,#32,Conti_5 mov a,#1 Conti_5: call Dec_Hex call Disp_Val call Hex_Dec jmp L_Set_Date Ch_Down_5: jb Down,Ch_Time_Key_5 call Bip call De_bounce dec a jnz Conti_5 mov a,#31 jmp Conti_5 ;vi khi da nhan phim tang hoac giam thi deu ;hien thi giong nhau Ch_Time_Key_5: jb Time_Key,Ch_Alarm_Key_5 call Bip call De_Bounce call Dec_hex mov Date,a jmp Set_month Ch_Alarm_Key_5: jb Alarm_Key,L_Set_Date call Bip call De_bounce call Dec_hex mov Date,a jmp Set_Finish ;---------------------- Set thang (month)---------------------------------- Set_Month: mov dptr,#Clear call Out_Cmd mov r2,#01h mov dptr,#M_Set_Month call Out_Str mov a,#0c7h call Cmd mov a,Month push acc call Disp_Val pop acc call Hex_Dec L_Set_Month: push acc mov a,#0c7h call cmd pop acc jb up,Ch_Down_6 call Bip call De_bounce inc a cjne a,#13,Conti_6 mov a,#1 Conti_6: call Dec_Hex call Disp_Val call Hex_Dec jmp L_Set_month Ch_Down_6: jb Down,Ch_Time_Key_6 call Bip call De_bounce dec a jnz Conti_6 mov a,#12 jmp Conti_6 ;vi khi da nhan phim tang hoac giam ; thi deu hien thi giong nhau Ch_Time_Key_6: jb Time_Key,Ch_Alarm_Key_6 call Bip call De_Bounce call Dec_Hex mov Month,a jmp Set_year Ch_Alarm_Key_6: jb Alarm_Key,L_Set_Month call Bip call De_bounce call Dec_Hex mov Month,a jmp Set_Finish ;----------------------- Set year------------------------------------------ Set_Year: mov dptr,#Clear call Out_Cmd mov r2,#01h mov dptr,#M_Set_Year call Out_Str mov a,#0c7h call Cmd mov a,Year push acc call Disp_Val pop acc call Hex_Dec L_Set_Year: push acc mov a,#0c7h call cmd pop acc jb up,Ch_Down_7 call Bip call De_bounce inc a cjne a,#100,Conti_7 mov a,#0 Conti_7: call Dec_Hex call Disp_Val call Hex_Dec jmp L_Set_Year Ch_Down_7: jb Down,Ch_Time_Key_7 call Bip call De_bounce dec a cjne a,#0FFH,Conti_7 mov a,#99 jmp Conti_7 ;vi khi da nhan phim tang hoac giam ; thi deu hien thi giong nhau Ch_Time_Key_7: jb Time_Key,Ch_Alarm_Key_7 call Bip call De_Bounce call Dec_Hex mov Year,a jmp Set_Finish Ch_Alarm_Key_7: jb Alarm_Key,L_Set_Year call Bip call De_bounce call Dec_Hex mov Year,a jmp Set_Finish ;--- khi da thiet lap xong, ghi thoi gian vao cac thanh ghi-- Set_Finish: call Sta_Cond mov a,#DS1307W call Send mov a,#00h call Send mov r1,#second Send_Set: mov a,@r1 call Send inc r1 cjne r1,#2Fh,Send_Set call Sto_Cond mov dptr,#clear call Out_cmd mov dptr,#Set_Ok call Out_Str mov r2,#50 call delayms mov r2,#01 mov dptr,#clear call Out_Cmd ret ;----------- SET ALARM --------------------------- Set_Alarm: call Bip clr EA ;cam ngat clr Alarm_flag mov dptr,#Ready call Out_Cmd mov r2,#01h mov dptr,#M_Set_Alarm call Out_Str mov r2,#50 call Delayms ;------- Set gio hen ---------------------------------------------------- A_Set_hour: mov A,#Clr_Disp call Cmd mov r2,#01h mov dptr,#M_Set_Hour call Out_Str mov a,#0c7h call Cmd mov a,A_hour call Disp_Val call Hex_Dec A_L_Set_Hour: push acc mov a,#0c7h call cmd pop acc jb up,A_Ch_Down_7 call Bip call De_bounce inc a cjne a,#24,A_Conti_7 mov a,#00 A_C

Các file đính kèm theo tài liệu này:

  • docxĐồng hồ hiển thị thời gian thực trên lcd có hẹn giờ.docx
Tài liệu liên quan