📄 h.c
字号:
SSPIF=0;
SCL_LOW();
if(ACK0)
{
i2cerror=1;
i=8;
}
}
}
else
{i2cerror=1;}
SCL_HIGH(); //stop i2c
SDA_HIGH();
delay();
delay();
SSPIF=0;
}
//****************************************************************************************************//
//************************************i2c read code**************************************************//
i2c_read(unsigned char addr)
{
unsigned char a,b,c,i,j;
c=addr;
b=addr;
b=b&0xfe;
a=b|0x01; //read,A0=1
SDA_HIGH();
SCL_HIGH();
SDA_LOW(); //start i2c
SSPIF=0;
for(i=0;i<8;i++)
{
SCL_LOW();
b=a&0x80;
if(b==0x80)
{SDA_HIGH();}
else
{SDA_LOW();}
SCL_HIGH();
a=a<<1;
}
SCL_LOW();
delay();
SDA_HIGH();
ACK0=SDA;
SCL_HIGH(); //9 rise edge
SSPIF=0;
if(!ACK0)
{
for(i=0;i<8;i++)
{
SCL_LOW();
delay();
a=0;
for(j=0;j<8;j++)
{
SCL_LOW();
a=a<<1;
a=a&0xfe;
SDA_HIGH();
SCL_HIGH();
SDABIT=SDA;
if(SDABIT)
{a=a|0x01;}
else
{a=a|0x00;}
}
if(c==BOTTOM)
{receiv0[i]=a;}
if(c==BACK)
{receiv1[i]=a;}
SCL_LOW();
SDA_LOW(); //generate ACK signal
delay();
SCL_HIGH(); //ninth rise
SSPIF=0;
}
}
else
{i2cerror=1;}
SCL_HIGH();
SDA_HIGH();
SSPIF=0;
}
//***********************************************************************************************//
//*************************************10ms定时中断程序******************************************//
//******************************处理I2C通信、按键扫描和LED扫描***********************************//
void interrupt isr(void) // Here be interrupt function - the name is
{
unsigned char a,i;
GIE=0;
if(TMR1IF)
{
TMR1IF=0;
TMR1L=-2500%256;
TMR1H=-2500/256;
i2c_count++;
key_count++;
if(key_count==20) //按键扫描步长,50ms
{
massage_count++;
knock_count++;
knead_count++;
anti_knead_count++;
key_count=0;
scan_key();
}
scan_led();
speed_count++; //调速步长计数器
}
else
{
/*i2c interrupt*/
if(SSPIF)
{
a=SSPBUF;
if(!STAT_RW) //write state
{
SSPIF=0;
while(!SSPIF)
{;}
if(SSPIF)
{
a=SSPBUF;
SSPIF=0;
}
for(i=0;i<7;i++)
{
while(!SSPIF)
{;}
if(SSPIF)
{
if(a==BOTTOM)
{receiv0[i]=SSPBUF;}
if(a==BACK)
{receiv1[i]=SSPBUF;}
a=SSPBUF;
SSPIF=0;
}
}
}
else //read stae
{
for(i=0;i<8;i++)
{
if(SSPIF)
{
CKP=0;
SSPBUF=send1[i];
CKP=1;
SSPIF=0;
while(!SSPIF)
{;}
}
}
}
SSPIF=0;
}
}
GIE=1; //开总中断
}
//*********************************************************************************************//
//**********************************系统程序部分结束*******************************************//
//**********************************功能应用程序部分********************************************//
//**********************************手动控制****************************************//
//********************************************宽度控制*******************************************//
//依宽中窄的顺序,每按1次键,依次循环选择揉捏头宽度,作用对象是揉捏电机,在慢速进行调整,消除惯性
//输入信号是宽中窄光耦信号
//RNDJ
//D7 D6 D5 D4 D3 D2 D1 D0
//启/停 正/反 宽 中 窄 设定标志
unsigned char width_stat;
width_hand(void)
{
unsigned char a,b;
if(width_k)
{
while(width_k){;}
switch(width_stat)
{
case ZHONG:
{
ZDDJB=0x0f;XQFB=0x0f;
i2c_write(BOTTOM);
RNDJB=ZHONG;
width_stat=ZHAI;
width_mid_on_led();
width_max_off_led();
width_min_off_led();
}break;
case ZHAI:
{
ZDDJB=0xf0;XQFB=0xf0;
i2c_write(BOTTOM);
RNDJB=ZHAI;
width_stat=KUAN;
width_min_on_led();
width_mid_off_led();
width_max_off_led();
}break;
case KUAN:
{
RNDJB=KUAN;
width_stat=ZHONG;
width_max_on_led();
width_mid_off_led();
width_min_off_led();
}break;
default: break;
}
i2c_write(BACK);
delay_ctrl();
RNDJB=0x00;
}
}
//********************************************区间控制*******************************************//
//依上、中、下、上中、中下、全身的顺序,每按1次键,依次循环选择运行区间,推拿程序只在此区间运行
//作用对象是行走电机
//螺纹距2mm,有效行程470mm(235圈),上部(肩)120mm(60圈),中部(背)150mm(75圈),
//下部(腰)200mm(100圈)
//GDJSL:下行程处,为0,GDJSL=0,GDJSH=100,为下部;GDJSL=100,GDJSH=175,为中部;GDJSL=175,GDJSH=235,为上部
//XZDJ
// D7 D6 D5 D4 D3 D2 D1 D0
//启/停 下/上 手动标志
//area_stat
// D7 D6 D5 D4 D3 D2 D1 D0
//启/停 下/上 上 中 下 上中 中下 全身
unsigned char area_stat;
#define area_up_on_led() led_ram[2]=led_ram[2]|0b00000010 //区间,上开
#define area_up_off_led() led_ram[2]=led_ram[2]&0b11111101 //区间,上关
#define area_mid_on_led() led_ram[2]=led_ram[2]|0b00000100 //区间,中开
#define area_mid_off_led() led_ram[2]=led_ram[2]&0b11111011 //区间,中关
#define area_down_on_led() led_ram[3]=led_ram[3]|0b00000001 //区间,下开
#define area_down_off_led() led_ram[3]=led_ram[3]&0b11111110 //区间,下关
#define GDJSH send0[10] //高度计数高端值
#define GDJSL send0[11] //高度计数低端值
#define GDXCB send0[12] //光电行程检测
area_hand(void)
{
unsigned char a,b;
if(area_k)
{
while(area_k){;}
a=area_stat;
a=a&0b00111111;
switch(a)
{
case 0x01: //为全身,改为上,175~235
{
b=0x20;
GDJSL=175;
GDJSH=235;
area_up_on_led();
area_mid_off_led();
area_down_off_led();
}break;
case 0x20: //为上,改为中,100~175
{
b=0x10;
GDJSL=100;
GDJSH=175;
area_mid_on_led();
area_up_off_led();
area_down_off_led();
}break;
case 0x10: //为中,改为下,0~100
{
b=0x08;
GDJSL=0;
GDJSH=100;
area_down_on_led();
area_mid_off_led();
area_up_off_led();
}break;
case 0x08: //为下,改为下中,100~235
{
b=0x04;
GDJSL=0;
GDJSH=175;
area_up_on_led();
area_mid_on_led();
area_down_off_led();
}break;
case 0x04: //为下中,改为中上,0~175
{
b=0x02;
GDJSL=100;
GDJSH=235;
area_up_off_led();
area_mid_on_led();
area_down_on_led();
}break;
case 0x02: //为中下,改为全身,0~235
{
b=0x01;
GDJSL=0;
GDJSH=235;
area_up_on_led();
area_mid_on_led();
area_down_on_led();
}break;
default: break;
}
a=area_stat;
a=a&0b11000000;
a=a|b;
area_stat=a;
i2c_write(BOTTOM);
delay_ctrl();
}
}
//********************************************上行控制******************************************//
//按住键,机心上行,如遇限位,自动停止;松开按键,机心停止。
go_up_hand(void)
{
if(go_up_k)
{
asm("clrwdt");
go_up_on_led(); //led bright
XZDJB=0xa1; //手动标志为1,不受区间控制
XZDJSDB=0x01; //启动时,速度最大
GDXCB=0x01;
ZDDJB=0b11110000;XQFB=0x0f;
i2c_write(BOTTOM);
while(go_up_k)
{asm("clrwdt");}
GDXCB=0x01;
XZDJB=0x00;
i2c_write(BOTTOM);
delay_ctrl();
go_up_off_led();
}
}
//**************************************************************************************//
//********************************************下行控制******************************************//
//按住键,机心下行,如遇限位,自动停止;松开按键,机心停止。
go_down_hand(void)
{
if(go_down_k)
{
ZDDJB=0x0f; XQFB=0xf0;
asm("clrwdt");
go_down_on_led(); //led bright
XZDJB=0xc1; //手动标志为1,不受区间控制
XZDJSDB=0x01; //启动时,速度最大
GDXCB=0x01;
i2c_write(BOTTOM);
while(go_down_k)
{asm("clrwdt");}
XZDJB=0x00;
GDXCB=0x01;
i2c_write(BOTTOM);
delay_ctrl();
go_down_off_led();
}
}
//**************************************************************************************//
//***********************************速度调节*******************************************//
//按住键,步长为2秒进行调节,若有电机关联,则只修改该电机参数,否则修改所有已开电机参数
bit knead_speed_flag,knock_speed_flag,massage_speed_flag;
speed_inc(void)
{
unsigned char a;
if(speed_inc_k)
{
speed_count=0; //步长
speed_inc_on_led();
while(speed_inc_k)
{
XTJRDJB=0x80;i2c_write(BOTTOM);
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==0){RNDJSDB=1;}
if(CJDJSDB==0){CJDJSDB=1;}
if(XZDJSDB==0){XZDJSDB=1;}
i2c_write(BACK);
i2c_write(BOTTOM);
delay_ctrl();
}
}
}
XTJRDJB=0;i2c_write(BOTTOM);
}
speed_dec(void)
{
unsigned char a;
if(speed_dec_k)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -