悬挂画圆.C

来源:互联网 发布:淘宝客超级权益推广 编辑:程序博客网 时间:2024/04/29 00:09

 #include "iom16v.h"
#include "math.h"
#include "macros.h"
#include "delayms.h"
#include "液晶显示模块.C"
#include "148编码键盘.C"
#define Lx 55 //x轴总长度(cm)
#define Ly 60 //y轴总长度(cm)
#define Ax1 (Ax+10)
#define Ay1 (Ly-Ay)
#define Bx1 (Bx+10)
#define By1 (Ly-By)
#define Ax2 (Lx-Ax+10)
#define Ay2 (Ly-Ay)
#define Bx2 (Lx-Bx+10)
#define By2 (Ly-By)
// Ax,Ay,Bx,By;//O坐标系的两点,A为初点,B为末点
// Ax1,Ay1,Bx1,By1;//O1坐标系的两点,A为初点,B为末点
// Ax2,Ay2,Bx2,By2;//O2坐标系的两点,A为初点,B为末点
//float dL1,dL2;
//dL1=sqrt(Bx1*Bx1+By1*By1)-sqrt(Ax1*Ax1+Ay1*Ay1);//O1坐标系差值>0伸长,<0缩短
//dL2=sqrt(Bx2*Bx2+By2*By2)-sqrt(Ax2*Ax2+Ay2*Ay2);//O2坐标系差值>0伸长,<0缩短
//-------------------------------变量定义------------------------------------------
const uchar tab[]={0x1F,0x2F,0x4F,0x8F};//四拍时序
char x_num=0,y_num=0;//----------数组元素计数
uchar num_x=0,num_y=0;//---------计数变量(周期)
uchar test=0;//------------------位检测变量
uchar cycle_y,cycle_x;//---------电机时序的周期
uint  N_x=0,N_y=0;//-------------电机所走拍数
//-------------------------------端口初始化----------------------------------------
void port_init(void)
{
    PORTA = 0x0F;
    DDRA  = 0xF0;
    PORTB = 0x0F;
    DDRB  = 0xFF;
    PORTC = 0x00;
    DDRC  = 0xFF;
  PORTD = 0x0F;
    DDRD  = 0xF0;
    w_com(0x38);
    w_com(0x0c);
    w_com(0x01);
  w_com(0x06);
}
//-------------------------------定时器T0初始化-----------------------------------
void timer0_init(void)
{
 TCCR0  = 0x00;//----------------停止定时器
 TCNT0  = 0x83;//----------------初始值--定时1ms
 TIMSK |= 0x01;//----------------中断允许
 TCCR0  = 0x03;//----------------启动定时器
}
//-------------------------------T0溢出中断服务程序-------------------------------
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
    TCNT0=0x83;//----------------初始值--定时1ms
    num_x++;
    num_y++;
    if(num_x>=cycle_x) num_x=0;
    if(num_y>=cycle_y) num_y=0;
}
void x_z_run()//-------------------X-正转---------------------------------
{
 if(num_x==1)  
        {
    PORTB=tab[x_num];
            test|=BIT(0);
   }  
 if(num_x==21) 
   {
    PORTB=0x0F;
          if(test&BIT(0))
    {
     x_num++;
     test&=~BIT(0);
     N_x++;
    }
    if((x_num<0)||(x_num>3))
     x_num=0;
       }       
}
void x_f_run()//---------------X-反转-------------------
{
 if(num_x==1)  
        {
    PORTB=tab[x_num];
            test|=BIT(1);
   }  
 if(num_x==21) 
   {
    PORTB=0x0F;
          if(test&BIT(1))
    { 
     x_num--;
     test&=~BIT(1);
     N_x++;
    }
    if((x_num<0)||(x_num>3))
     x_num=3;
       }       
}
void y_z_run()//-----------------Y-正转----------------
{
 if(num_y==1)  
        {
    PORTD=tab[y_num];
            test|=BIT(2);
   }  
 if(num_y==21) 
   {
    PORTD=0x0F;
          if(test&BIT(2))
    {
     y_num++;
     test&=~BIT(2);
     N_y++;
    }
    if((y_num<0)||(y_num>3))
     y_num=0;
       }       
}
void y_f_run()//------------------Y-反转----------------
{
 if(num_y==1)  
        {
    PORTD=tab[y_num];
            test|=BIT(3);
   }  
 if(num_y==21) 
   {
    PORTD=0x0F;
          if(test&BIT(3))
    {
     y_num--;
     test&=~BIT(3);
     N_y++;
    }
    if((y_num<0)||(y_num>3))
     y_num=3;
       }       
}
void init_devices(void)
{
 CLI(); //-----------禁止所有中断
 port_init();
 timer0_init();
 int_init();
 SEI();//-----------开全局中断
}
/***********************点到点*******************/
void D_D(uchar x_1,uchar y_1,uchar x_2,uchar y_2)
{
    float DL1,DL2;
  uchar Ax,Bx,Ay,By;
  uint N_1=0,N_2=0;
  Ax=x_1;
    Ay=y_1;//起始点
    Bx=x_2;
    By=y_2;//终点
    DL1=sqrt(Bx1*Bx1+By1*By1)-sqrt(Ax1*Ax1+Ay1*Ay1);//O1坐标系差值>0伸长,<0缩短(cm)
    DL2=sqrt(Bx2*Bx2+By2*By2)-sqrt(Ax2*Ax2+Ay2*Ay2);//O2坐标系差值>0伸长,<0缩短(cm)
    if(DL1<0)
    {
     test&=~BIT(4);//DL1为负=0
     DL1=-DL1;
    }
    else
    {
     test|=BIT(4);//DL1为正=1
    }
    if(DL2<0)
    {
     test&=~BIT(5);//DL2为负=0
     DL2=-DL2;
    }
    else
    {
     test|=BIT(5);//DL2为正=1
    }
    N_1=DL1/0.0255;//计算脉冲个数,0.0245*10000
    N_2=DL2/0.0255;//计算脉冲个数,0.0245*10000
    if(test&BIT(4))//-------------------DL1为正-M1-伸长-顺时针
    {        
     for(N_x=0;N_x<N_1;)
       {
       x_z_run();
       }
    }
    else//-------------------------M1-缩短
    {
     for(N_x=0;N_x<N_1;)
       {
       x_f_run();
       }
    }
    if(test&BIT(5))//------------------DL2为正-M2-伸长-逆时针
    {
     for(N_y=0;N_y<N_2;)
       {
       y_f_run();
       }
    }
    else//-----------------------M2-缩短
    {
     for(N_y=0;N_y<N_2;)
       {
       y_z_run();
       }
    }
}
/***********************画圆************************/
void yuan(uchar r,uchar a,uchar b)
{
  float Ax,Bx,Ay,By,i,dL1,dL2;
  uchar N_1=0,N_2=0;
    Ax=a;
    Ay=b-r;//起始点
    for(i=-1.553343;i<=4.7123889;i=i+(PI/180))
        {
            Bx=a+r*cos(i);
            By=b+r*sin(i);//---------------下一个相邻的点
    dL1=sqrt(Bx1*Bx1+By1*By1)-sqrt(Ax1*Ax1+Ay1*Ay1);//O1坐标系差值>0伸长,<0缩短(cm)
    dL2=sqrt(Bx2*Bx2+By2*By2)-sqrt(Ax2*Ax2+Ay2*Ay2);//O2坐标系差值>0伸长,<0缩短(cm)
    if(dL1<0)
    {
     test&=~BIT(4);//dL1为负=0
     dL1=-dL1;
    }
    else
    {
     test|=BIT(4);//dL1为正=1
    }
    if(dL2<0)
    {
     test&=~BIT(5);//dL2为负=0
     dL2=-dL2;
    }
    else
    {
     test|=BIT(5);//dL2为正=1
    }
    dL1=dL1*10000;//dL1扩大10000倍
    dL2=dL2*10000;//dL2扩大10000倍
    N_1=dL1/245;//计算脉冲个数,0.0245*10000
    N_2=dL2/245;//计算脉冲个数,0.0245*10000
    if(test&BIT(4))//-------------------dL1为正-M1-伸长-顺时针
    {        
     for(N_x=0;N_x<N_1;)
       {
       x_z_run();
       }
    }
    else//-------------------------M1-缩短
    {
     for(N_x=0;N_x<N_1;)
       {
       x_f_run();
       }
    }
    if(test&BIT(5))//------------------dL2为正-M2-伸长-逆时针
    {
     for(N_y=0;N_y<N_2;)
       {
       y_f_run();
       }
    }
    else//-----------------------M2-缩短
    {
     for(N_y=0;N_y<N_2;)
       {
       y_z_run();
       }
    }
    Ax=Bx;
            Ay=By;//-----------------------起始点转换         
        }
    PORTB = 0x0F;
    PORTD = 0x0F;                 
}
void main()
{
  init_devices();
  cycle_y=22;
  cycle_x=22;
  display1();
  while(1)
  {
      if((o_k&BIT(0))&&(o_k&BIT(1))&&(o_k&BIT(7))&&(o_k&BIT(6)))
      {
       o_k&=~BIT(0);
     o_k&=~BIT(1);
       D_D(x1,y1,x2,y2);
      //}
      //if((o_k&BIT(7))&&(o_k&BIT(6)))
      //{
       o_k&=~BIT(7);
     o_k&=~BIT(6);
       yuan(R,A,B);
      }
  }
}

原创粉丝点击