📄 timer.c
字号:
#define buzzer_on 0x01
#define buzzer_off 0x02
#define disperse_coal 0x03
#define start_cooking 0x04
#define stop_cooking 0x05
#define on_fan 0x06
#define off_fan 0x07
char data[2];
unsigned short time_count,delay_count,repetition, buffer,error;
unsigned int lapsed_time;
char dummy, fan_reg;
unsigned short mask(unsigned short num)
{
switch (num)
{
case 0 : return 0x7e;
case 1 : return 0x18;
case 2 : return 0xb6;
case 3 : return 0xbc;
case 4 : return 0xd8;
case 5 : return 0xec;
case 6 : return 0xee;
case 7 : return 0x38;
case 8 : return 0xfe;
case 9 : return 0xf8;
}
}
void convert_data(unsigned int buffer)
{
data[1] = 0;
data[0] = 0;
while (buffer > 0)
{
buffer--;
data[0]++;
if (data[0] > 9)
{
data[0] = 0;
data[1]++;
}
}
}
void interrupt()
{
TMR0 = 0;
if (INTCON.T0IF)
{
lapsed_time++;
if (lapsed_time == 425)
{
lapsed_time = 0;
time_count--;
dummy++;
if (time_count >= 100)
{
time_count = 0;
INTCON.GIE = 0;
INTCON.T0IE = 0;
}
}
}
INTCON.T0IF = 0;
}
void scan()
{
convert_data(time_count);
PORTB = mask (data[1]);
if (data[1] > 0)
{
PORTA.F2 = 1;
Delay_ms (5);
PORTA.F2 = 0;
}
PORTB = mask (data[0]);
PORTA.F1 = 1;
Delay_ms (5);
PORTA.F1 = 0;
}
void Delay_1_sec()
{
delay_count = 50;
while (delay_count > 0)
{
scan();
delay_count--;
}
}
void Delay_500_msec()
{
delay_count = 12;
while (delay_count > 0)
{
scan();
delay_count--;
}
}
void beep()
{
Man_Send (buzzer_on);
Man_Send (buzzer_off);
}
void acknowledge()
{
TRISA.F0 = 1;
Delay_1_sec();
Delay_1_sec();
while (!PORTA.F0)
{
Delay_1_sec();
}
TRISA.F0 = 0;
}
void main ()
{
TRISA = 0x18;
TRISB = 0x01;
PORTA = 0;
PORTB = 0;
Delay_ms(1000);
acknowledge();
time_count = 0;
OPTION_REG = 0x03;
data[0] = 0;
data[1] = 0;
Man_Send_Config (&PORTA,0);
Delay_1_sec();
Delay_1_sec();
Delay_1_sec();
Delay_1_sec();
Delay_1_sec();
Delay_1_sec();
Delay_1_sec();
Delay_1_sec();
beep();
beep();
beep();
beep();
while (1)
{
scan();
if ((PORTA & 0x18) == 0x18) // disperse button has been trigged
{
beep();
Delay_1_sec();
Man_Send (disperse_coal);
acknowledge();
}
if (((PORTA & 0x18) == 0x08) && time_count < 95) // increment button
{
time_count = time_count + 5;
beep();
Delay_1_sec();
}
if (((PORTA & 0x18) == 0x10) && time_count > 0) // start stop button
{
beep();
Delay_1_sec ();
dummy = 0;
Man_send (start_cooking);
acknowledge();
INTCON.GIE = 1;
INTCON.T0IE = 1;
TMR0 = 0;
while (((PORTA & 0x18) != 0x10) && time_count > 0 )
{
scan();
if (dummy == 3 && fan_reg == 0)
{
Man_Send(on_fan);
fan_reg = 1;
dummy = 0;
}
if (dummy == 3 && fan_reg == 1)
{
Man_Send(off_fan);
fan_reg = 0;
dummy = 0;
}
if ((PORTA & 0x18) == 0x18) // disperse button has been trigged
{
beep();
Man_Send (disperse_coal);
}
}
INTCON.GIE = 0;
INTCON.T0IE = 0;
Man_send (stop_cooking);
Man_send (stop_cooking);
Man_send (stop_cooking);
Man_send (stop_cooking);
Man_send (stop_cooking);
Man_send (stop_cooking);
Man_send (stop_cooking);
Man_send (stop_cooking);
acknowledge();
repetition = 40;
while (repetition > 0)
{
Delay_500_msec();
Man_Send (buzzer_on);
Delay_ms (250);
Man_Send (buzzer_off);
repetition--;
}
Man_Send (buzzer_off);
time_count = 0;
}
if (PORTB.F0 && time_count > 0) // decrement button
{
time_count = time_count - 5;
beep();
Delay_1_sec();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -