Thứ Hai, 3 tháng 12, 2018

Biến và hằng trong trình biên dịch CCS cho Pic


1.Biến và hằng số:
Biến để lưu trữ một giá giá trị mà giá trị có thể thay đổi, hằng số là một giá trị cố định . Biến và hằng với nhiều loại và và chiếm kích thước vùng nhớ khác nhau. Bài này chúng ta cùng đi tìm hiểu các kiểu biến và hằng.
1.1 Kiểu biến:
Biến và hằng số được lưu trữ bên trong bộ nhớ có giới hạn của vi điều khiển, và chương trình biên dịch cần biết số lượng bộ nhớ cần để cấp cho mỗi biến mà không làm lãng phí không gian bộ nhớ một cách không cần thiết. Do vậy người lập trình cần phải khai báo biến, chỉ định cả hai thông số đó là kích cỡ và kiểu dữ liệu cần lưu trữ. Điều quan trọng là hiểu được kích cỡ của mỗi kiễu dữ liệu của chương trình biên dịch mà bạn đang sử dụng bởi vì không phải tất cả các chương trình biên dịch quy định kích cỡ của kiểu biến giống nhau.   
 Các kiểu biến mặt định trong chương trình CCS
KiểuKích cỡUnsigned (Không dấu)Signed (Có dấu)
int1  Số 1 bit = true hay false ( 0 hay 1)0 đến 1 Không có
int8Số nguyên 1 byte ( 8 bit)
0 đến 255
-128 đến 127 
int16Số nguyên 16 bit0 đến 65535 -32768 đến 32767 
int32Số nguyên 32 bit0 đến 4294967295 -2147483648 đến 2147483647 
int48Số nguyên 48 bit
0 đến
281474976710655
-140737488355328 đến
140737488355327
int64Số nguyên 64 bitKhông Có-9223372036854775808 đến
9223372036854775807
float32Số thực 32 bit  -1.5 x 1045  đến  3.4 x 1038
 Bảng tương ứng giữa kiểu biến tiêu chuẩn của C với kiểu mặt định của trình biên dịch CCS
Kiểu tiêu chuẩn của CKiểu mặt định của trình biên dịch CCS
shortint1
charunsigned int8
intint8
longint16
long longint32
floatfloat32
double Không có
 Theo mặt định của chương trình biên dịch , kiểu short là 1 bit, int là 8 bit, long là 16 bit. Ta muốn thay đổi kích thước bằng lệnh tiền xữ lý #TYPE
Ví dụ: #TYPE SHORT=8, INT=16, LONG=32
1.2 Phạm vi biến (Variable scope)
Biến cục bộ: Là biến trong phạm vi một hàm và chỉ có thể được sử dụng trong hàm ấy. Biến cục bộ không có hiệu lực ở ngoài phạm vi của hàm mà ở đó nó được khai báo và sẽ được giải phóng khi kết thúc hàm.
Biến toàn cục: Là biến được khai báo ở ngoài tất cả các hàm và có thể được sử dụng ở phạm vi toàn bộ chương trình. Biến này có hiệu lực ở tất cả các hàm trong chương trình và thường được khai báo ở đầu chương trình. Biến toàn cục lưu giữ giá trị của nó trong suốt thời gian chương trình được thực thi.
Ví dụ biến cục bộ và biến toàn cục:
unsigned char globey; // biến toàn cục

void function_z( void) // đây là một hàm có thể được gọi từ hàm main 
{
unsigned int tween; // biến cục bộ của hàm function_z
tween=12; // hợp lệ bởi vì nó sử dụng trong hàm mà nó được khai báo
globey =47;// hợp lệ bởi vì đây là biến toàn cục
main_loc = 12; // không hợp lệ và tạo ra một lỗi vì nó là biến cục bộ của hàm main
}
void main()
{
unsined char main_loc; // khai báo biến cục bộ của hàm main
globey = 34; // hợp lệ bởi vì đây là biến toàn cục
tween = 12; // không hợp lệ và tạo ra một lỗi vì nó là biến cục bộ của hàm function_z
 while(1);
}

1.3 Hằng số (Constants)
Hằng số là biến có giá trị không thay đổi trong suốt quá trình thực thi chương trình. Hằng số có thể mang các kiểu dữ liệu khác nhau như số nguyên, số thực, kiểu ký tự hay luận lý, con trỏ, vân vân... như các biến thông thường ngoại trừ giá trị của chúng không thể biến đổi sau khi được định nghĩa.

Số nguyên

Số nguyên có thể được định nghĩa là số thập phân, số cơ số 8 (octal) hay cơ số 16 (hexa). Số thập phân được biểu diễn như cách chúng ta dùng hằng ngày, số cơ số 8 được bắt đầu bằng ký tự 0 (zero) và số cơ số 16 được bắt đầu bằng 0x. Cũng tương tự như các biến kiểu nguyên, các giá trị hằng số mặc định là kiểu integer (int), có thể định nghĩa chúng theo kiểu long hay unsigned bằng cách thêm vào phía sau giá trị các ký tự u hoặc U (unsigned), l hoặc L (long). Ví dụ:

53         // decimal, int
0357       // octal
0xa2c      // hexadecimal
789u       // unsigned int
2512l      // long
82ul       // unsigned long
34lU       // unsigned long
Các ký tự u và l có thể viết in hoặc thường.

Số thực


Số thực có thể được biểu diễn bằng dấu thập phân (dấu chấm), dùng chữ e hoặc cả hai. Kiểu mặc định của số thực là double, tuy nhiên số thực có thể được khai báo theo kiểu float hoặc long double bằng các ký tự f hoặc F, l hoặc L ở phía sau giá trị. Ví dụ:
5.23       // double
3.23e8     // 3.23 x 10^8
6.75e-5f   // float, 6.75 x 10^-5
6.75e-5L   // long double, 6.75 x 10^-5

Ký tự và chuỗi


Ký tự được biểu diễn bằng dấu nháy đơn ('a') bao quanh một ký tự trong khi đó chuỗi được biểu diễn bằng dấu nháy đôi ("chuỗi ký tự"). Ký tự và chuỗi cũng có thể biểu diễn các ký tự đặc biệt như sang dòng mới (\n) hoặc tab (\t). Những ký tự đặc biệt này được mở đầu bằng dấu gạch chéo ngược (\).
Mã gạch chéo ngược Ý nghĩa
\nnewline, dòng mới
\rcarriage return, trở về
\ttab ngang
\v tab dọc
\bbackspace, xóa lùi
\fform feed (page feed)
\aalert (beep)
\'single quote (')
\"double quote (")
\?question mark (?)
\\backslash (\)











Khai báo hằng số

Hằng số có thể được khai báo bằng hai cách, dùng const phía trước câu lệnh khai báo biến thông thường hoặc định nghĩa tiền xử lý (#define) theo cú pháp #define <tên> <giá trị>
ví dụ:
#include <pic16f877a.h>
#define PI 3.14159
void main(void)
{
const double bankinh = 7.0;
double chuvi;

chuvi = 2 * PI * bankinh;
while(1);
 
}


- Biến PI là hằng số và được định nghĩa bằng #define. Tiền xử lý #define nằm ở vị trí đầu chương trình nhằm định nghĩa các giá trị hằng số.
- Biến bankinh là biến cục bộ kiểu số thực được định nghĩa bằng const trong hàm main()

Lưu ý rằng ở cuối câu lệnh định nghĩa tiền xử lý #define không có dấu chấm phẩy (;).
1.3 Phân lớp lưu trữ :
Biến có thể khai báo trong ba phân lớp lưu trữ: auto, static, và register. Auto, hoặc automatic là phân lớp mặt định, do vậy khi khai báo
int value_1 ;
hoặc
auto int value_1;
Là giống nhau
 Automatic:
Một biến cục bộ phân lớp automatic không được khởi tạo giá trị ban đầu khi cấp phát bộ nhớ, vì vậy người lập trình nên đảm bảo dữ liệu có giá trị trước khi sử dụng. Vùng không gian bộ nhớ sẻ được giải phóng khi thoát khỏi hàm, nghĩa là giá trị sẽ bị mất và khi quay trở lại hàm thì giá trị đó không tồn tại. Biến lớp automatic được khai báo như phía dưới
       auto int value_1;
      hoặc
int value_1 ;
Static:
Một biến cục bộ static chỉ có phạm vị trong hàm mà nó định ngĩa (không thể truy xuất từ các hàm khác), nhưng nó được cấp phát trong vùng nhớ toàn cục.  Biến static được khởi tạo giá trị ban đầu bằng 0 khi lần đầu tiên hàm được gọi, và và giá trị lưu trong biến không mất đi khi thoát khỏi hàm. Và ta có thể sử dụng giá trị này mỗi khi hàm được gọi lại.
static int value_2;

Register:
Biến cục bộ register gần giống như biến automatic. Sự khác biệt đó là chương trình biên dịch sẽ sử dụng thanh ghi của vi điều khiển như là một biến để giảm số chu kỳ máy yêu cầu khi truy cập biến. Có rất ít thanh ghi khi so sánh với bộ nhớ tổng trong một máy điển hình. Do vậy phân lớp này sử dụng một cách tiết kiệm . Trong chương trình biến dịch CCS không hỗ trợ phân lớp này nhưng vẫn có thể khai báo.
1.3 Ép kiểu (Type casting) 
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 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 .


Không có nhận xét nào:

Đăng nhận xét

Bài đăng mới nhất

Valdes Fernando - Microcontrollers Applications With Pic

Bài đăng phổ biến