📄 h.c
字号:
{
speed_count=0; //步长
speed_dec_on_led();
while(speed_dec_k)
{
asm("clrwdt");
if(speed_count==SPEED_STEP) //速度调高
{
speed_count=0;
if(knead_speed_flag) //揉捏电机关联
{RNDJSDB++;}
else if(knock_speed_flag) //锤击电机关联
{CJDJSDB++;}
else if(massage_speed_flag) //行走电机关联
{XZDJSDB++;}
else
{
a=RNDJB;
a=a&0x80;
if(a==0x80){RNDJSDB++;}
a=CJDJB;
a=a&0x80;
if(a==0x80){CJDJSDB++;}
a=XZDJB;
a=a&0x80;
if(a==0x80){XZDJSDB++;}
}
if(RNDJSDB==0x21){RNDJSDB=0x20;}
if(CJDJSDB==0x21){CJDJSDB=0x20;}
if(XZDJSDB==0x21){XZDJSDB=0x20;}
i2c_write(BACK);
i2c_write(BOTTOM);
delay_ctrl();
}
}
speed_dec_off_led();
}
}
//*******************************************************************************************//
//****************************************推拿程序*************************************//
//机心上下自动行走,遇限位则换相,如果按键压住时间大于2秒,则与速度调节关联
bit massage_flag;
massage_hand(void)
{
unsigned char a;
if(massage_k)
{
massage_count=0;
while(massage_k)
{
TXTDJB=0x80;i2c_write(BOTTOM);
if(massage_count==40)
{massage_speed_flag=1;}
}
a=XZDJB;
a=a&0x80;
if(massage_flag)
{
XZDJB=0x00;
GDXCB=0x02;
massage_off_led();
massage_flag=0;
massage_speed_flag=0;
}
else
{
TXTDJB=0;
massage_flag=1;
XZDJB=0x88;
XZDJSDB=0x01; //启动时,速度最大
GDXCB=0x02;
massage_on_led();
}
GDJSL=0;
GDJSH=235;
i2c_write(BOTTOM);
delay_ctrl();
}
}
//**********************************************************************************************//
//JRQBB=0x80;(加热) JRQBB=0x08;(气泵) XTJRDJB=0x80(小腿夹揉电机);TXTDJB=0x80;(抬小腿电机);XQFB ZDDJB
//*********************************************锤击控制*****************************************//
//锤击电机启动,如果按键压住时间大于2秒,则与速度调节关联
knock_hand(void)
{
unsigned char a;
if(knock_k)
{
knock_count=0;
while(knock_k)
{
JRQBB=0x80;i2c_write(BOTTOM);
if(knock_count==40) //
{knock_speed_flag=1;}
}
a=CJDJB;
a=a&0x80;
if(a==0x80)
{
CJDJB=0x00;
knock_off_led();
knock_speed_flag=0;
}
else
{
JRQBB=0;i2c_write(BOTTOM);
CJDJB=0x80;
knock_on_led();
}
CJDJSDB=0x18;
i2c_write(BACK);
delay_ctrl();
}
}
//**********************************************************************************************//
//**********************************摆揉控制****************************************************//
//揉捏电机反转,如果按键压住时间大于2秒,则与速度调节关联
anti_knead_hand(void)
{
unsigned char a;
if(anti_knead_k)
{
anti_knead_count=0;
while(anti_knead_k)
{
JRQBB=0x08;
i2c_write(BOTTOM);
if(anti_knead_count==40)
{knead_speed_flag=1;}
}
a=RNDJB;
a=a&0xc0;
if(a==0xc0)
{
JRQBB=0;i2c_write(BOTTOM);
RNDJB=0x00;anti_knead_off_led();knead_speed_flag=0;}
else
{RNDJB=0xc0;anti_knead_on_led();}
RNDJSDB=0x01;
i2c_write(BACK);
delay_ctrl();
}
}
//**************************************************************************************//
//**********************************揉捏控制****************************************//
//揉捏电机启动,如果按键压住时间大于2秒,则与速度调节关联
knead_hand(void)
{
unsigned char a;
if(knead_k)
{
knead_count=0;
while(knead_k)
{ if(knead_count==40)
{knead_speed_flag=1;}
}
a=RNDJB;
a=a&0x80;
if(a==0x80)
{
XTJRDJB=0; i2c_write(BOTTOM);
RNDJB=0x00;knead_off_led();knead_speed_flag=0;}
else
{RNDJB=0x80;knead_on_led();}
RNDJSDB=0x01;
i2c_write(BACK);
delay_ctrl();
}
}
//**************************************************************************************//
//*************************************************倒背控制*************************************//
//不管按键多长,延时300ms自动停止
fall_hand(void)
{
if(fall_k)
{
DBDJB=0x80;
i2c_write(BOTTOM);
delay_ctrl();
while(fall_k){asm("clrwdt");}
DBDJB=0xc0;
i2c_write(BOTTOM);
delay_ctrl();
DBDJB=0x00;
}
}
//***********************************************************************************************//
//**********************************************开机程序****************************************//
//**********************************************开机复位****************************************//
//step1 arive bottom
power_init(void)
{
unsigned char i;
//led
knead_count=0;
for(i=0;i<6;i++)
{led_ram[i]=0xff;}
while(knead_count!=20){;} //all lamp bright 500ms
PORTA=0x00;
PORTC=0xff;
for(i=0;i<6;i++)
{led_ram[i]=0;}
power_on_led();
//bottom
// go_down_on_led(); //led bright
//XTJRDJB=0x80;
// TXTDJB=0x40;
//JRQBB=0x80; JRQBB=0x08;
XZDJB=0xa1; //手动标志为1,不受区间控制
XZDJSDB=0x00; //启动时,速度最大
GDXCB=0x01;
i2c_write(BOTTOM);
delay_ctrl();
// while(GDXCB!=0x80){GDXCB=GDXCB&0x80;} //到光电行程,则停止
// XZDJB=0x00;
// GDXCB=0x01;
// i2c_write(BOTTOM);
// go_down_off_led();
//back
RNDJB=ZHONG; //置设定标志,宽
CJDJB=0x00;
i2c_write(BACK);
delay_ctrl();
power_on_led();
}
//**********************************************开机控制****************************************//
power_on(void)
{
if(onoff_k)
{
while(onoff_k){;}
if(!power_flag)
{
POWERB=0x80;
i2c_write(BOTTOM);
delay_ctrl();
power_init();
power_on_led();
power_flag=1;
}
else
{
POWERB=0x00;
i2c_write(BOTTOM);
delay_ctrl();
power_init();
power_off_led();
power_flag=0;
}
}
}
//**********************************************************************************************//
//**************************************************轻松程序************************************//
easy_auto(void)
{
if(easy_k)
{
easy_on_led();
while(easy_k){;}
easy_off_led();
}
}
//***********************************************************************************************//
//**************************************************睡眠程序*************************************//
sleep_auto(void)
{
if(sleep_k)
{
sleep_on_led();
while(sleep_k){;}
sleep_off_led();
}
}
//************************************************************************************************//
//*************************************************理疗程序***************************************//
cure_auto(void)
{
if(cure_k)
{
cure_on_led();
while(cure_k){;}
cure_off_led();
}
}
//*************************************************************************************************//
//**********************************************主程序********************************************//
main(void)
{
unsigned char i;
//IO口初始化
PORTA=0;
PORTB=0;
PORTC=0;
ADCON1=0x06;
TRISA=0;
TRISB=0x0f; //RB0~3 are input,RB4~7 are output
TRISC=0;
PORTA=0;
PORTC=0xff;
//I2C 初始化
SDA_HIGH();
SCL_HIGH();
// SSPCON=0b00111011; //master mode
// SSPCON=0b00111110; //multi master mode
SSPCON=0b00110110; //7bit slave mode
SSPSTAT=0;
SSPADD=HAND; //作从器件时的地址值
//TMR1初始化
T1CON=0b00000001; //启动T1,10毫秒定时
TMR1L=-2500%256;
TMR1H=-2500/256;
TMR1IE=1; //开T1中断
SSPIE=1;
PEIE=1; //开外围中断
GIE=1; //开总中断
key_flag=0;
led_i=0;
//主循环
width_stat=ZHONG;
area_stat=0x01;
i2c_count=0;
key_count=0;
speed_count=0;
i2cerror=0;
ACK0=0;
SDABIT=0;
i2c_idle_flag=0;
key_flag=0;
knead_flag=0;
knock_flag=0;
power_flag=0;
track_flag=0;
massage_flag=0;
for(i=0;i<6;i++)
{led_ram[i]=0;}
while(1)
{
delay_ctrl();
asm("clrwdt");
power_on();
fall_hand();
if(power_flag)
{
// GDXCB=GDXCB&0x80;
// if(GDXCB==0x80)
// {
// i2c_write(BOTTOM); //行程光电1到位,立刻转发到BOTTOM
// GDXCB=0x00;
// }
width_hand();
area_hand();
go_up_hand();
go_down_hand();
speed_inc();
speed_dec();
massage_hand();
knock_hand();
anti_knead_hand();
knead_hand();
easy_auto();
sleep_auto();
cure_auto();
}
}
}
//**************************************END********************************************************//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -