Thu thập dữ liệu nhiệt độ môi trường trên cở sở dùng vi điều khiển PIC18F458

TÓM TẮT NỘI DUNG Khóa luận đã xây dựng được hệ thống thu thập số liệu đo lường trên cở sở dùng vi điều khiển PIC18F458. Với ứng dụng cụ thể là thu thập dữ liệu nhiệt độ môi trường. Hệ thống được xây dựng dựa trên việc kết hợp nhiều khối thiết bị ngoại vi khác, bao gồm bàn phím PS/2 cho phép nhập dữ liệu có thể là địa điểm của khu vực đặt hệ thống.v.v., đồng hồ thời gian thực dựa trên vi mạch DS1307 cho phép cập nhật thời gian cho hệ thống với đồng hồ này thông chỉ cần cài đặt một lần đồng hồ sẽ chạy cho tới khi không còn một nguồi nuôi nào, khối giao tiếp thẻ nhớ MMC lưu trữ tất cả dữ liệu mà người sử dụng cần với mục đích sử dụng hệ thống ví dụ địa điểm đặt hệ thống, thông tin về nhiệt độ đo được cập nhật cùng thời gian của hệ thống, và cuối cùng là khối hiển thị dùng LCD 16 cột 2 dòng hiển thị cùng lúc 32 ký tự, thể hiện những thông tin người thiết lập hệ thống muốn thông báo trong quá trình kiểm tra hoặc khi sử dụng . Tất cả hệ thống được lắp ráp trên một bo mạch tương đối nhỏ gọn. MỤC LỤC LỜI CẢM ƠN 1 TÓM TẮT NỘI DUNG 2 CHƯƠNG 1: TỔNG QUAN VỀ VẤN ĐỀ NGHIÊN CỨU 7 1.1 Tổng quan về hệ thống đo lường và điều khiển. 7 1.2 Hệ thống đo lường nhiệt độ. 8 CHƯƠNG 2: VI ĐIỀU KHIỂN PIC18F458 10 2.1 Tổng quan về vi điều khiển PIC. 10 2.1.1 Sơ đồ chân của vi điều khiển PIC18F458. 11 2.1.2 Một vài thông số về vi điều khiển PIC18F458. 11 2.1.2.1 CPU theo kiến trúc RISC 11 2.1.2.2 Các đặc tính ngoại vi. 11 2.2 Các ứng dụng được sử dụng trong khóa luận. 12 2.2.1 Bộ chuyển đổi tương tự số ADC. 12 2.2.2 Truyền nối tiếp đồng bộ SPI. 15 2.2.3 Truyền nối tiếp đồng bộ I2C. 18 CHƯƠNG 3: CẢM BIẾN NHIỆT ĐỘ VÀ VI MẠCH LM35 20 3.1 Nhiệt độ và ý nghĩa của đo nhiệt độ. 20 3.2 Cảm biến nhiệt độ LM35. 20 3.3.1 Một số đặc tính của LM35. 20 3.3.2 Sơ đồ ghép nối với vi điều khiển. 21 3.3.3 Xử lý và tính toán kết quả 21 CHƯƠNG 4: BÀN PHÍM PS/2 VÀ GIAO TIẾP BÀN PHÍM VỚI VI ĐIỀU KHIỂN 23 4.1 Bàn phím PS/2. 23 4.2 Giao diện vật lý. 23 4.3 Truyền nhận dữ liệu. 24 4.2.1 Thông tin từ bàn phím tới host. 24 4.2.2 Thông tin từ host tới bàn phím. 26 4.3 Mã quét. 27 4.4.1 Make Codes, Break Codes, và Typematic Repeat 28 4.4.1.1 Make code. 28 4.4.1.2 Break code. 28 4.4.1.3 Typematic. 29 4.4 Cài đặt. 29 4.4.1 Quá trình khởi động. 29 4.4.2 Các lệnh thiêt lập. 30 4.5 Mạch điều khiển bàn phím i8042. 31 4.6 PIC điều khiển bàn phím. 32 4.6.1 Sơ đồ ghép nối Keyboard PS/2 với PIC 18F452. 32 4.6.2 Khởi tạo giao tiếp và các hàm chức năng. 32 4.6.2.1 Khởi tạo giao tiếp. 32 4.6.2.2 Các hàm chức năng sử dụng trong chương trình. 33 CHƯƠNG 5: ĐỒNG HỒ THỜI GIAN THỰC 34 5.1 Mô tả chung về DS1307 34 5.2 Hoạt động của các chân. 35 5.3 Tổ chức bộ nhớ RAM của DS1307 35 5.3.1 Các thanh ghi thời gian của DS1307. 36 5.3.2 Thanh ghi điều khiển. 36 5.3 Cấu hình phần cứng. 37 5.4 Truyền dữ liệu theo chuẩn I2C. 38 5.5.1 Ghi dữ liệu vào DS1307. 38 5.5.2 Đọc dữ liệu từ DS1307. 39 5.5 Sơ đồ ghép nối PIC với DS1307 theo chuẩn I2C 40 5.6 Sơ đồ khối qúa trình khởi tạo và các hàm chức năng cho DS1307. 41 5.6.1 Khởi tạo đồng hồ thời gian thực. 41 5.6.2 Các hàm chức năng. 41 5.6.2.1 Hàm cài đặt thời gian cho đồng hồ. 42 5.6.2.2 Hàm cập nhật thời gian từ đồng hồ. 42 5.7 Giao tiếp I2C mềm. 43 5.7.1 Các bước thực hiện. 43 5.7.2 Hàm thư viện của khối I2C mềm. 43 CHƯƠNG 6: MMC VÀ ỨNG DỤNG ĐỌC GHI DỮ LIỆU 46 6.1 Chuẩn giao tiếp của MMC. 47 6.1.1 MultiMediaCard Mode. 47 6.1.2 SPI Mode. 48 6.2 Sơ đồ ghép nối MMC với PIC và một số linh kiện được sử dụng. 50 6.2.1 Sơ đồ ghép nối. 50 6.2.2 CD4050 và LM1117-3.3V. 50 6.2.2.1 CD4050. 50 6.2.2.2 LM1117-3.3V. 51 6.3 Đặc tính của MMC trong chuẩn SPI. 52 6.3.1 Các thanh ghi của MMC. 53 6.3.2 Định dạng khung lệnh của MMC. 53 6.3.3 Các lệnh được sử dụng. 54 6.3.3.1 Lớp các lệnh sử dụng. 54 6.3.3.2 Chi tiết các lệnh được sử dụng. 55 6.3.4 Đáp ứng của các lênh. 56 6.4 Khởi tạo MMC trong chế độ SPI. 57 6.4.1 Thiết lập lại phần mềm. 57 6.4.2 Khởi tạo. 58 6.5 Quá trình đọc ghi khối dữ liệu đối với MMC trong SPI mode. 60 6.6 Hệ thống tệp tin. 61 6.6.1 Master Boot Record. 63 6.6.1.1 Mục phân vùng trên MBR. 63 6.6.2 Sector khởi động. 64 6.6.3 Thư mục gốc. 65 6.6.5 Sử dụng hàm khi định dạng thẻ theo FAT16. 67 CHƯƠNG 7: LCD 71 7.1 Giới thiệu LCD. 71 7.1.1 Bảng mô tả các chân của LCD: 72 7.1.2 RAM chứa dữ liệu hiển thị. 72 7.1.3 ROM phát ký tự. 73 7.1.4 Thanh ghi chỉ thị và thanh ghi dữ liệu. 74 7.2 Lệnh và chỉ thị. 74 7.3 Khởi tạo LCD. 76 7.4 Các hàm thao tác cơ bản với LCD. 78 7.4.1 Cờ bận và đọc cờ bận. 78 7.4.2 Gửi lệnh và dữ liệu đến LCD. 79 7.4.3 Cài đặt vị trí con trỏ trên LCD. 79 7.4.4 Gửi dữ liệu tới LCD. 80 7.5 LCD hoạt động ở chế độ 4 bit. 81 7.5.1 Khởi tạo LCD ở chế độ 4 bit. 82 7.5.2 Gửi lệnh và dữ liệu tới LCD. 82 CHƯƠNG 8: KẾT QUẢ THỰC NGHIỆM 84 KẾT LUẬN 88 Ứng dụng. 88 Hướng phát triển. 88 PHỤ LỤC 1 : Sơ đồ nguyên lý 90 PHỤ LỤC 2: Keyboard Scan Codes: Set 2 91 TÀI LIỆU THAM KHẢO 93

doc92 trang | Chia sẻ: banmai | Lượt xem: 1924 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Thu thập dữ liệu nhiệt độ môi trường trên cở sở dùng vi điều khiển PIC18F458, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
i2c_stop(); /////////////////////////////////////////////// 5.6.2.2 Hàm cập nhật thời gian từ đồng hồ. Sau khi cài đặt thời gian, đồng hồ bên trong DS1307 đã chạy. Muốn cập nhật thông tin từ đồng hồ, cần phải truy xuất tới IC đọc các giá trị trong các thanh ghi, các giá trị này sẽ cho ta các thông số chính xác về thời gian. Để làm được điều này phải sử dụng chế độ “slave transmitter”. Vi điều khiển gửi chỉ thị START sau đó là giá trị 0xD1, khi giá trị này tới DS1307, IC cho phép đọc các thanh ghi bắt đầu tư địa chỉ được đưa tới cho tới khi có chỉ thị STOP dừng quá trình đọc. Đoạn code sau sẽ cho ta thực hiên thao tác đó. ///////////////Doc dữ liệu DS1307/////////// i2c_start(); i2c_write(0xD0); //Gui dia chi cua slave i2c_write(0x00); //thiet lap lai con i2c_stop(); I2C_start(); I2C_write(0xD1); /* gui lenh doc du lieu */ sec = i2c_read(1); /* bat dau tu thanh ghi 0*/ min = i2c_read(1); hour = i2c_read(1); //che do 24h ko can AND dow = i2c_read(1); date = i2c_read(1); month = i2c_read(1); year = i2c_read(0); i2c_stop(); //////////////////////////////////////////// 5.7 Giao tiếp I2C mềm. Trong một số trường hợp các vi điều khiển không có khối giao diện I2C để điều khiển truyền nhận dữ liệu với slave, master hoặc như có nhưng đã sử dụng vào một ứng dụng khác. Khi đó ta hoàn toàn có thể sử dụng các chân khác của vi điều khiển và dùng phần mềm viết một khối giao tiếp I2C cho vi điều khiển. Tuy công việc này có hơi mất công tuy nhiên ta có thể tạo ra nhiều hơn 1 giao diện I2C ở trên vi điều khiển thuận tiện cho việc ghép nối với các ngoại vi sử dụng giao thức truyền dữ liệu theo loại này. Vi điều khiển PIC18F458 có một khối giao diện I2C các chân được sử dụng là PIN_C3 (SCL) và PIN_C4 (SDA) tuy nhiên các chân này lại được sử dụng vào mục đích ghép nối với thẻ nhớ MMC trong giao diện SPI, giao diện SPI các chân được sử dụng PIN_C3 (CLK), PIN_C4 (DI), PIN_C5 (DO), được trình bày rõ ở chương về MMC. Vì vậy I2C mềm được lựa chọn để ghép nối DS1307 với vi điều khiển 5.7.1 Các bước thực hiện. Để có được khối I2C mềm phải thực hiện các bước sau: Định nghĩa các chân được sử dụng cho ghép nối. Tạo ra các hàm bao gồm : khởi tạo giao thức, kết thúc giao thức, hàm đọc dữ liệu, hàm ghi dữ liệu và 1 số hàm phụ khác. 5.7.2 Hàm thư viện của khối I2C mềm. Để viết được hàm thư viện cho khối giao tiếp I2C trước hết ta phải biết về cơ chế truyền dữ liệu theo chuẩn này là như thế nào ? Hoạt động theo các bước sau: Ban đầu tín hiệu SDA và SCL cùng ở mức cao Quá trình giao tiếp bắt đầu bằng việc chuyển mức tín hiệu của SDA từ cao xuống thấp (HàL). Dữ liệu bắt đầu truyền khi SCL ở mức thấp. Thời gian của dữ liệu kéo dài trong 1 chu kỳ xung SCL. Số lượng bít truyền trong 1 khung tùy thuộc thiết bị Quá trình truyền nhận kết thúc khi SCL ở mức cao và tín hiệu SDA chuyển từ thấp lên cao (LàH). Hình 5.8: Giản đồ xung của chuẩn I2C. Dữ liệu khi đọc ghi DS1307 có độ dài 1 byte với bit MSB đi đầu. Sau khi tạo được các hàm ta chỉ cần đính thư viện vào trong chương trình và sử dụng chúng như một khối giao diện cứng. Đoạn code mô tả quá trình đọc ghi dữ liệu của DS1307 theo chuẩn I2C. ///////////////Tao giao dien I2C////////////// #define SDA_PIN RB5 // RB.5 #define SCL_PIN RB4 // RB.4 #define SDA_DIR trisb5 #define SCL_DIR trisb4 /////cac ham duoc su dung///// int8 i2c_read(void); void i2c_write(byte o_byte); void i2c_nack(void); void i2c_start(void); void i2c_stop(void); void i2c_high_sda(void); void i2c_low_sda(void); void i2c_high_scl(void); void i2c_low_scl(void); //////////////////////////////////////////// byte i2c_read(void){ byte i_byte, n; i2c_high_sda(); for (n=0; n<8; n++){ i2c_high_scl(); if (SDA_PIN){ i_byte=(i_byte << 1)|0x01; // msbit trước } else{ i_byte = i_byte << 1; } i2c_low_scl(); } return(i_byte); } ////////////////////////////////////////////// void i2c_write(byte o_byte){ byte n; for(n=0; n<8; n++){ if(o_byte&0x80){ i2c_high_sda(); } else{ i2c_low_sda(); } i2c_high_scl(); i2c_low_scl(); o_byte = o_byte << 1; } i2c_high_sda(); } //////////////////////////////////////////////// ======================================================= CHƯƠNG 6: MMC VÀ ỨNG DỤNG ĐỌC GHI DỮ LIỆU MultiMediaCards (MMC) là loai bộ nhớ nối tiếp dạng Flash được tích hợp cao và có khả năng truy xuất dữ liệu ngẫu nhiên. Nó được đọc ghi thông qua một giao diện nối tiếp rõ ràng vì vậy việc truyền dữ liệu tỏ ra nhanh chóng và an toàn. Những thẻ MMC có hệ thống các tiểu chuẩn về đặc tính kỹ thuật như điện áp số chân…, đã được định nghĩa. MultiMediaCards là một phát kiến mới trong thiết bị lưu trữ dựa trên công nghệ bán dẫn. Nó được phát triển để tạo ra những thiết bị lưu trữ rẻ và có dung lượng trung bình, ứng dụng cho các phương tiên giải trí đa phương tiện. Hinh 6.1: Cấu trúc của MMC. Hình 6.2: Hình ảnh thực tế của MMC và RS-MMC. 6.1 Chuẩn giao tiếp của MMC. MultiMediaCards có thể hoạt động trong hai loại chuẩn khác nhau như sau: MultiMedia card Mode SPI Mode Cả hai cách chuẩn (mode) sử dụng các chân giống nhau. Mặc định khi ghép nối là mode MultiMediaCard. SPI mode chỉ được lựa chọn khi kích hoạt chân CS và gủi đi CMD0. 6.1.1 MultiMediaCard Mode. Trong chuẩn MultiMedia card dữ liệu được truyền trên số đường dây nhỏ nhất. Trong trường hợp này dữ liệu là lệnh sẽ được truyền trên một đường dây riêng còn dữ liệu trên một dây riêng. CLK: với mỗi chu kỳ của tín hiệu này 1bit lệnh và dữ liệu sẽ được truyền trên đương dây. Tần số có thể thay đổi từ 0 đến 20Mhz. CMD: là kênh truyền lệnh 2 hướng sử dụng cho việc khởi tạo card và truyền dữ liệu là lệnh. Những lệnh được gửi đi từ bus master tới MultiMedia card và đáp ứng ngược trở lại cũng chạy trên đường này. DAT: cũng là một kênh song hướng dung để truyền dữ liệu. RSV: chân này được kéo lên nguồn với điện trở 2MΩ. Hinh 6.3: Ghép nối MMC với host với MultiMediaCard mode Các chân trong chuẩn MultiMedia card được mô tả như sau: Chân Tên Loại Mô tả 1 RSV NC Không sử dụng 2 CMD I/O/PP/OD Lệnh/Đáp ứng 3 Vss S Nguồn (Đất) 4 Vdd S Nguồn 5 CLK I Xung clock 6 Vss S Nguồn (Đất) 7 DAT I/O/PP Dữ liệu S: power supply; I: input; O: output; PP: push-pull; OD: open-drain; NC: not connected 6.1.2 SPI Mode. SPI (Serial Peripheral Interface) là giao tiếp nối tiếp đồng bộ được biết đến đầu tiên ở các vi điều khiển của hãng Motorola. Các thẻ nhớ MMC trên thị trường đều tương thích với chuẩn SPI này. Giống như các thiết bị khác sử dụng chuẩn này, ghép nối của MMC như sau: CS: tín hiệu lựa chọn chip (chip select) tới thẻ . CLK: tín hiệu xung nhịp (clock) tơi thẻ. DataIn: tín hiệu dữ liệu truyền tới thẻ. DataOut: tín hiệu dữ liệu đọc từ thẻ. Đặc tính chung của chuẩn SPI là truyền dữ liệu theo byte và thẻ nhớ cũng không phải là một ngoại lệ. Tất cả dữ liệu được biểu diễn thành những byte có độ dài 8 bit và được đồng bộ theo tín hiệu CS. Các chân trong chuẩn SPI được định nghĩa như bảng sau: Chân Tên Loại Mô tả 1 CS I Lựa chọn chip 2 DI I/PP Dữ liệu vào 3 Vss S Nguồn (Đất) 4 Vdd S Nguồn 5 CLK I Xung clock 6 Vss S Nguồn (Đất) 7 DAT I/O/PP Dữ liệu ra 6.2 Sơ đồ ghép nối MMC với PIC và một số linh kiện được sử dụng. 6.2.1 Sơ đồ ghép nối. Hình 6.4: Sơ đồ ghép nối modun MMC với PIC 6.2.2 CD4050 và LM1117-3.3V. 6.2.2.1 CD4050. Là vi mạch cho phép chuyển giá trị điện áp từ mức CMOS ra TTL, đầu vào của IC được nối tới vi điều khiển, giá trị điện áp đầu ra là mức TTL phù hợp với MMC. Hình 6.5: Mô hình vi mạch CD4050. Hình 6.7: Cách ghép nối cho chức năng chuyển đổi mức điện áp. 6.2.2.2 LM1117-3.3V. Với vi mạch này cho ta lối ra ổn áp 3,.3V là điện áp nuôi MMC. Hinh 6.8: Vị trí chân và cách đóng gói vi mạch. Hình 6.9: Cách ghép nối cho điện thế đầu ra ổn ap 3,3V 6.3 Đặc tính của MMC trong chuẩn SPI. SPI mode được lựa chọn cho ứng dụng của đề tài, khi đó MMC được ghép nối với vi điều khiển cụ thể là PIC18F458 theo đúng khối phần cứng được tích hợp sẵn trên PIC. Trong mode hoạt động này có 4 loại tín hiệu được sử dụng giao tiếp với host (PIC) là: clock, data in, data out, chip select. Clock : được dùng để duy trì sự đồng bộ giữa hệ thống và card. Data in: sử dụng khi truyền lệnh từ host tới thẻ, đồng thời cũng được dùng vào mục đích ghi dữ liệu vào thẻ. Data out: được dùng với mục đích ngược với data in là gửi đáp ứng từ thẻ về host và đọc dữ liệu từ thẻ. Chip select: tín một thể cụ thể sẽ được lựa chọn khi tín hiệu này kích hoạt trên nó. Dưới đây sẽ là hình ảnh minh họa quá trình truyền nhận dữ liệu giữa vi điểu khiển PIC với thẻ MMC sử dụng chuẩn SPI. Hình 6.10: Truyền nhận dữ liệu theo chuẩn SPI. Chuẩn SPI của MMC cho phép truyền dữ liệu theo 1 khối (single block) hoặc nhiều khối (multiple block). Kích thước tối đa của khối dữ liệu này có thể thay đổi tuy hãng sản xuất nằm trong khoảng từ 1- 2048 byte. Hinh 6.11: Truyền dữ liệu theo từng khối Các gói dữ liệu truyền nối tiếp nhau với các lệnh điều khiển CMD17 và CMD24 . Kiểm tra lỗi CRC: CRCs (cycle redundancy codes) được thêm vào khung truyền lệnh, đáp ứng, và dữ liệu của MMC. CRC sẽ được kích hoạt để phát hiện lỗi trước khi truyền dữ liệu, cho phép truyền lại khi một lỗi được tìm thấy. CRC nâng cao độ tin cậy của hệ thống. Trong MMC mode, CRCs là bắt buộc, 7 bit CRC được thêm vào mỗi lệnh và 16 bit CRC với 512 byte dữ liệu. Với SPI mode, CRC là một tùy chọn. 6.3.1 Các thanh ghi của MMC. Bảng danh sách các thanh ghi trong MMC. Tên thanh ghi Độ dài Mô tả OCR Operation conditions register 32 bit Định nghĩa điện thế của hệ thống MMC 1 bit = 10mV CID Card indentification register 128 bit Thông tin về nhà sản xuất, OEM, ID của thẻ. RCA Relative card address register 16 bit Sử dụng để đặt tên cho thẻ từ host CSD Card specific data register 128 bit Lưu trữ nhưng thông tin riêng của thẻ, Sự phù hợp với CIS của PCMCIA DSR Driver stage register 16 bit Sử dụng để thiết lập thông lượng trên MMC bus Status register 32 bit Chỉ thi trạng thái và tình trạng của lỗi 6.3.2 Định dạng khung lệnh của MMC. Dữ liệu nối tiếp [47] Lệnh [0] Bảng sau cho ta chi tiết ý nghĩa của các bit: Vị trí bit 47 46 [45:40] [39:8] [7:1] 0 Số bit 1 1 6 32 7 1 Giá trị 0 1 X X X 1 Mô tả Bit start Bit truyền Chỉ số lệnh Đối số CRC7 Bit kết thúc Một lệnh gồm 48 bit bit đầu tiên là “bit start” luôn luôn là 0, bit thứ 2 là bit truyền và được đặt bằng 1, 6 bit tiếp theo cho biết chỉ số của lệnh, ví dụ với CMD0 thì 8 bit đầu tiên có giá trị là 01000000b (0x40). Tiếp theo là 32 bit trường đối số có thể là 1 địa chỉ tương đối, địa chỉ đọc hoặc địa chỉ ghi, 8 bit cuối cùng là phần kiểm tra lỗi CRC với bít cuối cùng luôn là 1 6.3.3 Các lệnh được sử dụng. 6.3.3.1 Lớp các lệnh sử dụng. Các lệnh được chia thành các lớp (classes) như basic command, read command, write command và erase command. Bảng sau chỉ rõ điều này Lớp Tên lớp MMC mode SPI mode 6.3.3.2 Chi tiết các lệnh được sử dụng. Đây chỉ là những lệnh cơ bản được xem là cần thiết để 1 MMC có thể hoạt động được trong chế độ SPI. Ngoài những lệnh này còn 1 số lệnh tùy chọn khác. Chỉ số Đối số Đáp ứng Tên tóm tắt Mô tả lệnh CMD0 Không R1 GO_IDLE_STATE Lênh cho phép reset thẻ Nếu lệnh được sử dụng khi chân CS dang ở mưc thấp thì cho phép lựa chon mode hoạt động là SPI. Sau khi có lệnh này thì các lệnh CMD1 và CMD58 mới có thể sử dụng được CMD1 Không R1 SEND_OP_COND Sử dụng để khởi tạo thẻ. Host sẽ tham dò với CMD1 cho tới khi đáp ứng chuyển từ 01h (Busy) sang 00h (Ready). CMD9 Không R1 SEND_CSD Sử dụng để đọc các thông tin trong thanh ghi CSD CMD10 Không R1 SEND_CID Đọc những thông tin từ CID CMD13 Không R2 SEND_STATUS Lệnh cho phép truyền theo thứ tự những thông tin ở thanh ghi trạng thái của thẻ (status register) CMD16 [31:0] Độ dài củ khối R1 SET_BLOCKEN Lệnh dùng để thay đổi độ dài của khối dữ liệu được sử dụng trong các lệnh CMD17 đọc 1 khối (single block read) và CMD24 ghi 1 khôi (single block write). Trong các thẻ nhở thông thương giá trị này mặc định là 512 byte. CMD17 [31:0] Địa chỉ dữ liệu R1 READ_SINGLE_ BLOCK Lệnh đọc dữ liệu từ thẻ, bắt đầu từ địa chỉ ở đối số và với độ dài được thiết lập ở lênh CMD16 (mặc đinh là 512 byte). CMD24 [31:0] Địa chỉ dữ liệu R1 WRITE_BLOCK Sử dụng để đọc dữ liệu từ thẻ bắt đầu từ địa chỉ ở đối số và độ dài của khối dữ liệu được đọc được cài đặt ở lênh CMD16. CMD27 Không R1b PROGRAM_CSD Lênh sử dụng cho việc lập trình bit programmale (cho phép chương trình hóa) ở trong thanh ghi CSD CMD58 Không R3 READ_OCR Lệnh đọc nội dung của thanh ghi OCR CMD59 [31:1] Stuff bit [0:0] CRC option R1 CRC_ON_OFF Lệnh bật tắt chức năng kiểm tra lỗi CRC. Mặc định trong SPI mode là tắt bit CRC option = 1 à CRC on CRC option = 0 à CRC off 6.3.4 Đáp ứng của các lênh. Như hình 6.10 cho thấy khi mỗi Command được gửi đến MMC trên đường DI từ host, thì sẽ có một Response từ MMC gửi trở lại host qua đường DO. Trong chế độ SPI thì có 2 loại Response là R1 và R2. R2 16 bit là đáp ứng trả về từ MMC khi gửi lệnh CMD13 từ host còn R1 8 bit cho tất cả các lệnh còn lại. Phần 8 bit thấp của R2 hoàn toàn giống với R1 R1, R1b : là đáp ứng với tất cả các lệnh ngoại trừ lệnh SEND_STATUS Dữ liệu nối tiếp Bit 7 Bit 0 Ý nghĩa của các bit: Bit 7: Luôn nhận giá trị 0 Bit 6 : Lỗi tham số Bit 5 : Lỗi địa chỉ Bit 4 : Lỗi chuỗi xóa Bit 3 : Lỗi CRC Bit 2 : Lệnh không hợp lệ Bit 1 : Xóa lại Bit 0 : Trạng thái chờ. R2 : là đáp ứng dành riêng cho lệnh SEND_STATUS (CMD13). Dữ liệu nối tiếp Bit 7 Byte 1 Bit 0 | Bit 7 Byte 2 Bit 0 0 0 Ý nghĩa các bit: Byte 1: Nội dung của byte 1 của R2 hoàn toàn giống với R1. Byte 2: Bit 7 : Luôn là 0 Bit 6 : Thông số xóa Bit 5 : Vi phạm chế độ bảo vệ ghi. Bit 4 : Lỗi ecc thẻ Bit 3 : Lỗi CC Bit 2 : Lỗi Bit 1 : Bỏ qua chế độ bảo vệ ghi hoặc lỗi lệnh khóa/mở khóa thẻ Bit 0 : Khóa thẻ Các thông số trên nhận được khi các bit có giá trị là 1. 6.4 Khởi tạo MMC trong chế độ SPI. Quá trình khởi tạo trong chế độ SPI: Sau khi cấp nguồn MMC hoạt động ở MMC mode. Để chuyển sang SPI mode cần phải thực hiện quy trình sau: Cấp điện áp cho thẻ nhớ đợi trong vòng ít nhất là 1ms, thiêt lập DI và CS ở mức cao, sau khoảng 74 xung được gửi tới chân SCLK thì thẻ nhớ sẽ cho phép lệnh. 6.4.1 Thiết lập lại phần mềm. Gửi lệnh CMD0 với chân CS ở mức thấp để reset thẻ. MMC lấy mẫu tín hiệu CS khi lệnh CMD0 được phát hiện sử dụng. Nếu tín hiệu CS ở mưc thấp thì thẻ nhớ sẽ hoạt động ở chế độ SPI. Lệnh CMD0 phải là lệnh đầu tiên, trường CRC phải có giá trị hợp lệ, với lệnh CMD0 thì CRC là 0x96. Khi vào hoạt động ở chế độ SPI, thì mã kiểm tra CRC được vô hiệu hóa. Sau khi lệnh CMD0 được chấp nhận, thẻ nhớ sẽ rơi vào trạng thái chờ (idle state) một đáp ứng R1 sẽ được gửi trở lại host. Giá trị của của bit idle state là 1, byte R1 là 0x01. CRC cũng có thể cho phép lại bằng lệnh CMD59. 6.4.2 Khởi tạo. Với trạng thái chờ (idle state), thẻ nhớ chỉ cho phép các lệnh CMD0, CMD1, và CMD58. Những lệnh khác sẽ bị loại bỏ. Khi thẻ phát hiện ra CMD1 nó sẽ bắt đầu quá trình khởi tạo. Để kết thúc việc thăm dò khi khởi tạo thẻ, mạch điều khiển của host phải lặp lại quá trình gửi CMD1 và kiểm tra đáp ứng. Khi đã khởi tạo thành công, thì bit “In Idle State” trong đáp ứng R1 được xóa về 0. Xử lý qúa trình khởi tạo có thể mất tới vài trăm ms (milliseconds). Sau khi quá trình khởi tạo kêt thúc thì việc đọc/ghi sẽ được chấp nhận. Trong thời gian này, OCR và CSD có thể được đọc để cấu hình các thuộc tính của thẻ. Ban đầu giá trị về độ dài của 1 khối có thể lớn hơn 512 byte, vì vậy nếu muốn thay đổi giá trị này ta sử dụng CMD16. Quá trình trên có thể mô tả bắng sơ đồ: Hình 6.12: Sơ đồ khối khởi tạo MMC CMD0 Trạng thái đợi (Idle state) CMD1 Trạng thái không hoạt động Trạng thái sẵn sàng Bận hoặc điện thế không phù hợp Điện thế không phù hợp Đoạn code sau sẽ mô tả quá trình khởi tạo thẻ. /////////////////////////////////////////////////////// int1 MMC_Initialize(void) {    int8 i, r1;    output_high(PIN_C7);   //tat lua chon MMC    for(i=0; i < 20; i++)       spi_write(0xFF);    output_low(PIN_C7);    //delay_ms(20);    if(MMC_Command(0x40,0,0,0x95, 1, 99) != 1) goto ErrorMMC; MMCLoop:    r1 = MMC_Command(0x41, 0, 0, 0xFF, 0, 0x40);    //LCD_SetCursor(0,6);    //printf(LCD_putc, "41_R1: %X", r1);    if(r1 != 0) {       goto MMCLoop;    }    spi_write(0xFF);    output_high(PIN_C7);    spi_write(0xFF);    return TRUE; ErrorMMC:    output_high(PIN_C7);    spi_write(0xFF);    return FALSE; } //////////////////////////////////////////////////////// 6.5 Quá trình đọc ghi khối dữ liệu đối với MMC trong SPI mode. Hình 6.13: Đọc ghi dữ liệu theo từng block. Còn đây là code để thực hiện 2 công việc trên Với lệnh ghi CMD24 thì 8 bit đầu tiên của khung lệnh là “0101 1000B” giá trị này trong hệ hexa là 0x58, còn với lệnh đọc CMD17 thì 8 bit đó sẽ là “0101 0001B” trong hệ hexa là 0x51. /////////////////Ghi 512 byte du lieu///////////////////// if (Command(0x58,0,512,0xFF) !=0) puts("Write error "); SPI(0xFF); SPI(0xFF); SPI(0xFE); SPI("Begin\n\r");   // 7 ky tu     for(i=0; i < 500; i++){   // con 512 ky tu    SPI('M'); } SPI("\n\rEnd");   // 5 ky tu SPI(255);       SPI(255); i=SPI(0xFF); i &=0b00011111; if (i != 0b00000101) puts("Write Error "); while(SPI(0xFF) !=0xFF);//doi qua trinh xu ly ket thuc //************************************* /////////////////Doc 512 byte////////////////////// if (Command(0x51,0,512,0xFF) !=0) puts("Read Error "); while(SPI(0xFF) != 0xFE);    for(i=0; i < 512; i++) {      putc(SPI(0xFF));      // gui du lieu } SPI(0xFF);     //gui 2 byte gia tri 255 de ket thuc SPI(0xFF); /////////////////////////////////////////////////////// 6.6 Hệ thống tệp tin. Qúa trình ghi dữ liệu lên thẻ có thể thực hiện theo 2 cách là ghi theo kiểu nhị phân (raw) hoặc theo kiểu hệ thống định dạng tệp tin (FAT). Với cách ghi theo kiểu nhị phân dữ liệu sẽ được ghi lần lượt vào thẻ nhớ, với cách ghi này nếu trót lỡ ghi vào master boot record (MBR) ở sector0 thì khả năng thẻ nhớ không thể sử dụng được là rất cao. Mặt khác với cách ghi raw thì khi cắm thẻ nhớ vào đầu đọc thẻ trên máy tinh thì Window sẽ không cho phép sử dụng thiết bị và bắt định dạng (reformat). Định dạng thẻ theo hệ thống tập tin (FAT) sẽ cho phép ta xem các dữ liệu đã ghi lên thẻ trên máy tính. Với cách ghi này dữ liệu chỉ được ghi vào vùng dữ liệu được quy ước trên thẻ. Một số hệ thống định dạng tệp tin mà hệ điều hành Windows sử dụng là FAT12, FAT16, FAT32, NTFS. Theo tiêu chuẩn ISO/IEC 9293 hệ thống lưu trữ dữ liệu trên các sector. Mỗi một sector có độ dài là 512 byte. Một nhóm các sector cho ta 1 cluster. Sector đầu tiên ở trên thẻ là Master Boot Record (MBR). MBR chứa thông tin về các phân vùng. Mỗi phân vùng này được định dạng với một hệ thông tệp tin duy nhất. Đặc trưng của SD card và MMC là chỉ có một phân vùng được kích hoạt. Thông tin phân vùng gồm có: Boot sector FAT regions Root Directory region Data region n : số bảng FAT Hình 6.14: Cấu trúc bộ nhớ MMC Sector khởi động (boot sector): là sector đầu tiên của mỗi phân vùng, ở đây chứa những thông tin cơ bản về loại hệ thống tệp tin. Vùng FAT (FAT region): là một bản đồ thực tế ở trên thẻ, cho biết những cluster nào được chỉ định trong vùng dữ liệu (data region). Thông thường có 2 bản sao chép của FAT ở trong vùng FAT (FAT region). Vùng thư mục gốc (root directory region): nằm tiếp theo vùng FAT chứa danh sách các file và thư mục ở trên thẻ. Vùng dữ liệu (data region): 3 phần trên là vùng hệ thống. Khoảng trống còn lại trên là vùng dữ liệu. Dữ liệu trên vùng này còn nguyên vẹn nếu không bị xóa hoặc ghi đè. Hệ thống FAT16 sử dùng 16 bit cho mỗi “FAT entry”, cho phép đánh dấu được khoảng chừng 66.536 (216) cluster. Có 1 byte trong boot sector định nghĩa số sector trên một cluster. Với hệ thống tệp tin FAT16 thì có thể hỗ trợ thể hỗ trợ tối đa phân vùng là 2GB. Hình sau chỉ ra cấu trúc bộ nhớ của MMC 6.6.1 Master Boot Record. MBR chứa những thông tin được sử dụng khi khởi động thẻ, cũng như thông tin về phân vùng. Những thông tin trong master boot record đã được chương trình hóa từ khi sản xuất. Những cố gắng để ghi vào MBR có thể làm thẻ không thể dùng được. Nội dung của MBR chỉ ra ở bảng sau. Địa chỉ byte Miêu tả Kích thước 000h Boot code 446 byte 1BEh Partition Entry 1 16 bytes 1CEh Partition Entry 2 16 bytes 1DEh Partition Entry 3 16 bytes 1EEh Partition Entry 4 16 bytes 1FEh Boot Signature Code (55h AAh) 2 bytes 6.6.1.1 Mục phân vùng trên MBR. Thông tin về một phân vùng trên thẻ được chứa trong mục bảng phân vùng trên master boot record. Một mô tả hệ thống tệp tin được chứa trong mục này để chỉ ra loại hệ thống file được sử dụng khi định dạng thẻ. Đối với MMC thì chỉ có một phân vùng được hoạt động. Bảng sau đưa ra nội dung mục bảng phân vùng. Địa chỉ byte Ý nghĩa Kích thước 00h Boot Descriptor (bằng 80h nếu phân vùng hoạt động, 00h nếu không hoạt động 1 byte 01h Sector đầu tiên của phân vùng 3 byte 04h Miêu tả hệ thống tệp tin 1 byte 05h Sector cuối cùng của phân vùng 3 byte 08h Số sector ở giữa MBR và sector đầu tiên của phân vùng 4 byte 0Ch Số sector trong phân vùng 4 byte 6.6.2 Sector khởi động. Sector khởi động (boot sector): là sector đầu tiên của của một phân vùng, chứa các thông tin về hệ thống tệp tin được sử dụng trong phân vùng đó và một số thông tin quan trọng khác. Mục đầu tiên trong boot sector là một lệnh nhảy để bỏ qua những thông tin khởi động. Nội dung chi tiết của boot sector được cho ở bảng sau. Địa chỉ byte Ý nghĩa Kích thước 00h Lệnh nhảy 3 byte 03h Tên OEM 8 byte 0Bh Số byte trên một sector 2 byte 0Dh Số sector trên một cluster 1 byte 0Eh Số sector của vùng để dành 2 byte 10h Số bảng phân bố dữ liệu (FAT) 1 byte 11h Số để mục trong thư mục gốc 2 byte 13h Tổng số sector (bit 0 – 15 trên tổng số 48 bit) 2 byte 15h Môi trường thẻ 1 byte 16h Số sector của một FAT 2 byte 18h Số sector trên một Track 2 byte 1Ah Sô head 2 byte 1Ch Số sector ẩn 4 byte 20h Tổng số sector (bít 16 – 47) 4 byte 24h Số ổ vật lý 1 byte 25h Head hiện tại 1 byte 26h Chữ ký khởi động 1 byte 27h ID của phân vùng 4 byte 2Bh Nhãn của phân vùng 11 byte 36h Loại hệ thồng file ( không được chỉ rõ) 8 byte 1FEh Chữ ký của hệ điều hành (55h, AAh) 2 byte 6.6.3 Thư mục gốc. Thư mục gốc (root directory) nằm ngay sau vùng FAT ở trong phân vùng, được chia thành các đề mục (entry) kích thước 32 byte để lưu trữ thông tìn về tệp tin và thư mục. Mỗi một entry chứa tên file, kich thước file, cluster đầu tiên của file, thời gian mà file được tạo ra hoặc đựợc bổ sung sữa chữa. Địa chỉ byte Ý nghĩa Kích thước 00h Tên file 8 byte 08h Đuôi mở rộng của file 3 byte 0Bh Thuộc tính của file 1 byte 0Ch Dữ phòng 1 byte 0Dh Thời gian tao file (phần ms) 1 byte 0Eh Thời gian tạo file ( giờ, phút, giây) 2 byte 10h Ngày tạo ra 2 byte 12h Ngày truy xuất cuối cùng 2 byte 14h Địa chỉ mở rộng 2 byte 16h Thời gian của lần sửa cuối cùng ( giờ, phút, giây) 2 byte 18h Ngày sửa cuối cùng 2 byte 1Ah Cluster đầu của file 2 byte 1Ch Kích thước file 4 byte 6.6.4 Bảng phân bố dữ liệu. Bảng phân bố dữ liệu (File Allocation Table) FAT :là một danh sách móc nối sử dụng cùng với bảng thư mục để theo dõi sát vị trí của dữ liệu ( file) trên thẻ và để sắp xếp chỗ trống để lưu trữ các file mới. FAT nằm ngay sau sector khởi đồng và phần để dành. Vùng lưu trữ dữ liệu trên đĩa được chia thành các trang (cluster), cấp phát các vùng nhớ trên đĩa cho file theo từng trang, một file không nhất thiết phải chiếm các trang liên tiếp nhau mà có thể chiếm các trang nằm rải rác trên thẻ. Chính vì lý do này cần phải lưu trữ bản đồ các trang – đó chính là FAT. FAT được chia thành các phần bằng nhau gọi là các đề mục (entry), mọi trang (cluster) trên thẻ đều có một đề mục tương ứng của nó, đề mục chứa một con số chỉ ra số của trang tiếp theo, hoặc một con số biểu diễn trang thái khác của trang. Nội dung các đề mục trong bảng FAT có ý nghĩa như cho ở bảng: Giá trị Ý nghĩa 0000h Báo rằng trang tương ứng còn trống 0001h Để dành 0002 – FFEFh Chỉ trang tiếp theo của file FFF0 – FFF6h Dành cho mục đích khác, không sử dụng FFF7h Trang hỏng FFF8 – FFFFh Trang tương ứng là kết thúc của file. Hình 6.16: Vi dụ phân bố dữ liệu của 1 file. Số đề mục trong FAT phải lơn hơn hoặc bằng số trang trên thẻ, kích thước (số bit) của mỗi đề mục FAT phải chứa được số hiệu trang của trang cuối cùng trên thẻ. Ta có thể hình dung FAT là một cái bảng mà mỗi phần tử là một đề mục. Thông qua nội dung trong các để mục để biết các trang còn trống để cấp phát cho các file, các trang đã cấp là thuộc file nào, trang nào bị hỏng không dùng.v.v. Với định dạng FAT16 thì mỗi đề mục FAT có kích thước 16 bit, do vậy nó chứa được con số lớn nhất là 65536 (216), tùy vào số sector trên 1 cluster mà dung lượng tối đa với định dạng FAT16 này sẽ khác nhau. Ví dụ như 1 cluster = 1 sector, thì dung được của thể được định dạng theo FAT16 là : 216 * 512 byte = 32Mbyte… 6.6.5 Sử dụng hàm khi định dạng thẻ theo FAT16. Có 13 hàm mà người dùng có thể sử dụng để quản lý file và thao tác với thẻ. Bảng sau cung cấp 1 cách tổng quan về các hàm. Tên hàm Ý nghĩa FSInit Là hàm khởi tạo thẻ, nạp vào MBR (thông tin về phân vùng), nạp vào sector khởi và cập nhật những thông sô hợp lệ cho nó FSfclose Hàm này cập nhật thông tin file, ngừng lại việc ghi tới entry và giải phóng RAM. Hàm này cũng cập nhật thông tin về mốc thời gian cho file. FSfoef Hàm phát hiện nếu việc kết thúc của 1 file đã được hoàn thành FSfopen Nếu file đã tồn tại, FSfopen có thể mở nó để ghi thêm vào từ điểm kêt thúc ơ lần mở trước, xóa nó và tạo một file mới cùng tên để ghi vào hoặc đơn giản chỉ là để đọc file. Nếu file không tồn tại, FSfopen có thể tạo ra nó. FSfopenpgm Hàm mở một file trên SD card kết hợp với FSFILE structure (stream). Hàm sử dụng đối số đã định nghĩa trong ROM. Hàm cần thiết cho kiến trúc PIC18. FSfread Hàm sẽ đọc thông tin từ một file mở tới một bộ đệm. Số byte ghi có thể được định nghĩa bằng các tham số. Nếu FSfread được gọi liên tiếp trên cùng 1 file giống nhau thì quá trình đọc sẽ tiếp tục từ điểm dừng ở lần đọc trước. Hàm này trả lại giá trị của dữ liệu đã đọc. FSfwrite Hàm đọc thông tin từ bộ đệm tới 1 file mở. Thuật toán sử dụng là đọc một sector từ vùng dữ liệu trên thẻ tới SRAM. Việc ghi các block với khối dữ liệu lớn, sẽ mất thời gian hơn ta ghi những block giống nhau nhưng block nhỏ. FSremove Hàm tìm kiếm các file cơ sở với tên hợp lệ cho nó. Nếu tìm thấy thì đề mục thư mục gốc được xóa mặt nạ và đề mục FAT được tẩy. FSremovepgm Xóa file được xác định bằng tên cho trước. Nếu file đã được mở với FSfopen, nó phải xóa file đó trước và gọi lai FSremovepgm. Tên file phải được định nghĩa ở trong ROM. Chức năng này chỉ cần thiết với PIC18. FSrewind Hàm thiết lập lại vị trí bắt đầu của file SetClockVars Hàm được sử dụng trong mode đồng hồ đã đước sử dụng có thiết lập thời gian hiện tại. Ngày giờ sẽ được áp dụng cho file mà đã tạo hoặc sử chữa. FSmkdir Thao tác với thư mục, hám sẽ tạo một thư muc con trong thư mục hiện thời. FSchdir Thao tác với thư mục, hàm sẽ thay đổi thư mục làm việc hiện thời thành 1 thư mục được định danh bởi người dùng FSrmdir Thao tác với thư mục, hàm sẽ xóa thư mục được chỉ định bởi người dùng FSgetcwd Thao tac với thư mục, hàm sẽ trả lại giá trị tên của thư mục đang làm việc hiện tại tới người dùng FindFirst Hàm sẽ định vị trí của file trong thư mục hiên thời cái mà phù hợp với tên và thuộc tính được đặt bởi người dùng. Với mỗi file được chỉ định, tên kích cỡ file, ngày giờ tạo, thuộc tính trong cấu trúc SearchRec sẽ được cập nhật với thông tin file chính xác. FindFirstpgm Giống với hàm FindFirst, hàm chỉ cần thiết đối với PIC18 FindNext Hàm định vị trí tiếp theo trong thư mục hiện tại sau khi đã gọi các hàm FindFirst hoặc FindFirstpgm FSformat Hàm sẽ xóa toàn bộ bảng thư mục gốc và bảng phân bố dữ liệu. Khi người dùng gọi hàm này nó sẽ tạo ra một boot sector mới dựa trên những thông tin lấy từ MBR FSfprintf Hàm sẽ ghi 1 chuỗi lên file. Ví dụ: Khởi tạo FAT16 và tạo một file. Đinh dạng MMC với hàm FSinit sau đó gọi hàm FSfopen để tạo 1 file mới, tiếp đến FSfopenpgm được gọi, đây là hàm giống với FSfopen tuy nhiên nó cho phép những thông số ROM. Hàm này thực hiện hành động mở 1 file đã tồn tại trong chế độ đọc. Quá trình tiếp tục với việc đọc 10byte dữ liệu từ file, rồi lại ghi 15 byte tới 1 file mới rồi đóng cả 2 file. Kết thúc công việc là xóa file cũ, để thực hiện được việc xóa file thì phải đảm bảo file đã đươc đóng bằng hàm FSfclose. Đoạn code sau mô tả các công việc trên. /////////////////////////////////////////////// #include #define bfrsize 5 void main(void){ FSFILE *pOldFile, pNewFile; char myData[20]; char bfr [6]; int bytesRead, bytesWritten; char newFile[] = “newfile.txt”; char writeArg = “w”; // khoi tao thu vien FAT16, chuan SPI va cac chan co lien quan if( !FSInit() ) //Loi qua trinh khoi tao FAT16 return 1; // the khong hien dien hoac dinh dang sai // tao 1 file moi pNewFile = FSfopen (newFile, writeArg); // mo 1 file da ton tai va doc pOldFile = FSfopenpgm (“myfile.txt”, “r”); if ( pOldFile == NULL ) return 1; // doc 10 byte du lieu tu file. bytesRead = FSfread((void*)myData,10,1,pOldFile); bytesRead = FSfread((void *)bfr,1,bfrSize, pOldFile); // ghi 15 byte len file bytesWritten = FSfwrite((void *) myData, 10, 1,pNewFile); bytesWritten = FSfwrite((void *)bfr,1, bfrSize, pNewFile); // dong tat ca cac file FSfclose( pOldFile ); FSfclose (pNewFile); //xoa file cu FSremovepgm (“myfile.txt”); } ///////////////////////////////////////////////////////// ===================================================== CHƯƠNG 7: LCD Hầu hết các LCD hiển thị ký tự hiện tại sử dụng bộ điều khiển HD44780 của hãng Hitachi. Bộ điều khiển này có thể dùng để điều khiển hiển thị LCD 16x1, 16x2, 20x2, 20x4.… Phần tiếp sau sẽ giới thiệu tổng quan về LCD 16x2, cách ghép nối với vi điều khiển và điều khiển hoạt động. 7.1 Giới thiệu LCD. LCD sử dụng trong khóa luận là loại 2 dòng và 16 cột, cho phép hiển hiển thị cùng lúc 32 ký tự. Với 14 chân điều khiển và 2 chân mở rộng, sơ đồ chân được chỉ ra ở hinh. Hình 7.1: Ảnh LCD1602. Hình 7.2: Số thứ tự và tên chân tương ứng. 7.1.1 Bảng mô tả các chân của LCD: Số thứ tự Tên Ý nghĩa 1 Vss Đất 2 Vcc Cung cấp nguồn +5V 3 Vee Điều khiển độ tương phản 4 RS 0 = đầu vào là lệnh 1 = đầu vào là dữ liệu 5 R/W 0 = ghi tới LCD 1 = đọc từ LCD 6 EN Chân cho phép 7 D0 Đường dữ liệu 0 (LSB) 8 D1 Đường dữ liệu 1 9 D2 Đường dữ liệu 2 10 D3 Đường dữ liệu 3 11 D4 Đường dữ liệu 4 12 D5 Đường dữ liệu 5 13 D6 Đường dữ liệu 6 14 D7 Đường dữ liệu 7 (MSB) 7.1.2 RAM chứa dữ liệu hiển thị. Display data RAM : lưu trữ dữ liệu hiển thị với mã ký tự 8 bit. Có dung lượng 80 x 8 bit, hoặc là 80 ký tự. Khi gửi dữ liệu đến Display data RAM (DDRAM) giá trị đó sẽ được hiển thị ngay trên LCD. Với LCD 2 x 16, chỉ nhìn thấy được 32 ký tự, vì thế sau ký tự thứ 32 cho dù có ghi tới DDRAM thì giá trị cũng không được hiển thị lên LCD. Vùng DDRAM không dùng cho việc hiển thị có thể sử dụng làm bộ nhớ dữ liệu thông thường. 7.1.3 ROM phát ký tự. Một câu hỏi đặt ra, khi gửi một giá trị ASCII đến DDRAM làm thế nào ký tự đó hiển thị được trên LCD? Câu trả lời đó là Character Generator ROM (CGROM). CGROM tạo ra kiểu dáng ký tự có thể là 5x8 điểm hoặc 5x10 điểm từ 8 bit mã ký tự. Người dùng có thể định nghĩa kiểu dáng của ký tự thông qua mặt nạ chương trình ROM. Bảng dưới đây cho hình dáng hiển thì của ký tự trên màn hình LCD theo kiều 5x8 điểm. Hình 7.3: Bảng các ký tự hiển thị trên LCD. 7.1.4 Thanh ghi chỉ thị và thanh ghi dữ liệu. Là 2 thanh ghi 8 bit trong bộ điều khiển HD44780. Thanh ghi chỉ thị lệnh (instruction register) chứa các lệnh được gửi từ vi điều khiển để điều khiển LCD như lệnh dịch LCD, xóa LCD, địa chỉ LCD .v.v.. Thanh ghi dữ liệu (data register) được sử dụng để lưu trữ dữ liệu để hiển thị trên LCD. Khi tín hiệu cho phép gửi của LCD được xác nhận, dữ liệu trên các chân sẽ được chốt tới thanh ghi dữ liệu và dữ liệu này sau đó sẽ được tự động chuyển tới DDRAM và sau đó sẽ hiển thị lên LCD. 7.2 Lệnh và chỉ thị. Chỉ có thanh ghi chỉ thị (instruction register) và thanh ghi dữ liệu (data register) của LCD mới có thể điều khiển được bằng vi điều khiển. Sự hoạt động bên trong của LCD được xác định bằng các tín hiệu được gửi đến từ MCU. Những tín hiệu đó bao gồm : tín hiệu lựa chon thanh ghi, tín hiệu đọc/ghi, và dữ liệu trên bus (D0 tới D7), có 4 loại lệnh của LCD là: Chỉ rõ chức năng của LCD như định dạng hiển thị, độ dài dữ liệu .v.v. Thiết lập địa chỉ RAM trong Thực hiện truyền dữ liệu với RAM trong Thực hiện một số chức năng khác. Bảng sau tóm tắt một danh sách các lệnh thường xuyên sử dụng khi làm viêc với LCD. Số thứ tự Chỉ thị Mã lệnh (hex) Mã lênh (decimal) 1 Thiết lập : 8 bit, 1 dòng, 5x7 điểm 0x30 48 2 Thiết lập : 8 bit, 2 dòng, 5x7 điểm 0x38 56 3 Thiết lập : 4 bit, 1 dòng, 5x7 điểm 0x20 32 4 Thiết lập : 4 bit, 2 dòng, 5x7 điểm 0x28 40 5 Tắt hiển thị, tắt con trỏ 0x08 8 6 Bật hiển thị, bật con trỏ 0x0E 14 7 Bật hiển thị, tắt con trỏ 0x0C 12 8 Bật hiển thị, nhấp nháy con trỏ 0x0F 15 9 Dịch hiển thị sang trái 0x18 24 10 Dịch hiển thị sang phải 0x1C 30 11 Di chuyển con trỏ sang trái 1 ký tự 0x10 16 12 Dich chuyển con trỏ sang phải 1 ký tự 0x14 20 13 Xóa hiểm thị đồng thời cũng xóa nội dung trong DDRAM 0x01 1 14 Thiết lập địa chỉ DDRAM hoặc vị trí con trỏ hiển thị 0x80 + add 128 + add 15 Thiết lập địa chỉ CGRAM hoặc cài đặt con trỏ tới vùng CGRAM 0x40 + add 64 + add 7.3 Khởi tạo LCD. Trước khi sử dụng LCD vào mục đích hiển thị, thì LCD cần được khởi tạo. Có thể khởi tạo bằng cách dùng mạch reset trong hoặc dùng các lệnh thiết lập cho LCD. Trong khóa luận chỉ đưa ra cách khởi tạo sử dụng lệnh. Qúa trình khởi tạo LCD được chỉ ra ơ lưu đồ. Hình 7.4: Quá trình khởi tạo LCD. Đoạn chương trình sau cho ta quá trình khởi tạo LCD ////////////////////////////////////////////////////////// void LCD_init() {      LCD_data = 0x28;     //thiet lap:2 dong,8-bit,5x7 diem      LCD_rs   = 0;        //lua chon thanh ghi lenh      LCD_rw   = 0;        //dl ghi vao thanh ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0;      LCD_busy();          //Doi lcd xu ly      LCD_data = 0x0F;     //bat hien thi con tro nhap nhay      LCD_rs   = 0;        //chon thanh ghi lenh      LCD_rw   = 0;        /du lieu ghi vao thah ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0;      LCD_busy();          //cho LCD xu ly      LCD_data = 0x01;     //xoa LCd      LCD_rs   = 0;        //chon thanh ghi lenh      LCD_rw   = 0;        /du lieu ghi vao thah ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0; LCD_busy();          //cho LCD xu ly      LCD_data = 0x06;          LCD_rs   = 0;        //chon thanh ghi lenh      LCD_rw   = 0;        /du lieu ghi vao thah ghi du lieu      LCD_en   = 1;        //cho phep H->L      LCD_en   = 0; LCD_busy();          // cho LCD xu ly } ///////////////////////////////////////////////////////// 7.4 Các hàm thao tác cơ bản với LCD. 7.4.1 Cờ bận và đọc cờ bận. Busy Flag : là cờ chỉ thị trạng thái cho LCD. Khi gửi 1 lệnh hoặc dữ liệu tới LCD để xử lý thì cờ này được bật (BF =1). Quá trình kết thúc cờ này được xóa về không (BF = 0). Để đọc được cờ BF thì điều kiện là RS = 0 và R/W = 1, bit MSB của dữ liệu LCD (D7) chứa giá trị nhận được của BF. Khi BF = 1 có nghĩa là LCD đang bận và sẽ không nhận bất cứ lệnh nào, còn khi BF = 0 cho biết LCD đã sẵn sàng nhận lệnh hoặc dữ liệu để xử lý. Khi gửi lệnh thì BF hoặc D7 của LCD sẽ nhận giá trị 1 thông báo LCD đang bận xử lý, quá trình kết thúc BF = 0. Các bước sau chỉ ra quá trình đọc cờ bận. Lựa chọn thanh ghi lệnh Lựa chọn thao tác đọc Gửi tín hiệu cho phép Đọc cờ. Đoạn code sau sẽ cho ta qúa trình đọc cờ bận /////////////////////////////////////////////////////// void LCD_busy(){      LCD_D7   = 1;            LCD_en   = 1;                LCD_rs   = 0;                LCD_rw   = 1;           //cho phep doc    while(LCD_D7){          //doc lai co ban cho toi khi nhan gia tri 0            LCD_en   = 0;     //cho phep       LCD_en   = 1;      } } /////////////////////////////////////////////////// Thao tác đọc cờ bận có thể thay thế bằng một khoảng thời gian trễ của hệ thống, để quá trình xử lý trên LCD hoàn thành. Có thể dùng hàm sau: ///////////////////////////////////////////////////// void LCD_busy(){          unsigned char i,j;          for(i=0;i<50;i++)    //mot vong lap don gian            for(j=0;j<255;j++); } ///////////////////////////////////////////////////// 7.4.2 Gửi lệnh và dữ liệu đến LCD. Gửi lệnh: qúa trình gửi lệnh thực hiện giống hệt như trong hàm khởi tạo có thể xây dựng hàm con với các bước sau: Di chuyển dữ liệu tới cổng của LCD Lựa chọn thanh ghi lệnh Lựa chọn thao tác ghi Gửi tín hiệu cho phép Đợi cho LCD xử lý Đây là hàm mô tả quá trình trên: ///////////////////////////////////// void LCD_command(unsigned char var){      LCD_data = var;// var la lenh can thao tac       LCD_rs   = 0      LCD_rw   = 0;              LCD_en   = 1;              LCD_en   = 0;      LCD_busy() } /////////////////////////////////////// 7.4.3 Cài đặt vị trí con trỏ trên LCD. Để thiết lập vị trí con trỏ trên LCD, cần gửi tới địa chỉ DDRAM Bit7  6   5   4   3   2   1   0  1   AD6 AD5 AD4 AD3 AD2 AD1 AD0 Bit thứ 7 luôn luôn là 1, các bit từ 0 tới 7 là địa chỉ của DDRAM. Nếu muốn đặt con trỏ tại vị trí đầu tiên tức dòng 1 cột 1, thì địa chỉ sẽ phải là ‘10000000B’ hay 0x80. Với LCD 2 dòng 16 cột, địa chỉ từ 0x80 tới 0x8F cho phép nhìn thấy trên dòng 1 và từ địa chỉ từ 0xC0 tới 0xCF nhìn thấy được trên dòng 2, vùng còn trống của DDRAM vẫn được dùng, tuy nhiên sẽ không nhìn thấy được trên LCD. Để kiểm tra điều này cách đơn giản là xuất 1 chuỗi ký tự lớn hơn 16 và dịch hiển thị thì những ký tự không được nhìn thấy sẽ trở lại từ phía sau. 7.4.4 Gửi dữ liệu tới LCD. Gửi dữ liệu đơn giản chỉ cần lựa chọn thanh ghi dữ liệu, các công việc khác hoàn toàn giống với thao tác gửi lệnh. Được mô tả bằng các bước sau: Di chuyển dữ liệu tới cổng LCD Lựa chọn thanh ghi dữ liệu Lựa chọn thao tác ghi Gửi tín hiệu cho phép Đợi cho LCD xử lý. Qúa trình trên được mô tả bằng đoạn code viết bằng C như sau: ////////////////////////////////////////////// void LCD_senddata(unsigned char var){      LCD_data = var      LCD_rs   = 1;              LCD_rw   = 0;              LCD_en   = 1;              LCD_en   = 0;      LCD_busy(); } ////////////////////////////////////////////// 7.5 LCD hoạt động ở chế độ 4 bit. Có nhiều nguyên nhân của việc chọn sử dụng chế độ 4 bit của LCD trong khóa luận. Một trong số đó là với chế độ này sẽ sử dụng một số ít chân của vi điều khiển để giao tiếp với LCD. Với chế độ 4 bit dữ liệu sẽ được gửi thành các nhóm 4 bit (nible), nible cao sẽ được gửi trước sau đó mới đến nible thấp. Để cho phép LCD hoạt động trong chế độ này thì chuỗi quá trình để khởi tạo là: Đợi khoảng 20mS Gửi giá trị khơi tạo lần đầu tiên (0x30) Đợi 10mS Gửi giá trị khởi tạo lần hai (0x30) Đợi 1mS Lựa chọn chế độ 4 bit (0x02) Đợi 1ms Sơ đồ ghép nối: Hình 7.5: Ghép nối LCD ở chế độ 4 bit. 7.5.1 Khởi tạo LCD ở chế độ 4 bit. ///////////////////////////////////////////////// void lcd_reset() {         lcd_port = 0xFF;         delayms(20);         lcd_port = 0x03+LCD_EN;         lcd_port = 0x03;         delayms(10);         lcd_port = 0x03+LCD_EN;         lcd_port = 0x03;         delayms(1);         lcd_port = 0x03+LCD_EN;         lcd_port = 0x03;         delayms(1);         lcd_port = 0x02+LCD_EN;         lcd_port = 0x02;         delayms(1); } void lcd_init () {         lcd_reset();                 lcd_cmd(0x28);               lcd_cmd(0x0C);         lcd_cmd(0x06);         lcd_cmd(0x80);  } //////////////////////////////////////////////////// 7.5.2 Gửi lệnh và dữ liệu tới LCD. //////////////////////////////////////////////////// void lcd_cmd (char cmd) {         lcd_port = ((cmd >> 4) & 0x0F)|LCD_EN;         lcd_port = ((cmd >> 4) & 0x0F);         lcd_port = (cmd & 0x0F)|LCD_EN;         lcd_port = (cmd & 0x0F);         delayus(200);         delayus(200); } void lcd_data (unsigned char dat){         lcd_port = (((dat >> 4) &0x0F)|LCD_EN|LCD_RS);         lcd_port = (((dat >> 4) & 0x0F)|LCD_RS);         lcd_port = ((dat & 0x0F)|LCD_EN|LCD_RS);         lcd_port = ((dat & 0x0F)|LCD_RS);         delayus(200);         delayus(200); } /////////////////////////////////////////////////// ========================================================== CHƯƠNG 8: KẾT QUẢ THỰC NGHIỆM Quá trình làm khóa luận tôi đã xây dựng được mạch với các modul giao tiếp giao bao gồm: giao tiếp bàn phím PS/2, ghép nối cảm biến nhiệt độ LM35, ghép nối với vi mạch thời gian thực DS1307, ghép nối thẻ nhớ MMC và khối hiển thị LCD với vi điều khiển PIC18F458. Ngoài ra còn các modul nguồn cung cấp ổn áp 5V và 3.3V các mạch chuyển mức điện áp…, để thực hiện những yêu cầu mà đề tài đặt ra. Sơ đồ nguyên lý được chỉ rõ ở phụ lục 1. Còn đây là mạch in sau khi thi công. Hình 8.1: Bo mạch sau thi công và hàn linh kiện Đã áp dụng thành công chuẩn nạp ICSP, nạp ngay trên mạch cho vi điều khiển. Sử dụng mạch nạp PICkit2 của Microchip, với chuẩn nạp này cho thời gian nạp chương trình tương đối nhanh, khoảng 30 giây cho chương trình 5 Kbyte. Không mất thời gian tháo chip ra khỏi đế, tránh được đứt chân vi mạch sau một vài lần tháo gắn, nạp tốc độ cao là một số ưu điểm dễ dàng nhận thấy khi sử dụng chuẩn nạp “on board” này. Khi thực hiện khóa luận thì quá trình xây dựng và kiểm tra kết quả được đã thực hiện theo từng modul, gồm các modul đầu vào và đầu ra của dữ liệu, thông tin. Đầu vào gồm có đầu vào dữ liệu từ bàn phím PS/2, đầu vào dữ liệu từ sensor nhiệt độ LM35 và dữ liệu đọc từ vi mạch thời gian thực DS1307. Với đầu vào dữ liệu từ bàn phím PS/2 đã thực hiện ghép nối trên bo mạch thiết kế, giao tiếp được thể hiện qua việc gõ các ký tự trên bàn phím và các ký tự này được hiển thị trên màn hình LCD các chuỗi ký tự được lưu vào trong thẻ nhớ sau khi bấm “enter”. Hình 8.2: Kết quả thức hiện giao tiếp với bàn phím PS/2. Đầu vào dữ liệu từ sensor nhiệt độ LM35 qua bộ chuyển đổi tương tự - số của PIC và quá trình tính toán, cho ta giá trị nhiệt độ tính theo thang bách phân Cecilus được hiển thị lên màn hình LCD, và sau đó cũng được lưu vào trong thẻ nhớ với một khoảng thời gian định kỳ được ấn định tùy thuộc mục đích và người lập trình. Dữ liệu về thời gian: Sau thiết lập thời gian cho vi mạch thời gian thực DS1307, các giá trị được ghi vào NVRAM do vậy sẽ không bị mất bi mất điện và đồng hồ của vi mạch sẽ chạy chừng nào vẫn còn nguồn cung cấp hoặc từ pin hoặc từ nguồn ngoài. Giá trị về thời gian được đọc ra và cũng được hiển thị lên màn hình LCD để có thể biết được thời gian thực mà hệ thống đang chạy. Dữ liệu này sẽ được lưu cùng với thông số nhiệt độ, và là thành phần có ý nghĩa rất lớn khi ta tổng hợp và phân tích kết qủa thu được từ sensor nhiệt độ. Hình 8.3: Kết quả hiển thị đồng hồ thời gian thực và nhiệt độ Đầu ra gồm có: khối hiển thị LCD, thẻ nhớ MMC lưu dữ liệu và kết qủa Khối hiển thị được tận dụng rất triệt để trong việc thể hiện các thông tin từ các đầu vào, nó thể hiện trung thực các kết quả mà vi điều khiển xuất ra, là một thành phần rất quan trọng để biết hệ thống của mình có chay và chạy có chính xác hay không. Bộ nhớ lưu trữ dữ liệu và kết quả MMC đây là một ứng dụng làm cho đề tài có khả năng triển khai thực tế cao. Với dung lượng nhớ ngày các gia tăng mà giá thành càng giảm, khi được ứng dụng làm tăng thời gian thu thập số liệu, dữ liệu được lưu không bó buộc chỉ là dữ liệu thu thập như khi dùng các bộ nhớ EEPROM truyền thống, ta có thể lưu thêm nhiều trường thông tin khác như thời gian, địa điểm ở nơi khảo sát. Khóa luận đã thành công trong việc ghi dữ liệu vào trong thẻ nhớ và quan sát được dữ liệu này trên máy tính. ====================================== KẾT LUẬN Sau một khoảng thời gian tìm hiểu và nghiên cứu đề tài, đã giúp em nắm vững thêm các kiến thức đã được học, và cũng bổ sung thêm được một khối lượng kiến thức mới về đo lường cũng như các hệ thống đo lường dựa trên vi điều khiển. Từng bước làm quen, nắm bắt và triển khai thực hiện xây dựng mạch nguyên lý và mạch in trên phần mềm Altium Design. Thành công trong việc sử dụng phần mền CCS v4.068 để viết chương trình trên ngôn ngữ C. Sử dụng thành thạo công cụ mô phỏng Proteus để thực hiện mô phỏng một số phần việc trước khi triển khai lên mạch thật…. Đề tài thể hiện được tính ứng dụng cao, dễ dàng đưa vào triển khai trong thực tế và có thể áp dụng với quy mô lớn trong việc đo lường và lưu trữ các thông số môi trường. Ứng dụng. Với hệ thống như trên có thể ứng dụng trên nhiều trong thực tế. Ví dụ có thể dùng lấy số liệu trong một thời gian dài về nhiệt độ của một khu vực để vẽ biểu đồ nhiệt độ phục vụ cho công tác cảnh báo cháy rừng….Hay như với đầu đo không phải là nhiệt độ mà là độ ẩm thì lại dùng cho nghiên cứu khí tượng, còn nều muốn đo sự biến đổi mức nước của một dòng sông ta có thể dùng đầu đo độ sâu… Đầu đo nhiệt đồ chỉ là một ví dụ cụ thể cho ứng dụng này, nhằm mục đích nhanh cho kết quả để thử nghiệm. Có thể thay thế bằng bất kỳ đầu đo nào tùy vào mục đích và ứng dụng cụ thể. Hướng phát triển. Sau khi thực hiện thành công hệ thống với đầu đo nhiệt độ, nếu có điều kiện em sẽ triển khai hệ thống với những đầu đo khác để có thể áp dụng cho nhiều môi trường xung quanh chúng ta. Một vấn đề khác là vấn đề nguồn nuôi và năng lượng để duy trì hệ thống khi nguôn nuôi không phải là từ điện lưới qua biến đổi AC - DC, có thể đó là pin lithium hay pin năng lượng mặt trời…, khi đó vấn đề tiết kiệm năng lượng cho hệ thống mà vẫn duy trì sự hoạt động ổn định của hệ thống là bài toán khá phức tạp cần phải được tính đến. Một trong những hướng giải quyết là sử dụng các vi mạch có mức tiêu thụ năng lượng thấp, hoặc như có những cơ chế như “sleep” cho vi điều khiển, vi điều khiển sẽ “ngủ” khi các thành phần khác của hệ thông hoạt động và chỉ được đánh thức khi có nhu cầu xử lý…. Cuối cùng là việc nghiên cứu để có thể áp dụng được định dạng thẻ theo hệ thống tập tin FAT32. Với FAT16 giới hạn thẻ nhớ có dung lượng nhỏ hơn 2 Gbyte, còn với FAT32 thẻ nhớ có thể có dung lượng lên tới 8TByte, với con số nay thì không phải nghi đến việc ghi được trong bao lâu mà là ghi những cái gì! ============================================ PHỤ LỤC 2: Keyboard Scan Codes: Set 2 101-, 102-, and 104-key keyboards: KEY MAKE BREAK ----- KEY MAKE BREAK ----- KEY MAKE BREAK A 1C F0,1C 9 46 F0,46 [ 54 FO,54 B 32 F0,32 ` 0E F0,0E INSERT E0,70 E0,F0,70 C 21 F0,21 - 4E F0,4E HOME E0,6C E0,F0,6C D 23 F0,23 = 55 FO,55 PG UP E0,7D E0,F0,7D E 24 F0,24 \ 5D F0,5D DELETE E0,71 E0,F0,71 F 2B F0,2B BKSP 66 F0,66 END E0,69 E0,F0,69 G 34 F0,34 SPACE 29 F0,29 PG DN E0,7A E0,F0,7A H 33 F0,33 TAB 0D F0,0D U ARROW E0,75 E0,F0,75 I 43 F0,43 CAPS 58 F0,58 L ARROW E0,6B E0,F0,6B J 3B F0,3B L SHFT 12 FO,12 D ARROW E0,72 E0,F0,72 K 42 F0,42 L CTRL 14 FO,14 R ARROW E0,74 E0,F0,74 L 4B F0,4B L GUI E0,1F E0,F0,1F NUM 77 F0,77 M 3A F0,3A L ALT 11 F0,11 KP / E0,4A E0,F0,4A N 31 F0,31 R SHFT 59 F0,59 KP * 7C F0,7C O 44 F0,44 R CTRL E0,14 E0,F0,14 KP - 7B F0,7B P 4D F0,4D R GUI E0,27 E0,F0,27 KP + 79 F0,79 Q 15 F0,15 R ALT E0,11 E0,F0,11 KP EN E0,5A E0,F0,5A R 2D F0,2D APPS E0,2F E0,F0,2F KP . 71 F0,71 S 1B F0,1B ENTER 5A F0,5A KP 0 70 F0,70 T 2C F0,2C ESC 76 F0,76 KP 1 69 F0,69 U 3C F0,3C F1 05 F0,05 KP 2 72 F0,72 V 2A F0,2A F2 06 F0,06 KP 3 7A F0,7A W 1D F0,1D F3 04 F0,04 KP 4 6B F0,6B X 22 F0,22 F4 0C F0,0C KP 5 73 F0,73 Y 35 F0,35 F5 03 F0,03 KP 6 74 F0,74 Z 1A F0,1A F6 0B F0,0B KP 7 6C F0,6C 0 45 F0,45 F7 83 F0,83 KP 8 75 F0,75 1 16 F0,16 F8 0A F0,0A KP 9 7D F0,7D 2 1E F0,1E F9 01 F0,01 ] 5B F0,5B 3 26 F0,26 F10 09 F0,09 ; 4C F0,4C 4 25 F0,25 F11 78 F0,78 ' 52 F0,52 5 2E F0,2E F12 07 F0,07 , 41 F0,41 6 36 F0,36 PRNT SCRN E0,12, E0,7C  E0,F0, 7C,E0, F0,12  . 49 F0,49 7 3D F0,3D SCROLL 7E F0,7E / 4A F0,4A 8 3E F0,3E PAUSE E1,14,77, E1,F0,14, F0,77 -NONE- ACPI Scan Codes: Key Make Code Break Code Power E0, 37 E0, F0, 37 Sleep E0, 3F E0, F0, 3F Wake E0, 5E E0, F0, 5E Windows Multimedia Scan Codes: Key Make Code Break Code Next Track E0, 4D E0, F0, 4D  Previous Track E0, 15 E0, F0, 15 Stop E0, 3B E0, F0, 3B Play/Pause E0, 34 E0, F0, 34 Mute E0, 23 E0, F0, 23 Volume Up E0, 32 E0, F0, 32 Volume Down E0, 21 E0, F0, 21 Media Select E0, 50 E0, F0, 50 E-Mail E0, 48 E0, F0, 48 Calculator E0, 2B E0, F0, 2B My Computer E0, 40 E0, F0, 40 WWW Search E0, 10 E0, F0, 10 WWW Home E0, 3A E0, F0, 3A WWW Back E0, 38 E0, F0, 38 WWW Forward E0, 30 E0, F0, 30 WWW Stop E0, 28 E0, F0, 28 WWW Refresh E0, 20 E0, F0, 20 WWW Favorites E0, 18 E0, F0, 18 TÀI LIỆU THAM KHẢO Tài liệu Tiếng Việt. [1] Nguyễn Đình Việt, Kiến trúc máy tính, Nhà xuất bản Đại học Quốc Gia, 2005. [2] GS. Nguyễn Văn Ất, Kỹ thuật lập trình C, Nhà xuất bản Thống Kê, 2003. Tài liệu Tiếng Anh. [1] AN1045a, Implementing File I/O Functions Using Microchip’s Memory Disk Drive File System Library, Microchip Technology Inc, 2007. [2] Adam Chapweske, The PS/2 Mouse/Keyboard Protocol, 2003. [3] Datasheet LM35DZ, CD4050, LM1117-3.3V, DS1307, PIC18F458. [4] [5] [6]

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

  • docthu th7853p d7919 li7879u nhi7879t 2737897 mi tr4327901ng.doc
Tài liệu liên quan