📄 main.c
字号:
#include <iom64v.h>
#include <macros.h>
#include <string.h>
#include "timer.h"
#include "main.h"
unsigned int iProgRunCount=0;
unsigned int soundTime=0;
unsigned char data1,data2,data3,data4;
// 端口初始化函数
void Port_Init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x01;
DDRB = 0xE7;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xC0;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//SPI initialize
// clock rate: 1000000hz
void spi_init(void)
{
//int i;
SPCR = 0x7e; //setup SPI
SPSR = 0x00; //setup SPI
PORTB |= (1<<PB0); //SS=1
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//unsigned char temp=0;
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x40; //external memory
Port_Init();
watchdog_init();
timer1_init();
spi_init();
MCUCR = (1 << SRE); //0x80,外部存储使能
//EICRA:外部中断3-0敏感电平控制BIT7--0:ISC31|ISC30......ISC01|ISC00
//ISCn1|ISCn0:00-低电平触发,01-保留,10-下降沿触发,11-上升沿触发
EICRA = 0x02;
//EICRB:外部中断7-4敏感电平控制BIT7--0:ISC71|ISC70......ISC41|ISC40
//ISCn1|ISCn0:00-低电平触发,01-任意逻辑电平变化,10-两次采用发生下降沿就触发,11-两次采用发生上升沿就触发
EICRB = 0x00;
EIMSK = 0x01; //外部中断屏蔽寄存器BIT7--0:INT7--INT0,1使能0关闭
//TIMSK:定时器中断屏蔽寄存器BIT7--0:OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0
TIMSK = (1 << TOIE1); //0x04
//ETIMSK:扩展定时器中断屏蔽寄存器BIT7--0:--|--|TICIE3|OCIE3A|OCIE3B|TOIE3|OCIE3C|OCIE1C
ETIMSK = 0x00; //(1<<TOIE3); //0x04
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void isd1700_init(void)
{
int i;
for(i=0;i<=100;i++);
//芯片上电
PORTB &= ~(1<<PB0); //SS=0
for(i=0;i<100;i++)
;
SPDR = 0x10+0x01;
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x00;
while (!(SPSR &(1 << SPIF)))
;
for(i=0;i<100;i++)
;
PORTB |= (1<<PB0); //SS=1
for(i=0;i<=100;i++);
//设置APC寄存器
PORTB &= ~(1<<PB0); //SS=0
for(i=0;i<100;i++)
;
SPDR = 0x10+0x45;
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x40;
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x0c;
while (!(SPSR &(1 << SPIF)))
;
PORTB |= (1<<PB0); //SS=1
for(i=0;i<=100;i++);
}
void Read_APC(void)
{
int i;
PORTB &= ~(1<<PB0); //SS=0
for(i=0;i<100;i++)
;
SPDR = 0x10+0x44;
while (!(SPSR &(1 << SPIF)))
;
data1=SPDR;
SPDR = 0x00;
while (!(SPSR &(1 << SPIF)))
;
data2=SPDR;
SPDR = 0x00;
while (!(SPSR &(1 << SPIF)))
;
data3=SPDR;
SPDR = 0x00;
while (!(SPSR &(1 << SPIF)))
;
data4=SPDR;
if(data4==0x0c)
RUN2_ON();
for(i=0;i<100;i++)
;
PORTB |= (1<<PB0); //SS=1
}
void Sound_Flay(void)
{
int i;
PORTB &= ~(1<<PB0); //SS=0
for(i=0;i<100;i++)
;
SPDR = 0x10+0x40;
while (!(SPSR &(1 << SPIF)))
;
data1=SPDR;
SPDR = 0x00;
while (!(SPSR &(1 << SPIF)))
;
data2=SPDR;
for(i=0;i<100;i++)
;
PORTB |= (1<<PB0); //SS=1
}
void Sound_SetFlay(unsigned int startAdd)
{
int i;
PORTB &= ~(1<<PB0); //SS=0
for(i=0;i<100;i++)
;
SPDR = 0x10+0x80; //cmd
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x00; //data
while (!(SPSR &(1 << SPIF)))
;
SPDR = (unsigned char)startAdd; //start add,LSB
while (!(SPSR &(1 << SPIF)))
;
SPDR = (unsigned char)(startAdd>>8); //start add,MSB
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x00; //end add
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x00; //end add
while (!(SPSR &(1 << SPIF)))
;
SPDR = 0x00; //end add
while (!(SPSR &(1 << SPIF)))
;
for(i=0;i<100;i++)
;
PORTB |= (1<<PB0); //SS=1
}
//主函数
void main(void)
{
static unsigned char secondcount=0;
unsigned char soundFlag=0;
unsigned int t;
init_devices(); //全局初始化
RUN2_OFF();
iProgRunCount=GetTime();
while(1)
{
WDR();
t=GetPassTime(iProgRunCount);
if(t>=100)
{
isd1700_init();
break;
}
}
Read_APC();
Sound_SetFlay(0x10);
soundTime=GetTime();
while (1)
{
WDR(); //内部watchdog
if(GetPassTime(soundTime)>=1000)
{
soundTime=GetTime();
secondcount++;
if(secondcount>=20)
{
secondcount=0;
soundFlag=1;
}
RUN1();
}
if(soundFlag)
{
soundFlag=0;
//Sound_Flay();
Sound_SetFlay(0x10);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -