使用PCA9685的0和1通道,用四个独立按键控制两个舵机正反转。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
sbit s1=P3^0;
sbit s2=P3^1;
bit flag0_right=0,flag0_left=0,flag1_right=0,flag1_left=0;
void delay() { ;; }
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void i2c_init()
{
sda=1;
delay();
scl=1;
delay();
}
void i2c_start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void i2c_stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()
{
uchar i=0;
scl=1;
delay();
while((sda==1)&&(i<255))
{
i++;
}
scl=0;
delay();
}
void write_byte(uchar date)
{
uchar temp,i=0;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
void writeadd(uchar address,uchar date)
{
i2c_start();
write_byte(0x80);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
i2c_stop();
}
void pca_start()
{
writeadd(0x00,0x10);//SMOD1休眠
delay1ms(20);
writeadd(0xfe,0x84);//PRE_SCLAE
delay1ms(20);
writeadd(0x00,0);
delay1ms(20);
writeadd(0x07,0);//LED0_ON为0
delay1ms(20);
writeadd(0x06,0);
delay1ms(20);
writeadd(0x0b,0);//LED1_ON为0
delay1ms(20);
writeadd(0x0a,0);
delay1ms(20);
}
void main()
{
i2c_init();
pca_start();
while(1)
{
P3 = 0xff;//判断独立按键
if(P3 != 0xff)
{
delay1ms(5);//软件消抖
if( P3 != 0xff)
{
switch(P3)
{
case 0xfe: flag0_right=1; break;
case 0xfd: flag0_left=1; break;
case 0xfb: flag1_right=1; break;
case 0xf7: flag1_left=1; break;
}
while(P3 != 0xff);//松手检测
}
}
if(flag0_right==1)
{
flag0_right=0;
writeadd(0x09,0x00);
delay1ms(20);
writeadd(0x08,0x66);
delay1ms(20);
}
if(flag0_left==1)
{
flag0_left=0;
writeadd(0x09,0x01);
delay1ms(20);
writeadd(0x08,0x9a);
delay1ms(20);
}
if(flag1_right==1)
{
flag1_right=0;
writeadd(0x0d,0x00);
delay1ms(20);
writeadd(0x0c,0x66);
delay1ms(20);
}
if(flag1_left==1)
{
flag1_left=0;
writeadd(0x0d,0x01);
delay1ms(20);
writeadd(0x0c,0x9a);
delay1ms(20);
}
}
}