📄 main.c
字号:
//ICC-AVR application builder : 2008-4-9 17:20:49
// Target : M16
// Crystal: 16.000Mhz
#include <iom16v.h>
#include <macros.h>
#define DataR 0x90
#define RSTA1 0x4a
#define RSTA2 0x30
#define TSTA1 0x6b
#define TSTA2 0x4c
#define DataT 0xaf
#define En 0xe0
#define Run 0x83
#define Stop 0x7d
#define OK 1
#define NG 0
#define ONE 0x90
#define TWO 0x91
#define THREE 0x92
#define FOUR 0x93
#define COMM 0x94
unsigned char Enter[4] = {En,0x3e,0xe3,0xee};
unsigned char RunBuffer[4] = {Run,0x44,0x35,0x7e};
unsigned char StopBuffer[4] = {Stop,0x5e,0xe5,0x9e};
static unsigned char n = 0;
static unsigned char len;
static unsigned char flag;
unsigned char RxBuffer[4] = {0,0,0,0};
unsigned char TxBuffer[4];
enum COMCHE{ENTER,RUN,STOP}comcheck;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0x00;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x67; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0xD8;
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{unsigned char temp = UDR;
if (flag == NG){
switch (n){
case 0: if (temp == RSTA1) n++;break; //头1
case 1: if (temp == RSTA2) n++; //头2
else n = 0; break;
case 2: if (temp >= ONE && temp <= COMM)//长度
{len = temp; n++;}
else n = 0;
break;
case 3: RxBuffer[0] = temp; n++; break;
case 4: RxBuffer[1] = temp; n++; break;
case 5: RxBuffer[2] = temp; n++; break;
case 6: RxBuffer[3] = temp; n++; //data
break;
case 7: if (RxBuffer[0] + RxBuffer[1] + RxBuffer[2] +RxBuffer[3] +len == temp) { //校验
flag = OK;
PORTA = 0xff;
//CLI();
// UCSRB = 0xC8; //关接受中断
// SEI();
}
n = 0;
break;
default: break;
}
}
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
if (flag == OK){
PORTC = 0xff;
switch (n){
case 1: n++;UDR = TSTA2; break; //头2
case 2: n++;UDR = DataT - len; break; //长度
case 3: n++;UDR = RxBuffer[0]; break;
case 4: n++; UDR = RxBuffer[1]; break;
case 5: n++;UDR = RxBuffer[2]; break;
case 6: n++; UDR = RxBuffer[3]; break; //data
case 7: n=0;flag = NG;UDR = RxBuffer[0]+RxBuffer[1]+RxBuffer[2]+RxBuffer[3]+DataT-len;break;//校验
default:break;
}
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/*****************************************************
unsigned char check_buf( unsigned char *CheckBuffer)
检测命令是否符合要求
*****************************************************/
unsigned char check_buf( unsigned char *CheckBuffer,unsigned char num){
unsigned char i;
for (i = 0;i < num; i++){
if (CheckBuffer[i] != RxBuffer[i])
break;
}
if (i == num)
return OK;
else
return NG;
}
unsigned char check_com(){
unsigned char i;
switch (len){
case COMM: switch (RxBuffer[0]){
case En: if (check_buf(Enter,4) == OK)
comcheck = ENTER;
break;
case Run: if(check_buf(RunBuffer,2) == OK)
{comcheck = RUN;
//runtask(RxBuffer);
}
break;
case Stop: if(check_buf(StopBuffer,2) == OK)
{comcheck = STOP;
//stoptask(RxBuffer);
}
break;
default: break;
}break;
case ONE:
case TWO:
case THREE:
case FOUR: if (check_buf(TxBuffer,4) == OK)
{for (i = 0;i < 4;i++) RxBuffer[i] = Enter[i];
}
//UDR = TSTA1;
break;
default: PORTC = 0xf0;break;
}
while (!(UCSRA&(1<<UDRE)));
n=1;
UDR = TSTA1;
}
void main(){
n = 0;
flag = NG;
init_devices();
while(1){
if (flag == OK && n == 0)
check_com();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -