View Single Post
Old 21-03-2008, 04:46 PM   #2
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Bài 2: Delay

Khi lập trình bằng C30, hoặc các trình dịch từ gcc, chúng ta chú ý rằng gcc không cung cấp hàm delay( ). Do vậy, chúng ta phải tự viết các hàm này.

Sau đây là một thí dụ, các bạn hãy thử phân tích thí dụ này để hiểu được cách viết một hàm delay như thế nào, tất nhiên các bạn hoàn toàn có thể sử dụng luôn hàm này.

Lưu ý khi sử dụng, hãy tính toán một cách kỹ lưỡng các giá trị đặt cho cấu hình của mình.


File delay.h:
Code:
// Thay đổi giá trị FCY để phù hợp với cấu hình của chip, tính bằng MIPS
#define FCY  16000000					//16 MIPS

void Delay( unsigned int delay_count );
void Delay_Us( unsigned int delayUs_count );

// Những cấu hình này thường dùng để khởi tạo LCD, nên để ở đây
#define Delay200uS_count  (FCY * 0.0002) / 1080
#define Delay_1mS_Cnt     (FCY * 0.001) / 2950
#define Delay_2mS_Cnt     (FCY * 0.002) / 2950
#define Delay_5mS_Cnt     (FCY * 0.005) / 2950
#define Delay_15mS_Cnt    (FCY * 0.015) / 2950
#define Delay_1S_Cnt      (FCY * 1) / 2950

File delay.c:
Code:
#include "delay.h"

unsigned int temp_count;

void Delay( unsigned int delay_count ) 
{
	temp_count = delay_count +1;
	asm volatile("outer: dec _temp_count");	
	asm volatile("cp0 _temp_count");
	asm volatile("bra z, done");
	asm volatile("do #3200, inner" );	
	asm volatile("nop");
	asm volatile("inner: nop");
	asm volatile("bra outer");
	asm volatile("done:");
}
	

void Delay_Us( unsigned int delayUs_count )
{
	temp_count = delayUs_count +1;
	asm volatile("outer1: dec _temp_count");	
	asm volatile("cp0 _temp_count");
	asm volatile("bra z, done1");
	asm volatile("do #1500, inner1" );	
	asm volatile("nop");
	asm volatile("inner1: nop");
	asm volatile("bra outer1");
	asm volatile("done1:");
}

thay đổi nội dung bởi: falleaf, 22-03-2008 lúc 06:22 PM.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn