📄 1.c
字号:
{
temp = 0;
while (temp < 200)
{
AD4 = 1;
_delay_us(200);
AD4 = 0;
_delay_us(100);
temp++;
led_init();
}
temp = 0;
while (temp < 200)
{
AD4 = 1;
_delay_us(200);
AD4 = 0;
_delay_us(100);
temp++;
led_init();
}
}
AD4 = 0;
led_init();
clear_timer();
temp = 0;
while ((0 == AD5_R) && (0 == temp))
{
if (second > 2) //超时报错1:目标板无电压
{
error = (1<<0);
temp = 1;
}
}
if (0 == error) //正常亮绿灯1
{
green1 &= ~(1<<0);
led_display();
}
else //亮红灯1,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
PORTF &= 0xF0;
goto TEST_RST_19;
}
/*加热继电器断开测试*/
PORTF &= 0xF0;
_delay_ms(100);
clear_timer();
while ((1 == VIN2) && (0 == second))
{
asm("NOP");
}
if (0 != second) //正常亮绿灯2
{
green1 &= ~(1<<1);
led_display();
}
else //亮红灯2,停止检测
{
red1 &= ~(1<<1);
BEEP = 1;
led_display();
PORTF &= 0xF0;
goto TEST_RST_19;
}
/*电机继电器断开测试*/
clear_timer();
while ((1 == VIN1) && (0 == second))
{
asm("NOP");
}
if (0 != second) //正常亮绿灯3
{
green1 &= ~(1<<2);
led_display();
}
else //亮红灯3,停止检测
{
red1 &= ~(1<<2);
BEEP = 1;
led_display();
PORTF &= 0xF0;
goto TEST_RST_19;
}
/*加热继电器接通测试*/
AD1 = 1;
AD3 = 1;
_delay_ms(100);
clear_timer();
temp = 0;
while ((1 == VIN2) && (0 == temp))
{
if (second > 2) //超时报错4:不加热
{
error = (1<<3);
temp = 1;
}
}
time_1 = 0;
while (0 == VIN2)
{
i2c_delay();
time_1++;
if (time_1 > 60000)
{
error = (1<<3); //超时报错4:不加热
break;
}
}
while (1 == VIN2)
{
i2c_delay();
time_1++; //测得全功率的周期
if (time_1 > 60000)
{
error = (1<<3); //超时报错4:不加热
break;
}
}
AD1 = 0;
if (0 == error) //正常亮绿灯4
{
green1 &= ~(1<<3);
led_display();
}
else //亮红灯4,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
PORTF &= 0xF0;
goto TEST_RST_19;
}
/*电机继电器接通测试*/
AD2 = 1;
_delay_ms(100);
clear_timer();
temp = 0;
while ((1 == VIN1) && (0 == temp))
{
if (second > 2) //超时报错5:不打浆
{
error = (1<<4);
temp = 1;
}
}
if (0 == error) //正常亮绿灯5
{
green1 &= ~(1<<4);
led_display();
}
else //亮红灯5,停止检测
{
red1 &= ~error;
BEEP = 1;
led_display();
PORTF &= 0xF0;
goto TEST_RST_19;
}
/*半功率测试*/
AD3 = 0;
_delay_ms(200);
clear_timer();
temp = 0;
while ((1 == VIN1) && (0 == temp))
{
if (second > 2) //超时报错6:不打浆
{
error = (1<<5);
temp = 1;
}
}
time_2 = 0;
while (0 == VIN1)
{
i2c_delay();
time_2++;
if (time_2 > 60000)
{
error = (1<<5); //超时报错6:不打浆
break;
}
}
while (1 == VIN1)
{
i2c_delay();
time_2++; //测得半功率的周期
if (time_2 > 60000)
{
error = (1<<5); //超时报错6:不打浆
break;
}
}
time_2 *= 2;
time_1 *= 3; //半功率周期 > 1.5全功率周期
if ( (time_2 > time_1) && (0 == error) ) //正常亮绿灯6
{
green1 &= ~(1<<5);
led_display();
}
else //亮红灯6,停止检测
{
red1 &= ~(1<<5);
BEEP = 1;
led_display();
PORTF &= 0xF0;
goto TEST_RST_19;
}
/*自动测试通过*/
red1 = 0xFF;
red2 = 0xFF;
green1 = 0x00;
green2 = 0x00;
K4 = 0;
K5 = 0;
K8 = 0; //目标板断电
PORTF &= 0xF0;
led_display();
}
else if (0x02 == key_temp) //beep off
{
BEEP = 0;
}
else
{
led_display();
}
}
}
else
{
while (1)
{
asm("NOP");
}
}
}
/*************************************************************************************************************
INIT Subroutine
**************************************************************************************************************/
void io_init(void)
{
cli();
// wdt_disable();
XDIV = 0;
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
PORTE = 0x20;
DDRE = 0xDE;
PORTF = 0x0F;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x04;
ram_init();
spi_init();
twi_init();
timer_init();
uart_init();
adc_init();
sei();
}
void ram_init(void)
{
key_current = 0;
key_old = 0;
key_time = 0;
key_do = 0;
key_do_flag = 0;
timer_counter = 0;
second = 0;
red1 = 0xFF;
red2 = 0xFF;
green1 = 0xFF;
green2 = 0xFF;
time_1 = 0;
time_2 = 0;
error = 0;
model = 0;
beep_test = 0;
flash_t = 0;
}
void spi_init(void)
{
SPCR = 0; //SPI disable
//SPSR = 0;
//SPDR = 0;
}
void twi_init(void)
{
TWCR = 0; //TWI disable
//TWBR = 0xFF;
//TWAR = 0;
//TWDR = 0xFF;
//TWSR = 0;
}
void timer_init(void)
{
SFIOR |= (1<<TSM) | (1<<PSR0) | (1<<PSR321); //Synchronization Mode
TCCR0 = 0x07; //timer0 23.7ms
TCNT0 = 0;
//OCR0 = 0xFF; //Output Compare
TCCR1A = 0x09; //non-inverting mode
TCCR1B = 0x09; //timer1 8-bit Fast PWM Mode, 43.2KHz
TCCR1C = 0;
TCNT1 = 0;
//OCR1A = 255; //DAOUT1
//OCR1B = 255; //DAOUT2
OCR1C = 255; //DAOUT3
//ICR1 = 0;
TCCR2 = 0; //Timer2 disable
//TCNT2 = 0;
//OCR2 = 0x10; //Output Compare
//timer3_init();
TCCR3A = 0x00; //Timer3 disable
TCCR3B = 0x00;
//TCCR3C = 0;
//TCNT3 = 0;
//OCR3A = 255; //DAOUT4
//OCR3B = 255; //DAOUT5
//OCR3C = 255; //DAOUT6
//ICR3 = 0;
TIMSK = 0x01; //Timer0 Overflow Interrupt Enable
//ETIMSK = 0x00;
TIFR = 0xFF; //clear all timer int flag
SFIOR &= ~(1<<TSM); //all the Timers start counting simultaneously
}
void uart_init(void)
{
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= (1 << U2X);
#else
UCSR0A &= ~(1 << U2X);
#endif
UCSR0B = (1<<RXEN) | (1<<TXEN); //USART0 允许发送和接收
UCSR0C = (1<<UCSZ1) | (1<<UCSZ0); //8位数据
UCSR1B = 0; //USART1 disable
}
void adc_init(void)
{
//ADMUX = 0;
ADCSRA = 0; //ADC disable
}
/*---------------------------------------------------------------------------------------------------
Description: led display
input: red1, red2, green1, green2
Return: --
Others: --
----------------------------------------------------------------------------------------------------*/
void led_init(void)
{
red1 = 0xFF;
red2 = 0xFF;
green1 = 0xFF;
green2 = 0xFF;
led_display();
}
void led_display(void)
{
unsigned char i;
//PORTA |= 0x0D;
//PORTA &= ~0x02;
for(i=0;i<8;i++)
{
CLK1 = 0;
if ( (red1 & (1<<(7-i))) )
{
DATA1 = 1;
}
else
{
DATA1 = 0;
}
asm("NOP");
CLK1 = 1;
asm("NOP");
asm("NOP");
asm("NOP");
}
CLK1 = 0;
for(i=0;i<8;i++)
{
CLK2 = 0;
if ( (red2 & (1<<(7-i))) )
{
DATA2 = 1;
}
else
{
DATA2 = 0;
}
asm("NOP");
CLK2 = 1;
asm("NOP");
asm("NOP");
asm("NOP");
}
CLK2 = 0;
for(i=0;i<8;i++)
{
CLK3 = 0;
if ( (green1 & (1<<(7-i))) )
{
DATA3 = 1;
}
else
{
DATA3 = 0;
}
asm("NOP");
CLK3 = 1;
asm("NOP");
asm("NOP");
asm("NOP");
}
CLK3 = 0;
for(i=0;i<8;i++)
{
CLK4 = 0;
if ( (green2 & (1<<(7-i))) )
{
DATA4 = 1;
}
else
{
DATA4 = 0;
}
asm("NOP");
CLK4 = 1;
asm("NOP");
asm("NOP");
asm("NOP");
}
CLK4 = 0;
}
/*---------------------------------------------------------------------------------------------------
Description: key scan
Return:
0x00--Not Deal, 0xFF--No key be pressed, 0xFE--the last key be loosened
Others: --
----------------------------------------------------------------------------------------------------*/
unsigned char scan_key(void)
{
unsigned char temp;
/* WDT clear */
/* read key value */
key_current = PING;
key_current = ~key_current;
key_current &= 0x1B;
/* filter */
if (key_current != key_old)
{
key_old = key_current;
key_time = 0;
key_do_flag = 0;
}
else if (0 == key_do_flag)
{
key_time++;
if (key_time > KEY_FILTER)
{
key_do_flag = 1;
if (0 == key_current) /* no key be pressed */
{
key_do = 0;
return 0xFF;
}
else if (key_current < key_do) /* the last key be loosened & have key be pressed */
{
key_do = key_current;
return 0xFE;
}
else /* have new key be pressed */
{
temp = (key_current & (~key_do)); /* prevent to redo the already done key */
key_do = key_current;
return temp;
}
}
}
return 0;
}
/*---------------------------------------------------------------------------------------------------
self-explain functions
----------------------------------------------------------------------------------------------------*/
void clear_timer(void)
{
timer_counter = 0;
second = 0;
}
void set_model(void)
{
model = PINA;
model = ~model;
model = model & 0x0F;
}
void i2c_delay(void)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -