10 4.104 8051 9 Acquy adc pic All datasheet ALTIUM Altium Designer AM-FM Arduino ARM ARM là gì Ấn Tượng Bản tin công nghệ Bản tin Thiết Bị Số Barobo bất động sản biến Binary Bit board lpc2378 Bộ chuyển đổi ADC Bộ Đếm Bộ điều khiển cửa cuốn Bộ Định Thời Buy Khóa Số Điện Tử Buy Mạch đếm sản phẩm Buy Mạch giao thông Buy Mạch nạp Buy Matrix Byte C cho AVR các hàm vào ra các loại lõi arm các mạch DAC cơ bản các ngắt trong pic Cách đọc điện trở Cách Đọc Giá Trị Điện Trở Cách đọc giá trị tụ điện Cách hàn linh kiện dán cách làm mạch khóa số cách tạo linh kiện dán cad/cam Cài Đặt cài đặt proteus 8 cảm biến Cấu Kiện Logic Khả Trình cấu tạo cấu trúc arm cấu trúc lệnh CCS Chân chân Transistor Chip Khả Trình chuyển đổi Chuyển đổi số tương tự Chuyển Đổi Tương Tự/Số - ADC Chuyển động số chương trình City Clip Điện Tử Code 8051 - ASM Code 8051 - C Code 8051-C code ASM code ASM mẫu 8086 Code AVR - C code C Code Lập Trình Code led sao băng code maupic code mẫu 8051 Code Mẫu 8086 Code Mẫu cho ARM - LPC1343 code mẫu pic Code PIC - C codemaupic Counter Cổng Vào Ra Cơ Bản Cuộn Cảm Cửa cuốn DA DAC Debug Decimal Delay8051 Dev-C++ Diode DIY Dò đường Do It Yourself doanh nghiệp Download DTMF Mobile đảo chiều động cơ Điện Trở Điện Tử Điện Tử Cơ Bản điều chế độ rộng xung điều chế xung PWM điều khiển bằng điện thoại Điều khiển cửa cuốn Điều khiển cửa cuốn bằng điện thoại điều khiển động cơ đo điện áp đo nhiệt độ đo nhiệt độ hiển thị lên lcd trên 8051 Đo Nhiệt Độ LM35 + LCD Đo Nhiệt Độ LM35 + Led 7 thanh đọc màu điện trở đồ chơi động cơ chân không Động cơ nhiên liệu Động cơ robo đồng hồ thời gian thực Ebook Đại Học ebook điện tử Ebook đồ án Ebook Tin Học Encoder Encoder là gì Full Giải Thuật Giải thuật PID Giáo Dục giao tiếp i2c pic 16f877a giao tiếp i2c pic16f877a với ic ds1307 giao tiếp máy tính qua rs232 Giao Tiếp Máy Tính VB6 giao tiếp rs232 giao tiếp spi giữa 2 pic giao tiếp spi trong pic Giáo Trình Điện Tử Giới thiệu 8051 Giới thiệu cơ bản GPIO Graphic Design hàm Hàn linh kiện dán Hexadecimal Hệ Hexa Hệ Nhị Phân Hệ Thập Lục Phân Hệ Thập Phân hiển thị lên lcd 16x2 Hoạt Động Học Học 8051 qua các ví dụ đơn giản Học ALtium Designer học AVR Học Corel Draw X3 Học Eagle HỌC LẬP TRÌNH 16F877A Học Lập Trình 8051 Học Lập Trình C Học Orcad Học Protues hoc-lam-robot-do-duong-qua-video Hồng ngoại hướng dẫn hướng dẫn Altium Designer hướng dẫn đo đồng hồ VOM hướng dẫn keil - C lập trình 8051 hướng dẫn làm led sao băng hướng dẫn làm led trái tim hướng dẫn lập trình ARM Hướng Dẫn Lập Trình ARM - LPC1343 hướng dẫn lập trình ARM-LPC2378 hướng dẫn lập trình CCS hướng dẫn lập trình PIC Hướng Dẫn Led Trái Tim hướng dẫn module sim548c hướng dẫn sử dụng keil hướng dẫn sử dụng proteus 8 Hyper Terminal hercules 3.2.4 I/O IC 555 IC 7447 IC 74HC151 IC 74HC154 IC 74HC245 IC 74HC595 IC 74LS138 IC DS1307 IC đồng hồ thời gian thực IC LM324 IC LM342 IC LM7805 IC số IC số opamp LM324 IC Thông Dụng IC555 Interrupt Keil 4 Full keil arm Keil C Keil uVision3 kế toán kiểm toán khái niệm Khái Niệm Cơ Bản Kho Vật Liệu khóa điện tử khóa số dùng 8051 khóa số dùng 89s52 Khóa Số Điện Tử khuếch đại kiểm tra Kinh doanh maketing kinh tế quản lí Kỹ Thuật Kỹ Thuật Vi Xử Lý làm mạch điện lý thú Làm quen AVR Lap Trinh Dieu Khien Robot Lập Trình lập trình 8051 Lập Trình AVR Lập Trình C lập trình c++ Lập Trình Led Quảng Cáo Lập Trình Nhúng Lập trình pic Lập trình Robot Lập Trình Vi Điều Khiển Lập Trình Với AVR Studio LCD 16x2 Lcd16x2 Led Clock Led Quay led sao băng led trai tim Led Trái Tim Lịch sử ra đời Linh Kiện Cơ Bản linh kiện điện tử Loa LPC 2378 LSB lý thú Mã AVR - C Mạch 7seg Mạch Amply.Mạch Loa Mạch Autorobo Mạch bảo vệ Mạch Cảm Biến mạch cảm ứng sờ tay Mạch Cầu H Mạch cube Mạch Đếm Sản Phẩm Mạch điện cơ bản Mạch điện hay Mạch Điện Ứng Dụng Mạch Điều khiển động cơ Mạch Động Cơ Mạch đồng hồ Mạch đồng hồ 4 led Mạch giao thông Mạch IC số Mạch in mạch khóa số mạch khuếch đại thuật toán mạch led chúc mừng năm mới mạch led đẹp Mạch Led đơn Mạch Led Quảng Cáo mach led trai tim mạch led trái tim Mạch Led Vumeter mạch lý thú Mạch Ma trận Phím Mạch Matrix Mạch nạp Mạch nguồn Mạch Nút Bấm mạch sóng rf mạch tăng áp Mạch thu phát Mạch tổ hợp MSI Mạch trái tim Mạch Vi điều khiển Microbicho module module GSM/GPS Module Sim548 Module Sim548 giao tiếp với vi điều khiển PIC Module Sim548C Mosfet Motor Mô Phỏng Phần Cứng Mô Tả Phần Cứng MSB mua led sao băng News Ngắt Ngắt Trong LPC23xx ngân hàng Ngôn Ngữ Ngôn Ngữ C Ngôn Ngữ Tự Học Lập Trình C Ngôn Ngữ VHDL Nguyên Lý nguyên lý ic 555 Nguyên Tắc nháy led Nhập môn C Nhỏ Gọn Nibble opamp People Phần Mềm phần mềm altium Designer Phần mềm điện tử Phần Mềm Điện Tử Phần Mềm Điện Tử Hay Phần Mềm Hay Phần Mềm Led Quảng Cáo phần mềm proteus 8 Phần mềm vi tính Phần Mền Phương pháp hàn linh kiện dán PIC pic16f877a Print Design Proteus Proteus 7.8 SP2 FULL PWM quà tặng bạn gái quà tặng độc đáo quản trị doanh nghiệp quản trị kinh doanh quét led 7 đoạn Relay robocon Robot ROBOT DÒ ĐƯỜNG rút gọn mạch logic tổ hợp Sach Dien Tu Sản Phẩm Thú Vị Sản Phẩm Thương Mại Sáng tạo Short Smart Home SMD sơ đồ nguyên lý spi Sports Sử Dụng Sử Dụng Đồng Hồ sử dụng đồng hồ VOM sử dụng ngắt trong pic sự khác nhau Sức mạnh số Tải tài chính tài chính doanh nghiệp tài chính ngân hàng Tài Khoản Chia Sẻ Tài Liệu Tài Liệu 8051 tài liệu avr Tài liệu Điện Tử Tài Liệu Pic Tài liệu robocon tài liệu về ngân hàng Tài Liệu Vi Điều Khiển tailieuvn Tạo cổng Com ảo Tạo cổng nối tiếp ảo tạo dự án trong keil arm Tạo Project trong Vi Xử Lý ARM tạo thư viện altium designer tạo xung vuông Tạp chí Tạp Chí Hay tăng áp Tập lệnh AT Team Support TEAMPLATE PROTEUS Test thị trường tài chính Thiết Bị Thú Vị Thiết kế robot Thiết lập Fuse Bits Thiết Lập Pin Thuật Toán Thuật Toán Điều Khiển PID Thuật Toán Quine MCCluskey Thư viện Protues Thực Hành Thyristor Timer Timer/Counter Tin Học Chia Sẻ Tổ Chức Bộ Nhớ tổng quan về proteus 8 Transistor Tranzito Tranzitor Trao đổi học tập Travel Trình Biên Dịch Trình Dịch Trong Suốt Truyền Thông Nối Tiếp Không Đồng Bộ- UART truyền thông nối tiếp RS232 Tụ điện TUT - 8051 - ASM TUT - 8051 - KeilC tự hành Tự Học C Tự Học Lập Trình C Tý hon UART Update USB Ứng Dụng Led Quảng Cáo ứng dụng mạch khuếch đại thuật toán vẽ mạch in vẽ mạch nguyên lý VHDL Vi Điều Khiển Vi điều khiển - Ứng dụng vi điều khiển PIC Vi mạch số Vi Xử Lý Vi Xử Lý 8051 Vi Xử Lý 8086 Vi Xử Lý ARM Vi Xử Lý PIC Video Video Mach Điện Virtual Serial Port Driver VOM vxl Web Design xác định góc quay động cơ xử lý chuỗi

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: 

+ Trên đây là thời gian cần cho 1 phép toán . 
+ Khi chương trình của bạn nhỏ xíu và có thể kiểm soát được , và thời gian thực thi là không quan trọng ,đồng thời có thể không cần mô phỏng thì bạn có thể dùng cả kiểu float nếu thấy tiện . 
+ Khi chương trình lớn , cần mô phỏng , và thời gian thực thi là quan trọng thì các điều sau đây nên làm : 
+ Không xài biến kiểu float , vì khi mô phỏng không thấy được giá trị thực  của nó .Để khử số thập phân kiểu float , hãy nhân hay chia cho 2^k . 
VD : số kiểu float : m có thể biểu diễn ở dạng : n / 2^8 , với m biết trước , n nguyên được tính trước 
bằng cách : n= m* 2^8 , lấy được 2 chữ số sau dấu phẩy (2^8=256 ) . Do đó với 1 bảng tra sin 361 
phần tử từ 0->360 độ , nếu lấy chính xác tới 2 dấu phẩy thì các giá trị sin nhân thêm cho 2^8 , cắt bỏ 
phần thập phân và lưu vào mảng hằng số int16  , sau đó khi truy xuất tới các giá trị này để sử dụng 
thì hãy chia cho 256 bằng cách dịch phải 8 bit . 

+ Các phép tính nhân chia cho 2^k rất nhanh vì  ta dùng phép toán dịch bit .
VD : 
Z=Y*2^5 ; thì thay bởi z =  y<<5 .="" 20="" g="" l="" n="" nbsp="" nhanh="" p="" span="">
Z= y / 2^5; thay bởi z = y >>5 ; nhanh gấp 20 lần . 

Trong đó  phép dịch nguyên byte ( 8bit, 16 bit  ) là nhanh nhất . VD : z= y>>8  ; z=y <<16 nbsp="" span="">

+ Không dùng phép trừ mà dẫn đến kết quả có thể âm vì số âm sẽ không hiển thị được  khi mô phỏng ( số hiển thị sẽ là dương và dĩ nhiên giá trị sẽ khác hẳn ) .Biến đổi sao cho  phép trừ luôn cho kết quả dương thì mới hiển thị chính xác . 
VD : công thức điều chế sin PWM có dạng : z = T * (1 + ma *  y ) 
Trong đó  : ma <1 -1="" .="" 1="" :="" bi="" div="" gi="" h="" i="" m="" n="" nbsp="" nh="" sau="" sin="" tr="" y="">
y= (y +1) – 1 = y’ -1




=> z = T* ( 1-ma ) + T * ma * y’ trong đó ( 1-ma ) >=1 . và  0< y’ <2 nbsp="" span="">
=> z = [ T * ( 256 – MA ) ]>>8  +  [T * MA * Y’ ] >> 15 
Trong đó  MA = ma<<8 7="" nbsp="" span="" v="" y="">
=> chỉ cần lập bảng tra sin trong đó là các giá trị sin là số nguyên = ( y + 1) * 128 ;






II / CÁC CẤU TRÚC LỆNH : ( statement ) 


+ Gồm các lệnh như: while . . do , case ,  . . .



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 đó ) . 
+ 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 / #ASM và #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 



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 .
VD : 
#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)


+ #BYTE  id = x 
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úc nà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 


+ # DEFINE id   text 
Text : chuỗi hay  số . Dùng định nghĩa giá trị .
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:
 * = 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  { }


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 


+ 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( ) .


#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 io như  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 ) 




#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) 




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
_Các toán tử C : xem Operators
>= , < = , = =  ,  !=  ( 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
++ , - - ,  += , - = ,   .  .  .
(Nguồn:  TRẦN XUÂN TRƯỜNG)
dientumaytinh.com

dien tu chia se, lap trinh pic

Đăng nhận xét

Author Name

{picture https://lh3.googleusercontent.com/-5Ns_H0UG4cU/Vuu5KrqbEnI/AAAAAAAAEZs/XgsHemy00D4eQ3ivA76v6FFEm7jg9reVwCCo/s512-Ic42/pham-van-ngoc-anh.jpg}

Tôi là Ngọc Anh. Tôi đến từ Nghệ An. Tôi tốt nghiệp một trường đại học tại Sài Gòn. Hiện tôi đang phát triển công ty riêng. Liên lạc với tôi qua:

{facebook https://www.facebook.com/phamvanngocanh}
{twitter https://twitter.com/nghiphong1993}
{google https://plus.google.com/+dientuchiase/posts}
{youtube https://www.youtube.com/channel/UCeJKhA_goBNFmDw6RKNtmYQ}

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.