Cần giúp Dùng Timer Quét LED 7 Đoạn

lee_trieu

Học sinh trung cấp
#1
Chào mọi người !!
Mình đang gặp vướn mắc chỗ dùng timer để quét LED 7 đoạn.
Mọi người nói giúp mình cách quét bằng phương pháp này nhé, mình chưa hình dung ra được cách quét ! Trước giờ chỉ toàn delay bình thường không ah !! Cảm ơn mọi người !!
 

mta_cdt

Super Moderator
Thành viên BQT
#2
Về nguyên tắc nó giống như phương phép quét bằng delay nhưng tạo thời gian bằng timer. Trong hàm ngắt timer bạn dùng 1 biến đếm sau mỗi 1 lần ngắt tăng biến này thêm 1.
Khi biến đó bằng 1 thì bật led 1 hiển thị dữ liệu led 1 tắt các led còn lại
Khi biến đó bằng 2 thì bật led 2 hiển thị dữ liệu led 2 tắt các led còn lại
....
cho đến hết led thứ n thì gán trở lại biến đếm đó bằng 0.
Đây là 1 đoạn mình quét led 7 thanh dùng avr hiển thị 3 biến giờ phút giây dùng timer 0 avr.
Mã:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=230;
index++;
if(index==1 ){
t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=1;led2=0;led3=0;led4=0;led5=0;led6=0;
PORTA=font[t_view/10];

}
if(index==2 )
{// t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=1;led3=0;led4=0;led5=0;led6=0;
PORTA=font[t_view%10];
}
if(index==3){
t_view=m;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=1;led4=0;led5=0;led6=0;
PORTA=font[t_view/10];
}
if(index==4 )
{
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=1;led5=0;led6=0;
PORTA=font[t_view%10];
}
if(index==5) {

t_view=s;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=0;led5=1;led6=0;
PORTA=font[t_view/10];
}

if(index==6 )
{ //t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=1;
PORTA=font[t_view%10];
index=0;
}
// Place your code here

}
 

lee_trieu

Học sinh trung cấp
#3
Về nguyên tắc nó giống như phương phép quét bằng delay nhưng tạo thời gian bằng timer. Trong hàm ngắt timer bạn dùng 1 biến đếm sau mỗi 1 lần ngắt tăng biến này thêm 1.
Khi biến đó bằng 1 thì bật led 1 hiển thị dữ liệu led 1 tắt các led còn lại
Khi biến đó bằng 2 thì bật led 2 hiển thị dữ liệu led 2 tắt các led còn lại
....
cho đến hết led thứ n thì gán trở lại biến đếm đó bằng 0.
Đây là 1 đoạn mình quét led 7 thanh dùng avr hiển thị 3 biến giờ phút giây dùng timer 0 avr.
Mã:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=230;
index++;
if(index==1 ){
t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=1;led2=0;led3=0;led4=0;led5=0;led6=0;
PORTA=font[t_view/10];

}
if(index==2 )
{// t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=1;led3=0;led4=0;led5=0;led6=0;
PORTA=font[t_view%10];
}
if(index==3){
t_view=m;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=1;led4=0;led5=0;led6=0;
PORTA=font[t_view/10];
}
if(index==4 )
{
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=1;led5=0;led6=0;
PORTA=font[t_view%10];
}
if(index==5) {

t_view=s;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=0;led5=1;led6=0;
PORTA=font[t_view/10];
}

if(index==6 )
{ //t_view=h;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;
led1=0;led2=0;led3=0;led4=0;led5=0;led6=1;
PORTA=font[t_view%10];
index=0;
}
// Place your code here

}
ah..ra là vậy ! Nhưng cụ thể mình quét 4 LED, vậy thì thiết lập Timer đếm đến giá trị bao nhiêu để thoã 24 hình/giây nhỉ?mình cảm ơn nhiều !!!
 

mta_cdt

Super Moderator
Thành viên BQT
#4
ah..ra là vậy ! Nhưng cụ thể mình quét 4 LED, vậy thì thiết lập Timer đếm đến giá trị bao nhiêu để thoã 24 hình/giây nhỉ?mình cảm ơn nhiều !!!
Chỉ cần đảm bảo trên 24hz là ok đến 50 thì vẫn tốt chứ sao nhưng không được cao quá thôi hiiiiii vì nhiều quá không có thời gian làm cái khác.
Cái này tùy bạn dùng thạch anh bao nhiêu, bộ chia tần thế nào mà tính ra thôi mà.
 

lee_trieu

Học sinh trung cấp
#5
Chỉ cần đảm bảo trên 24hz là ok đến 50 thì vẫn tốt chứ sao nhưng không được cao quá thôi hiiiiii vì nhiều quá không có thời gian làm cái khác.
Cái này tùy bạn dùng thạch anh bao nhiêu, bộ chia tần thế nào mà tính ra thôi mà.
ah mình hiểu rồi ! Cảm ơn bạn nhiều !!
 

Quảng cáo Google