以前に10点LEDの簡易レベルメータを作成しましたが、今回はステレオに対応し、表示はLCD(16文字2行)を使用しました。
<信号を増幅する>
<信号の大きさを求める>
<信号の大きさをLCDにバー表示する>
//********************************************************************** /* <ステレオレベルメーター(16点)> */ //********************************************************************** unsigned int adR, adL; void measurement() { unsigned int maxR, minR, maxL, minL; unsigned char cnt; // maxR = 0; minR = 1024; maxL = 0; minL = 1024; for (cnt = 0; cnt < 100; cnt++) { adR = Adc_Read(1); adL = Adc_Read(2); maxR = maxR < adR ? adR : maxR; minR = minR > adR ? adR : minR; maxL = maxL < adL ? adL : maxL; minL = minL > adL ? adL : minL; } adR = maxR - minR; adL = maxL - minL; } //********************************************************************** void main() { unsigned char buf[10], cnt, tmpR, tmpL; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000110; // AD1,2を使用する。 TRISA = 0b00111110; TRISB = 0b00001111; // Lcd_Custom_Config(&PORTB, 4, 5, 6, 7, &PORTA, 0, 7, 6); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Out(1, 1, "LevelMeterV2 "); Lcd_Custom_Out(2, 1, " JF3SFB 2007.12"); Delay_ms(1000); Lcd_Custom_Cmd(LCD_CLEAR); // while (1) { measurement(); // tmpR = adR / 54; tmpL = adL / 54; for (cnt = 0; cnt < 16; cnt++) { if (tmpR > cnt) Lcd_Custom_Chr(1, cnt + 1, 0xFF); else Lcd_Custom_Chr(1, cnt + 1, ' '); // if (tmpL > cnt) Lcd_Custom_Chr(2, cnt + 1, 0xFF); else Lcd_Custom_Chr(2, cnt + 1, ' '); } } } //**********************************************************************