![]() |
![]() |
#3 |
Đệ tử 9 túi
|
Giải mã LED7 thanh
Tiếp theo tôi xin đưa cho mọi người xem một chương trình của tui không biết liệu nó đã tối ưu chưa? Đã hiệu quả chưa?
Mô tả phần cứng: có 4 led 7 thanh. Các chân của PORTD 7->1 nối với các chân a->g của led7. Các chân RA5 đến RA3 nối vào cực bazơ của con uA1015 lần lượt nối với các cực Anot của 4 led. Đây là sch: vì to quá nên cắt thành 2 nhìn cho rõ: ![]() ![]() Hình 2: Quét led 7 thanh. Chương trình này lấy phần giải mã của anh 4MD. chương trình của anh ấy dùng cả delay. Nhưng tôi nghĩ là khi dùng ngắt rùi thì dùng delay làm gì cho phí. Do đó việc dùng ngắt làm cho ta đỡ tốn thời gian làm những việc linh tinh. Các bạn cho ý kiến về giải thuật này. Code:
#include<pic.h> const unsigned char Font[]={ 0b00000011, 0b10011111, 0b00100101, 0b00001101, 0b10011001,\ 0b01001001, 0b01000001, 0b00011111, 0b00000001, 0b00001001}; __CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS ); //------------------------------------Interrupt void interrupt MyInt(void){ static int counter1,counter2; // counter1 dem so lan timer0 tran // counter2 dem so lan led duoc quet static unsigned int number; static unsigned int a[4]={0,0,0,0}; static unsigned char j; if(T0IF){ ++counter1; if( counter1 == 500){ counter1 = 0; PORTD = 0xFF; PORTA = 0xFF - (1<<(5-j));// bat mot led PORTD = Font[a[j]]; if(++j==4) { j=0; ++counter2; }; }; if(counter2 == 500){ ++number; if(number>9999) number= 0; counter2 = 0; a[3] = number/1000; a[2] = (number/100)%10; a[1] = (number/10)%10; a[0] = number%10; }; TMR0 = 6; T0IF = 0 ;// xoa co ngat }; } //------------------------------------init void init(void) { //-------------------------init for PORTs OPTION = 0b00000000; ADCON1 = 0b00000111; TRISA = 0b00000000; TRISB = 0b11111111; TRISC = 0b11111111; TRISD = 0b00000000; TRISE = 0b11111111; //-------------------------init for interrupt GIE = 1; T0IE = 1; TMR0 = 6; } //------------------------------------MAIN void main(){ init(); while(1); // Trong này làm gì thì làm } Chương trình của mình có cái hay là khi bạn vừa dùng ngắt Timer0 để quét led bạn vừa có thể tận dụng nó để làm việc khác nữa như đếm số lần quét hoặc là delay để làm cái gì đó. Cái này giống kiểu tiết kiệm chân vi điều khiển vậy ![]() Chúc các bạn thành công. thay đổi nội dung bởi: ngohaibac, 05-01-2007 lúc 03:24 PM. |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|
![]() |
||||
Ðề 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 |