📄 usart3_step_lcd.c
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include<avr/pgmspace.h>
#include<avr/eeprom.h>
#define SYNC 0x40
#define PARITY_EVEN 0x30
#define PARITY_ODD 0x30
#define SPOP_2 0x04
#define DATA_5 0x00
#define DATA_6 0x02
#define DATA_7 0x04
#define DATA_8 0x06
#define DATA_9 0x0c
#define SYSTEM_CLOCK 14745600L
#define BAUD_RATE 115200L//长整型
#define UART_RX_BUFFER_SIZE 128
#define UART_RX_BUFFER_MASK (UART_RX_BUFFER_SIZE-1)
#if(URAT_RX_BUFFER_SIZE&UART_RX_BUFFER_MASK)
#error RX buffer size is not a power of 2
#endif
#define UART_TX_BUFFER_SIZE 128
#define UART_TX_BUFFER_MASK (UART_TX_BUFFER_SIZE-1)
#if(URAT_TX_BUFFER_SIZE&URAT_TX_BUFFER_MASK)
#error TX buffer size is not a power of 2
#endif
#define TLCD_CTRL (unsigned char *)0x7000;
#define TLCD_DATA (unsigned char *)0x7001;
unsigned char *lcd_data,*lcd_control;
volatile static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
volatile static unsigned char UART_RxHead;
volatile static unsigned char UART_RxTail;
volatile static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
volatile static unsigned char UART_TxHead;
volatile static unsigned char UART_TxTail;
const unsigned char one_phase1[]={0x01,0x04,0x08,0x02};
const unsigned char one_phase2[]={0x02,0x08,0x04,0x01};
volatile unsigned char phase_pnt1=0,dir=1,speed=0,phase_pnt2=0;
void delay(unsigned int d1,unsigned int d2);
void go_step_1phase(unsigned int time);
void go_step_2phase(unsigned int time);
unsigned char array[10];
unsigned char array_time[6];
void lcd_con(void);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
volatile unsigned char hour1='0',hour2='0',minute1='0',minute2='0',second1='0',second2='0';
unsigned char __attribute__((__progmem__)) prompt[]="USART_STEP_MOTOR :";
unsigned char __attribute__((__progmem__)) logo[]=
"\r\nUSART Control Step_motor\r\n\r\n<H> Help Messages\r\n";
unsigned char __attribute__((__progmem__)) M_Help[]=
"\r\nF:FORWARD B:BACKWARD S:GIVE_SPEED T:TIME Q:quit\r\n";
unsigned char __attribute__((__progmem__)) M_thank[]=
"\r\nThank you!\r\n ";
unsigned char __attribute__((__progmem__)) M_SELECT[]=
"\r\nUPSPEED(1) OR DOWNSPEED(2)\r\n";
unsigned char __attribute__((__progmem__)) M_SELECT1[]=
"\r\nFORWARD(1) OR BACKWARD(2)\r\n";
unsigned char __attribute__((__progmem__)) M_Forward_JIASU[]=
"\r\nForward_Upspeed:ENTER 1 OR 2 OR 3\r\n ";
unsigned char __attribute__((__progmem__)) M_Forward_JIANSU[]=
"\r\nForward_Downspeed:ENTER 1 OR 2 OR 3\r\n";
unsigned char __attribute__((__progmem__)) M_Backward_JIASU[]=
"\r\nBackward_Upspeed:ENTER 1 OR 2 OR 3\r\n";
unsigned char __attribute__((__progmem__)) M_Backward_JIANSU[]=
"\r\nBackward_Downspeed:ENTER 1 OR 2 OR 3\r\n";
unsigned char __attribute__((__progmem__)) SPEED[]=
"\r\nInput your speed:";
unsigned char __attribute__((__progmem__)) HOUR[]=
"\r\nInput Hour:";
unsigned char __attribute__((__progmem__)) MINUTE[]=
"\r\nInput Minute:";
unsigned char __attribute__((__progmem__)) SECOND[]=
"\r\nInput Second:";
void Initilize(void);
void serial_Initialize(unsigned long int baud);
unsigned char ReceiveByte(void);
void TransmitByte(unsigned char data);
void print_logo(void);
void print_prompt(void);
void print_Message(unsigned char *message);
unsigned int To_Numeric(unsigned char in_data);
void initialize_timer(void);
void Initialize(void)
{
MCUCR|=(1<<SRE);
EIMSK=0X01;
EICRA=0X02;
sei();
serial_Initialize(BAUD_RATE);
}
void serial_Initialize(unsigned long int baud)
{
unsigned short int ubrr1;
ubrr1=((SYSTEM_CLOCK/(16L*baud))-1);
UBRR1H=(unsigned char)(ubrr1>>8);
UBRR1L=(unsigned char)ubrr1;
UCSR1A=0x20;//发送缓冲器准备好进行新的数据接收
UCSR1B=((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));//中断使能
UCSR1C=DATA_8;
UART_RxTail=0;
UART_RxHead=0;
UART_TxTail=0;
UART_TxHead=0;
}
void initialize_timer(void)
{TCNT0=0xf0;
TCCR0=0x07;
TIMSK=0x01;
sei();
}
void delay(unsigned int d1,unsigned int d2)
{unsigned int i,j;
for(i=0;i<d1;i++)
{for(j=0;j<d2;j++);}
}
void initialize_text_lcd(void)
{lcd_con();
*lcd_data='0';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
*lcd_data='0';
lcd_data_wait();
}
void lcd_con(void)
{lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;
lcd_control_wait();
*lcd_control|=0x38;
lcd_control_wait();
*lcd_control|=0x02;
lcd_control_wait();
*lcd_control|=0x01;
lcd_control_wait();
*lcd_control|=0x06;
lcd_control_wait();
*lcd_control|=0x0e;
lcd_control_wait();
}
void lcd_control_wait(void)
{delay(1000,1000);
}
void lcd_data_wait(void)
{delay(1000,10);
}
void go_step_1phase(unsigned time)
{
PORTD=(one_phase1[phase_pnt1++]<<4);
phase_pnt1&=0x03;
delay(time,100);}
void go_step_2phase(unsigned time)
{
PORTD=(one_phase2[phase_pnt2++]<<4);
phase_pnt2&=0x03;
delay(time,100);
}
SIGNAL(SIG_OVERFLOW0)
{TCNT0=0xf0;
if(second2!='0') second2--;
else if((second2=='0')&&(second1!='0')){second1=To_Numeric(second1)-1+'0';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2!='0')){minute2=To_Numeric(minute2)-1+'0';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1!='0')){minute1=To_Numeric(minute1)-1+'0';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2!='0')){hour2=To_Numeric(hour2)-1+'0';minute1='5';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2=='0')&&(hour1!='0'))
{hour2='9';minute1='5';minute2='9';second1='5';second2='9';}
else {hour1=hour2=minute1=minute2=second1=second2='0';
while(1){go_step_1phase(speed);
}
}
lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;
lcd_control_wait();
*lcd_control|=0x38;
lcd_control_wait();
*lcd_control|=0x02;
lcd_control_wait();
*lcd_control|=0x06;
lcd_control_wait();
*lcd_control|=0x0e;
lcd_control_wait();
*lcd_data=hour1;
lcd_data_wait();
*lcd_data=hour2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=minute1;
lcd_data_wait();
*lcd_data=minute2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=second1;
lcd_data_wait();
*lcd_data=second2;
lcd_data_wait();
}
void initialize_timer3(void)
{TCNT3H=0xff;
TCNT3L=0xf0;
TCCR3B=0x05;
ETIMSK=0x04;
sei();
}
SIGNAL(SIG_OVERFLOW3)
{TCNT3H=0xff;
TCNT3L=0xf0;
if(second2!='0') second2--;
else if((second2=='0')&&(second1!='0')){second1=To_Numeric(second1)-1+'0';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2!='0')){minute2=To_Numeric(minute2)-1+'0';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1!='0')){minute1=To_Numeric(minute1)-1+'0';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2!='0')){hour2=To_Numeric(hour2)-1+'0';minute1='5';minute2='9';second1='5';second2='9';}
else if((second2=='0')&&(second1=='0')&&(minute2=='0')&&(minute1=='0')&&(hour2=='0')&&(hour1!='0'))
{hour2='9';minute1='5';minute2='9';second1='5';second2='9';}
else { hour1=hour2=minute1=minute2=second1=second2='0';
while(1){go_step_2phase(speed);}
}
lcd_control=TLCD_CTRL;
lcd_data=TLCD_DATA;
lcd_control_wait();
*lcd_control|=0x38;
lcd_control_wait();
*lcd_control|=0x02;
lcd_control_wait();
*lcd_control|=0x06;
lcd_control_wait();
*lcd_control|=0x0e;
lcd_control_wait();
*lcd_data=hour1;
lcd_data_wait();
*lcd_data=hour2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=minute1;
lcd_data_wait();
*lcd_data=minute2;
lcd_data_wait();
*lcd_data=':';
lcd_data_wait();
*lcd_data=second1;
lcd_data_wait();
*lcd_data=second2;
lcd_data_wait();
}
SIGNAL(SIG_INTERRUPT0)
{dir=0;
}
SIGNAL(SIG_UART1_RECV)
{unsigned char data;
unsigned char tmphead;
data=UDR1;
tmphead=(UART_RxHead+1)&UART_RX_BUFFER_MASK;
UART_RxHead=tmphead;
if(tmphead==UART_RxTail){}
UART_RxBuf[tmphead]=data;
}
SIGNAL(SIG_UART1_DATA)
{ unsigned char tmptail;
if(UART_TxHead!=UART_TxTail){tmptail=(UART_TxTail+1)&UART_TX_BUFFER_MASK;
UART_TxTail=tmptail;
UDR1=UART_TxBuf[tmptail];}
else{UCSR1B&=~(1<<UDRIE);}
}
unsigned char ReceiveByte(void)
{ unsigned char tmptail;
while(UART_RxHead==UART_RxTail);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -