Đã được đăng vào 31/05/2021 @ 11:22
Gphone Clock (Dam Clock V1.0) sử dụng GLCD 128×64 trong máy bàn không dây Homephone của Viettel và máy Gphone.
Sau khi tháo ra thì ngoài số mã PCB-S68063-1 V02 thì không có thêm thông tin gì khác, lên mạng tìm thì không thấy bất cứ tài liệu datasheet gì nói về con này.
Rất may mình đã tìm được thư viện giao tiếp và sơ đồ chân của Vũ Văn Thái kèm theo bản test mà mình đã đăng lần trước và thấy các hàm đọc, ghi,hiển thị dữ liệu cũng na ná như 1 số dòng LCD khác nên mình quyết định chinh phục em nó cho bằng được.
Sau vài ngày tìm hiểu về cái LCD này mình quyết định cho ra sản phẩm Gphone Clock (Dam Clock V1.0)
Xem thêm:
- Đồng hồ thời gian thực (Read Time Clock – DS1307) sử dụng Arduino
- Đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307
- Hiển thị thời gian thực (RTC DS1307) lên LCD16x2 bằng giao tiếp I2C trong môi trường Arduino

Tuy rằng còn nhiều chức năng thiếu : Báo thức, remote , bật tắt đèn nền … nhưng mình thấy khá hài lòng vì tính ĐỘC và chưa đụng hàng với bất kỳ sản phẩm nào.
Mình cũng quyết định chia sẻ full code C bản Gphone Clock (Dam Clock V1.0) này để anh em nghiên cứu .
Hy vọng rằng anh em có ai share hoặc thương mại thì cũng bớt ra 1 vài dòng chót cho tác giả để mình thấy công sức của mình bỏ ra là hoàn toàn xứng đáng…Xin cảm ơn!
Phần cứng

- Màn hình GLCD máy Homphone/Gphone
- Vi điều khiển AT89S52 / AT89C52
- IC thời gian thực DS1307
- Cảm biến nhiệt độ DS18B20
- Pin + đế pin Cmos
- Tụ gốm, tụ hóa, điện trở, Jack, Jumer …
Giới thiệu màn hình GLCD 12864 Homephone Viettel hoặc GPhone VNPT
Màn hình GLCD 12864 HOMEPHONE/GPHONE từ điện thoại Viettel hoặc Vinaphone
Xem hướng dẫn sử dụng chi tiết ở đây nhé:
Hướng dẫn sử dụng glcd ST7565 homephone và chia sẻ thư viện
- Sử dụng IC điều khiển ST7565
- Điện áp: 3,3 – 5,5 VDC (Không khuyến khích sử dụng 5V)
- Kích thước viền ngoài: 60 x 90.5 x 10 mm
- Kích thước màn hình: 70 x 47 mm.
- Độ phân giải: 128px x 64px

GLCD của máy điện thoại không dây Gphone do hãng ZTE sản xuất theo đơn đặt hàng của VNPT.
Ưu điểm của LCD này là đẹp, rẻ có thể đi nhặt đồng nát hoặc xin được, vì giá những con GLCD trên thị trường cũng khá khó kiếm
GLCD có đèn nền mầu trắng hoặc màu vàng sẫm tùy đời máy Gphone
Giao tiếp SPI 4 line tiết kiệm chân MCU, điện áp hoạt động theo mình dò được khoảng 2.2-3.3V (2.5V) và các tính năng khác mình có nêu rõ trong ghi chú Code.
Điều đáng nói ở đây là tài liệu về con GLCD này là không có trên mạng lên việc xác định chân cẳng hoàn toàn bằng kinh nghiệm và chip driver cũng noname luôn, nhưng thật may là mình đã test thử với con ST7565, ST7567… mà tìm ra tập lệnh tương thích với nó.

Như vậy từ bây giờ các bạn có thể sử dụng nó như một Text LCD 20×8 với bộ font được bạn Lê Đắc Đảm biên soạn sẵn và chế độ Graphic cho những bạn nào thích đồ họa đen trắng 😀
Sau đây là sơ đồ nguyên lý chung cho GLCD: Tất cả các LCD trong máy Gphone đều giống nhau!!!!
Chú ý: Vị trí chân của LCD này khác so với LCD 9 chân như sau
- Serial input data = SDA or SI or DIN or MOSI ( chân 7 của màn hình )
- Serial clock = SCL or SCK or SCLK ( chân 3 của màn hình )
- Data/command select = RS or AO or DC ( chân 4 của màn hình )
- LCD chip reset = RST or REST ( chân 2 của màn hình )
- LCD chip select = CS or CE or SS or EN or SCE ( chân 8 của màn hình )
Màn dùng điện áp <5V nên khi cấp nguồn + cho chân 9 của màn hình từ khoảng 2,5-3,3V hoặc dùng cầu chia áp bằng 2 điện trở 10K.
Nguồn (-) cấp vào chân 1 và 10 của màn hình.
Cấp nguồn cho 2 chân led nền là 5 và 6 của màn hình
Một số tài liệu
Bộ font, thư viện mẫu, hướng dẫn sử dụng bạn có thể tải tại đây:
Phần mềm
- Hiển thị giờ phút giây, này tháng năm dương, âm lịch
- Hiển thị nhiệt độ phòng
- 2 loại font 8x8px và 16x16px
#include<regx52.h> #include <INTRINS.H> #define uchar unsigned char #define CS P2_3 //Chon chip #define SDA P2_2 //Data SPI #define AO P2_1 //Chot du lieu Command va Data (C/D) #define SCK P2_0 //Clock SPI sbit sda = P3^1; sbit scl = P3^0; sbit menu_key=P3^7; sbit up_key=P3^6; sbit down_key=P3^5; sbit DQ = P1^0; uchar temp1,temp2,temp; unsigned char gio,phut,giay,thang_al,ngay_al,mode = 0; unsigned char time[7]; unsigned char code font[][8] ={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ' ' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '!' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '"' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '#' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '$' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '%' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '&' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ''' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '(' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ')' {0x00,0x0C,0x1E,0x12,0x12,0x1E,0x0C,0x00}, // '*' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '+' {0x00,0x80,0xE0,0x60,0x00,0x00,0x00, 0x00}, // ',' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '-' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '.' {0x40,0x60,0x30,0x18,0x0C,0x06,0x02,0x00}, // '/' {0x3C,0x7E,0x52,0x4A,0x46,0x7E,0x3C,0x00}, // '0' {0x00,0x44,0x44,0x7E,0x7E,0x40,0x40,0x00}, // '1' {0x44,0x66,0x72,0x52,0x52,0x5E,0x4C,0x00}, // '2' {0x24,0x66,0x42,0x4A,0x4A,0x7E,0x34,0x00}, // '3' {0x10,0x58,0x54,0x7E,0x7E,0x50,0x50,0x00}, // '4' {0x2E,0x6E,0x4A,0x4A,0x4A,0x7A,0x32,0x00}, // '5' {0x3C,0x7E,0x4A,0x4A,0x4A,0x7A,0x32,0x00}, // '6' {0x06,0x06,0x62,0x72,0x1A,0x0E,0x06,0x00}, // '7' {0x34,0x7E,0x4A,0x4A,0x4A,0x7E,0x34,0x00}, // '8' {0x4C,0x5E,0x52,0x52,0x52,0x7E,0x3C,0x00}, // '9' {0x00,0x00,0x66,0x66,0x00,0x00,0x00,0x00}, // ':' {0x00,0x40,0x66,0x26,0x00,0x00,0x00,0x00}, // ';' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '<' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '=' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '>' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '?' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '@' {0x7C,0x7E,0x12,0x12,0x12,0x7E,0x7C,0x00}, // 'A' {0x42,0x7E,0x7E,0x4A,0x4A,0x7E,0x34,0x00}, // 'B' {0x3C,0x7E,0x42,0x42,0x42,0x66,0x24,0x00}, // 'C' {0x42,0x7E,0x7E,0x42,0x42,0x7E,0x3C,0x00}, // 'D' {0x42,0x7E,0x7E,0x4A,0x4A,0x42,0x66,0x00}, // 'E' {0x42,0x7E,0x7E,0x4A,0x0A,0x02,0x06,0x00}, // 'F' {0x3C,0x7E,0x42,0x42,0x52,0x72,0x74,0x00}, // 'G' {0x7E,0x7E,0x08,0x08,0x08,0x7E,0x7E,0x00}, // 'H' {0x00,0x00,0x42,0x7E,0x7E,0x42,0x00,0x00}, // 'I' {0x20,0x60,0x40,0x42,0x7E,0x3E,0x02,0x00}, // 'J' {0x42,0x7E,0x7E,0x08,0x1C,0x76,0x62,0x00}, // 'K' {0x42,0x7E,0x7E,0x42,0x40,0x40,0x60,0x00}, // 'L' {0x7E,0x7C,0x08,0x10,0x08,0x7C,0x7E,0x00}, // 'M' {0x7E,0x7E,0x04,0x18,0x20,0x7E,0x7E,0x00}, // 'N' {0x3C,0x7E,0x42,0x42,0x42,0x7E,0x3C,0x00}, // 'O' {0x42,0x7E,0x7E,0x52,0x12,0x1E,0x0C,0x00}, // 'P' {0x3C,0x7E,0x42,0x42,0x32,0x7E,0x5C,0x00}, // 'Q' {0x42,0x7E,0x7E,0x12,0x32,0x5E,0x4C,0x00}, // 'R' {0x24,0x6E,0x4A,0x5A,0x52,0x76,0x24,0x00}, // 'S' {0x06,0x02,0x42,0x7E,0x7E,0x42,0x06,0x00}, // 'T' {0x3E,0x7E,0x40,0x40,0x40,0x7E,0x3E,0x00}, // 'U' {0x0E,0x1E,0x30,0x60,0x30,0x1E,0x0E,0x00}, // 'V' {0x7E,0x7E,0x20,0x10,0x20,0x7E,0x7E,0x00}, // 'W' {0x42,0x66,0x3C,0x18,0x3C,0x66,0x42,0x00}, // 'X' {0x06,0x0E,0x48,0x78,0x78,0x4E,0x06,0x00}, // 'Y' {0x46,0x62,0x72,0x5A,0x4E,0x46,0x62,0x00}, // 'Z' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '[' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // backslash {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ']' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '^' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '_' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '`' {0x20,0x74,0x54,0x54,0x3C,0x78,0x40,0x00}, // 'a' {0x42,0x7E,0x3E,0x48,0x48,0x78,0x30,0x00}, // 'b' {0x38,0x7C,0x44,0x44,0x44,0x6C,0x28,0x00}, // 'c' {0x30,0x78,0x48,0x48,0x3E,0x7E,0x40,0x00}, // 'd' {0x38,0x7C,0x54,0x54,0x54,0x5C,0x58,0x00}, // 'e' {0x48,0x7C,0x7E,0x4A,0x02,0x06,0x04,0x00}, // 'f' {0x4C,0x5E,0x52,0x52,0x7C,0x3E,0x02,0x00}, // 'g' {0x42,0x7E,0x7E,0x10,0x08,0x78,0x70,0x00}, // 'h' {0x00,0x00,0x48,0x7A,0x7A,0x40,0x00,0x00}, // 'i' {0x20,0x60,0x40,0x40,0x42,0x7E,0x3E,0x00}, // 'j' {0x42,0x7E,0x7E,0x10,0x38,0x6C,0x44,0x00}, // 'k' {0x00,0x00,0x42,0x7E,0x7E,0x40,0x00,0x00}, // 'l' {0x7C,0x7C,0x08,0x30,0x0C,0x7C,0x78,0x00}, // 'm' {0x7C,0x7C,0x04,0x04,0x04,0x7C,0x78,0x00}, // 'n' {0x38,0x7C,0x44,0x44,0x44,0x7C,0x38,0x00}, // 'o' {0x44,0x7C,0x7C,0x54,0x14,0x1C,0x08,0x00}, // 'p' {0x0C,0x1E,0x12,0x52,0x7C,0x7E,0x42,0x00}, // 'q' {0x44,0x7C,0x78,0x4C,0x04,0x0C,0x08,0x00}, // 'r' {0x48,0x5C,0x54,0x54,0x54,0x74,0x24,0x00}, // 's' {0x04,0x04,0x3E,0x7E,0x44,0x64,0x24,0x00}, // 't' {0x3C,0x7C,0x40,0x40,0x3C,0x7C,0x40,0x00}, // 'u' {0x1C,0x3C,0x60,0x40,0x20,0x3C,0x1C,0x00}, // 'v' {0x3C,0x7C,0x40,0x30,0x40,0x7C,0x3C,0x00}, // 'w' {0x44,0x6C,0x38,0x10,0x38,0x6C,0x44,0x00}, // 'x' {0x4C,0x5C,0x50,0x50,0x50,0x7C,0x3C,0x00}, // 'y' {0x44,0x64,0x74,0x54,0x5C,0x4C,0x44,0x00}, // 'z' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '{' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '|' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '}' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // -> {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // <- }; unsigned char code font_big_1[][8] ={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x1E,0x1E,0x1E,0x1E,0x0E,0xFE,0xFE}, {0x00,0xFE,0xFE,0xFE,0xFC,0xF8,0xF0,0xE0}, {0x00,0xF8,0xFC,0xFE,0xFE,0x1E,0x0E,0x0E}, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0xC3}, {0x00,0xF8,0xFC,0xFE,0xFE,0x1E,0x0E,0x8E}, {0x00,0x38,0x38,0x38,0x38,0x38,0xFE,0xFE}, {0x00,0x38,0x3C,0x3E,0x3E,0x1E,0x0E,0x0E}, {0x00,0x38,0x3C,0x3E,0x1E,0x0E,0xCE,0xCE}, {0x00,0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00}, {0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xCE,0xCE}, {0x00,0xF8,0xFC,0xFE,0xFE,0x9E,0xCE,0xCE}, {0x00,0x1E,0x1E,0x1E,0x1E,0x0E,0x0E,0x0E}, {0x00,0x38,0x7C,0xFE,0xFE,0xDE,0xCE,0xCE}, {0x00,0xF8,0xFC,0xFE,0xFE,0xDE,0x8E,0x8E}, {0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C} }; /////////////////////////////////////////////////////////////////////// unsigned char code font_big_2[][8] ={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0xFE,0xFE,0x0E,0x1E,0x1E,0x1E,0x1E,0x00}, {0xC0,0x80,0x00,0xFE,0xFE,0xFE,0xFE,0x00}, {0x0E,0x0E,0x1E,0x3E,0x3E,0x3C,0x38,0x00}, {0xC3,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, {0xCE,0xEE,0x7E,0xFE,0xFE,0xFC,0xF8,0x00}, {0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00}, {0x0E,0x0E,0x9E,0xFE,0xFE,0xFC,0xF8,0x00}, {0xCE,0xCE,0xDE,0xFE,0xFE,0x7C,0x38,0x00}, {0xFE,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00}, {0xCE,0xCE,0xCE,0xDE,0xDE,0x9E,0x1E,0x00}, {0xCE,0xCE,0xDE,0xDE,0xDE,0x9C,0x18,0x00}, {0x8E,0xCE,0xEE,0xFE,0xFE,0x7E,0x3E,0x00}, {0xCE,0xCE,0xDE,0xFE,0xFE,0x7C,0x38,0x00}, {0x8E,0x8E,0xDE,0xFE,0xFE,0xFC,0xF8,0x00}, {0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00} }; unsigned char code font_big_3[][8] ={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x70,0x7F,0x7F}, {0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x01,0x03}, {0x00,0x1F,0x3F,0x7F,0x7F,0x78,0x70,0x70}, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0x87}, {0x00,0x1F,0x3F,0x7F,0x7F,0x7E,0x77,0x73}, {0x00,0x70,0x70,0x70,0x70,0x70,0x7F,0x7F}, {0x00,0x60,0x70,0x78,0x78,0x7C,0x7C,0x7E}, {0x00,0x1C,0x3C,0x7C,0x78,0x70,0x71,0x71}, {0x00,0x03,0x07,0x07,0x07,0x07,0x07,0x07}, {0x00,0x1C,0x3D,0x7D,0x7D,0x79,0x71,0x71}, {0x00,0x1F,0x3F,0x7F,0x7F,0x7B,0x71,0x71}, {0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7F}, {0x00,0x1E,0x3F,0x7F,0x7F,0x7B,0x71,0x71}, {0x00,0x18,0x39,0x7B,0x7B,0x7B,0x73,0x73}, {0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C} }; unsigned char code font_big_4[][8] ={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x22,0x36,0x3E,0x1C,0x08,0x0E,0x11,0x21}, {0x41,0x8E,0x51,0x21,0x41,0x8A,0x49,0x29}, {0x19,0x0E,0x08,0x08,0x3E,0x3E,0x1C,0x08}, {0x2C,0x24,0x24,0x2C,0x24,0x24,0x2C,0x18}, {0x3C,0x3C,0x2C,0x24,0x24,0x2C,0x24,0x24}, {0x3C,0x7E,0xFF,0xFF,0xFF,0xFF,0x7E,0x3C}, {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}, {0x7F,0x7F,0x70,0x00,0x00,0x00,0x00,0x00}, {0x07,0x0F,0x1F,0x3F,0x7F,0x7F,0x7F,0x00}, {0x70,0x70,0x78,0x7C,0x7C,0x3C,0x1C,0x00}, {0x87,0x87,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, {0x71,0x70,0x78,0x7F,0x7F,0x3F,0x1F,0x00}, {0x7F,0x7F,0x70,0x70,0x70,0x70,0x70,0x00}, {0x76,0x77,0x73,0x73,0x71,0x71,0x70,0x00}, {0x71,0x71,0x7B,0x7F,0x7F,0x3F,0x1E,0x00}, {0x7F,0x7F,0x7F,0x7F,0x07,0x07,0x07,0x00}, {0x71,0x71,0x7B,0x7F,0x7F,0x3F,0x1F,0x00}, {0x71,0x71,0x7B,0x7F,0x7F,0x3F,0x1F,0x00}, {0x7F,0x7F,0x03,0x01,0x00,0x00,0x00,0x00}, {0x71,0x71,0x7B,0x7F,0x7F,0x3F,0x1E,0x00}, {0x73,0x73,0x7B,0x7F,0x7F,0x3F,0x1F,0x00}, {0x3C,0x3C,0x18,0x00,0x00,0x00,0x00,0x00} }; const unsigned char code lich[]={ 0x1b,0x0c//1999 ,0x11,0x12,0x03,0x04,0x15,0x06,0x07,0x18,0x09,0x1a,0x1b,0x0c ,0x11,0x12,0x03,0x14,0x04,0x15,0x06,0x07,0x18,0x09,0x1a,0x0b,0x1c ,0x11,0x12,0x03,0x14,0x05,0x16,0x07,0x08,0x19,0x0a,0x1b,0x0c ,0x11,0x12,0x03,0x14,0x15,0x06,0x17,0x08,0x09,0x1a,0x0b,0x1c ,0x01,0x12,0x02,0x13,0x14,0x05,0x16,0x07,0x18,0x09,0x1a,0x0b,0x1c ,0x01,0x12,0x03,0x14,0x05,0x16,0x17,0x08,0x19,0x0a,0x1b,0x0c//2005 ,0x11,0x02,0x13,0x04,0x05,0x16,0x17,0x07,0x18,0x19,0x0a,0x1b,0x0c //2006 ,0x11,0x02,0x13,0x04,0x05,0x16,0x07,0x18,0x19,0x1a,0x0b,0x1c ,0x11,0x02,0x03,0x14,0x05,0x06,0x17,0x08,0x19,0x0a,0x1b,0x1c ,0x11,0x12,0x03,0x04,0x15,0x05,0x06,0x17,0x08,0x19,0x0a,0x1b,0x1c ,0x11,0x02,0x13,0x04,0x15,0x06,0x07,0x18,0x09,0x1A,0x0B,0x1C///2010 ,0x11,0x02,0x13,0x14,0x05,0x16,0x07,0x08,0x19,0x0A,0x1B,0x0C ,0x11,0x02,0x13,0x14,0x04,0x15,0x06,0x17,0x08,0x19,0x0a,0x1b,0x0c ,0x11,0x02,0x13,0x04,0x15,0x16,0x07,0x18,0x09,0x1a,0x0b,0x1c ,0x01,0x12,0x03,0x14,0x05,0x16,0x07,0x18,0x19,0x09,0x1a,0x0b,0x1c ,0x01,0x12,0x03,0x04,0x15,0x06,0x17,0x18,0x19,0x0a,0x1b,0x0c ,0x11,0x02,0x13,0x04,0x05,0x16,0x07,0x18,0x19,0x0a,0x1b,0x1c ,0x01,0x12,0x03,0x14,0x05,0x06,0x16,0x07,0x18,0x09,0x1a,0x1b,0x1c//2017 ,0x01,0x12,0x03,0x14,0x05,0x06,0x17,0x08,0x19,0x0a,0x1b,0x1c ,0x11,0x02,0x13,0x04,0x15,0x06,0x07,0x18,0x09,0x0a,0x1b,0x1c ,0x01,0x12,0x13,0x14,0x04,0x15,0x06,0x07,0x18,0x09,0x1a,0x0b,0x1c }; const unsigned int code count_year1[]={ 0,59,413,797,1151,1506,1890,2244, 2628,2983,3337,3721,4075,4429,4813, 5168,5552,5906,6261,6645,6999,7353, 7737,8091,8446,8830,9184,9568,9922, 10276,10660,11015,11369,11753,12108, 12492,12846,13200,13584,13938,14292, 14676,15031,15386,15770,16124,16508, 16862,17216,17600,17954,18309,18693, 19048,19431,19786,20140,20523,20878, 21232,21616,21971,22325,22709,23063, 23447,23801,24156,24540,24894,25249, 25633,25987,26371,26725,27079,27463, 27818,28172,28556,28911,29265,29649, 30003,30387,30741,31096,31480,31834, 32189,32572,32926,33310,33664,34019, 34403,34758,35112,35496,35850,36204,36588}; const unsigned int code count_year[]={ 25 ,391 ,756 ,1121 ,1486 ,1852 ,2217 , 2582 ,2947 ,3313 ,3678 ,4043 ,4408 , 4774 ,5139 ,5504 ,5869 ,6235 ,6600 , 6965 ,7330 ,7696 ,8061 ,8426 ,8791 , 9157 ,9522 ,9887 ,10252 ,10618 , 10983 ,11348 ,11713 ,12079 ,12444 , 12809 ,13174 ,13540 ,13905 ,14270 , 14635 ,15001 ,15366 ,15731 ,16096 , 16462 ,16827 ,17192 ,17557 ,17923 , 18288 ,18653 ,19018 ,19384 ,19749 , 20114 ,20479 ,20845 ,21210 ,21575 , 21940 ,22306 ,22671 ,23036 ,23401 , 23767 ,24132 ,24497 ,24862 ,25228 , 25593 ,25958 ,26323 ,26689 ,27054 , 27419 ,27784 ,28150 ,28515 ,28880 , 29245 ,29611 ,29976 ,30341 ,30706 , 31072 ,31437 ,31802 ,32167 ,32533 , 32898 ,33263 ,33628 ,33994 ,34359 , 34724 ,35089 ,35455 ,35820 ,36185 ,36550 }; const unsigned int code sothang[]={ 0,2,14,27,39,51,64,76,89,101,113, 126,138,150,163,175,188,200,212, 225,237,249,262,274,286,299,311, 324,336,348,361,373,385,398,410, 423,435,447,460,472,484,497,509, 521,534,546,559,571,583,596,608, 620,633,645,658,670,682,695,707, 719,732,744,756,769,781,794,806, 818,831,843,855,868,880,893,905, 917,930,942,954,967,979,991,1004, 1016,1029,1041,1053,1066,1078,1090, 1103,1115,1128,1140,1152,1165,1177, 1189,1202,1214,1226,1239 }; const unsigned int code count_month[] ={0,0,31,59,90,120,151,181,212,243,273,304,334}; const unsigned int code count_month1[]={0,0,31,60,91,121,152,182,213,244,274,305,335}; const unsigned int code nd[]={ 500,485,470,450,430,405,394,384, 368,352,342,332,322,315,308,300, 292,286,275,268,262,256,246,236, 226,216,212,202,188,180,172,165, 156,150,145,140,138,135,130,125, 120,115,110,105,100,98,97,93,90,85 }; unsigned char hex_dec(unsigned char hex){ return((hex>>4)*10 +(hex & 0xf));} unsigned char dec_hex(unsigned char dec){ return(((dec/10) <<4 )+(dec%10));} unsigned int tinhlich(unsigned char ngayduong,thangduong,nam) { unsigned int songay,t5; unsigned char ngayam,thangam; ngayduong = hex_dec(ngayduong); thangduong = hex_dec(thangduong); nam = hex_dec(nam); if(nam%4==0) songay=count_year[nam]+count_month1[thangduong]+ngayduong; else songay=count_year[nam]+count_month[thangduong]+ngayduong; songay--; songay=songay-count_year1[nam]; for(t5=sothang[nam];t5<262;t5++) { if(songay==0)break; if(songay>50000)break; if(lich[t5]>16) { songay=songay-30;} else { songay=songay-29;} } if(songay==0) { if(lich[t5-1]>16) { thangam=lich[t5-1]-16; ngayam=30; } else { thangam=lich[t5-1]; ngayam=29; } } else { if(lich[t5-1]>16) { thangam=lich[t5-1]-16; ngayam=songay+30; } else { thangam=lich[t5-1]; ngayam=songay+29; } } ngayam = dec_hex(ngayam); thangam = dec_hex(thangam); t5= thangam << 8 ; t5 = t5 + ngayam; return(t5); } /////////////////////////////////////////////////////// void delay(unsigned int i) { unsigned int j; while(i-->0) { for(j=0;j<400;j++) { } } } void delay_ms(unsigned int t) { unsigned int x,y; for(x=0; x<t; x++); { for(y=0; y<123; y++); //delay 1ms } } void delay_lcd(unsigned int t){ unsigned int i; unsigned char j; for(i=0;i<t;i++) for(j=0;j<125;j++); } void delay_18B20(unsigned int i) { while(i--); } void lcd_write(unsigned char cd, unsigned char byte){ unsigned char h; CS=0; if(cd)AO=1; else AO=0; for(h=0;h<8;h++){ if(!(byte&0x80))SDA=0; else SDA=1; SCK=0; SCK=1; byte<<=1; } AO=~AO; CS=1; } void lcd_gotoxy(unsigned char x, unsigned char y) { x=x*8; lcd_write(0,(x & 0x0f)); lcd_write(0,((x >> 4) & 0x07)|0x10); lcd_write(0,(y & 0x0f)|0xb0); } void lcd_putchar16_1(char dat) { unsigned char v; if((dat >= 0x20) && (dat <= 0x3a)){ dat=dat-32; for(v=0;v<8;v++) lcd_write(1, font_big_1[dat][v]); } } void lcd_putchar16_2(char dat) { unsigned char v; if((dat >= 0x20) && (dat <= 0x3a)){ dat=dat-32; for(v=0;v<8;v++) lcd_write(1, font_big_2[dat][v]); } } void lcd_putchar16_3(char dat) { unsigned char v; if((dat >= 0x20) && (dat <= 0x3a)){ dat=dat-32; for(v=0;v<8;v++) lcd_write(1, font_big_3[dat][v]); } } void lcd_putchar16_4(char dat) { unsigned char v; if((dat >= 0x20) && (dat <= 0x3a)){ dat=dat-32; for(v=0;v<8;v++) lcd_write(1, font_big_4[dat][v]); } } void lcd_puts_4(char *s) { while(*s) lcd_putchar16_4(*s++); } void lcd_clear() { unsigned char u,w; for(u=0;u<8;u++){ lcd_gotoxy(0,u); for(w=0;w<130;w++) lcd_write(1,0); } lcd_gotoxy(0,0); } void lcd_putchar(char dat) { unsigned char v; if((dat >= 0x20) && (dat <= 0x7f)){ dat=dat-32; for(v=0;v<8;v++) lcd_write(1, font[dat][v]); } } void lcd_putchar_amban(char dat) { unsigned char v; if((dat >= 0x20) && (dat <= 0x7f)){ dat=dat-32; for(v=0;v<8;v++) lcd_write(1, ~font[dat][v]); } } void lcd_puts_amban(char *s) { while(*s) lcd_putchar_amban(*s++); } void lcd_puts(char *s) { while(*s) lcd_putchar(*s++); } void lcd_init() { lcd_write(0,0xE2); //Reset delay_lcd(100); //Delay 100ms lcd_write(0,0xAF); //Display ON, 0xAE - OFF lcd_write(0,0x2F); //Power control lcd_clear(); //Xoa man hinh } void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ reset delay_18B20(8); //Slight delay DQ = 0; //SCM will be pulled down DQ delay_18B20(80); //Accurate delay Greater than 480us DQ = 1; //Pulled the bus delay_18B20(14); x=DQ; //After slight delay is initialized if x = 0 x = 1 is initialized successfully defeat delay_18B20(20); } unsigned char ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // To the pulse signal dat>>=1; DQ = 1; // To the pulse signal if(DQ) dat|=0x80; delay_18B20(4); } return(dat); } void WriteOneChar(uchar dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; } } void ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; Init_DS18B20(); WriteOneChar(0xCC); // Skip read serial number column number of operations WriteOneChar(0x44); // Start temperature conversion delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //Skip read serial number column number of operations WriteOneChar(0xBE); //Read the temperature register, etc. (a total of 9 registers readable) is the temperature of the first two delay_18B20(100); a=ReadOneChar(); //Read the low temperature b=ReadOneChar(); //Read the high temperature temp1=b<<4; temp1+=(a&0xf0)>>4; temp2=a&0x0f; temp=((b*256+a)>>4); //In addition to the current collection temperature of 16 was the actual temperature } ////////////////////////////////////////////////////// void start(void) { scl=1; sda=1; _nop_(); _nop_(); sda=0; _nop_(); scl=0; } void stop(void) { scl=0; _nop_(); sda=0; _nop_(); scl=1; _nop_(); sda=1; } bit write(unsigned char x) { unsigned char i; bit k; for(i=0;i<8;i++) { sda=(x&0x80); scl=1; _nop_(); _nop_(); scl=0; x<<=1; } sda=1; scl=1; _nop_(); _nop_(); k=sda ; scl=0; _nop_(); return k ; } unsigned char read(bit ack) { unsigned char Data,i; sda=1; for(i=0;i<8;i++) { scl=1; Data<<=1; Data=Data|sda; scl=0; } scl =0; sda=ack; scl=1; _nop_(); _nop_(); scl=0; _nop_(); sda = 1; scl = 1; return Data; } void read_ds(void) { int i; start(); write(0xd0); write(0x00); start(); write(0xd1); for(i=0;i<6;i++) time[i] = read(0); time[6] = read(1); stop(); } void write_ds(void) { unsigned char t; start(); write(0xd0); write(0x0); for(t=0;t<7;t++) write(time[t]); stop(); } void am_lich (bit k) { unsigned int t; if((time[2]==0 & time[1] ==0 & time[0] < 3) | (k==1) ) //Tinh lich 00h00p03s { t = tinhlich(time[4],time[5],time[6]); ngay_al=t & 0xff; thang_al= t >> 8; }; } unsigned char tang(unsigned char bcd,unsigned char min,unsigned char max) { if(bcd>=max) bcd = min; else if ((bcd& 0xf)==9) bcd = bcd + 0x10 - 0x9; else bcd++; return bcd; } unsigned char giam(unsigned char bcd,unsigned char min,unsigned char max) { if(bcd<=min) bcd = max; else if ((bcd& 0xf)==0) bcd = bcd - 0x10 + 0x9; else bcd--; return bcd; } void scan_key (void) { static unsigned char l; if(menu_key==0) { delay(10); if(menu_key==0) { while(menu_key==0 & l < 20){ l++; delay(10);}; delay(10); if(l<20) { mode++; if( mode > 7 ) { mode = 0; write_ds(); am_lich (1); } } if(l>=20) { mode = 0; am_lich (1); } } } else if(up_key==0) { delay(10); if(up_key==0) { while(up_key==0 & l < 20){ l++; delay(10);}; delay(10); if(l>=20) { if (mode ==1 ) time[0] = tang(time[0],0 ,0x59); else if(mode ==2 ) time[1] = tang(time[1],0 ,0x59); else if(mode ==3 ) time[2] = tang(time[2],0 ,0x23); else if(mode ==4 ) time[3] = tang(time[3],0x1 ,0x07); else if(mode ==5 ) time[4] = tang(time[4],1 ,0x31); else if(mode ==6 ) time[5] = tang(time[5],1 ,0x12); else if(mode ==7 ) time[6] = tang(time[6],0x1 ,0x20); } if(l<20) { if (mode ==1 ) time[0] = tang(time[0],0 ,0x59); else if(mode ==2 ) time[1] = tang(time[1],0 ,0x59); else if(mode ==3 ) time[2] = tang(time[2],0 ,0x23); else if(mode ==4 ) time[3] = tang(time[3],0x1 ,0x07); else if(mode ==5 ) time[4] = tang(time[4],1 ,0x31); else if(mode ==6 ) time[5] = tang(time[5],1 ,0x12); else if(mode ==7 ) time[6] = tang(time[6],0x1 ,0x20); } } } else if(down_key==0) { delay(10); if(down_key==0) { while(down_key==0 & l < 20){ l++; delay(10);}; delay(10); if(l>=20) { if (mode ==1 ) time[0] = giam(time[0],0 ,0x59); else if(mode ==2 ) time[1] = giam(time[1],0 ,0x59); else if(mode ==3 ) time[2] = giam(time[2],0 ,0x23); else if(mode ==4 ) time[3] = giam(time[3],0x1 ,0x07); else if(mode ==5 ) time[4] = giam(time[4],1 ,0x31); else if(mode ==6 ) time[5] = giam(time[5],1 ,0x12); else if(mode ==7 ) time[6] = giam(time[6],0x1 ,0x20); } if(l<20) { if (mode ==1 ) time[0] = giam(time[0],0 ,0x59); else if(mode ==2 ) time[1] = giam(time[1],0 ,0x59); else if(mode ==3 ) time[2] = giam(time[2],0 ,0x23); else if(mode ==4 ) time[3] = giam(time[3],0x1 ,0x07); else if(mode ==5 ) time[4] = giam(time[4],1 ,0x31); else if(mode ==6 ) time[5] = giam(time[5],1 ,0x12); else if(mode ==7 ) time[6] = giam(time[6],0x1 ,0x20); } } } else l = 0; } void kiem_tra_ds (void) { read_ds(); if(time[0] & 0x80) { time[0] = 0x1; time[1] = 0x40; time[2] = 0x6; time[3] = 0x3; time[4] = 0x1; time[5] = 0x12; time[6] = 0x15; write_ds(); } } void main() { kiem_tra_ds(); am_lich (1); delay_ms(500); lcd_init(); delay_ms(100); lcd_clear(); delay_ms(300); while(1){ if(mode ==0) { read_ds(); ReadTemperature(); am_lich (0); } lcd_gotoxy(0,0); lcd_puts_amban(" DAM CLOCK V1 "); lcd_gotoxy(0,1); lcd_putchar16_1(((time[2]%100)>> 4)+48); lcd_putchar16_2(((time[2]%100)>> 4)+48); lcd_putchar16_1((time[2]& 0xf)+48); lcd_putchar16_2((time[2]& 0xf)+48); lcd_putchar16_1(':'); lcd_putchar16_2(':'); lcd_putchar16_1(((time[1]%100)>> 4)+48); lcd_putchar16_2(((time[1]%100)>> 4)+48); lcd_putchar16_1((time[1]& 0xf)+48); lcd_putchar16_2((time[1]& 0xf)+48); lcd_putchar16_1(':'); lcd_putchar16_2(':'); lcd_putchar16_1(((time[0]%100)>> 4)+48); lcd_putchar16_2(((time[0]%100)>> 4)+48); lcd_putchar16_1((time[0]& 0xf)+48); lcd_putchar16_2((time[0]& 0xf)+48); lcd_gotoxy(0,2); lcd_putchar16_3(((time[2]%100)>> 4)+48); lcd_putchar16_4(((time[2]%100)>> 4)+48); lcd_putchar16_3((time[2]& 0xf)+48); lcd_putchar16_4((time[2]& 0xf)+48); lcd_putchar16_3(':'); lcd_putchar16_4(':'); lcd_putchar16_3(((time[1]%100)>> 4)+48); lcd_putchar16_4(((time[1]%100)>> 4)+48); lcd_putchar16_3((time[1]& 0xf)+48); lcd_putchar16_4((time[1]& 0xf)+48); lcd_putchar16_3(':'); lcd_putchar16_4(':'); lcd_putchar16_3(((time[0]%100)>> 4)+48); lcd_putchar16_4(((time[0]%100)>> 4)+48); lcd_putchar16_3((time[0]& 0xf)+48); lcd_putchar16_4((time[0]& 0xf)+48); lcd_gotoxy(0,4); lcd_puts_amban(" 20"); lcd_gotoxy(3,4); lcd_putchar_amban(((time[6]%100)>> 4)+48); lcd_putchar_amban((time[6]& 0xf)+48); lcd_gotoxy(5,4); lcd_puts_amban(" "); lcd_gotoxy(10,4); lcd_puts_amban(" AL "); lcd_gotoxy(6,4); if(time[3]==0x01) { lcd_putchar16_1('.');} else { lcd_putchar16_1(',');} lcd_gotoxy(7,4); if(time[3]==0x01) { lcd_putchar16_2('.');} else { lcd_putchar16_2(',');} lcd_gotoxy(6,5); if(time[3]==0x01) { lcd_putchar16_3('.');} else { lcd_putchar16_3(',');} lcd_gotoxy(7,5); if(time[3]==0x01) { lcd_putchar16_4('.');} else { lcd_putchar16_4(',');} lcd_gotoxy(8,4); if(time[3]==0x01) { lcd_putchar16_1('-');} else { lcd_putchar16_1((time[3]& 0xf)+48);} lcd_gotoxy(9,4); if(time[3]==0x01) { lcd_putchar16_2('-');} else { lcd_putchar16_2((time[3]& 0xf)+48);} lcd_gotoxy(8,5); if(time[3]==0x01) { lcd_putchar16_3('-');} else { lcd_putchar16_3((time[3]& 0xf)+48);} lcd_gotoxy(9,5); if(time[3]==0x01) { lcd_putchar16_4('-');} else { lcd_putchar16_4((time[3]& 0xf)+48);} lcd_gotoxy(0,5); lcd_putchar(((time[4]%100)>> 4)+48); lcd_putchar((time[4]& 0xf)+48); lcd_putchar('/'); lcd_gotoxy(3,5); lcd_putchar(((time[5]%100)>> 4)+48); lcd_putchar((time[5]& 0xf)+48); lcd_gotoxy(11,5); lcd_putchar(((ngay_al%100)>> 4)+48); lcd_putchar((ngay_al& 0xf)+48); lcd_putchar('/'); lcd_gotoxy(14,5); lcd_putchar((( thang_al%100)>> 4)+48); lcd_putchar(( thang_al& 0xf)+48); lcd_gotoxy(0,6); lcd_puts_4("++++++++++++++++"); if ( mode == 0) { lcd_gotoxy(3,7); lcd_puts_4("*)("); lcd_gotoxy(7,7); lcd_putchar(((temp1%100)/10)+48); lcd_putchar((temp1%10)+48); lcd_putchar(','); lcd_putchar(((temp2%100)/10)+48); lcd_puts("*C "); } else if ( mode == 1) { lcd_gotoxy(3,7); lcd_puts("SET Giay ");} else if ( mode == 2) { lcd_gotoxy(3,7); lcd_puts("SET Phut ");} else if ( mode == 3) { lcd_gotoxy(3,7); lcd_puts("SET Gio ");} else if ( mode == 4) { lcd_gotoxy(3,7); lcd_puts("SET Thu ");} else if ( mode == 5) { lcd_gotoxy(3,7); lcd_puts("SET Ngay "); am_lich (1);} else if ( mode == 6) { lcd_gotoxy(3,7); lcd_puts("SET Thang "); am_lich (1);} else if ( mode == 7) { lcd_gotoxy(3,7); lcd_puts("SET Nam "); am_lich (1);} delay_ms(200); scan_key(); } }
Code Main chính
#include<regx52.h> #include <INTRINS.H> #include"lib\Fonts.c" #include"lib\LCDG_S68063.c" #include"Amlich.c" //#include"Key.c" #include"Ds18b20.h" sbit sda = P3^0; // SDA sbit scl = P3^1; // SCL sbit menu_key=P3^7; sbit up_key=P3^6; sbit down_key=P3^5; unsigned char gio,phut,giay,thang_al,ngay_al,mode = 0; unsigned char time[7]; /////////////////////////////////////////////////////// void delay(unsigned int i) {unsigned int j; while(i-->0) { for(j=0;j<400;j++) { } } } void delay_ms(unsigned int t) { unsigned int x,y; for(x=0; x<t; x++); { for(y=0; y<123; y++); //delay 1ms } } /*void delay(unsigned int i) {unsigned int j; while(i-->0) { for(j=0;j<400;j++) { } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void nop(void) { unsigned int j=3; while(j-->0) { } }*/ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // CAC CHUONG TRINH CON GIAO TIEP VOI RTC // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void start(void) { scl=1; sda=1; _nop_(); _nop_(); sda=0; _nop_(); scl=0; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void stop(void) //dk stop: 1 su cdoi trang thai tu muc thap len cao tren duong sda trong khi duong { // slc dang o muc cao scl=0; _nop_(); sda=0; _nop_(); scl=1; _nop_(); sda=1; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// bit write(unsigned char x) { unsigned char i; bit k; for(i=0;i<8;i++) { sda=(x&0x80);//? 1:0; //dua bit du lieu ra chan SDA scl=1; _nop_(); _nop_(); scl=0; x<<=1; //bit co trong so lon hon dc truyen truoc } sda=1; scl=1; //nhan bit ACK tu SLAVER bao hieu ket thuc mot byte du lieu _nop_(); _nop_(); k=sda ; // nhan gia tri ACK scl=0; _nop_(); return k ; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// unsigned char read(bit ack) { unsigned char Data,i; sda=1; for(i=0;i<8;i++) // nhan vao 8 bit { scl=1; Data<<=1; Data=Data|sda; scl=0; } scl =0; sda=ack;//master gui bit ACK scl=1; //master nhan/gui bit du lieu(sda) khi scl o muc cao _nop_(); _nop_(); scl=0; _nop_();//du lieu(sda) thay doi khi scl muc thap/ sda = 1; scl = 1; return Data;//tra gia tri cho ham } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void read_ds(void) { int i; start(); write(0xd0); write(0x00); start(); write(0xd1); for(i=0;i<6;i++) time[i] = read(0); time[6] = read(1); stop(); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void write_ds(void) { unsigned char t; start(); write(0xd0); write(0x0); for(t=0;t<7;t++) write(time[t]); stop(); } /**********************************************************************************/ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // CHUONG TRINH CON THUC HIEN TINH AM LICH // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void am_lich (bit k) { unsigned int t; if((time[2]==0 & time[1] ==0 & time[0] < 3) | (k==1) ) //Tinh lich 00h00p03s { t = tinhlich(time[4],time[5],time[6]); ngay_al=t & 0xff; thang_al= t >> 8; }; }//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // CHUONG TRINH CON THUC HIEN VIEC CAI DAT NGAY GIO, THANG NAM // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// unsigned char tang(unsigned char bcd,unsigned char min,unsigned char max)// tang so bcd lên 1 don vi { // chinh tang so bcd len 1 trong gioi han min,max if(bcd>=max) bcd = min; else if ((bcd& 0xf)==9) bcd = bcd + 0x10 - 0x9; // neu hang don vi = 9 thi tang hang chuc len 1 else bcd++; return bcd; } unsigned char giam(unsigned char bcd,unsigned char min,unsigned char max)// giam so bcd xuong 1 don vi { // giam so bcd di 1 if(bcd<=min) bcd = max; else if ((bcd& 0xf)==0) bcd = bcd - 0x10 + 0x9; // neu hang don vi = 9 thi tang hang chuc len 1 else bcd--; return bcd; } //======================================================================= void scan_key (void) { static unsigned char l; if(menu_key==0) // nut menu { delay(10); if(menu_key==0) { while(menu_key==0 & l < 20){ l++; delay(10);}; delay(10); if(l<20) // Nhan de vao cai dat { mode++; if( mode > 7 ) { mode = 0; write_ds(); am_lich (1); } } if(l>=20) // O cai dat nhan giu thi se thoat vaf khong luu { mode = 0; am_lich (1); } } } ///////////////////////////////////////////////////////////////////// else if(up_key==0) // nut down { delay(10); if(up_key==0) { while(up_key==0 & l < 20){ l++; delay(10);}; delay(10); if(l>=20) // Nhan giu de tang gia tri cai dat { if (mode ==1 ) time[0] = tang(time[0],0 ,0x59);// tang giay else if(mode ==2 ) time[1] = tang(time[1],0 ,0x59);// tang phut else if(mode ==3 ) time[2] = tang(time[2],0 ,0x23);// tang gio else if(mode ==4 ) time[3] = tang(time[3],0x1 ,0x07);// tang thu else if(mode ==5 ) time[4] = tang(time[4],1 ,0x31);// tang ngay else if(mode ==6 ) time[5] = tang(time[5],1 ,0x12);// tang thang else if(mode ==7 ) time[6] = tang(time[6],0x1 ,0x20);// tang nam } if(l<20) // Nhan de tang { if (mode ==1 ) time[0] = tang(time[0],0 ,0x59);// tang giay else if(mode ==2 ) time[1] = tang(time[1],0 ,0x59);// tang phut else if(mode ==3 ) time[2] = tang(time[2],0 ,0x23);// tang gio else if(mode ==4 ) time[3] = tang(time[3],0x1 ,0x07);// tang thu else if(mode ==5 ) time[4] = tang(time[4],1 ,0x31);// tang ngay else if(mode ==6 ) time[5] = tang(time[5],1 ,0x12);// tang thang else if(mode ==7 ) time[6] = tang(time[6],0x1 ,0x20);// tang nam } } } ///////////////////////////////////////////////////////////////////// else if(down_key==0) // nut down { delay(10); if(down_key==0) { while(down_key==0 & l < 20){ l++; delay(10);}; delay(10); if(l>=20) // Nhan giu de tang gia tri cai dat { if (mode ==1 ) time[0] = giam(time[0],0 ,0x59);// giam giay else if(mode ==2 ) time[1] = giam(time[1],0 ,0x59);// giam phut else if(mode ==3 ) time[2] = giam(time[2],0 ,0x23);// giam gio else if(mode ==4 ) time[3] = giam(time[3],0x1 ,0x07);// giam thu else if(mode ==5 ) time[4] = giam(time[4],1 ,0x31);// giam ngay else if(mode ==6 ) time[5] = giam(time[5],1 ,0x12);// giam thang else if(mode ==7 ) time[6] = giam(time[6],0x1 ,0x20);// giam nam } if(l<20) // Nhan de tang { if (mode ==1 ) time[0] = giam(time[0],0 ,0x59);// giam giay else if(mode ==2 ) time[1] = giam(time[1],0 ,0x59);// giam phut else if(mode ==3 ) time[2] = giam(time[2],0 ,0x23);// giam gio else if(mode ==4 ) time[3] = giam(time[3],0x1 ,0x07);// giam thu else if(mode ==5 ) time[4] = giam(time[4],1 ,0x31);// giam ngay else if(mode ==6 ) time[5] = giam(time[5],1 ,0x12);// giam thang else if(mode ==7 ) time[6] = giam(time[6],0x1 ,0x20);// giam nam } } } else l = 0; } //======================================================================= void kiem_tra_ds (void) { read_ds(); if(time[0] & 0x80) // kiem tra xem ds1307 co chay khong { time[0] = 0x1; time[1] = 0x40; time[2] = 0x6; time[3] = 0x3; time[4] = 0x1; time[5] = 0x12; time[6] = 0x15; write_ds(); } } //==================================================================== void main() //Chuong trinh chinh { kiem_tra_ds(); am_lich (1); delay_ms(500); lcd_init(); delay_ms(100); lcd_clear(); delay_ms(300); while(1){ if(mode ==0) { read_ds(); ReadTemperature(); am_lich (0); } lcd_gotoxy(0,0); lcd_puts_amban(" DAM CLOCK V1 "); ///////////////////////////////////////////////////////////////// lcd_gotoxy(0,1); lcd_putchar16_1(((time[2]%100)>> 4)+48); //Chuc lcd_putchar16_2(((time[2]%100)>> 4)+48); //Chuc lcd_putchar16_1((time[2]& 0xf)+48); //Don vi lcd_putchar16_2((time[2]& 0xf)+48); //Don vi lcd_putchar16_1(':'); //Don vi lcd_putchar16_2(':'); //Don vi lcd_putchar16_1(((time[1]%100)>> 4)+48); //Chuc lcd_putchar16_2(((time[1]%100)>> 4)+48); //Chuc lcd_putchar16_1((time[1]& 0xf)+48); //Don vi lcd_putchar16_2((time[1]& 0xf)+48); //Don vi lcd_putchar16_1(':'); //Don vi lcd_putchar16_2(':'); //Don vi lcd_putchar16_1(((time[0]%100)>> 4)+48); //Chuc lcd_putchar16_2(((time[0]%100)>> 4)+48); //Chuc lcd_putchar16_1((time[0]& 0xf)+48); //Don vi lcd_putchar16_2((time[0]& 0xf)+48); //Don vi lcd_gotoxy(0,2); lcd_putchar16_3(((time[2]%100)>> 4)+48); //Chuc lcd_putchar16_4(((time[2]%100)>> 4)+48); //Chuc lcd_putchar16_3((time[2]& 0xf)+48); //Don vi lcd_putchar16_4((time[2]& 0xf)+48); //Don vi lcd_putchar16_3(':'); //Don vi lcd_putchar16_4(':'); //Don vi lcd_putchar16_3(((time[1]%100)>> 4)+48); //Chuc lcd_putchar16_4(((time[1]%100)>> 4)+48); //Chuc lcd_putchar16_3((time[1]& 0xf)+48); //Don vi lcd_putchar16_4((time[1]& 0xf)+48); //Don vi lcd_putchar16_3(':'); //Don vi lcd_putchar16_4(':'); //Don vi lcd_putchar16_3(((time[0]%100)>> 4)+48); //Chuc lcd_putchar16_4(((time[0]%100)>> 4)+48); //Chuc lcd_putchar16_3((time[0]& 0xf)+48); //Don vi lcd_putchar16_4((time[0]& 0xf)+48); //Don vi //////////////////////////////////////////////////////////////////// lcd_gotoxy(0,4); lcd_puts_amban(" 20"); lcd_gotoxy(3,4); lcd_putchar_amban(((time[6]%100)>> 4)+48); //Chuc lcd_putchar_amban((time[6]& 0xf)+48); //Don vi lcd_gotoxy(5,4); lcd_puts_amban(" "); lcd_gotoxy(10,4); lcd_puts_amban(" AL "); lcd_gotoxy(6,4); if(time[3]==0x01) { lcd_putchar16_1('.');} // Chu C else { lcd_putchar16_1(',');} // Chu T lcd_gotoxy(7,4); if(time[3]==0x01) { lcd_putchar16_2('.');} // Chu C else { lcd_putchar16_2(',');} // Chu T lcd_gotoxy(6,5); if(time[3]==0x01) { lcd_putchar16_3('.');} // Chu N else { lcd_putchar16_3(',');} // Chu T lcd_gotoxy(7,5); if(time[3]==0x01) { lcd_putchar16_4('.');} // Chu N else { lcd_putchar16_4(',');} // Chu T lcd_gotoxy(8,4); if(time[3]==0x01) { lcd_putchar16_1('-');} // Chu N else { lcd_putchar16_1((time[3]& 0xf)+48);} // Chu THU lcd_gotoxy(9,4); if(time[3]==0x01) { lcd_putchar16_2('-');} // Chu N else { lcd_putchar16_2((time[3]& 0xf)+48);} // Chu THU lcd_gotoxy(8,5); if(time[3]==0x01) { lcd_putchar16_3('-');} // Chu N else { lcd_putchar16_3((time[3]& 0xf)+48);} // Chu THU lcd_gotoxy(9,5); if(time[3]==0x01) { lcd_putchar16_4('-');} // Chu N else { lcd_putchar16_4((time[3]& 0xf)+48);} // Chu THU ///////////////////////////////////////////////////////////////////// lcd_gotoxy(0,5); // ngay dl lcd_putchar(((time[4]%100)>> 4)+48); //Chuc lcd_putchar((time[4]& 0xf)+48); //Don vi lcd_putchar('/'); lcd_gotoxy(3,5); lcd_putchar(((time[5]%100)>> 4)+48); //Chuc lcd_putchar((time[5]& 0xf)+48); //Don vi lcd_gotoxy(11,5); lcd_putchar(((ngay_al%100)>> 4)+48); //Chuc lcd_putchar((ngay_al& 0xf)+48); //Don vi lcd_putchar('/'); lcd_gotoxy(14,5); lcd_putchar((( thang_al%100)>> 4)+48); //Chuc lcd_putchar(( thang_al& 0xf)+48); //Don vi //////////////////////////////////////////////////////////////////// lcd_gotoxy(0,6); lcd_puts_4("++++++++++++++++"); /////////////////////// nhiet do ///////////////////////// if ( mode == 0) { lcd_gotoxy(3,7); lcd_puts_4("*)("); lcd_gotoxy(7,7); lcd_putchar(((temp1%100)/10)+48); //Chuc lcd_putchar((temp1%10)+48); //Don vi lcd_putchar(','); lcd_putchar(((temp2%100)/10)+48); //Chuc lcd_puts("*C "); } else if ( mode == 1) { lcd_gotoxy(3,7); lcd_puts("SET Giay ");} else if ( mode == 2) { lcd_gotoxy(3,7); lcd_puts("SET Phut ");} else if ( mode == 3) { lcd_gotoxy(3,7); lcd_puts("SET Gio ");} else if ( mode == 4) { lcd_gotoxy(3,7); lcd_puts("SET Thu ");} else if ( mode == 5) { lcd_gotoxy(3,7); lcd_puts("SET Ngay "); am_lich (1);} else if ( mode == 6) { lcd_gotoxy(3,7); lcd_puts("SET Thang "); am_lich (1);} else if ( mode == 7) { lcd_gotoxy(3,7); lcd_puts("SET Nam "); am_lich (1);} delay_ms(200); //////////////////////////////////////////////////////////////////// scan_key(); } }
Cài đặt
- Nhấn phím menu ( P3.7 ) để vào chế độ cài đặt, nhấn up hoặc down để tăng giảm giá trị, khi cài xong Năm nhấn menu lần nữa thì sẽ thoát menu cài đặt về màn hình chính và lưu lại. Nếu đang cài các giá trị mà không muốn cài nữa thì nhấn giữ nút Menu, mạch sẽ trở về màn hình chính và không lưu cài đặt
- Phím up,down khi cài đặt có thể nhấn giữ để tăng giá trị nhanh hơn.
Tải Phiên Bản V1.0 – Full Code
File nén gồm code hex, full code C, file nguyên lý và sơ đồ chân để vẽ mạch in, hiện tại mình đang dùng board nên chưa có file mạch in, mọi người chịu khó vẽ lại vậy.
Muốn mở mạch nguyên lý (File mô phỏng) hãy sử dụng phần mềm Proteus 7.8 (Bấm vào để tải)
GLCD HOMEPHONE CLOCK V1FW0 BY LEDACDAM
Hoặc
Tải Phiên Bản V1.1 – File Hex
- Thêm còi báo đúng giờ từ 21 – 6h
- Hẹn giờ
- Đổi dấu ngát ngày
- Hiển thị ngày lễ tết trong năm
GLCD CLOCK HOMEPHONE V1FW1 BY LEDACDAM
Hoặc
Video Demo Gphone Clock ( Dam Clock V1.0 )
Nguồn: Damclock
Có bán bộ màn hình này không bạn.
Dạ mình hiện không sẵn bộ này bạn ạ