📄 application.c
字号:
#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "initial.h"
#include "pdiusbd12.h"
#include "descriptor.h"
#include "endpointfun.h"
#include "chap9.h"
#include "application.h"
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xF1; //set count
OCR0 = 0x0F; //set compare
//TCCR0 = 0x04; //start timer
TIMSK |= 0x01;
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0xF1;
}
void spi_init(void)
{
DDRB= (1<<DDB4)|(1<<DDB5)|(1<<DDB7);//SPI端口初始化
PORTB |=0xf0; //conect R
SPSR=0x01;//SPI状态寄存器初始化,时钟倍速,close interrupt_spi
SPCR=0x58; //SPI enable,MSB first ,Master Mode,
}
void adc_init(void)
{
DDRA = 0x00;
PORTA =0x00;
ACSR =(1<<ACD);
ADMUX=0x00;
ADCSRA = 0x00;
SFIOR = 0x80;
ADCSRA=(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2) ;
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
enqueue(&sq,ADCL);
enqueue(&sq,ADCH);
}
void adc_dac(uchar volatile *ppt)
{
uchar temp8;
if (*ppt==0x55)
{
switch (*(ppt+1))
{
case 0x05:
IO_out(*(ppt+3),*(ppt+2));
break;
case 0x04:
temp8=IO_in(*(ppt+2));
abc1[0]=temp8;
break;
case 0x01:
channel_change(*(ppt+2));
TCCR0 = 0x04;
break;
case 0x02:
TCCR0 = 0x00;
break;
case 0x03:
channel_change(*(ppt+2));
break;
case 0x10:
DAC_5617_10(*(ppt+3),*(ppt+4),*(ppt+2));
break;
case 0x11:
DAC_5617_10(*(ppt+3),*(ppt+4),*(ppt + 2));
asm("NOP");
TCCR0 = 0x04;
break;
default:break;
}
}
}
void channel_change (unsigned char adc_channel)
{
switch (adc_channel)
{
case 0x00:
ADMUX=0x00;
NOP();
NOP();
break;
case 0x01:
ADMUX=0x01;
NOP();
NOP();
break;
case 0x02:
ADMUX=0x02;
NOP();
NOP();
break;
case 0x03:
ADMUX=0x03;
NOP();
NOP();
break;
default:break;
}
}
void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel)
{
unsigned char TempL,TempH;
if(dac_channel==0x00)
{
set_cs;
TempH=0x00;
TempL=0x00;
TempH|=((dac_dataH<<2)|(dac_dataL>>6))&0x0F;
TempH|=0xc0;
TempL|=(dac_dataL<<2);
clr_cs;
SPI_Transmit(TempH);
SPI_Transmit(TempL);
set_cs;
}
else if (dac_channel==0x01)
{
set_cs;
TempH=0x40;
TempL=0x00;
TempH|=(dac_dataH<<2)|(dac_dataL>>6);
TempL|=(dac_dataL<<2);
clr_cs;
SPI_Transmit(TempH);
SPI_Transmit(TempL);
set_cs;
}
else
{
asm("NOP");
}
}
void SPI_Transmit(unsigned char dac_data)
{
unsigned char i;
SPCR=0x58;
SPDR=dac_data;
while(!SPSR&(1<<SPIF))
;
for (i=0;i<3;i++)
{;}
}
void IO_out(unsigned char IO_data,unsigned char IO_channel)
{
switch (IO_channel)
{
case IO_PA4:
if (IO_data==0x00)
{
DDRA |= (1<<DDA4);
PORTA &=~(1<<4);
}
else if (IO_data==0x01)
{
DDRA |= (1<<DDA4);
PORTA |= (1<<4);//
}
break;
case IO_PA5:
if (IO_data==0x00)
{
DDRA |= (1<<5);
PORTA &=~(1<<5);
}
else if (IO_data==0x01)
{
DDRA |= (1<<5);
PORTA |= (1<<5);
}
else
{
asm("NOP");
}
break;
case IO_PA6:
if (IO_data==0x00)
{
DDRA |= (1<<6);
PORTA &=~(1<<6);;
}
else if (IO_data==0x01)
{
DDRA |= (1<<6);
PORTA |= (1<<6);
}
else
{
asm("NOP");
}
break;
case IO_PA7:
if (IO_data==0x00)
{
DDRA |= (1<<7);
PORTA &= ~(1<<7);
}
else if (IO_data==0x01)
{
DDRA |= (1<<7);
PORTA |= (1<<7);
}
else
{
asm("NOP");
}
break;
default:break;
}
}
unsigned char IO_in(unsigned char IO_channel)
{
unsigned char temp;
switch (IO_channel)
{
case IO_PA4:
{
DDRA &= ~(1<<4);
PORTA |= (1<<4);
asm("NOP");
temp = PINA;
temp =(temp>>4) & 0x01;
}
break;
case IO_PA5:
{
DDRA &= ~(1<<5);
PORTA |=(1<<5);
asm("NOP");
temp = PINA;
temp=(temp>>5)& 0x01;
}
break;
case IO_PA6:
{
DDRA &=~(1<<6);
PORTA |= (1<<PA6);
asm("NOP");
temp = PINA;
temp=(temp>>6)& 0x01;
}
break;
case IO_PA7:
{
DDRA &=~(1<<7);
PORTA |= (1<<PA7);
asm("NOP");
temp = PINA;
temp=(temp>>7)& 0x01;
}
break;
default:break;
}
return temp;
}
void init(queue *sq)
{
sq->front = 0;
sq->rear = 0;
sq->fr = MaxWid - 1;
}
elemtype enqueue(queue *sq,elemtype x)
{
if ( (sq->fr == (MaxWid - 1)) && (sq->rear + 1)%MaxLen == sq->front )
return 0;
else
{
if (sq->fr == MaxWid - 1)
sq->rear = (sq->rear + 1)%MaxLen;
sq->fr = (sq->fr + 1) % MaxWid;
sq->data1[sq->rear][sq->fr] = x;
return 1;
}
}
elemtype outqueue(queue *sq,elemtype **x)
{
if ((sq->front == sq->rear) || ((sq->rear == (sq->front + 1)%MaxLen) && (sq->fr != MaxWid - 1)))
return 0;
else
{
sq->front = (sq->front + 1)%MaxLen;
*x = sq->data1[sq->front];
return 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -