MCU PIC16F877
ใช้ interrupt timer1
เขียนโปรแกรมให้ 7segment นับ 0 - 9 แล้ววนกลับมาใหม่
การนับแต่ละครั้ง 1sec
// 7segment common k , LED8 bit by Anucha R ,chamobile2003@yahoo.com
// 05:03:13 update (dd:mm:yy)
#include <16F877.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay (clock = 20000000) // Crytal = 20MHz
#use fast_io(D)
#use fast_io(C)
#use fast_io(A)
// interrupt timmer 1 ,pulse 100Hz,
int8 count,i=0;
int v;
int NUM[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfc}; // no dot
//int NUM[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7c}; // dot active high,common low
// 0 1 2 3 4 5 6 7 8 9 dot
//----------------------------------------------------
//##############################################################################
#INT_TIMER1 // 5ms
void isr_timer1()
{
if(count>100) // 1000/5 = 200,duty cycle 50% (200) = 100
{
v=!v;
if(i<9)i++;
else i=0;
count=0;
}
output_c (NUM[i]);
output_d(0x10);
count++;
set_timer1(40536); // 5ms=0.2us*1*TMR1H:TMR1L,65536 - 25000
}
//******************************************************************************
void main()
{
//-------------------------------------------------
SETUP_ADC(ADC_OFF);
set_tris_a(0xff); // PortA INPUT
set_tris_c(0x00); // 0000 0000
set_tris_d(0x00); // 0000 0000
enable_interrupts(global);
enable_interrupts(int_timer1);
//-------------------------------------------------
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(40536);
while(true)
{
}
}
การทดลอง
วงจรทำงานได้ นับ 0 -9 วนไปเรื่อยๆ
แต่พอกด Reset แล้ว ค่าตัวเลข แทนที่จะเริ่ม 1 ใหม่
กลับนับต่อไปเลยครับ
ไม่ทราบ ต้องเซ็ตค่าอะไรเพิ่ม
วงจร
16F877 ใช้ interrupt timer รีเซ็ตแล้วไม่เริ่มใหม่
ใช้ interrupt timer1
เขียนโปรแกรมให้ 7segment นับ 0 - 9 แล้ววนกลับมาใหม่
การนับแต่ละครั้ง 1sec
// 7segment common k , LED8 bit by Anucha R ,chamobile2003@yahoo.com
// 05:03:13 update (dd:mm:yy)
#include <16F877.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay (clock = 20000000) // Crytal = 20MHz
#use fast_io(D)
#use fast_io(C)
#use fast_io(A)
// interrupt timmer 1 ,pulse 100Hz,
int8 count,i=0;
int v;
int NUM[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfc}; // no dot
//int NUM[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7c}; // dot active high,common low
// 0 1 2 3 4 5 6 7 8 9 dot
//----------------------------------------------------
//##############################################################################
#INT_TIMER1 // 5ms
void isr_timer1()
{
if(count>100) // 1000/5 = 200,duty cycle 50% (200) = 100
{
v=!v;
if(i<9)i++;
else i=0;
count=0;
}
output_c (NUM[i]);
output_d(0x10);
count++;
set_timer1(40536); // 5ms=0.2us*1*TMR1H:TMR1L,65536 - 25000
}
//******************************************************************************
void main()
{
//-------------------------------------------------
SETUP_ADC(ADC_OFF);
set_tris_a(0xff); // PortA INPUT
set_tris_c(0x00); // 0000 0000
set_tris_d(0x00); // 0000 0000
enable_interrupts(global);
enable_interrupts(int_timer1);
//-------------------------------------------------
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(40536);
while(true)
{
}
}
การทดลอง
วงจรทำงานได้ นับ 0 -9 วนไปเรื่อยๆ
แต่พอกด Reset แล้ว ค่าตัวเลข แทนที่จะเริ่ม 1 ใหม่
กลับนับต่อไปเลยครับ
ไม่ทราบ ต้องเซ็ตค่าอะไรเพิ่ม
วงจร