悬挂画圆.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);
}
}
}
- 悬挂画圆.C
- C/C++ 野指针、指针悬挂
- c陷阱与缺陷总结-”悬挂“else
- C#.WinForm下悬挂窗口的简易实现
- C++_指针悬挂和赋值操作符的重载
- C++_指针悬挂和赋值操作符的重载
- C++_指针悬挂和赋值操作符的重载
- c++(vc)实现类似qq窗口悬挂功能
- 指针悬挂
- 指针悬挂
- 悬挂else
- 悬挂指针
- 悬挂“else”
- 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏
- 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案
- C语言探索之旅 | 第二部分第九课: 实战"悬挂小人"游戏
- C语言探索之旅 | 第二部分第十课: 实战"悬挂小人"游戏 答案
- 指针悬挂(转)
- IBM DB2日常应用汇总
- my last will
- 在虚拟机下安装DOS 6.22
- 开发工具整理
- ajax+php
- 悬挂画圆.C
- 登录时的"记住我"
- Google in China (李开复演讲 Kai fu Lee speech in CMU) Notes
- 说梦
- 148编码键盘.C
- gridview 排序
- col用法总结
- VC6.0下directshow环境配置
- WCF Service Configuration Editor