View Single Post
Old 12-03-2006, 04:21 PM   #3
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
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.
Yêu cầu của chương trình là: hiển thị ra 4 led các giá trị tăng dần từ 0000 đến 9999 sau đó lại quay lại.

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
}
Anh 4MD cho ý kiến với em luôn.

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 . Dưới đây có file gửi kèm là 3 file .c của 3 bài trên.

Chúc các bạn thành công.
File Kèm Theo
File Type: zip PJ1.zip (1.4 KB, 1071 lần tải)

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