![]() |
![]() |
#2 |
Đệ tử 9 túi
|
Đây là chương trình dùng ngắt timer0.
Code:
#include<pic.h> __CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS ); //================================================================ // Hàm ng?t Timer0 void interrupt inter0(void){ static unsigned char i; static unsigned int counter; // bien dem su kien ngat timer0 if(T0IF){ // neu co ngat Timer0 xay ra ++ counter; if(counter == 500){ PORTD = (1<<i) + (1<<(7-i)); ++i; if(i==8) i=0; counter = 0; }; TMR0 = 6; T0IF = 0 ; // xoa co ngat, cong viec khong the thieu sau ham ngat }; } // == Ham khoi tao cho chip PIC16F877A void init(void){ // Khoi tao I/O cho cac port TRISD = 0x00;// PortD as output // Khoi tao cho cac thanh ghi OPTION = 0x00; // dung prescaler cho timer0 voi ti le la 1:2 // Khoi tao cho ngat Timer0 GIE = 1; // cho phep ngat toan cuc T0IE = 1; // cho phep ngat timer0 T0IF = 0; // xoa co ngat TMR0 = 6; // khoi tao } // Chuong trinh chinh void main(void){ init(); while(1); // de con tro PC khong nhay lung tung,con lam gi thi lam :D } Trong chương trình này mình sau 500 ngắt timer0 thì mới quét led1 lần. Ngoài ra cũng dùng thêm biến static i để biết được đang quét led nào. Do đó dùng ngắt sẽ tiện hơn nhiều. Và dùng đếm sự kiện ngắt thì ta có thể không cần dùng Prescaler với tỉ lệ quá cao, tránh được sai số nhiều. Không biết mọi người có ý kiến thế nào? |
![]() |
![]() |
|
|
![]() |
||||
Ðề 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 |