PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 05-01-2007, 03:54 PM   #1
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Quét led7 thanh.

Sau đây mình copy một số bài bên dientuvietnam.net sang đây và trả lời từng câu hỏi mà các bạn hỏi nhé.

Rảnh rỗi ngồi viết chương trình hiển thị led7 thanh chơi chơi. Ở đây em chỉ dùng 1 led thôi cho đơn giản. Còn việc quét led đã viết ở các bài trước rùi .

Đây là sơ đồ nguyên lý:

Tiếp theo là chương trình bằng HTPIC:

Code:
#include<pic.h>
__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );

// bộ font cho led7 
const unsigned char Font[]={ 0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001,\
							0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001};
void init(void)
	{
		//-------------------------init for PORTs
		OPTION = 0b00000000; // dùng Prescaler với k= 1:2
		TRISD	= 0b00000000;
		TRISE	= 0b11111111;
		PORTD = Font[0] ; // ban đầu cho hiển thị số 0
		//-------------------------init for interrupt vầ timer0
		GIE	= 1; // cho phép ngắt toàn cục
		T0IE    = 1;  // cho phép ngắt timer0
		TMR0    = 6;  // đặt giá trị đầu cho TMR0
	}

void interrupt MyInt(void){
	static int counter;  // biến đếm sự kiện ngắt timer
	static unsigned char i;  // biến đếm số đang hiển thị trên led
	if (T0IF  &  T0IE){  // nếu có ngắt
		T0IF = 0 ;
		TMR0 = 6;
		++ counter;
		if( counter == 1000){  // cứ 1s thì hiển thị hiển thị tiếp
			counter = 0 ;  // reset lại bộ đếm
			PORTD = Font[i++];
			if( i ==10) i = 0;
		};
	};
}

void main(){
	init();
	while(1);
}
Chương trình trên cực kỳ đơn giản song chỉ có một câu lệnh cần chú ý là:
Code:
if (T0IF  &  T0IE){
vì timer0 tự chạy nên cờ T0IF liên tục set lên khi đó nếu không phải là ngắt timer0 mà là một ngắt khác xảy ra. Khi đó trong hàm ngắt chương trình sẽ thử điều kiện T0IF = = 1 sẽ đúng. Nếu chúng ta chỉ dùng là
Code:
 if (T0IF)
thì tất nhiên là điều kiện thử đúng và sẽ thực hiện chương trình trong if .

Nếu lúc đó ta đã disable ngắt timer0 mà giờ nó lại thực hiện chương trình trong timer0 thì chương trình chạy quá sai rùi. Đây là chú ý của anh BA . Nếu không nhận ra thì có khi sai nhiều đó . Khi chúng ta viết chương trình ngắt trong ngắt thì sẽ thấy điều này .

Chúc các bạn thành công.

thay đổi nội dung bởi: ngohaibac, 05-01-2007 lúc 04:00 PM.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
Cách giao tiếp DS1877 và PIC6F877A nbqvdp Cơ bản về vi điều khiển và PIC 7 05-08-2010 06:46 PM
Hỏi về chương trình HTPIC của ngohaibac riquelme Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) 26 20-01-2007 09:42 PM
Giúp đỡ về HTPIC riquelme Cơ bản về vi điều khiển và PIC 0 11-01-2007 11:56 PM
Giao tiếp Pic6f877A qua cổng máy in???? spirit Cơ bản về vi điều khiển và PIC 8 11-09-2006 01:04 PM


Múi giờ GMT. Hiện tại là 01:57 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam