📄 sl.c
字号:
#include"pic.h"
#define bitset(var, bitno) ((var) |= (1<<(bitno)))
#define bitclr(var, bitno) ((var) &= ~(1<<(bitno)))
#define CLK RC3
#define DATA RC5
#define STB RD4
#define PS_4021 RD6
#define DATA_INPUT RD7
#define CLK_4021 RD5
#define MODE_P RC0
#define MODE_N RC1
#define RF_P RD0
#define RF_N RD1
#define MIX_P RD2
#define MIX_N RD3
#define ad0 0b01000001
#define ad1 0b01001001
#define ad2 0b01010001
#define ad3 0b01011001
#define ad4 0b01100001
#define ad5 0b01101001
#define ad6 0b01110001
#define ad7 0b01111001
#define ad8 0b01000011
#define ad9 0b01001011
#define ad10 0b01010011
#define ad11 0b01011011
#define ad12 0b01100011
#define ad13 0b01101011
union var
{
unsigned char byte;
struct
{
unsigned bit0: 1;
unsigned bit1: 1;
unsigned bit2: 1;
unsigned bit3: 1;
unsigned bit4: 1;
unsigned bit5: 1;
unsigned bit6: 1;
unsigned bit7: 1;
}bits;
};
union adres
{
unsigned int ad;
unsigned char res[2];
}adresult;
static union var KEY_VALUE;
unsigned char PWM[7]={0x00,0X33,0X66,0X99,0XCC,0XFF,0xFF};
unsigned int Vol_H[6]={1080,810,550,260,70,40};
unsigned int Vol_L[6]={1020,750,490,200,10,5};
static unsigned char led[4]={0,0,0,0};
unsigned char mode_count;
unsigned char Ad_count;
unsigned int fb_voltage;
unsigned int cur_voltage;
unsigned char mode_counter=0;
unsigned char rf_counter=0;
unsigned char mix_counter=0;
unsigned blo_counter=0;
unsigned char gear=1;
unsigned char autostep=1;
unsigned char step=1;
unsigned char count_10s=0;
unsigned int max_cur;
unsigned int ad_value;
bit modemotor_flag=0;
bit rfmotor_flag=0;
bit mixmotor_flag=0;
bit mode_flag=0;
bit rf_flag=0;
bit mix_flag=0;
bit blo_flag=0;
bit blo_over=0;
bit cur_flag=0;
bit test_flag=0;
bit auto_flag=0;
bit over_flag=0;
bit open_ok;
void delay(unsigned char t)
{
unsigned int i;
for(;t>0;t--)
for(i=1000;i>0;i--)
NOP();
}
unsigned char key_input()
{
unsigned char i;
PS_4021=1;
NOP();
PS_4021=0;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
for(i=0;i<8;i++)
{
KEY_VALUE.byte<<=1;
KEY_VALUE.bits.bit0=RD7;
NOP();
CLK_4021=0;
NOP();
CLK_4021=1;
NOP();
}
return KEY_VALUE.byte;
}
void led_out()
{
unsigned char i,j;
STB=0;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
CLK=0;
NOP();
DATA=led[i]&0x01;
NOP();
CLK=1;
led[i]>>=1;
}
}
STB=1;
}
void ad_sampling(unsigned char ch)
{
//unsigned int temp;
//ADCON0=0x41;
//ADCON1=0x80;
ADCON1=0x80;
ADCON0=ch;
//bitset(ADCON0,0);
bitset(ADCON0,2); //启动A/D转换
while(!ADIF);
ADIF=0;
//bitclr(ADCON0,0);
adresult.res[0]=ADRESL;
adresult.res[1]=ADRESH;
ad_value=adresult.ad;
ad_value=ad_value*50/1024;
}
void keyscan()
{
if(key_input()&0x01==0)
{
delay(10);
if(key_input()&0x01==0)
auto_flag=1;
else
auto_flag=0;
}
if((key_input()&0x02)==0)
{
delay(10);
if((key_input()&0x02)==0)
{
mode_flag=1;
mode_counter++;
while(mode_counter>2)
mode_counter=0;
}
}
if((key_input()&0x04)==0)
{
delay(10);
if((key_input()&0x04)==0)
{
rf_flag=1;
rf_counter++;
while(rf_counter>2)
rf_counter=0;
}
}
if((key_input()&0x08)==0)
{
delay(10);
if((key_input()&0x08)==0)
{
mix_flag=1;
mix_counter++;
while(mix_counter>2)
mix_counter=0;
}
}
if((key_input()&0x10)==0)
{
delay(10);
if((key_input()&0x10)==0)
{
blo_flag=1;
blo_counter++;
if(blo_counter>6)
blo_counter=0;
}
}
}
void interrupt ISR(void) //中断处理函数
{
if(TMR1IF) //Timer1中断
{
TMR1IF=0;
TMR1H=0X3C; //Timer1=0xC350=50000
TMR1L=0XAF;
count_10s++;
if(count_10s>40) //50000*50*4us=6S
{
count_10s=0;
blo_counter++;
if(blo_counter>6)
{
blo_counter=0;
blo_over=1;
}
}
}
}
void main()
{
TRISA=0xFF;
TRISB=0xFF;
TRISC=0x00;
TRISD=0x80;
TRISE=0x07;
PORTC=0x00;
PORTD=0x00;
ADCON0=0x41;
ADCON1=0x80;
CCP1CON=0X0F; //设置PWM模式
PR2=0XFF; //Timer2周期(占空比总长度)
T2CON=0X7F;
CCPR1L=0x00;
INTCON=0x00; /* bit7-bit0:关总中断 */
PIR1=0X00; //清除所有中断
T1CON=0X01; //使能Timer1定时器、内部时钟*/
bitset(INTCON,6); //set PEIE bit
bitset(INTCON,7); //set GIE bit
KEY_VALUE.byte=0x00;
while(1)
{
keyscan();
if(blo_flag)
CCPR1L=PWM[blo_counter];
//if(auto_flag)
//{
//led[3]=0xff;
//led_out();
// }
//if(blo_flag)
// {
// led[3]=0xff;
// led_out();
// CCPR1L=PWM[blo_counter];
//}
/*if(mode_flag)
{
if(mode_counter==1)
{
MODE_P=1; //启动MODE motor
NOP();
MODE_N=0;
NOP();
ad_sampling(ad6);
if(ad_value<15)
{
if(ad_value>10)
{
mode_flag=0;
MODE_P=0;
NOP();
MODE_N=0;
NOP();
if(max_cur<50)
{
led[3]&=0b11011111;
led[3]|=0x80;
open_ok=1;
}
else
led[3]|=0x10;
}
}
else
{
led[3]|=0x20;
ad_sampling(ad1);
if(ad_value>max_cur)
max_cur=ad_value;
}
led_out();
}
if(mode_counter==2)
{
MODE_P=0;
NOP();
MODE_N=1;
NOP();
ad_sampling(ad6);
if(ad_value>30)
{
if(ad_value<35)
{
mode_flag=0;
MODE_P=0;
NOP();
MODE_N=0;
NOP();
if(max_cur<50)
{
led[3]&=0b11011111;
led[3]|=0x40;
}
else
led[3]|=0x10;
}
}
else
{
if(open_ok)
led[3]|=0x80;
led[3]|=0x20;
ad_sampling(ad1);
if(ad_value>max_cur)
max_cur=ad_value;
}
led_out();
}
}
if(rf_flag)
{
if(rf_counter==1)
{
RF_P=1; //启动MODE motor
NOP();
RF_N=0;
NOP();
ad_sampling(ad7);
if(ad_value<15)
{
if(ad_value>10)
{
rf_flag=0;
RF_P=0;
NOP();
RF_N=0;
NOP();
if(max_cur<50)
{
led[3]&=0b11011111;
led[3]|=0x80;
open_ok=1;
}
else
led[3]|=0x10;
}
}
else
{
led[3]|=0x20;
ad_sampling(ad2);
if(ad_value>max_cur)
max_cur=ad_value;
}
led_out();
}
if(rf_counter==2)
{
RF_P=0;
NOP();
RF_N=1;
NOP();
ad_sampling(ad7);
if(ad_value>30)
{
if(ad_value<35)
{
rf_flag=0;
MIX_P=0;
NOP();
MIX_N=0;
NOP();
if(max_cur<50)
{
led[3]&=0b11011111;
led[3]|=0x40;
}
else
led[3]|=0x10;
}
}
else
{
if(open_ok)
led[3]|=0x80;
led[3]|=0x20;
ad_sampling(ad2);
if(ad_value>max_cur)
max_cur=ad_value;
}
led_out();
}
}
if(mix_flag)
{
if(mix_counter==1)
{
MIX_P=1; //启动MODE motor
NOP();
MIX_N=0;
NOP();
ad_sampling(ad8);
if(ad_value<15)
{
if(ad_value>10)
{
mix_flag=0;
MIX_P=0;
NOP();
MIX_N=0;
NOP();
if(max_cur<50)
{
led[3]&=0b11011111;
led[3]|=0x80;
open_ok=1;
}
else
led[3]|=0x10;
}
}
else
{
led[3]|=0x20;
ad_sampling(ad3);
if(ad_value>max_cur)
max_cur=ad_value;
}
led_out();
}
if(mix_counter==2)
{
MIX_P=0;
NOP();
MIX_N=1;
NOP();
ad_sampling(ad8);
if(ad_value>30)
{
if(ad_value<35)
{
mix_flag=0;
MIX_P=0;
NOP();
MIX_N=0;
NOP();
if(max_cur<50)
{
led[3]&=0b11011111;
led[3]|=0x40;
}
else
led[3]|=0x10;
}
}
else
{
if(open_ok)
led[3]|=0x80;
led[3]|=0x20;
ad_sampling(ad3);
if(ad_value>max_cur)
max_cur=ad_value;
}
led_out();
}
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -