Bài trước: +Bài 1: Hướng dẫn lập trình cho PIC bằng CCS ver3.242
Bài tiếp: +Bài 3: Các Hàm Xử Lý Số, Xử Lý Bit, Delay trong CCS
Bài 2: Sử dụng Biến và Hàm, Cấu trúc lệnh, Chỉ thị tiền xử lý trong CCS
I / KHAI BÁO VÀ SỬ DỤNG BIẾN , HẰNG , MẢNG :
1 /Khai báo biến , hằng ,mảng :
+ Các loại biến sau được hỗ trợ :
int1 số 1 bit = true hay false ( 0 hay 1)
int8 số nguyên 1 byte ( 8 bit)
int16 số nguyên 16 bit
int32 số nguyên 32 bit
char ký tự 8 bit
float số thực 32 bit
short mặc định như kiểu int1
byte mặc định như kiểu int8
int mặc định như kiểu int8
long mặc định như kiểu int16
+ Thêm signed hoặc unsigned phía trước để chỉ đó là số có dấu hay không dấu .Khai báo như trên mặc định là không dấu . 4 khai báo cuối không nên dùng vì dễ nhầm lẫn . Thay vào đó nên dùng 4 khai báo đầu .
VD :
Signed int8 a ; // số a là 8 bit dấu ( bit 7 là bit dấu ).
Signed int16 b , c , d ;
Signed int32 , . . .
+ Phạm vi biến :
Int8 :0 , 255 signed int8 : -128 , 127
Int16 : 0 ,2^15-1 signed int16 : -2^15 , 2^15-1
Int32 : 0 , 2^32-1 signed int32 : -2^31 , 2^31-1
+ Khai báo hằng :
VD :
Int8 const a=231 ;
+ Khai báo 1 mảng hằng số :
VD :
Int8 const a[5] = { 3,5,6,8,6 } ; //5 phần tử , chỉ số mảng bắt đầu từ 0 : a[0]=3
+ Một mảng hằng số có kích thước tối đa tuỳ thuộc loại VĐK:
*NếuVĐK là PIC 14 ( VD :16F877 ) : bạn chỉ được khai báo 1 mảng hằng số có kích thước tối đa là 256byte .
Các khai báo sau là hợp lệ :
Int8 const a[5]={ . . .}; // sử dụng 5 byte , dấu . . . để bạn điền số vào
Int8 const a[256]={ . . .}; // 256 phần tử x 1 byte = 256 byte
Int16 const a[12] = { . . . }; // 12 x 2= 24 byte
Int16 const a[128] = { . . . }; // 128 x 2= 256 byte
không hợp lệ :
Int16 const a[200] = { . . . }; // 200 x 2 =400 byte
*Nếu VĐK là PIC 18 : khai báo mảng hằng số thoải mái , không giới hạn kích thước .
+ Lưu ý : nếu đánh không đủ số phần tử vào trong ngoặc kép như đã khai báo , các phần tử còn lại sẽ là 0 . Truy xuất giá trị vượt quá chỉ số mảng khai báo sẽ làm chương trình chạy vô tận .
VD :
int8 const a [7] = { 0 , 3,5 ,9 } // các phần tử a[4] ,a[5],a[6] đều =0
+ Mảng hằng số thường dùng làm bảng tra (ví dụ bảng tra sin ) , viết dễ dàng và nhanh chóng , gọn hơn so với khi dùng ASM để viết .
+ Khai báo 1 biến mảng : kích thước tuỳ thuộc khai báo con trỏ trong #device và loại VDK:
*PIC 14 : Nếu bạn khai báo con trỏ 8 bit : VD: # device *=8 : không gian bộ nhớ chỉ có 256 byte cho tất cả các biến chương trình bất chấp VĐK của bạn có hơn 256 byte RAM (Vd : 368 , . . .) và biến mảng có kích thước tối đa tuỳ thuộc độ phân mảnh bộ nhớ , với 16F877 có 368 byte ram , thường thì kích thước không quá 60 byte ,có khi dưới 40 byte , nếu khai báo lớn hơn sẽ gặp lỗi vô duyên : "not enough ram for all variable" trong khi thực sự VDK còn rất nhiều RAM . Nếu khai báo con trỏ 16 bit : VD : #device *=16 , không gian bộ nhớ là đầy đủ ( trừ đi 1 ít RAM do CCS chiếm làm biến tạm ) .VD : với 16F877 bạn dùng đủ 368 byte RAM . Nhưng kích thước mảng cũng không quá 60 byte .
* PIC 18 : kích thước mảng không giới hạn, xài hết RAM thì thôi . Với khai báo con trỏ 8 bit , bạn chỉ được xài tối đa 256 byte RAM , nếu khai báo con trỏ 16 bit , bạn xài trọn bộ nhớ RAM thực sự . VD: Khai báo biến mảng : int16 a[125] ; // biến mảng 126 phần tử , kích thước 252 byte ram .
2 / Cách sử dụng biến :
+ Khi sử dụng các phép toán cần lưu ý : sự tràn số , tính toán với số âm , sự chuyển kiểu và ép kiểu .
A ) Một vài ví dụ về tràn số , làm tròn :
VD :
Int8 a=275; // a =275-256=19
Int8 const a=275 //a=19
Int8 a=40 , b=7 , c;
C=a * b ; //c=280-256=24
C=a / b ; //c=5
+ Bạn có thể ép kiểu , thường là tiết kiệm ram , hay muốn tiết kiệm thời gian tính , . . .. VD :
Int8 a =8 , b=200;
Int16 c ;
C= ( int16) a * b ;
// c= 1600 , a chuyển sang 16 bit , 16bit*8bit => b tự động chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b vẫn là 8 bit .
+ 8bit * 8bit => phép nhân là 8 bit , KQ là 8 bit
+ 16bit * 8 bit => phép nhân là 16 bit , KQ là 16 bit
+ 32bit * 16 bit => phép nhân là 32 bit , KQ là 32 bit
+ 16bit * 16 bit => phép nhân là 16 bit , KQ là 16 bit
. . . v . v . . .
+ Có thể ép kiểu kết quả : VD : 16b*8b => 16bit , nếu gán vào biến 8 bit thì KQ sẽ cắt bỏ 8 bit cao .
B )Phạm vi sử dụng biến :
+ Giống như C trong lập trình C cho máy tính . Biến có thể được khai báo như toàn cục hay cục bộ . Biến khai báo trong hàm sẽ là cục bộ và sẽ chỉ dùng được trong hàm đó , kể cả trong hàm main() . Ngoài ra còn có thể khai báo ngay trong 1 khối lệnh , và cũng chỉ tồn tại trong khối lệnh đó . Do vậy nếu dùng MPLAB để mô phỏng , thì khi nhảy vào hàm hay khối lệnh có chứa khai báo biến đó thì biến đó mới có giá trị , có khi nhảy ra ngoài hàm thì biến đó sẽ là” out of scope” khi ta quan sát chúng trong cửa sổ Watch.
+ Chi tiết về phạm vi biến xem tài liệu lập trình C trên máy tính .
+ CCS có hỗ trợ cả con trỏ , tuy nhiên ít dùng .
+ CCs không hỗ trợ lập trình hướng đối tượng như C++ . Tuy vậy CCS có hỗ trợ các biến cấu trúc .
3 / Các phép toán , sự thực thi và vấn đề tối ưu mã , chương trình:






