PDA

View Full Version : Đồng hồ số dùng PIC18F4580


longnhat
26-07-2010, 10:10 PM
Anh (chị) nào giúp em cách dùng nhiều ngắt trong CCS được không ? Ví dụ , em viết code để làm đồng hồ số sử dụng ngắtTIMER1 để đếm h,p,s hiển thị LED7segment ; nhưng chừ em muốn dùng ngắt khác để chỉnh h,p,s bằng switch . Nhưng em thử hoài mà không thấy xảy ra ngắt (ngắt INT_EXT1).Cho em hỏi phải quan tâm đến ưu tiên không vậy ? Nếu có thì phải làm sao ?
Cho em hỏi tiếp là làm sao khi ta ấn(SW) lần 1 thì giây lại nhấp nháy như trong đồng hồ đeo tay , lần 2 tới phút.....giúp em vấn đề này với....sao mà khó thế...nói chung em muốn làm giống y đồng hồ đeo tay
Mong anh(chị) pro gthich càng chi tiết càng tốt . Thank trước !

longnhat
27-07-2010, 05:46 PM
Các cao thủ PIC giúp em tí đi . Mong có câu trả lời sớm ...HELP ME !

longnhat
28-07-2010, 04:14 PM
Sao chán thế này nhỉ ... giúp mình với , mình ok ngắt rồi nhưng vấn đề lớn mình không biết cách làm sao khi ta ấn nút thì 2led hiển thị giây nhấp nháy mà 4led còn lại vẫn tiếp tục quét h,p...các cao thủ nào có thể thảo luận về vấn đề này được không ?

tdm
17-08-2010, 09:20 PM
Sao chán thế này nhỉ ... giúp mình với , mình ok ngắt rồi nhưng vấn đề lớn mình không biết cách làm sao khi ta ấn nút thì 2led hiển thị giây nhấp nháy mà 4led còn lại vẫn tiếp tục quét h,p...các cao thủ nào có thể thảo luận về vấn đề này được không ?
dùng một biến tạm để làm việc đó.
vd:
ngắt
nhay=~nhay;//đảo byte
.
.
.
main
nhay =0x00;
quet_led();
void quet_led(void)
if(nhay==0x00)
{
hiển thị giờ phút giây
}
else//nhay =0xff
{
hiển thị giờ phút tắt giây
}

XuHi
10-05-2011, 12:08 PM
dùng một biến tạm để làm việc đó.
vd:
ngắt
nhay=~nhay;//đảo byte
.
.
.
main
nhay =0x00;
quet_led();
void quet_led(void)
if(nhay==0x00)
{
hiển thị giờ phút giây
}
else//nhay =0xff
{
hiển thị giờ phút tắt giây
}
Anh có thể nói rõ hơn là mình sẽ ngắt gì không? Với lại để có thể thấy nhấp nháy cũng phải cần delay khoảng 150 ms, nhưng khi quét led 7 đoạn mỗi lần delay chỉ là 1 ms thôi, nếu chương trình chạy quet_led() liên tục mỗi lần chỉ delay rất nhỏ làm sao mắt thấy được.
Em có tham khảo code của anh Linhnc308:

PortB=maled7[led3];
if(blink_min==1) RC2=1;//LED3
else RC2=0;
delay_ms(1); RC2=1;
PortB=maled7[led4];
if(blink_min==1) RD0=1;//LED4
else RD0=0;
delay_ms(1); RD0=1;

Nhưng mà không dùng được?

tdm
10-05-2011, 09:54 PM
Anh có thể nói rõ hơn là mình sẽ ngắt gì không? Với lại để có thể thấy nhấp nháy cũng phải cần delay khoảng 150 ms, nhưng khi quét led 7 đoạn mỗi lần delay chỉ là 1 ms thôi, nếu chương trình chạy quet_led() liên tục mỗi lần chỉ delay rất nhỏ làm sao mắt thấy được.
Em có tham khảo code của anh Linhnc308:

PortB=maled7[led3];
if(blink_min==1) RC2=1;//LED3
else RC2=0;
delay_ms(1); RC2=1;
PortB=maled7[led4];
if(blink_min==1) RD0=1;//LED4
else RD0=0;
delay_ms(1); RD0=1;
Nhưng mà không dùng được?
đoạn code đơn giản để làm việc đó:

#include <16F877A.h>
#Fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(c)
#use fast_io(d)
const unsigned char font[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
int8 i=0,a,tao_nhay=0xaa;
int16 count=0;
void hien_thi(void);
void hien_thi_1(void);
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 5000) //
{
count=0;
tao_nhay=~tao_nhay;
}}

void main ()
{

set_tris_b(0);
set_tris_d(0);
output_b(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);//
enable_interrupts(int_timer0);
enable_interrupts(global);
while(1)
{
if(tao_nhay==0xaa)
{
hien_thi();
}
else
{
hien_thi_1();
}
}
}
void hien_thi(void)
{
output_d(0xfe);
output_b(font[i/10]);
delay_ms(1);
output_b(0xff);
output_d(0xfd);
output_b(font[i%10]);
delay_ms(1);
output_b(0xff);
}
void hien_thi_1(void)
{
output_d(0xfe);
output_b(font[i/10]);
delay_ms(1);
output_b(0xff);
output_d(0xfd);
delay_ms(1);
output_b(0xff);
}