📄 minihorn.c
字号:
//Compile date 2008.05.23 Checksum:0x05FA V2.0 12F629
//Compile date 2008.05.27 Checksum:0x01fa V2.0 12F629
#include <pic12f6x.h>
//#include <htc.h>
union
{
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}bits;
unsigned char data;
}recbit;
union
{
struct
{
unsigned commandin:1;
unsigned command_start:1;
unsigned rec_bit:1;
unsigned pulse:1;
unsigned hornsw:1;
unsigned case_horn_sw:1;
unsigned up:1;
unsigned keyin:1;
}bits;
unsigned char data;
}flag;
bit is_the_first_pulse,whoop_sleep;
unsigned char OPTION_REG_BAK,step,keycode,horn_pulse_counter,var_tmr0,var_tmr1,whoop_delay,soundtype,temp3_step,tmr1_counter;
unsigned int tmr0scale;
bit temp3,march,fastmarch,bpm20,soundopen,temp_sw,horn_sw;
unsigned char rec_code;
void init(void);// Init Port and Reg
void var_init(void); //INIT user ram
void scankey(void);
void interrupt ISR(void)
{
unsigned char temp;
// Command Start pulse detect
if(CMIE & CMIF)
{
//unsigned char temp;
flag.bits.rec_bit=COUT;
CMIF=0; //GPIO5=!GPIO5;
TMR0=0x70;// clear TMR0 presclae,reset TMR0,delay tmr0 interrupt
T0IF=0;
step++;
if((is_the_first_pulse)&(!flag.bits.commandin))//adjust the Timer0 prescale reg
{
if(flag.bits.rec_bit)//if the first COUT=1 means pre_command is ok
{
OPTION_REG_BAK=OPTION_REG;//backup the OPTION_REG REG
OPTION_REG=0x2;
is_the_first_pulse=0;
flag.bits.command_start=1;
}
}
if(flag.bits.command_start)
{
switch(step)
{
case 1:{recbit.bits.b3=flag.bits.rec_bit;break;}
case 2:{recbit.bits.b2=flag.bits.rec_bit;break;}
case 3:{recbit.bits.b1=flag.bits.rec_bit;break;}
case 4:{recbit.bits.b0=flag.bits.rec_bit;break;}
case 5:{step=0;flag.bits.command_start=0;flag.bits.commandin=1;OPTION_REG=OPTION_REG_BAK;break;}
default:{step=0;}
}
}
}
//--------------------End Start pulse detect
if(T0IE & T0IF)//IF dectected the first pulse then turn tmr0 to quick mode to receive the others pulse level.
{
T0IF=0;
if(!flag.bits.command_start)
{
/*
if(horn_pulse_counter)
{
TMR0=0xCC;//0xCC 260us 3846Hz
horn_pulse_counter--;
if(flag.bits.up)
{
var_tmr0=var_tmr0+4;
if(var_tmr0>0xD2){flag.bits.up=0;var_tmr0=0xD2;}//0xD2
}
else
{
var_tmr0=var_tmr0-4;
if(var_tmr0<0x7A){flag.bits.up=1;var_tmr0=0x7A;}//0x83
}
}
else
{
//TMR0=0xCC;
TMR0=var_tmr0;
if(!flag.bits.case_horn_sw){flag.bits.case_horn_sw=1;}
horn_pulse_counter=1;
}
*/
if(horn_pulse_counter)
{
horn_pulse_counter--;
flag.bits.pulse=!flag.bits.pulse;
if(flag.bits.pulse)
{
TMR0=0xDD;//0xCB 260us 3846Hz
flag.bits.hornsw=1;
}else
{
TMR0=0xB7;
flag.bits.hornsw=0;
}
//whoop_delay=10;
}
else
{
TMR0=0x30;
whoop_delay--;
if(!whoop_delay)
{
horn_pulse_counter=60;
whoop_delay=8;
}
flag.bits.hornsw=0;
}
GPIO5=(!GPIO5) & flag.bits.hornsw & soundopen & horn_sw;
//flag.bits.case_horn_sw=!flag.bits.case_horn_sw;
//GPIO5=flag.bits.case_horn_sw & soundopen & horn_sw;
}//--------------End HORN pulse generate
else
//If it is not in the command receiving mode,enable the horn pulse by set the TMR0.
{
GPIO5=0;
CMIF=1;
}//End command receiveing
}
//-------------------end TMR0 interrupt
if(TMR1IE & TMR1IF & (!flag.bits.command_start))
{//TIME BASE 0.25s
TMR1IF=0;
TMR1L=0xED;
TMR1H=0x85;
if(temp3)
{
switch(temp3_step)
{
case 0:
{
tmr1_counter++;
if(tmr1_counter==2)
{
temp_sw=1;
temp3_step=1;
tmr1_counter=0;
}
break;
}
case 1:
{
tmr1_counter++;
if(tmr1_counter==2)
{
temp_sw=0;
temp3_step=2;
tmr1_counter=0;
}
break;
}
case 2:
{
tmr1_counter++;
if(tmr1_counter==2)
{
temp_sw=1;
temp3_step=3;
tmr1_counter=0;
}
break;
}
case 3:
{
tmr1_counter++;
if(tmr1_counter==2)
{
temp_sw=0;
temp3_step=4;
tmr1_counter=0;
}
break;
}
case 4:
{
tmr1_counter++;
if(tmr1_counter==2)
{
temp_sw=1;
temp3_step=5;
tmr1_counter=0;
}
break;
}
case 5:
{
tmr1_counter++;
if(tmr1_counter==6)
{
temp_sw=0;
tmr1_counter=0;
temp3_step=0;
}
}
}//end switch(temp3_step)
soundopen=!temp_sw;
}//end if(temp3)
if(march)
{
tmr1_counter++;
if(tmr1_counter==2)
{temp_sw=!temp_sw;tmr1_counter=0;}
soundopen=temp_sw;
}
if(fastmarch)
{
if(!GPIO2)//GPIO2=0 Fast March Time GPIO2=1 20 beat per minute
{
temp_sw=!temp_sw;
}
else
{
tmr1_counter++;
if(tmr1_counter==6)
{
temp_sw=!temp_sw;
tmr1_counter=0;
}
}
soundopen=temp_sw;
}
}//TMR1 END;
}
void main(void)
{
var_init();
init();
while(1)
{
if(flag.bits.commandin)
{
rec_code=recbit.data & 0xF;
recbit.data=0;
flag.bits.commandin=0;
is_the_first_pulse=1;
GIE=0;
horn_pulse_counter=2;
switch(rec_code)
{
case 0x9:{horn_sw=0;break;}//1001 HORN OFF
case 0xB:{horn_sw=1;soundopen=1;fastmarch=0;temp3=0;march=0;break;}//1011 HORN ON
case 0x8:{horn_sw=1;temp3=1;march=0;fastmarch=0;break;}//1000 TEMPORAL
case 0xE:{horn_sw=1;temp3=0;march=1;fastmarch=0;break;}//1110 MARCH TIME
case 0xC:{horn_sw=1;temp3=0;march=0;fastmarch=1;break;}//1100 Fast March time
default:;
}
GIE=1;
}
}
}
void var_init(void)
{
soundopen=1;
march=0;
fastmarch=0;
temp3=0;
temp3_step=0;
tmr1_counter=0;
temp_sw=0;
horn_sw=1;// Horn sw=the biggest off switch
rec_code=0;
soundtype=7;
whoop_sleep=0;
whoop_delay=10;
tmr0scale=3;
flag.bits.hornsw=1;
flag.bits.pulse=0;
flag.bits.command_start=0;
flag.bits.commandin=0;
OPTION_REG_BAK=0;
var_tmr0=0x23;
var_tmr1=0x0;
horn_pulse_counter=5;
step=0;
keycode=0;
flag.bits.keyin=1;
is_the_first_pulse=1;
}
void init(void)
{
OPTION_REG=0;
T1CON=0x31;
//ANSEL=0x02;//0x02 12F629 AD not exist.
CMCON=0x04;
TRISIO=0x1F;//0x1F
GPIO=0x1F;
WPU=0x1D;
IOCB=0x0;
VRCON=0xA7;
CMCON=CMCON;
TMR1IF=0;
T0IF=0;
CMIF=0;
GIE=1;
GPIE=0;
T0IE=1;
TMR1IE=1;
CMIE=1;
PEIE=1;
}
// GPIO2 GPIO3 GPIO4
// 1 1 1 HORN
// 1 0 1 BELL
// 0 0 1 MARCH TIME
// 1 1 0 CA Horn
// 0 1 1 Reserve
// 0 1 0 SLOW WHOOP
// 1 0 0 SIREN
// 0 0 0 HI/LO
/*
void scankey(void)
{
// unsigned char temp_keycode;
union
{
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}bits;
unsigned char data;
}keys;
keys.bits.b0=GPIO2;
keys.bits.b1=1;
keys.bits.b2=1;
if(keys.data!=keycode)
{
keycode=keys.data;
flag.bits.keyin=1;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -