1. Trang chủ
  2. » Thể loại khác

Chapter4 NgonNguC MMC18 GT V2q

30 200 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 577,87 KB

Nội dung

Chương 4: ngơn ngữ lập trình C trình MPLAB C18 CHƯƠNG 4: NGƠN NGỮ LẬP TRÌNH C VÀ TRÌNH MPLAB C18 Trong thiết kế ứng dụng điều khiển tự động, người thiết kế thường phải sử dụng hai ngơn ngữ để lập trình: ngơn ngữ assembly C Trong đó, assembly hướng dẫn chương Trong chương xem ngôn ngữ C chuẩn khả lập trình mà người tham khảo có Như vậy, khơng phân tích hướng dẫn sâu C mà tóm tắt lại cấu trúc ngôn ngữ C mà thơi Nội dung chương hướng dẫn trình MPLAB C18 xây dựng dựa tảng ngơn ngữ C Mục tiêu cho người tham khảo đọc chương này:  Nắm vững cách viết vòng chương trình C  Viết chương trình C đơn giản dùng trình MPLAB C18  Có khả viết hỗn hợp assembly C MPLAB C18  Có khả áp dụng hàm thường dùng MPLAB C18 4.1 CẤU TRÚC CHƯƠNG TRÌNH NGƠN NGỮ C 4.1.1 Giới thiệu ngơn ngữ C Phần hỗ trợ tóm tắt ngơn ngữ C để sử dụng lập trình giao tiếp PIC18 Ngơn ngữ C thay hợp ngữ ứng dụng nhúng thường sử dụng lập trình nhiều lĩnh vực ứng dụng đa dạng, nên thân thiện đối người lập trình Một chương trình C bao gồm hàm biến Hàm chứa đựng phát biểu để rõ hoạt động để thực Các kiểu phát biểu hàm cơng bố, định, gọi hàm, điều khiển vô hiệu (null) Biến lưu trữ giá trị để sử dụng tính tốn Hàm main() u cầu phải có chương trình C mà điều khiển thơng qua chương trình thi hành Một chương trình C đơn giản có cấu trúc sau: (1) #include (2) /* Bắt đầu chương trình */ (3) main(void) /* chứa đựng thơng tin thư viện chuẩn*/ /* định nghĩa hàm có tên main mà nhận*/ /* khơng có giá trị*/ (4) { /* phát biểu main “{}”*/ (5) int a, b, c; /* định nghĩa biến kiểu int*/ 125 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 (6) a = 3; /* gán a = 3*/ (7) b = 5; /* gán b = 5*/ (8) c = a + b; /* thực biểu thức*/ (9) printf(“a + b = %d\n”, c); /* in kết quả*/ (10) return 0; /* trả cho thủ tục gọi main*/ (11) } /* kết thúc hàm main*/ Giải thích cấu trúc chương trình: Dòng #include thường xuất dòng nhiều chương trình C Tập tin stdio.h chứa đựng định nghĩa trước cho tất thủ tục vào/ra mà gọi chương trình sử dụng khai báo sử dụng chương trình sử dụng stdio.h cho phép hàm printf( ) cầu khẩn chương trình Dòng thứ hai dòng thích nội dung khơng biên dịch Chú thích C có ký hiệu bắt đầu “/*” kết thúc “*/” Các thích ảnh hưởng đến kích cỡ tập tin văn không ảnh hưởng đến dung lượng mã thi hành Dòng thứ ba main() nơi chương trình thực bắt đầu Dòng thứ năm định nghĩa biến a, b, c Trong C, biến phải khai báo trước chúng sử dụng Dòng thứ mười, trả kết cho việc gọi main() Dòng cuối “}” báo kết thúc main() 4.1.2 Kiểu liệu, biến, toán tử, biểu thức Các biến đối tượng tính tốn chương trình Các biến phải khai báo trước sử dụng Các loại liệu Có vài kiểu liệu C: void, char, int, float, double Kiểu void thường sử dụng nhiều với hàm Biến có kiểu sau: char: xử lý byte đơn liệu int: biểu diễn số nguyên thường có độ dài 16 bit short long: bổ sung thêm cho kiểu int float: xử lý số chấm động có độ dài 32 bit (độ xác đơn) double: xử lý số chấm động có độ dài 64 bit (độ xác gấp đơi) 126 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Khai báo biến Biến gồm tên kiểu biến cung cấp thêm giá trị ban đầu Tên biến bắt đầu ký tự từ A ÷ Z a ÷ z ký tự gạch dướ, theo sau số, nhiều chữ hay ký tự gạch Các tên biến không chứa đựng dấu số học, dấu chấm, hơ ngữ, từ khố C, ký tự đặc biệt @, #, ? Các ví dụ sau trình diễn cách khai báo biến: int i, j, k; char cx, by; Biến khởi tạo khai báo: int n = 0; char echo = ‘y’; /* mã ASCII ký tự y gán cho biến echo.*/ Các số Có kiểu hằng: số nguyên, ký tự, số chấm động chuỗi Một số dài (long) viết kèm với ký tự cuối l hay L, chẳng hạn 44332211L Các ký tự sau ấn định trước C: Bảng 4.1: ý nghĩa ký tự C Ký hiệu \a \b \f \n \r \t \v Ý nghĩa Ký tự báo (chng) Lùi formfeed Dòng Carriage return Tab ngang Tab dọc Ký hiệu \\ \? \’ \’’ \000 \xhh Ý nghĩa Dấu \ Dấu ? Dấu nháy đơn ‘ Dấu nháy kép ” Số bát phân Số hex Tương tự hợp ngữ, số C phải rõ số khác Cách thức để rõ số số thêm tiền tố (prefix) trước số bảng 4.2: Bảng 4.2: tiền tố cho số khác Cơ số Thập phân Bát phân Thập lục Tiền tố Khơng có 0x Ví dụ 1459 04297 0x2Ạ5F Các tốn tử số học Có tốn tử số học: + Thực cộng cộng đơn vị - Thực trừ trừ đơn vị 127 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 * Thực nhân / Thực chia % Thực chia modulo (lấy phần dư) ++ Thực tăng Thực giảm Biểu thức a % b sinh phần dư a chia cho b Tốn tử % khơng hỗ trợ cho kiểu float double Các toán tử bit thơng minh Ngơn ngữ C cung cấp tốn tử cho thao tác bit, toán tử xử lý toán hạng nguyên char, short, int long: & AND | OR ^ XOR ~ NOT >> Dịch phải Lớn < Nhỏ = Lớn && and || or ! not Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Sự ưu tiên tốn tử Ngơn ngữ C trì độ ưu tiên thực tất toán tử theo bảng 4.3 Các tốn tử có cấp độ ước lượng từ trái qua phải Bảng 4.3: độ ưu tiên toán tử Độ ưu tiên Cao Thấp Toán tử ()[]  ! ~ ++ + - * */% +> = == != & ^ | && || ?: = += -= *= /= %= &= ^= |= = ‘ Tính kết hợp Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Trái sang phải Phải sang trái Phải sang trái Trái sang phải Bảng 4.4: ví dụ độ ưu tiên toán tử Biểu thức 15 – 2*7 (13 – 4) * (0x20 | 0x01) != 0x01 0x20 | 0x01 != 0x01 = 1); 4.1.3.5 Phát biểu goto Thi hành phát biểu goto tạo điều khiển để truyền trực tiếp tới phát biểu có gán nhãn Phát biểu goto thực ngắt lưu trình bình thường chương trình làm khó khăn để theo dõi đọc mã Vì lý này, sử dụng phát biểu goto khơng xem kiểu lập trình tốt Cú pháp thực hiện: goto label Ví dụ 4.4: if (x > 100) goto bao_loi; 132 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Bao_loi: printf(“x o ngoai gioi han!\n”); 4.1.4 Nhập xuất Các khả nhập xuất phần thân ngôn ngữ C Tuy nhiên, nhập xuất lại quan trọng ứng dụng Chuẩn ANSI định nghĩa tập hợp hàm thư viện để chúng tồn dạng tương thích hệ thống mà C diện Trong phần này, xem ý nghĩa bốn hàm nhập xuất int getchar() Đây hàm trả lại ký tự gọi tới Đoạn chương trình sau trả lại ký tự gán cho biến x_ch: char x_ch; x_ch = getchar(); int putchar (int) Hàm xuất ký tự dựa vào thiết bị ngõ theo tiêu chuẩn Ví dụ, putchar(‘a’); xuất ký tự a từ thiết bị ngõ theo chuẩn int puts (const char *s) Hàm xuất chuỗi định s dựa vào thiết bị xuất theo chuẩn Ví dụ, phát biểu sau phát chuỗi “du an PIC dau tien!”: puts(“du an PIC dau tien! \n”); int printf (formatting string, arg1, arg2, , argn) Hàm thực chuyển đổi, định dạng in đối số dựa vào ngõ chuẩn điều kiện formatting string, arg1, arg2, , argn đối số mà biểu diễn phần tử liệu riêng lẻ Các đối số viết hằng, biến đơn hay tên mảng, biểu thức phức tạp Chuỗi định dạng soạn nhóm riêng biệt ký tự, với nhóm ký tự liên kết với phần tử liệu Nhóm ký tự tương ứng với phần tử liệu phải bắt đầu % Ở dạng đơn giản nhất, nhóm ký tự riêng lẻ mang dấu % theo sau ký tự chuyển đổi để loại phần tử liệu tương ứng Một tập nhiều ký tự chuyển đổi thường sử dụng liệt kê bảng 4.5 Bảng 4.5: ký tự chuyển đổi sử dụng tổng quát cho liệu xuất Ký tự chuyển đổi c d Ý nghĩa Phần tử liệu hiển thị ký tự đơn Dữ liệu hiển thị số thập phân có dấu 133 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 e f g i o s u x Dữ liệu hiển thị giá trị chấm động với số mũ Dữ liệu hiển thị giá trị chấm động khơng có số mũ Dữ liệu hiển thị giá trị chấm động dùng kiểu chuyển đổi e f, tuỳ thuộc vào giá trị; có số 0, chấm động không hiển thị Dữ liệu hiển thị số nguyên thập phân có dấu Dữ liệu hiển thị số ngun bát phân, khơng có chữ số đầu Dữ liệu hiển thị chuỗi Dữ liệu hiển thị số nguyên thập phân không dấu Dữ liệu hiển thị số ngun thập lục, khơng có chữ số đầu Giữa ký tự % ký tự chuyển đổi phần tử sau:  Một dấu trừ, để rõ điều chỉnh trái đối số chuyển đối  Một số để độ rộng vùng tối thiểu Đối số chuyển đổi in vùng tối thiểu độ rộng  Một chu kỳ để tách biệt độ rộng vùng từ xác  Một số, độ xác để số tối đa ký tự in từ chuỗi, số số sau chấm thập phân số chấm động, số tối thiểu số số nguyên  Ký tự h số nguyên in dạng short hay l long Nhiều lệnh printf gọi sau: printf(“PIC18 de dang su dung! \n”); printf(“%d %d %d”, x1, x2, x3); /* xuất chuỗi*/ /* xuất biến x1, x2, x3 dùng số tối thiểu số với khoảng trắng tách biệt giá trị*/ printf(“Nhiet hom la %4.1d \n ”, temp); /* hiển thị chuỗi Nhiet hom la theo sau giá trị temp Hiển thị số lẻ tối thiểu số cho giá trị.*/ Lưu ý, hàm printf() không hỗ trợ cho trình biên dịch PIC18 4.1.5 Các hàm cấu trúc chương trình Mỗi chương trình C chứa tối thiểu hàm Nếu chương trình có nhiều hàm, định nghĩa nhúng hàm khác Tổng qt, hàm xử lý thơng tin từ vị trí gọi hàm trả lại kết nhờ phát biểu return Các thông tin xử lý hàm gọi đối số (arguments) Đơi khi, hàm có xử lý thông tin không trả lại kết thực (như hàm printf) 134 Chương 4: ngôn ngữ lập trình C trình MPLAB C18 { unsigned char x; unsigned int y; } P; //P tag flags Các biến x y chiếm hữu vùng nhớ giống nhau, cỡ hợp byte (cỡ thành viên lớn cỡ hợp nhất) Khi đó, biến y nạp giá trị 2-byte, biến x lấy giá trị byte thấp y Trong ví dụ sau, y nạp giá trị 16-bit 0xAEFA x nhận giá trị 0xFA: P.y = 0xAEFA; 4.1.7 Phát biểu #pragma Người thảo chương trình biên dịch thêm lựa chọn thi hành độc lập C chuẩn cách sử dụng phát biểu #pragma Phát biểu thường sử dụng để khai báo đoạn liệu mã, khai báo thuộc tính, vector ngắt thủ tục ngắt nhiều đặc trưng thi hành độc lập khác Kiểu đoạn #pragma Trình biên dịch MPLAB C18 sử dụng kiểu phát biểu để quản lý nhớ Một đoạn chương trình ứng dụng định vị để địa nhớ Có hai kiểu đoạn chương trình thực cho loại nhớ:  Bộ nhớ chương trình code: chứa đựng lệnh thi hành romdata: chứa đựng biến  Bộ nhớ liệu udata: chứa đựng biến người dùng chưa khởi tạo cấp phát tĩnh idata: chứa đựng biến người dùng khởi tạo cấp phát tĩnh Cú pháp đoạn khai báo sau: #pragma udata [attribute-list] [section-name [location]] #pragma idata [attribute-list] [section-name [location]] #pragma romdata [overlay] [section-name] [location] #pragma code [overlay] [section-name] [location] đó, attribute-list truy xuất, chồng lấp hai; section-name phải dạng C đúng; location địa bắt đầu đoạn phải số nguyên Sự truy xuất thuộc tính báo cho trình biên dịch để định vị đoạn rõ bank truy xuất 140 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Thuộc tính chồng lấp cho phép đoạn đặt địa vật lý giống để chiếm giữ nhớ 4.2 HỖN HỢP C VÀ HỢP NGỮ Thỉnh thoảng, chương trình cần gọi hàm hợp ngữ từ chương trình C gọi hàm C từ chương trình hợp ngữ 4.2.1 Các quy ước gọi Trình biên dịch MPLAB C18 sử dụng ngăn xếp phần mềm nhớ toàn cục (trong nhớ liệu) để cấp phát biến cục bộ, nhập thông số kết trả Trong chương 3, ngăn xếp phần mềm từ địa thấp đến địa cao Con trỏ ngăn xếp (FSR1) đến vị trí ngăn xếp diện MPLAB C18 sử dụng FSR2 trỏ khung, cung cấp khả truy xuất nhanh tới biến cục thông cố Khi hàm cầu khẩn, đối số theo ngăn xếp đẩy lên phía ngăn xếp theo trật tự từ phải sang trái, đối số hàm cực tả đỉnh ngăn xếp mềm Hình 4.1 mơ tả ưu tiên tức thời ngăn xếp mềm gọi hàm Hình 4.1: ví dụ trật tự ưu tiên tức thời ngăn xếp phần mềm Con trỏ khung tham chiếu vị trí ngăn xếp mà tách biệt với đối số ngăn xếp sở từ biến cục ngăn xếp sở Các đối số ngăn xếp sở đặt khoảng cách âm từ trỏ khung, biến cục ngăn xếp sở đặt khoảng cách dương từ trỏ khung Ngay tức thời ngõ vào hàm C, hàm gọi đẩy giá trị FSR2 lên ngăn xếp chép giá trị FSR1 vào FSR2, cách lưu trữ ngữ cảnh hàm gọi sử khởi tạo trỏ khung hàm hành Kích cỡ tổng biến cục ngăn xếp sở cho hàm cộng thêm vào trỏ ngăn xếp, cấp phát không gian ngăn xếp cho biến Khi cần hàm hành lưu trữ ghi cụ thể trước cấp phát biến cục Hình 4.2 diễn tả ngăn xếp mềm sau gọi hàm C, hình cho biết hàm không lưu trữ ghi ngăn xếp mềm 141 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Hình 4.2: mơ tả ngăn xếp mềm diễn sau gọi hàm C Một thông số hàm hay biến cục định nghĩa với từ khoá static định nhớ toàn cục Tổng quát, biến cục thông số hàm ngăn xếp sở yêu cầu mã nhiều để truy xuất biến cục static thông số hàm 4.2.2 Các biến trả Vị trí giá trị trả phụ thuộc vào kích cỡ giá trị trả Bảng 4.6 liệt kê chi tiết vị trí giá trị trả dựa vào cỡ Bảng 4.6: giá trị trả MCC18 Cỡ giá trị trả bits 16 bits 24 bits > 32 bits Vị trí giá trị trả WREG PRODH: PRODL (AARGB2 + 2) (AARGB2 + 1) AARGB3 Trên ngăn xếp, FSR0 giá trị trả Các biến AARGB2 AARGB3 định nghĩa tập tin aarg.asm thư mục mcc18\src\math\18Cxx biến toàn cục Các địa chúng xác định suốt thời gian liên kết 4.2.3 Gọi thủ tục C từ chương trình hợp ngữ Các hàm C tồn cục trừ định nghĩa tĩnh Để gọi hàm C, tên hàm C phải khai báo ký hiệu extern trình hợp ngữ Lệnh CALL hay RCALL sử dụng tạo gọi hàm Trước gọi hàm C, trình hợp ngữ phải đẩy thơng số auto vào phía ngăn xếp phần mềm từ phải sang trái Đối với liệu nhiều byte, byte cuối đẩy vào phía ngăn xếp phần mềm 142 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Ví dụ 4.9: cho hàm nguyên mẫu hàm C, char xyz(auto char a, auto char b); viết chuỗi lệnh để gọi hàm xyz với a = 0x20 b = 0x30 Giải pháp: b thông số đầu mút bên phải, phải đẩy lên ngăn xếp Sau đó, a đẩy vào ngăn xếp Chuỗi lệnh sau sử dụng để gọi hàm xyz lưu giá trị trả vị trí nhớ result: extern xyz ; định nghĩa C push_dat 0x30 ; đưa b vào stack push_dat 0x20 ; đưa a vào stack call xyz movwf result ; result trả WREG Ví dụ 4.10: cho hàm nguyên mẫu hàm C, int hwh(int xx, int yy); viết chuỗi lệnh để gọi hàm hwh với xx = 0x1234 yy = 0x5678 Giải pháp: nạp thông số yy vào stack trước đến xx extern hwh ; định nghĩa C push_dat 0x78 ; đưa byte thấp yy vào stack push_dat 0x56 ; đưa byte cao yy vào stack push_dat 0x34 ; đưa byte thấp xx vào stack push_dat 0x12 ; đưa byte cao xx vào stack 4.2.4 call hwh movff PRODL, result ; lưu kết byte thấp vào result movff PRODL, result+1 ; lưu kết byte cao vào result Gọi hàm hợp ngữ từ chương trình C Các điều kiện sau phải có trước hàm C gọi hàm hợp ngữ:  Nhãn hàm phải khai báo global (toàn cục) hợp ngữ  Hàm phải khai báo extern C 143 Chương 4: ngôn ngữ lập trình C trình MPLAB C18  Hàm phải trì kiểu thực trình MPLAB C18 (chẳng hạn, giá trị trả phải trả lại vị trí bảng 4.6)  Hàm gọi từ thủ tục C sử dụng ký hiệu hàm C chuẩn Ví dụ, cho hàm sau viết hợp ngữ, udata_acs dly_cnt res code delay1 setf loop nop dly_cnt ; khởi tạo dly_cnt 255 nop nop decf dly_cnt, F bnz loop return global delay1 end để gọi hàm hợp ngữ delay1 từ tập nguồn C, nguyên hàm bên cho hàm hợp ngữ phải thêm vào, sau hàm gọi sử dụng phát biểu hàm C chuẩn: extern void delay1(void); void main(void) { delay1(); } Hàm hợp ngữ delay1 tạo độ trễ cố định Giả sử độ trễ thời gian tạo đưa vào ngăn xếp phần mềm Khi đoạn mã hợp ngữ chỉnh lại: #include code delay2 144 movlw -2 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 nop nop decf PLUSW2, F ; thơng số hàm bytes FSR2 bnz delay2 return global delay2 end Các phát biểu C sau gọi hàm delay2 với thông số chẳng hạn 0xC0: extern void delay2(unsigned char); void main(void) { delay2(0xC0); } 4.2.5 Tham chiếu biến C hàm hợp ngữ Để truy xuất biến C từ trình hợp ngữ, phải thực sau:  Biến C phải có phạm vi tồn cục tập nguồn C  Biến C phải khai báo ký hiệu extern tập hợp ngữ Giả sử tập C có phát biểu: unsigned int xyz; void main(void) { } Các phát biểu hợp ngữ sau gán 0x2013 tới biến C xyz: ; xyz định nghĩa C extern xyz code ab_func movlw 0x13 145 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 ; định byte thấp = 0x13 movwf xyz movlw 0x20 movwf xyz+1 ; định byte cao = 0x20 return global ab_func end 4.2.6 Tham chiếu biến hợp ngữ hàm C Ta tham chiếu biến định nghĩa tập hợp ngữ từ trình C, cách thực sau:  Các biến phải định nghĩa global trình hợp ngữ  Các biến phải khai báo extern trình C Giả sử có đoạn chứa phát biểu hợp ngữ sau: asm_data udata xym res ; xym biến 2-byte global xym end Các phát biểu C sau gán giá trị 0x1998 cho biến hợp ngữ xym: extern unsigned int xym; void main(void) { xym = 0x1998; } 4.3 CÁC HÀM TRONG THƯ VIỆN CỦA MPLAB C18 Thư viện sưu tập hàm phân nhóm cho tham khảo dễ dàng liên kết Các thư viện MPLAB C18 chứa thư mục phụ lib Chúng liên kết trực 146 Chương 4: ngôn ngữ lập trình C trình MPLAB C18 tiếp tới ứng dụng nhờ trình kết nối MPLINK Các thư viện MPLAB C18 chia làm hai nhóm: thư viện xử lý độc lập thư viện xử lý đặc trưng 4.3.1 Các thư viện xử lý đặc trưng Các tập tin thư viện xử lý đặc trưng chứa đựng định nghĩa họ PIC18 thủ tục thiết bị ngoại vi định nghĩa ghi chức đặc biệt Các thủ tục thiết bị ngoại vi cung cấp để hỗ trợ thiết kế thiết bị ngoại vi phần cứng thực giao tiếp ngoại vi sử dụng đượng vào/ra đa Các thư viện có tên pprocessor.lib ví dụ, tập tin thư viện PIC18F8720 có tên p18f8720.lib 4.3.2 Thư viện xử lý độc lập Thư viện xử lý độc lập chứa đựng hàm tổng quát hàm toán Các hàm hỗ trợ cho tất vi điều khiển họ PIC18, chứa thư viện clib.lib Trình biên dịch MPLAB C18 thực phép tốn mà khơng hỗ trợ trực tiếp phần cứng cách gọi hàm thư viện tốn học thích hợp Ví dụ phép nhân 16bit với 16-bit 32-bit với 32-bit, phép chia với độ dài bất kỳ, phép toán chấm động Thư viện tổng quát MPLAB C18 hỗ trợ nhóm thủ tục sau:  Các hàm phân loại ký tự  Các hàm chuyển đổi liệu  Các hàm tạo độ trễ  Các hàm thao tác chuỗi nhớ 4.3.3 Các hàm phân loại ký tự Các hàm phân loại ký tự cung cấp MPLAB C18 phù hợp với hàm thư viện C chuẩn ANSI 1989 Các định nghĩa sử dụng hàm trình bày bảng 4.7 4.8, chúng chứa tập tin dẫn ctype.h Bảng 4.7: hàm thủ tục phân loại ký tự Tên isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper Mô tả Định rõ ký tự mẫu tự số Định rõ ký tự mẫu tự Định rõ ký tự ký tự điều khiển Định rõ ký tự số thập phân Định rõ ký tự ký tự đồ hoạ Định rõ ký tự ký tự thường bảng mẫu tự Định rõ ký tự in Định rõ ký tự ký tự chấm câu Định rõ ký tự khoảng trắng Định rõ ký tự ký tự hoa bảng mẫu tự 147 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Định rõ ký tự số hex isxdigit Bảng 4.8: cách sử dụng hàm thủ tục phân loại ký tự Tên isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit 4.3.4 Khai báo unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char isalnum(unsigned char name); isalpha(unsigned char name); iscntrl(unsigned char name); isdigit(unsigned char name); isgraph(unsigned char name); islower(unsigned char name); isprint(unsigned char name); ispunct(unsigned char name); isspace(unsigned char name); isupper(unsigned char name); isxdigit(unsigned char name); Các hàm thư viện chuyển đổi liệu Các hàm khai báo nguyên mẫu cho thủ tục liệt kê bảng 4.9 4.10 Hầu hết hàm hữu dụng cho hoạt động vào/ra MPLAB C18 cung cấp tập hợp hàm chuyển đổi để gọi ứng dụng người dùng Bảng 4.9: hàm thủ tục C chuyển đổi ký tự MPLAB C18 Tên atob atof atoi atol btoa itoa ltoa rand srand tolower toupper ultoa Mô tả Chuyển đổi chuỗi thành byte có dấu 8-bit Chuyển đổi chuỗi thành giá trị chấm động Chuyển đổi chuỗi thành thành số nguyên có dấu 16-bit Chuyển đổi chuỗi thành số long integer Chuyển đổi byte có dấu 8-bit thành chuỗi Chuyển đổi số nguyên có dấu 16-bit thành chuỗi Chuyển đổi số long integer có dấu sang chuỗi Phát số nguyên ngẫu nhiên Đặt bắt đầu tìm phát số ngẫu nhiên Chuyển đổi ký tự thành ký tự ASCII theo mẫu tự thường Chuyển đổi ký tự thành ký tự ASCII theo mẫu tự hoa Chuyển đổi số long integer không dấu thành chuỗi Bảng 4.10: cách sử dụng hàm chuyển đổi ký tự MPLAB C18 Tên atob atof atoi atol btoa itoa ltoa rand srand tolower toupper ultoa 148 Khai báo signed char double int long char char char int void char char char atob(const char *s); atof(const char *s); atoi(const char *s); atol(const char *s); btoa(signed char value, char *string); itoa(int value, char *string); ltoa(long value, char *string); rand(void); srand(unsigned int seed); tolower(char ch); toupper(char ch); ultoa(unsigned long value, char *string); Chương 4: ngơn ngữ lập trình C trình MPLAB C18 4.3.5 Các hàm thao tác chuỗi nhớ Hầu hết hàm phù hợp với hàm thư viện C chuẩn ANSI tên giống Ý nghĩa sử dụng hàm trình bày bảng 4.11 chúng chứa tập tin dẫn string.h Bảng 4.11: hàm thao tác chuỗi MPLAB C18 Tên Mô tả memchr memcmp memcmppgm memcmppgm2ram memcmpram2pgm memcpy memcpypgm2ram memmove memmovepgm2ram memset strcat strcatpgm2ram strchr strcmp strcmppgm2ram strcpy strcpypgm2ram strcspn strlen strlwr strncat strncatpgm2ram strncmp strncpy strncpypgm2ram strpbrk strrchar strspn strstr strtok strupr 4.3.6 Tìm kiếm giá trị vùng nhớ rõ So sánh nội dung hai mảng (ram liệu với ram liệu) So sánh nội dung hai mảng (ram liệu với nhớ chương trình) So sánh nội dung hai mảng (bộ nhớ chương trình ram liệu) So sánh nội dung hai mảng (ram liệu nhớ chương trình) Sao chép nhớ đệm từ nhớ liệu tới nhớ liệu Sao chép nhớ đệm từ nhớ chương trình tới nhớ liệu Sao chép nhớ đệm từ nhớ liệu tới nhớ liệu Sao chép nhớ đệm từ nhớ chương trình tới nhớ liệu Khởi tạo mảng với giá trị lặp đơn Gắn vào chuỗi nguồn cuối chuỗi đích Gắn vào chuỗi nguồn cuối chuỗi đích Đặt kiện giá trị chuỗi So sánh hai chuỗi nhớ liệu So sánh chuỗi nhớ liệu với nhớ chương trình Chép chuỗi từ nhớ liệu vào nhớ liệu Chép chuỗi từ nhớ chương trình vào nhớ liệu Tính số ký tự liên tục từ bắt đầu chuỗi mà khơng chứa đựng tập hợp ký tự Xác định độ dài chuỗi Đổi tất ký tự upper-case chuỗi thành lower-case Gắn số rõ ký tự từ chuỗi nguồn tới đầu cuối chuỗi đích Gắn số rõ ký tự từ chuỗi nguồn tới đầu cuối chuỗi đích So sánh hai chuỗi, mở rộng tới số định rõ ký tự Chép ký tự từ chuỗi nguồn tới chuỗi đích số rõ ký tự Chép ký tự từ chuỗi nguồn tới chuỗi đích số rõ ký tự Tìm kiếm chuỗi cho kiện ký tự từ tập hợp ký tự Đặt kiện cuối ký tự định chuỗi Tính số ký tự liên tục từ bắt đầu chuỗi mà khơng chứa đựng tập hợp ký tự Đặt kiện chuỗi bên chuỗi khác Ngắt chuỗi thành chuỗi Đổi tất ký tự lower-case chuỗi thành upper-case Các hàm tạo trễ MPLAB C18 cung cấp tập hợp hàm tạo trễ (delay) mà tạo độ trễ tương đương với bội số chu kỳ lệnh Ý nghĩa cách khai báo hàm trễ dẫn bảng 4.12 4.13 Các hàm chứa tập dẫn delays.h Bảng 4.12: ý nghĩa hàm delay MPLAB C18 Tên hàm Delay1TCY Delay10TCYx Mô tả Thực trễ chu kỳ lệnh Thực trễ 10 chu kỳ lệnh 149 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 Delay100TCYx Delay1KTCYx Delay10KTCYx Thực trễ 100 chu kỳ lệnh Thực trễ 1000 chu kỳ lệnh Thực trễ 10,000 chu kỳ lệnh Bảng 4.13: khai báo hàm delay MPLAB C18 Tên hàm Delay1TCY Delay10TCYx Delay100TCYx Delay1KTCYx Delay10KTCYx Khai báo void Delay 1TCY (void) void Delay 10TCYx (unsigned char unit) void Delay 100TCYx (unsigned char unit) void Delay 1KTCYx (unsigned char unit) void Delay 10KTCYx (unsigned char unit) Ví dụ 4.11: giả sử có board điều khiển dùng VĐK PIC18F8720 sử dụng dao động thạch anh 16 MHz để điều khiển trạng thái LED với yêu cầu theo bảng 4.14, viết chương trình theo yêu cầu từ bảng Lưu ý, để LED sáng chân ngõ VĐK kết nối tương ứng phải xuất mức Bảng 4.14: yêu cầu ví dụ 4.11 Tên thiết bị điều khiển LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8 Kết nối VĐK Thứ tự trạng thái hoạt động RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 Cho LED sáng 0.5s tắt 0.5s Lập lại bước thêm ba lần Cho điểm sáng chạy tịnh tiến từ LED1 đến LED8, thời gian LED sáng 0.5s Lập lại bước thêm ba lần Làm lại bước 3, theo hướng từ LED8 đến LED1 Lập lại bước thêm ba lần Bật LED8 LED1 sáng-tắt lần, lần sáng tắt 0.5s Bật LED7 LED2 sáng-tắt lần, lần sáng tắt 0.5s Bật LED6 LED3 sáng-tắt lần, lần sáng tắt 0.5s 10 Bật LED5 LED4 sáng-tắt lần, lần sáng tắt 0.5s 11 Bật LED5 LED4 sáng-tắt lần, lần sáng tắt 0.5s 12 Bật LED6 LED3 sáng-tắt lần, lần sáng tắt 0.5s 13 Bật LED7 LED2 sáng-tắt lần, lần sáng tắt 0.5s 14 Bật LED8 LED1 sáng-tắt lần, lần sáng tắt 0.5s Giải pháp: từ trạng thái LED bước cho biết giá trị cần phải xuất PORTD tương ứng #include #include 150 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 unsigned rom char led_tab [] = { 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE, 0x7E, 0xFF, 0x7E, 0xFF, 0x7E, 0xFF, 0x7E, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xDB, 0xFF, 0xDB, 0xFF, 0xDB, 0xFF, 0xDB, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xDB, 0xFF, 0xDB, 0xFF, 0xDB, 0xFF, 0xDB, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0xBD, 0xFF, 0x7E, 0xFF, 0x7E, 0xFF, 0x7E, 0xFF, 0x7E, 0xFF}; void main (void) { unsigned char i; TRISD = 0x00; /* xác định PORTD để xuẩt */ while (1) { for (i=0; i < 136; i++) { PORTD = led_tab[i]; /*điều khiển LEDs */ Delay10KTCYx(200); /*delay 0.5s */ } } } 151 Chương 4: ngơn ngữ lập trình C trình MPLAB C18 4.4 BÀI TẬP 1) Viết hàm C chuyển đổi tất mẫu tự hoa chuỗi sang chuỗi có mẫu tự thường Địa bắt đầu chuỗi nhập vào hàm 2) Viết hàm C để chuyển đổi số thập phân sang nhị phân 3) Viết hàm C để chuyển đổi số nhị phân sang số thập phân 4) Viết hàm C để chuyển đổi số thập phân sang số Hex 5) Viết hàm C để chuyển đổi số nhị phân sang số Hex 6) Viết hàm setbits (int x, char p, char n) mà trả giá trị x với n bit mà bắt đầu vị trí p đảo ngược (1 đảo thành hay ngược lại) 7) Viết chương trình C để đặt bit bit PORTC 8) Viết chương trình C thực đếm xuống liên tục xuất giá trị đếm PORTB 9) Xác định giá trị phép toán bitwise dùng AND, OR EXOR: Toán hạng 1: 00010001 Toán hạng 2: 11110001 10) Cho biết vòng sau lặp lại lần, giá trị cuối j trường hợp? (a) for (j = 0; j < 5; j++) (b) for (j = 1; j < 10; j++) (c) for (j = 0; j

Ngày đăng: 21/12/2017, 12:18

TỪ KHÓA LIÊN QUAN

w