📄 sample.c
字号:
/*
* Sample application using LCD interface (see lcd.c) and analog input
* on a 16C71 (see adc.c)
*
* 1) Read channel 0 of the ADC and write it to the LCD
* 2) Read serial data and write it to line 2 of the LCD
*
*/
#define O_FREQ RC4
#define O_LED RC5
#define O_POS RC6
#define O_NEG RC7
#define TMR_STOP 0
#define TMR_RUN 1
//#define _16CF877
//#define _16c62a
#include <pic.h>
#define INT_ON 1
void check_key(void);
void sys_initial(void);
void sys_tmr_check(void);
void sys_freq_check(void);
void sys_signal_check(void);
void set_hz03(void);
void set_hz91(void);
void set_hz30(void);
void set_hz292(void);
//----the data of system------
unsigned char sys_freq;
unsigned char sys_timer;
unsigned char sys_signal;
unsigned char sys_long_timer;
unsigned char long_timer;
unsigned char test_int;
unsigned long tr_index=0;
unsigned long tr_pwm_index=0;
unsigned char tr0_10k;
unsigned char h_sec_index;
unsigned char one_min_index;
unsigned long tran_tmr;
unsigned long pwm_tmr;
unsigned long half_sec_tmr;
unsigned long one_minute_tmr;
//----bit flags of system------static bit
unsigned char sys_tmr_changed;
unsigned char sys_freq_changed;
unsigned char sys_signal_changed;
unsigned char start_carry; //start transfer 10khz
unsigned char signal_st;
unsigned char stop_tmr; //LONG TIME TIMER
// tr_index=31009 freq=0.3hz
//
//
// tr_index=34 freq=292hz
main()
{
sys_initial();
//set_hz292();
for(;;)
{
//start_carry=12;
asm("clrwdt");
if(stop_tmr==TMR_RUN)
{
if(tr_index >tran_tmr )
{
tr_index=0;
tr_pwm_index=0;
start_carry=1;
}
if(tr_pwm_index>pwm_tmr)
{
tr_pwm_index=0;
start_carry=0;
tr0_10k=0;
O_FREQ=0;
}
if(half_sec_tmr > 5000)
{
if(signal_st)
{
h_sec_index=~h_sec_index;
if(!h_sec_index){
O_POS=0;
O_NEG=1;}
else {
O_POS=1;
O_NEG=0;}
}
half_sec_tmr=0;
}
// one minute = 600000
if( one_minute_tmr > 600000 )
{
//one_min_index=~one_min_index;
//if(!one_min_index) O_LED=0;
//else O_LED=1;
long_timer++;
if (sys_long_timer ==0xff ) long_timer=0;
if (long_timer == sys_long_timer ) stop_tmr=TMR_STOP;
one_minute_tmr=0;
}
}
// TIMER COUNT FINISH AND CLRAN ALL DATA
if( stop_tmr==TMR_STOP){
O_FREQ=0;
O_LED=0;
O_POS=0;
O_NEG=0;}
check_key();
sys_tmr_check();
sys_freq_check();
sys_signal_check();
}
}
// purpose :system setup routine
// input :
//ouput :
void sys_initial(void)
{
//CLEAN RAM
INTCON=0;
PIR1=0;
PIE1=0;
TMR1L=0;
TMR1H=0;
OPTION=0;
TRISC = 0x0F;
PORTC = 0x00; // Initialise interrupt-controlled lights (upper 4 bits).
#ifdef _16CF877
ADCON1=0x06;
#endif
ADCON1=0x06;
TRISA =0xFF;
PORTA=0x00;
TRISB =0xFF;
PORTA=0x00;
// Initialise & start timer0.
T0IE=1;
T0CS = 0;
//initial timr1
TMR1IE=1;
TMR1ON=1;
#ifdef INT_ON
GIE=1;
PEIE=1;
#endif
TMR1IE=1;
tr0_10k=0xff;
// clean status control flag
sys_tmr_changed=0;
sys_freq_changed=0;
sys_signal_changed=0;
half_sec_tmr=0;
one_minute_tmr=0;
test_int=0xFF;
signal_st=0;
stop_tmr=TMR_RUN;
start_carry=0;
}
//purpose : interrupt routine for timer0 and timer1
// input :
//ouput :
interrupt void
timer0_overflow_isr( void)
{
// CONTROL TIMER-0
if(T0IF==1)
{
//PORTC = 0xAA;
TMR0=215;
if(stop_tmr==TMR_RUN)
{
if(start_carry)
{
O_LED=1;
tr0_10k=~tr0_10k;
if(tr0_10k==0) O_FREQ=0;
else O_FREQ=1;
}
if(!start_carry) O_LED=0;
}
T0IF = 0; // Clear Timer 0 Interrupt Flag.
}
// CONTROL TIMER-1
if(TMR1IF==1)
{
TMR1L=90;
TMR1H=0xFF;
tr_index++;
tr_pwm_index++;
half_sec_tmr++;
one_minute_tmr++;
TMR1IF=0;
}
}
// purpose :check user press any key
// input :
// output :
void check_key(void)
{
unsigned char data_temp;
//check timer select in PORTA
data_temp=PORTA;
data_temp &= 0x0F;
if(data_temp != sys_timer)
{
sys_tmr_changed=1;
sys_timer=data_temp;
}
//check freqence in PORTC
data_temp=PORTC;
data_temp &= 0x0F;
if(data_temp != sys_freq)
{
sys_freq_changed=1;
sys_freq=data_temp;
}
if(data_temp==0)
{
stop_tmr=TMR_STOP;
O_FREQ=0;
O_LED=0;
// O_POS=0;
// O_NEG=0;
start_carry=0;
asm("sleep");
asm("nop");
asm("sleep");
asm("nop");
}
//check signal in PORTB
data_temp=PORTB;
data_temp &= 0x07;
if(data_temp != sys_signal)
{
sys_signal_changed=1;
sys_signal=data_temp;
}
}
//purpose :check timer selecr have ever change
//input :
//output :
void sys_tmr_check(void)
{
if(sys_tmr_changed)
{
switch(sys_timer)
{
case 0x01 : //RA0 PRESS ,1OMIN
sys_long_timer=10;
break;
case 0x02 : //RA1 PRESS ,20MIN
sys_long_timer=20;
break;
case 0x04: //RA2 PRESS ,60MIN
sys_long_timer=60;
break;
case 0x08 : //CONTINUOUS
sys_long_timer=0xFF;
break;
default : //NON SELECT
sys_long_timer=0xFF;
break;
}
long_timer=0;
sys_tmr_changed=0;
one_minute_tmr=0;
tr_index=0;
tr_pwm_index=0;
half_sec_tmr=0;
}
}
// purpose :check timer selecr have ever change
//input :
//output :
void sys_freq_check(void)
{
if(sys_freq_changed)
{
switch(sys_freq)
{
case 0x01 : //0.3HZ (PW=1.8S)
//RC4 =1;
set_hz03();
stop_tmr=TMR_RUN;
break;
case 0x02 : //9.1HZ (PW=64MS)
//RC5=1;
set_hz91();
stop_tmr=TMR_RUN;
break;
case 0x04: //30HZ (PW=20MS)
//RC6=1;
set_hz30();
stop_tmr=TMR_RUN;
break;
case 0x08 : //292HZ (PW=16MS)
//RC7=1;
set_hz292();
stop_tmr=TMR_RUN;
break;
//case 0x00 :
default:
stop_tmr=TMR_STOP;
O_FREQ=0;
O_LED=0;
//O_POS=0;
//O_NEG=0;
start_carry=0;
break;
}
sys_freq_changed=0;
}
// 2003.3.24 changed here
asm("clrwdt");
asm("clrwdt");
asm("clrwdt");
asm("clrwdt");
data_temp=PORTB;
data_temp &= 0x07;
sys_signal=data_temp;
sys_signal_changed=1;
sys_signal_check();
// stop....
}
//purpose :check timer selecr have ever change
//input :
//ouput :
void sys_signal_check(void)
{
if(sys_signal_changed)
{
switch(sys_signal)
{
case 0x6 : //POSITIVE
O_POS=1;
O_NEG=0;
signal_st=0;
//RC4=1;
break;
case 0x05 : //NEGATIVE
//RC5=1;
//PORTC=0xAA;
O_POS=0;
O_NEG=1;
signal_st=0;
break;
case 0x03: //BI-PHASIC
//RC6=1;
signal_st=1;
break;
case 0x0f :
//PORTC=00;
break;
}
sys_signal_changed=0;
}
}
// purpose : setup in 0.3hz
void set_hz03(void)
{
tr_index=31008;
tran_tmr=31009;
pwm_tmr=18000;
}
//purpose : setup in 9.1hz
void set_hz91(void)
{
tr_index=1108;
tran_tmr=1100;
pwm_tmr=640;
}
//purpose : setup in 30hz
void set_hz30(void)
{
tr_index=329;
tran_tmr=330;
pwm_tmr=200;
}
//purpose : setup in 30hz
void set_hz292(void)
{
tr_index=33;
tran_tmr=33;
pwm_tmr=16;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -