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
92 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2941 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Khóa luận 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:
- Thu thập dữ liệu nhiệt độ môi trường trên cở sở dùng vi điều khiển PIC18F458.doc