📄 main.c
字号:
dis_t=dis_en_row(5,64,"Y");
dis_t+=dis_en(5,dis_t,'0'+i+1);
dis_t=dis_en_row(5,dis_t,":_");
dy[i+1]=get_num(5,dis_t);
}
start_wait();
//,
dx[0]=dy[0]=0;
for(cnt=0;cnt<n;cnt++)
{
//依次调用画线函数,参数是dx[i],dy[i],相当于lineto();
//x=dx[cnt];
//y=dy[cnt];
draw_line(dx[cnt+1],dy[cnt+1]);
}
stop_wait();
}
void m_dingbiao(void) //定位校正坐标
{
uint xx,yy,f=1;
uint c;
xx=x;yy=y;
clrscr(0);
dis_side();
draw_point(x,y);
dis_hz(0,64,hz_ding);
dis_hz(0,64+16,hz_biao);
stop_wait();
while(f)
{
c=get_key();
if(c==KEY_OK)
f=0;
if(c==KEY_UP)
//调用向上移动的函数
{dis_en(3,64+16,'^');draw_line_base(x,y+1);}
if(c==KEY_DOWN)
//调用向下移动的函数
{dis_en(6,64+16,'~');draw_line_base(x,y-1);}
if(c==KEY_LEFT)
//调用向左移动的函数
{dis_hz(4,64,hz_jiantou_xx);draw_line_base(x-1,y);}
if(c==KEY_RIGHT)
//调用向右移动的函数
{dis_hz(6,64+16+7,hz_jiantou);draw_line_base(x+1,y);}
clrscr(2);
}
x=xx;y=yy;
}
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF0; //setup
TCNT1L = 0xBE;
OCR1AH = 0x0F;
OCR1AL = 0x42;
OCR1BH = 0x0F;
OCR1BL = 0x42;
ICR1H = 0x0F;
ICR1L = 0x42;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xF0; //reload counter high value
TCNT1L = 0xBE; //reload counter low value
t_cnt++;
}
/*************************/////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0xF0;
DDRB = 0x0F;
PORTC = 0x03; //m103 output only
DDRC = 0xff;
PORTD = 0xff;
DDRD = 0xff;
}
//Watchdog initialize
// prescale: 256K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0d; //WATCHDOG ENABLED - dont forget to issue WDRs
}
/* UART初始化 */
void uart_init(void)
{
UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
//uart_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/* 字符输入函数 */
uchar getchar(void)
{uchar i=0;
while(i!=0xaa)
{
while(!(UCSRA& (1<<RXC)));
i=UDR;
}
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/* 微秒级延时程序 */
void del(unit time)
{
do
{
time--;
}
while (time>1);
}
/* 毫秒级延时程序 */
void delay_1ms(void)
{ unsigned int i1;
for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
;
}
void delay(unsigned int n)
{
unsigned int i2=0;
while(i2<n)
{delay_1ms();
i2++; WDR();
}
}
void write_step(void)
{
unit n;
if(nx>=ny)
n=nx;
else
n=ny;
while(n)
{
if(nx>0)
{
PORTA&=~0xf0;
PORTA|=xdat[xi];
E1;
nx--;
}
if(ny>0)
{
PORTA&=~0x0f;
PORTA|=ydat[yi];
E1;
ny--;
}
if(phase1==1)
{
xi++;
if(xi==4)
xi=0;
}
else
{
xi--;
if(xi==255) xi=3;
}
if(phase2==1)
{
yi++;
if(yi==4) yi=0;
}
else
{
yi--;
if(yi==255) yi=3;
}
delay(30);
n--;
}
}
void draw_line_base(float x0,float y0)///x00 y00为0,0坐标原点
{
float abs1,abs2;
ss01=sqrt((L-y)*(L-y)+(x+P)*(x+P)-49);
ss02=sqrt((L-y)*(L-y)+(800+P-x)*(800+P-x)-49);
ss1=sqrt((L-y0)*(L-y0)+(x0+P)*(x0+P)-49);
ss2=sqrt((L-y0)*(L-y0)+(800+P-x0)*(800+P-x0)-49);
if(ss01>ss1) {abs1=(ss01-ss1); phase1=0;}
else {abs1=ss1-ss01;phase1=1;}
if(ss02>ss2) {abs2=(ss02-ss2); phase2=0;}
else {abs2=ss2-ss02;phase2=1;}
nx=(uint)(abs1/one_size);
ny=(uint)(abs2/one_size);///操作电动机
write_step();
x=x0;y=y0;
}
void draw_line(float linex0,float liney0)
{float k;
uint i;
//length=sqrt((y00-y0)*(y00-y0)-(x00-x0)*(x00-x0));
k=(1.0*(liney0-y))/(1.0*(linex0-x));
//while(length/i>1)i++;
//for(j=0;j<i;j++)
if(linex0>x)
{
while(x+10<linex0)
{
draw_line_base(x+10,k*10+y);
}
draw_line_base(linex0,liney0);
}
else
{
while(x-10>linex0)
{
draw_line_base(x-10,y-k*10);
}
draw_line_base(linex0,liney0);
}
}
///在圆心处,向右移动25cm 逆时针画圆
void draw_cricle(float r)///x0,y0圆心坐标
{
double a,b,i,x0,y0,t=0.0,tl;
uint j;
a=x;
b=y;
draw_line(a+r, b);
//draw_line_base(a+r, b);//向右移动25cm
tl=2*3.1415926/6;
for(j=0;j<6;j++)//100
{
t+=tl;
x0=a+r*cos(t);
y0=b+r*sin(t);
draw_line((x0),y0);
//draw_line_base((x0),y0);
/////*****call dsp
}
}
//以500,400为坐标原点画五角星
void draw_star(void)
{
int i;
float xx[5],yy[5],tl,t=0.0;
tl=2*3.1415926/5;
for(i=0;i<5;i++)
{
t+=tl;
xx[i]=400+200.0*cos(t);
yy[i]=500+200.0*sin(t);
}
draw_line(600,500);
draw_line(xx[1],yy[1]);
draw_line(xx[3],yy[3]);
draw_line(xx[0],yy[0]);
draw_line(xx[2],yy[2]);
draw_line(xx[4],yy[4]);
}
uchar flag(void)
{
uchar n,i;
n=0;
for(i=0;i<6;i++)
{
if(getchar()>30) n++;
delay(1);
if(n>3) break;
}
if(n>3) return(1);
else return(0);
}
uchar find_updown(uchar k)//0 shang 1 xia
{
uchar _p=8,m_i;
for(m_i=0;m_i<5;m_i++)
{
if(k==0) draw_line_base(x,y+3);
else draw_line_base(x,y-3);
a=flag();
if(a) break;
}
if(a==1) return 1; //找到黑?
else //mei zhao dao 改为向下找
{
if(k==0) draw_line_base(x,y-15);
else draw_line_base(x,y+15);
for(m_i=0;m_i<5;m_i++)
{
if(k==0) draw_line_base(x,y-3);
else draw_line_base(x,y+3);
a=flag();
if(a) break;
}
if(a==1) return 2; //找到黑线
else
{
if(k==0) draw_line_base(x,y+15);
else draw_line_base(x,y-15);
return 3;
}
}
}
uchar find_leftright(uchar k)//0 shang 1 xia
{
uchar _p=8,m_i;
for(m_i=0;m_i<5;m_i++)
{
if(k==0) draw_line_base(x+3,y);
else draw_line_base(x-3,y);
a=flag();
if(a) break;
}
if(a==1) return 1; //找到黑?
else //mei zhao dao 改为向下找
{
if(k==0) draw_line_base(x-15,y);
else draw_line_base(x+15,y);
for(m_i=0;m_i<5;m_i++)
{
if(k==0) draw_line_base(x-3,y);
else draw_line_base(x+3,y);
a=flag();
if(a) break;
}
if(a==1) return 2; //找到黑线
else
{
if(k==0) draw_line_base(x+15,y);
else draw_line_base(x-15,y);
// draw_line_base(x+20,y);
return 3;
}
}
}
void stack(float tt)
{uchar i;
for(i=0;i<3;i++)
seq[i]=seq[i+1];
seq[3]=tt;
}
void rightout(void)
{
a=getchar();
while(a)
{
a=flag();
draw_line_base(x+3,y);
// WDR();
}
}
void leftout(void)
{
a=getchar();
while(a=flag())
{
a=flag();
draw_line_base(x-3,y);
WDR();
}//xiang you dao xian wa
}
void upout(void)
{
a=getchar();
while(a=flag())
{
a=flag();
draw_line_base(x,y+3);
WDR();
}//xiang
}
void downout (void)
{
a=getchar();
while(a=flag())
{
a=flag();
draw_line_base(x,y-3);
WDR();
}//xiang
}
/*************************/////
/*************************/////
/*******开始主程序********/
int main(void)
{
uint c;
uint menu_index=0; //menu_index 是从0到MENU_MAX-1的数值
void (*fun)(void);
delay_ms(1000);
//init_devices();
//{
// nx=1;
// ny=1;
// write_step();
//}
//timer1_init();
init_dis();
clrscr(0);
dis_welcome(); //显示欢迎屏幕
while(1) //消息循环
{
dis_menu(menu_index,MENU_MAX); //显示菜单,当前条目前加箭头
c=get_key();
if(c==KEY_UP) //有向上的键按下
{
if(menu_index==0)
{
menu_index=MENU_MAX-1;
}
else
{
menu_index--;
}
//dis_menu(menu_index,MENU_MAX);
}
if(c==KEY_DOWN) //有向下的键按下
{
if(menu_index==MENU_MAX-1)
{
menu_index=0;
}
else
{
menu_index++;
}
//dis_menu(menu_index,MENU_MAX);
}
if(c==KEY_OK)
{
//menu_funs[menu_index]();
/*switch (menu_index)
{
case 0:fun=m_dingdian;break;
case 1:fun=m_huaxian;break;
case 2:fun=m_huayuan;break;
case 3:fun=m_zhaoxian;break;
case 4:fun=m_huatu;break;
case 5:fun=m_dingbiao;break;
}
fun();
*/
if(menu_index==0)
{
m_dingdian();
}
if(menu_index==1)
{
m_huaxian();
}
if(menu_index==2)
{
m_huayuan();
}
if(menu_index==3)
{
m_zhaoxian();
}
if(menu_index==4)
{
m_huatu();
}
if(menu_index==5)
{
m_dingbiao();
}
dis_en_row(4,0,"do_fun over");
}
WDR();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -