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 |
Tất cả các kiểu biến , ngoại trừ kiểu float mặt định là không dấu. Thêm signed hoặc unsigned phía trước để chỉ đó là số có dấu hay không dấu .Nếu ta không khai báo rõ thì mặt định là không dấ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 e . . .
Phạm vi biến :
Kiểu biến | Dãi giá trị |
int1 | 0 đến 1 |
int8 | 0 đến 255 |
signed int8 | -128 đến 127 |
int16 | 0 đến 65535 |
signed int16 | -32768 đến 32767 |
int32 | 0 đến 4294967295 |
signed int32 | -2147483648 đến 2147483647 |
float32 | -1.5x1045 đến 3.4 x1038 |
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ếu VĐ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à 256 byte .
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
Int16 const a[200] = {. . .}; // 200 x 2 =400 byte : không hợp lệ
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ếu VĐ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à 256 byte .
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
Int16 const a[200] = {. . .}; // 200 x 2 =400 byte : không hợp lệ
*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 .
- 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 .
*PIC 14:- 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:
- 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 .
Một vài ví dụ về tràn số , làm tròn :
Ví Dụ :
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
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 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 .
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 .
II / _ CÁC CẤU TRÚC LỆNH : ( statement )
_Gồm các lệnh như while . . do , case , . . .
STATEMENTS
STATEMENTS
STATEMENT | EXAMPLE |
if (expr) stmt; [else stmt;] | if (x==25) x=1; else x=x+1; |
while (expr) stmt; | while (get_rtcc()!=0) putc(‘n’); |
do stmt while (expr); | do { putc(c=getc()); } while (c!=0); |
for (expr1;expr2;expr3) stmt; | for (i=1;i<=10;++i) printf(“%u\r\n”,i); |
switch (expr) { casecexpr: stmt; //one or more case [default:stmt] ... } | switch (cmd) { case 0: printf(“cmd 0”); break; case 1: printf(“cmd 1”); break; default: printf(“bad cmd”); break; } |
return [expr]; | return (5); |
goto label; | goto loop; |
label: stmt; | loop: I++; |
break; | break; |
continue; | continue; |
expr; | i=1; |
{[stmt]} Zero or more | {a=1; b=1;} |
Lưu ý : các mục trong [ ] là có thể có hoặc không .
_while (expr) stmt : xét điều kiện trước rồi thực thi biểu thức sau .
_ do stmt while (expr) : thực thi biểu thức rồi mới xét điều kiện sau .
_Return: dùng cho hàm có trả về trị , hoặc không trả về trị cũng được , khi đó chỉ cần dùng: return
; ( nghĩa là thoát khỏi hàm tại đó ) .
; ( nghĩa là thoát khỏi hàm tại đó ) .
_Break: ngắt ngang ( thoát khỏi ) vòng lặp while.
_Continue: quay trở về đầu vòng lặp while
III / _ CHỈ THỊ TIỀN XỬ LÝ :
_Xem chi tiết tất cả ở phần HELP , mục pre_processor . Ở đây sẽ giới thiệu 1 số chỉ thị thường dùng
nhất :
1 /_ #ASMvà #ENDASM :
nhất :
1 /_ #ASMvà #ENDASM :
- Cho phép đặt 1 đoạn mã ASM giữa 2 chỉ thị này , Chỉ đặt trong hàm . CCS định nghĩa sẵn 1 biến 8 bit _RETURN_ để bạn gán giá trị trả về cho hàm từ đoạn mã Assembly.
- C đủ mạnh để thay thế Assmemly . Vì vậy nên hạn chế lồng mã Assembly vào vì thường gây ra xáo trộn dẫn đến sau khi biên dịch mã chạy sai , trừ phi bạn nắm rõ Assembly và đọc hiểu mã Assembly sinh ra thông qua mục C/Asm list .
- Khi sử dụng các biến không ở bank hiện tại , CCS sinh thêm mã chuyển bank tự động cho các biến đó . Nếu sử dụng #ASM ASIS thì CCS không sinh thêm mã chuyển bank tự động , bạn phải tự thêm vào trong mã ASM .
- Lưu ý : mã Assembly theo đúng mã tập lệnh VDK , không phải mã kiểu MPLAB .
VD :
int find_parity (int data) {
int count;
#asm
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movwf _return_
#endasm
}
int find_parity (int data) {
int count;
#asm
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movwf _return_
#endasm
}
2 / _ #INCLUDE :
Cú pháp : #include
Hay #include “ filename”
Filename : tên file cho thiết bị *.h , *.c . Nếu chỉ định file ở đường dẫn khác thì thêm đường dẫn vào . Luôn phải có để khai báo chương trình viết cho VĐK nào , và luôn đặt ở dòng đầu tiên .
Hay #include “ filename”
Filename : tên file cho thiết bị *.h , *.c . Nếu chỉ định file ở đường dẫn khác thì thêm đường dẫn vào . Luôn phải có để khai báo chương trình viết cho VĐK nào , và luôn đặt ở dòng đầu tiên .
_VD :
#include <16F877.H> // chương trình sử dụng cho VĐK 16F877
#include < C:\INCLUDES\COMLIB\MYRS232.C >
#include <16F877.H> // chương trình sử dụng cho VĐK 16F877
#include < C:\INCLUDES\COMLIB\MYRS232.C >
3 / _ #BIT , #BYTE, #LOCATE và # DEFINE:
#BIT id = x . y
Với id : tên biến
x : biến C ( 8, 16, 32, …bit) hay hằng số địa chỉ thanh ghi
y : vị trí bit trong x
→ tạo biến 1 bit đặt ở byte x vị trí bit y, tiện dùng kiểm tra hay gán trị cho bit thanh ghi . Điểm khác biệt so với dùng biến 1 bit từ khai báo int1 là : int1 tốn 1 bit bộ nhớ , đặt ở thanh ghi đa mục đích nào đó do CCS tự chọn , còn #BIT thì không tốn thêm bộ nhớ do id chỉ là danh định đại diện cho bit chỉ định ở biến x , thay đổi giá trị id ( 0 / 1 ) sẽ thay đổi giá trị bit tương ứng y -> thay đổi trị x.
VD:
#bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 ở địa chỉ 0xb.2 (PIC16F877)
Khi đó TMR1Flag = 0 -> xoá cờ ngắt timer1
int16 a=35; //a=00000000 00100011
#bit b= a.11 //b=0 , nếu b=a.0 thì b chỉ vị trí LSB ( bit thấp nhất , bên trái)
Sau đó : b=1; //a=00001000 00100011 = 2083
Lưu ý không dùng được : if ( 0xb.2 ) mà phải khai báo như trên rồi dùng : if(TMR1Flag)
x : biến C ( 8, 16, 32, …bit) hay hằng số địa chỉ thanh ghi
y : vị trí bit trong x
→ tạo biến 1 bit đặt ở byte x vị trí bit y, tiện dùng kiểm tra hay gán trị cho bit thanh ghi . Điểm khác biệt so với dùng biến 1 bit từ khai báo int1 là : int1 tốn 1 bit bộ nhớ , đặt ở thanh ghi đa mục đích nào đó do CCS tự chọn , còn #BIT thì không tốn thêm bộ nhớ do id chỉ là danh định đại diện cho bit chỉ định ở biến x , thay đổi giá trị id ( 0 / 1 ) sẽ thay đổi giá trị bit tương ứng y -> thay đổi trị x.
VD:
#bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 ở địa chỉ 0xb.2 (PIC16F877)
Khi đó TMR1Flag = 0 -> xoá cờ ngắt timer1
int16 a=35; //a=00000000 00100011
#bit b= a.11 //b=0 , nếu b=a.0 thì b chỉ vị trí LSB ( bit thấp nhất , bên trái)
Sau đó : b=1; //a=00001000 00100011 = 2083
Lưu ý không dùng được : if ( 0xb.2 ) mà phải khai báo như trên rồi dùng : if(TMR1Flag)
#BYTE id = x
với X: địa chỉ
id : tên biến C
Gán tên biến id cho địa chỉ (thanh ghi ) x , sau đó muốn gán hay kiểm tra địa chỉ x chỉ cần dùng id . Không tốn thêm bộ nhớ , tên id thường dùng tên gợi nhớ chức năng thanh ghi ở địa chỉ đó . Lưu ý rằng giá trị thanh ghi có thể thay đổi bất kỳ lúcnào do hoạt động chương trình nên giá trị id cũng tự thay đổi theo giá trị thanh ghi đó . Không nên dùng id cho thanh ghi đa mục đích như 1 cách dùng biến int8 vì CCS có thể dùng các thanh ghi này bất kỳ lúc nào cho chương trình , nếu muốn dùng riêng , hãy dùng #LOCATE.
VD:
#byte port_b = 0xc6; // 16F877 :0xc6 là địa chỉ portb
Muốn port b có giá trị 120 thì : port_b=120;
#byte status = 0xc3;
id : tên biến C
Gán tên biến id cho địa chỉ (thanh ghi ) x , sau đó muốn gán hay kiểm tra địa chỉ x chỉ cần dùng id . Không tốn thêm bộ nhớ , tên id thường dùng tên gợi nhớ chức năng thanh ghi ở địa chỉ đó . Lưu ý rằng giá trị thanh ghi có thể thay đổi bất kỳ lúcnào do hoạt động chương trình nên giá trị id cũng tự thay đổi theo giá trị thanh ghi đó . Không nên dùng id cho thanh ghi đa mục đích như 1 cách dùng biến int8 vì CCS có thể dùng các thanh ghi này bất kỳ lúc nào cho chương trình , nếu muốn dùng riêng , hãy dùng #LOCATE.
VD:
#byte port_b = 0xc6; // 16F877 :0xc6 là địa chỉ portb
Muốn port b có giá trị 120 thì : port_b=120;
#byte status = 0xc3;
# LOCATE id = x
+Làm việc như #byte nhưng có thêm chức năng bảo vệ không cho CCS sử dụng địa chỉ đó vào mục đích khác . VD: # LOCATE temp = 0xc20 // 0xc20 :thanh ghi đa mục đích
Cách sau tương tự :
int8 temp ;
#locate temp = 0xc20
+Sử dụng #LOCATE để gán biến cho 1 dãy địa chỉ kề nhau ( cặp thanh ghi ) sẽ tiện lợi hơn thay vì phải dùng 2 biến với #byte .
VD : CCP1 có giá trị là cặp thanh ghi 0x15 ( byte thấp ) và 0x16 ( byte cao ) . Để gán trị cho CCP1 :
Int16 CCP1;
#locate CCP1= 0x15 // byte thấp của CCP1 ở 0x15 , byte cao của CCP1 ở 0x16
Gán trị cho CCP1 sẽ tự động gán vào cả 2 thanh ghi
CCP1 = 1133 ; // = 00000100 01101101 Ỉ0x15 = 00000100 , 0x16 = 01101101
Cách sau tương tự :
int8 temp ;
#locate temp = 0xc20
+Sử dụng #LOCATE để gán biến cho 1 dãy địa chỉ kề nhau ( cặp thanh ghi ) sẽ tiện lợi hơn thay vì phải dùng 2 biến với #byte .
VD : CCP1 có giá trị là cặp thanh ghi 0x15 ( byte thấp ) và 0x16 ( byte cao ) . Để gán trị cho CCP1 :
Int16 CCP1;
#locate CCP1= 0x15 // byte thấp của CCP1 ở 0x15 , byte cao của CCP1 ở 0x16
Gán trị cho CCP1 sẽ tự động gán vào cả 2 thanh ghi
CCP1 = 1133 ; // = 00000100 01101101 Ỉ0x15 = 00000100 , 0x16 = 01101101
# DEFINE id text
Text : chuỗi hay số . Dùng định nghĩa giá trị .
VD : #define a 12345
VD : #define a 12345
4 / _ # DEVICE :
# DEVICE chip option
chip : tên VĐK sử dụng , không dùng tham số này nếu đã khai báo tên chip ở # include .
option : toán tử tiêu chuẩn theo từng chip:
chip : tên VĐK sử dụng , không dùng tham số này nếu đã khai báo tên chip ở # include .
option : toán tử tiêu chuẩn theo từng chip:
* = 5 dùng pointer 5 bit ( tất cả PIC )
* = 8 dùng pointer 8 bit ( PIC14 và PIC18 )
* = 16 dùng pointer 16 bit ( PIC14 ,PIC 18)
ADC = x sử dụng ADC x bit ( 8 , 10 , . . . bit tuỳ chip ) , khi dùng hàm read_adc( ) , sẽ trả về giá trị x bit .
ICD = true : tạo mã tương thích debug phần cứng Microchip
HIGH_INTS = TRUE : cho phép dùng ngắt ưu tiên cao
Khai báo pointer 8 bit , bạn sử dụng được tối đa 256 byte RAM cho tất cả biến chương trình .
Khai báo pointer 16 bit , bạn sử dụng được hết số RAM có của VDK .
Chỉ nên dùng duy nhất 1 khai báo #device cho cả pointer và ADC .
VD : #device * = 16 ADC = 10
5 / _ # ORG :
# org start , end
# org segment
#org start , end { }
# org segment
#org start , end { }
Start , end: bắt đầu và kết thúc vùng ROM dành riêng cho hàm theo sau , hoặc để riêng không dùng .
VD :
Org 0x30 , 0x1F
Void xu_ly( )
{
} // hàm này bắt đầu ở địa chỉ 0x30
org 0x1E00
anotherfunc( )
{
} //hàm này bắt đầu tuỳ ý ở 0x1E00 đến 0x1F00
Org 0x30 , 0x1F { }
// không có gì cả đặt trong vùng ROM này
Org 0x30 , 0x1F
Void xu_ly( )
{
} // hàm này bắt đầu ở địa chỉ 0x30
org 0x1E00
anotherfunc( )
{
} //hàm này bắt đầu tuỳ ý ở 0x1E00 đến 0x1F00
Org 0x30 , 0x1F { }
// không có gì cả đặt trong vùng ROM này
_Thường thì không dùng ORG .
6 / _ # USE :
# USE delay ( clock =speed )
Speed : giá trị OSC mà bạn dùng . VD: dùng thạch anh dao động 40Mhz thì :
#use delay ( clock = 40000000)
_Chỉ khi có chỉ thị này thì trong chương trình bạn mới được dùng hàm delay_us ( ) và delay_ms( ) .
Speed : giá trị OSC mà bạn dùng . VD: dùng thạch anh dao động 40Mhz thì :
#use delay ( clock = 40000000)
_Chỉ khi có chỉ thị này thì trong chương trình bạn mới được dùng hàm delay_us ( ) và delay_ms( ) .
#USE fast_io (port)
Port : là tên port :từ A-G ( tuỳ chip )
_Dùng cái này thì trong chương trình khi dùng các lệnh ionhư output_low() , . . . nó sẽ set chỉ với 1
lệnh , nhanh hơn so với khi không dùng chỉ thị này.
_Trong hàm main( ) bạn phải dùng hàm set_tris_x( ) để chỉ rõ chân vào ra thì chỉ thị trên mới có
hiệu lực , không thì chương trình sẽ chạy sai .
_Không cần dùng nếu không có yêu cầu gì đặc biệt .
VD : # use fast_io( A )
Port : là tên port :từ A-G ( tuỳ chip )
_Dùng cái này thì trong chương trình khi dùng các lệnh ionhư output_low() , . . . nó sẽ set chỉ với 1
lệnh , nhanh hơn so với khi không dùng chỉ thị này.
_Trong hàm main( ) bạn phải dùng hàm set_tris_x( ) để chỉ rõ chân vào ra thì chỉ thị trên mới có
hiệu lực , không thì chương trình sẽ chạy sai .
_Không cần dùng nếu không có yêu cầu gì đặc biệt .
VD : # use fast_io( A )
#USE I2C (options )
_Thiết lập giao tiếp I2C.
Option bao gồm các thông số sau, cách nhau bởi dấu phẩy :
Master : chip ở chế độ master
Slave : chip ở chế độ slave
SCL = pin : chỉ định chân SCL
SDA = pin : chỉ định chân SDA
ADDRESS =x : chỉ định địa chỉ chế độ slave
FAST : chỉ định FAST I2C
SLOW : chỉ định SLOW I2C
RESTART_WDT : restart WDT trong khi chờ I2C_READ( )
FORCE_HW : sử dụng chúc năng phần cứng I2C ( nếu chip hỗ trợ )
NOFLOAT_HIGH : không cho phép tín hiệu ở float high ( ??? ) , tín hiệu được lái từ thấp lên cao.
SMBUS : bus dùng không phải bus I2C , nhưng là cái gì đó tương tự .
_VD :
#use I2C ( master , sda=pin_B0 , scl = pin_B1 )
#use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW )
Option bao gồm các thông số sau, cách nhau bởi dấu phẩy :
Master : chip ở chế độ master
Slave : chip ở chế độ slave
SCL = pin : chỉ định chân SCL
SDA = pin : chỉ định chân SDA
ADDRESS =x : chỉ định địa chỉ chế độ slave
FAST : chỉ định FAST I2C
SLOW : chỉ định SLOW I2C
RESTART_WDT : restart WDT trong khi chờ I2C_READ( )
FORCE_HW : sử dụng chúc năng phần cứng I2C ( nếu chip hỗ trợ )
NOFLOAT_HIGH : không cho phép tín hiệu ở float high ( ??? ) , tín hiệu được lái từ thấp lên cao.
SMBUS : bus dùng không phải bus I2C , nhưng là cái gì đó tương tự .
_VD :
#use I2C ( master , sda=pin_B0 , scl = pin_B1 )
#use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW )
#USE RS232 (options )
_Thiết lập giao tiếp RS232 cho chip ( có hiệu lực sau khi nạp chương trình cho chip , không phải
giao tiếp RS232 đang sử dụng để nạp chip ) .
Option bao gồm :
BAUD = x : thiết lập tốc độ baud rate : 19200 , 38400 , 9600 , . . .
PARITY = x : x= N ,E hay O , với N : không dùng bit chẵn lẻ .
XMIT = pin : set chân transmit ( chuyển data)
RCV = pin : set chân receive ( nhận data )
_Các thông số trên hay dùng nhất , các tham số khác sẽ bổ sung sau.
VD :
#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)
giao tiếp RS232 đang sử dụng để nạp chip ) .
Option bao gồm :
BAUD = x : thiết lập tốc độ baud rate : 19200 , 38400 , 9600 , . . .
PARITY = x : x= N ,E hay O , với N : không dùng bit chẵn lẻ .
XMIT = pin : set chân transmit ( chuyển data)
RCV = pin : set chân receive ( nhận data )
_Các thông số trên hay dùng nhất , các tham số khác sẽ bổ sung sau.
VD :
#use rs232(baud=19200,parity=n,xmit=pin_C6,rcv=pin_C7)
7 / _ Một số chỉ thị tiền xử lý khác :
#CASE : cho phép phân biệt chữ hoa / thường trong tên biến , dành cho những ai quen lập trình C .
#OPT n :với n=0 – 9 : chỉ định cấp độ tối ưu mã , không cần dùng thì mặc định là 9 ( very tối ưu ) .
#PRIORITY ints : với ints là danh sách các ngắt theo thứ tự ưu tiên thực hiện khi có nhiều ngắt xảy
ra đồng thời , ngắt đứng đầu sẽ là ngắt ưu tiên nhất , dùng ngắt nào đưa ngắt đó vô . Chỉ cần dùng
nếu dùng hơn 1 ngắt . Xem cụ thể phần ngắt .
VD : #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiên nhất
MỘT SỐ VẤN ĐỀ QUAN TRỌNG KHÁC – xem chi tiết trong phần HELP :
_Biểu thức : xem HELP->Expressions , trong đó : biểu thị số trong C:
123 : số decimal 0x3 , 0xB1 : số hex 0b100110 : số binary
‘a’ : ký tự
“abcd” : chuỗi , ký tự null được thêm phía sau
ra đồng thời , ngắt đứng đầu sẽ là ngắt ưu tiên nhất , dùng ngắt nào đưa ngắt đó vô . Chỉ cần dùng
nếu dùng hơn 1 ngắt . Xem cụ thể phần ngắt .
VD : #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiên nhất
MỘT SỐ VẤN ĐỀ QUAN TRỌNG KHÁC – xem chi tiết trong phần HELP :
_Biểu thức : xem HELP->Expressions , trong đó : biểu thị số trong C:
123 : số decimal 0x3 , 0xB1 : số hex 0b100110 : số binary
‘a’ : ký tự
“abcd” : chuỗi , ký tự null được thêm phía sau
_Các toán tử C : xem Operators
>= , < = , = = , != ( không bằng )
&& : and
>= , < = , = = , != ( không bằng )
&& : and
|| : or
! : not ( đảo của bit , không phải đảo của byte )
>>n : dịch trái n bit
<< n : dịch phải n bit
++ , - - , += , - = , . . .
Không có nhận xét nào:
Đăng nhận xét