/***************************************************** This program was produced by the CodeWizardAVR V1.24.8d Professional Automatic Program Generator ?Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 2008-4-21 Author : F4CG Company : F4CG Comments: Chip type : ATmega8 Program type : Application Clock frequency : 8.000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include #include #include #define ADC_VREF_TYPE 0x20 //外部Vref,通道0,左对齐。 #define KEY_IN PINC.1 unsigned char DS_Data0; //显示的前面一个点 unsigned char DS_Data1; //显示的后面一个点 unsigned char adc_data0,adc_data1[100],display_on=0; unsigned char kt=3; //unsigned char T_scale[8]={0,98,192,225,241,250,251,252}; //200ms,100ms,50ms,20ms,10ms,5ms,2ms,1ms unsigned char T_scale[8]={0,97,194,225,241,250,251,252}; //83ms,50ms,20ms,10ms,5ms,2ms,1ms,0.5ms unsigned char Run_S,S_Trig; unsigned char Trig_level=32; eeprom unsigned char Font[10][5]={0x7C,0x8A,0x92,0xA2,0x7C, //数字 0x00,0x00,0x84,0xFE,0x80, 0xC4,0xA2,0x92,0x92,0x8C, 0x82,0x82,0x92,0x9A,0x66, 0x30,0x28,0xA4,0xFE,0xA0, 0x8E,0x8A,0x8A,0x8A,0x72, 0x78,0x94,0x92,0x92,0x62, 0x02,0x02,0xF2,0x0A,0x06, 0x6C,0x92,0x92,0x92,0x6C, 0x8C,0x92,0x92,0x92,0x7C}; eeprom unsigned char FontR[5]={0xFE,0x12,0x32,0x52,0x8C}; //Font后面的字母,这里是R eeprom unsigned char FontU[5]={0x7E,0x80,0x80,0x80,0x7E}; eeprom unsigned char FontN[5]={0xFE,0x08,0x10,0x20,0xFE}; eeprom unsigned char FontS[5]={0x8C,0x92,0x92,0x92,0x62}; eeprom unsigned char FontT[5]={0x02,0x02,0xFE,0x02,0x02}; eeprom unsigned char FontO[5]={0x7C,0x82,0x82,0x82,0x7C}; eeprom unsigned char FontP[5]={0xFE,0x12,0x12,0x12,0x0C}; eeprom unsigned char Font_m[5]={0xF0,0x08,0xF0,0x08,0xF0}; eeprom unsigned char FontV[5]={0x3E,0x40,0x80,0x40,0x3E}; eeprom unsigned char Font_u[5]={0x78,0x80,0x80,0x80,0x78}; eeprom unsigned char Font_minus[5]={0x00,0x08,0x08,0x08,0x00}; eeprom unsigned char Font_hiphen[5]={0x80,0x80,0x80,0x80,0x80}; eeprom unsigned char FontG[5]={0x7C,0x82,0x92,0x92,0x72}; eeprom unsigned char Font_d[5]={0x60,0x90,0x90,0xFE,0x80}; eeprom unsigned char Font_i[5]={0x00,0x90,0xF4,0x80,0x00}; eeprom unsigned char Font_v[5]={0x38,0x40,0x80,0x40,0x38}; eeprom unsigned char FontI[5]={0x00,0x82,0xFE,0x82,0x00}; eeprom unsigned char FontM[5]={0xFE,0x04,0xF8,0x04,0xFE}; eeprom unsigned char FontE[5]={0xFE,0x92,0x92,0x92,0x92}; eeprom unsigned char Font_e[5]={0x70,0xA8,0xA8,0xA8,0x10}; eeprom unsigned char FontL[5]={0x00,0xFE,0x80,0x80,0x80}; eeprom unsigned char Font_space[5]={0x00,0x00,0x00,0x00,0x00}; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Reinitialize Timer 0 value static unsigned char i1,j,k,Trig_En,a,i2; TCNT0=T_scale[kt]; // Place your code here if (((S_Trig==1)&(adc_data0<=Trig_level))|(a==1)) //单次触发 { adc_data1[i2]=adc_data0; a=1; i2++; if (i2>99) { i2=0; a=0; display_on=1; Run_S=1; TIMSK=0x00; } return; } if (adc_data0==Trig_level) //电平触发 Trig_En=1; else { Trig_En=0; k++; if (k>210) k=210; } if ((((Trig_En)&(i1==0))|(i1>0))&(S_Trig==0)) //任意触发 { adc_data1[i1]=adc_data0; i1++; if (i1>99) { i1=0; display_on=1; TIMSK=0x00; } k=0; } else if ((k>200)&(Trig_En==0)&(S_Trig==0)) { adc_data1[j]=adc_data0; j++; if (j>99) { j=0; display_on=1; TIMSK=0x00; } } } // ADC interrupt service routine interrupt [ADC_INT] void adc_isr(void) //读取ADC { // Read the 8 most significant bits // of the AD conversion result adc_data0=ADCH>>2; } void Set_KeyIn() //读取键值 { unsigned char key,kv,i; key=PINC&0b00011100; key=(~(key>>2))&0b00000111; kv=(PORTB&0b00111000)>>3; if ((key==2)&(kv<7)) //Kv:衰减系数 2&3 { PORTB=PORTB+0x08; kv=(PORTB&0b00111000)>>3; } if ((key==3)&(kv>0)) { PORTB=PORTB-0x08; kv=(PORTB&0b00111000)>>3; } for (i=102;i<128;i++) WRITE_LCD_V_LINE(i,32,39); switch (kv) { case (7): Write_Char(108,4,Font[3]); Write_Char(114,4,Font[2]); Write_Char(120,4,FontV); break; case (6): Write_Char(108,4,Font[1]); Write_Char(114,4,Font[6]); Write_Char(120,4,FontV); break; case (5): Write_Char(106,4,Font[6]); DP(113,4); Write_Char(114,4,Font[4]); Write_Char(120,4,FontV); break; case (4): Write_Char(106,4,Font[3]); DP(113,4); Write_Char(114,4,Font[2]); Write_Char(120,4,FontV); break; case (3): Write_Char(102,4,Font[1]); DP(109,4); Write_Char(110,4,Font[6]); Write_Char(116,4,Font[2]); Write_Char(122,4,FontV); break; case (2): Write_Char(102,4,Font[0]); DP(109,4); Write_Char(110,4,Font[6]); Write_Char(116,4,Font[4]); Write_Char(122,4,FontV); break; case (1): Write_Char(102,4,Font[0]); DP(109,4); Write_Char(110,4,Font[3]); Write_Char(116,4,Font[2]); Write_Char(122,4,FontV); break; case (0): Write_Char(102,4,Font[0]); DP(109,4); Write_Char(110,4,Font[1]); Write_Char(116,4,Font[6]); Write_Char(122,4,FontV); break; } if ((key==0)&(kt<7)) //Kt:时间系数 0&1 { kt++; } if ((key==1)&(kt>0)) { kt--; } TCNT0=T_scale[kt]; for (i=102;i<128;i++) WRITE_LCD_V_LINE(i,48,55); switch (kt) { case (7): Write_Char(102,6,Font[0]); DP(108,6); Write_Char(109,6,Font[5]); Write_Char(115,6,Font_m); Write_Char(121,6,FontS); break; case (6): Write_Char(108,6,Font[1]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); break; case (5): Write_Char(108,6,Font[2]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); break; case (4): Write_Char(108,6,Font[5]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); break; case (3): Write_Char(102,6,Font[1]); Write_Char(108,6,Font[0]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); break; case (2): Write_Char(102,6,Font[2]); Write_Char(108,6,Font[0]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); break; case (1): Write_Char(102,6,Font[5]); Write_Char(108,6,Font[0]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); break; case (0): Write_Char(106,6,Font[0]); DP(113,6); Write_Char(114,6,Font[1]); Write_Char(120,6,FontS); break; } if ((key==4)&(Trig_level<63)) //触发电平,4&7 { Trig_level++; } if ((key==7)&(Trig_level>3)) { Trig_level--; } Write_Char(113,2,Font[(64-Trig_level)/10]); Write_Char(119,2,Font[(64-Trig_level)%10]); Erase_V_Line(101); Erase_V_Line(100); WRITE_LCD_V_LINE(101,Trig_level-1,Trig_level+1); WRITE_LCD_DOT(99,Trig_level); if (key==5) { #asm("cli"); S_Trig=1; //单次触发 :5 Run_S=0; Write_Char(102,0,FontS); Write_Char(108,0,FontN); Write_Char(114,0,FontG); Write_Char(120,0,FontL); for (i=0;i<100;i++) Erase_V_Line(i); #asm("sei"); } if (key==6) //Run_S&STOP :6 Run_S=0; STOP Run_S=1 { S_Trig=0; if (Run_S==1) { Run_S=0; Write_Char(102,0,FontR); Write_Char(108,0,FontU); Write_Char(114,0,FontN); Write_Char(120,0,Font_space); } else if (Run_S==0) { Run_S=1; Write_Char(102,0,FontS); Write_Char(108,0,FontT); Write_Char(114,0,FontO); Write_Char(120,0,FontP); } } while (KEY_IN==0); } // Declare your global variables here void main(void) { // Declare your local variables here unsigned char x; PORTB=0b00101000; DDRB=0xff; PORTC=0x00; DDRC=0x20; PORTD=0x00; DDRD=0xff; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 312.500 kHz TCCR0=0x03; //采样间隔时间 TCNT0=T_scale[kt]; TIMSK=0x01; // ADC initialization // ADC Clock frequency: 1000.000 kHz // ADC Voltage Reference: AVCC pin // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE; ADCSRA=0B11101010; //4分频,ADC连续转换,中断使能,ADC使能。 delay_ms(200); CS1=1;CS2=1; init_LCD(); clear_LCD(); for (x=102;x<128;x++) WRITE_LCD_V_LINE(x,0,63); Write_Char(102,0,FontR); //显示外观 Write_Char(108,0,FontU); Write_Char(114,0,FontN); Write_Char(102,1,FontT); Write_Char(108,1,FontR); Write_Char(114,1,FontI); Write_Char(120,1,FontG); Write_Char(102,3,FontV); Write_Char(108,3,Font_d); Write_Char(114,3,Font_i); Write_Char(120,3,Font_v); Write_Char(106,4,Font[6]); DP(113,4); Write_Char(114,4,Font[4]); Write_Char(120,4,FontV); Write_Char(102,5,FontT); Write_Char(108,5,Font_i); Write_Char(114,5,Font_m); Write_Char(120,5,Font_e); Write_Char(102,6,Font[2]); Write_Char(108,6,Font[0]); Write_Char(114,6,Font_m); Write_Char(120,6,FontS); WRITE_LCD_V_LINE(101,Trig_level-1,Trig_level+1); WRITE_LCD_DOT(99,Trig_level); Write_Char(113,2,Font[Trig_level/10]); Write_Char(119,2,Font[Trig_level%10]); #asm("sei") while (1) { // Place your code here while(display_on==0) //只允许显示结束后读取键值 { if (KEY_IN==0) Set_KeyIn(); } DS_Data0=adc_data1[0]; for (x=0;x<100;x++) //显示波形 { Erase_V_Line(x); DS_Data1=adc_data1[x]; WRITE_LCD_V_LINE(x,DS_Data0,DS_Data1); DS_Data0=DS_Data1; } if (x>99) { x=0; TIMSK=0x01; display_on=0; if (KEY_IN==0) Set_KeyIn(); while (Run_S==1) { if (KEY_IN==0) Set_KeyIn(); } } Define_Z(); //稳定LCD }; }