#include<stdio.h>
#include <math.h>
#include <device.h>
//波の配列上での長さを25に設定する。
//配列には数指定で数値を入れているので、Nの値を変えれば波の長さが変わるわけではない。
#define N 25
void main()
{
//変数eは終了する際のカウンタである。
int e = 0;
int a = 0,i = 0,j = 0;
//pointはポイント数のカウント、iniは平均計算時のpoint数個の合計を扱う変数。
//timesはフィルタを何度かけるかを決める変数。
int point = 1;
int times = 1;
int ini = 0;
//加算型平均化、減算型平均化のどちらかを判定する変数。
int type = 0;
//計算し終えた平均化の波を格納する配列average_wave。
double average_wave[N];
//計算前の波を保管する配列sample_waveと
//計算中に元の値を参照するための配列initial_wave。
int sample_wave[N] = {0,4,8,12,16,12,8,4,0,4,8,12,16,12,8,4,0,4,8,12,16,12,8,4,0};
int initial_wave[N] = {0,4,8,12,16,12,8,4,0,4,8,12,16,12,8,4,0,4,8,12,16,12,8,4,0};
LCD_1_Start();
LCD_1_ClearDisplay();
//初めに加算型平均化、減算型平均化のどちらのフィルタをかけるかを選ぶ。
//加算型であればSW2,減算型であればSW3を押す。
//このプログラムではSWの名前をSW2、SW3の名前をSW2にしてしまったため、分かりにくくなっている。
LCD_1_PrintString("LPF or HPF?");
LCD_1_Position(1, 0);
LCD_1_PrintString("LPF:SW2 HPF:SW3");
while(1){
//いずれかのSWを押せば、変数typeに値が入る。
//0は加算型、1は減算型。
if(!SW_Read()){
type = 0;
break;
}
if(!SW2_Read()){
type = 1;
break;
}
CyDelay(150);
}
LCD_1_ClearDisplay();
LCD_1_Position(0, 0);
//平均化のタップ数を入力する。変数pointに値が入る。
// 減算の場合は自動で2が設定される。
//SW2で入力、SW3で終了。
if(type == 0){
LCD_1_PrintString("points :");
CyDelay(1000);
LCD_1_Position(1, 0);
LCD_1_ClearDisplay();
while(1){
if(!SW_Read()){
LCD_1_ClearDisplay();
point++;
LCD_1_PrintNumber(point);
}
CyDelay(150);
if(!SW2_Read())
break;
}
LCD_1_ClearDisplay();
LCD_1_Position(0, 0);
}
else{
point = 2;
}
//フィルタをかける回数を入力する。変数timesに値が入る。
//timesが16を超えると1に戻る。
//SW2で入力、SW3で終了。
LCD_1_PrintString("times :");
LCD_1_Position(1, 0);
CyDelay(1000);
while(1){
if(!SW_Read()){
LCD_1_ClearDisplay();
times++;
if(times > 16)
times = 1;
LCD_1_PrintNumber(times);
}
CyDelay(150);
if(!SW2_Read())
break;
}
LCD_1_Position(0, 0);
LCD_1_ClearDisplay();
//サンプル波を自分で作るか、デフォルトの物を作るかを選択する。
//作成する場合はSW2を、しない場合はSW3を押す。
LCD_1_PrintString("do u make wave");
LCD_1_Position(1, 0);
LCD_1_PrintString("yes:SW2 no:SW3");
CyDelay(1000);
while(1){
if(!SW2_Read()){
break;
}
if(!SW_Read()){
LCD_1_ClearDisplay();
LCD_1_Position(0, 0);
//サンプル波を自分で作る場合、波作成の画面に移る。
//編集する地点から順に出力され、SW2で値を入力、SW3で次の地点の入力に移る。
//また、入力前にはデフォルトの波が入っていて、値が16を超えると0に戻る。
//地点16以降はLCD左端から再出発する。
for(i = 0; i < N; i++){
CyDelay(150);
if(i > 16)
LCD_1_DrawVerticalBG(1,i - 16,2,sample_wave[i]);
else
LCD_1_DrawVerticalBG(1,i,2,sample_wave[i]);
while(1){
CyDelay(150);
if(!SW_Read()){
if(sample_wave[i] > 16){
sample_wave[i] = 0;
initial_wave[i] = 0;
}
else{
sample_wave[i]++;
initial_wave[i]++;
}
if(i > 16)
LCD_1_DrawVerticalBG(1,i - 16,2,sample_wave[i]);
else
LCD_1_DrawVerticalBG(1,i,2,sample_wave[i]);
}
if(!SW2_Read()){
break;
}
}
}
break;
}
CyDelay(150);
}
LCD_1_ClearDisplay();
LCD_1_Position(0, 0);
//計算前に配列average_waveをサンプル波で初期化する。
//この後配列initial_waveでaverage_waveから取り出した値を元に計算が行われる。
for(i = 0; i < N; i++){
average_wave[i] = sample_wave[i];
}
for(;;){
//カウンタ変数eに値が入っていれば、終了する。
if(e>=1){
LCD_1_PrintString("End");
for(;;){
}
}
//初めにサンプル波を出力する。
LCD_1_PrintString("sample wave");
CyDelay(1000);
LCD_1_ClearDisplay();
for(i = 0; i < N; i++){
average_wave[i] = sample_wave[i];
}
for(i = 0; i < N; i++)
{
CyDelay(100);
LCD_1_DrawVerticalBG(1,i,2,average_wave[i]);
}
LCD_1_ClearDisplay();
//フィルタをかけた波を出力する。
if(type == 0){
LCD_1_PrintNumber(point);
LCD_1_PrintString(" points");
}
LCD_1_PrintNumber(times);
LCD_1_PrintString(" times");
CyDelay(1000);
LCD_1_ClearDisplay();
for(a = 0;a <= times; a++){
//波の表示を行う。
//減算型の場合は、中心をLCDの中央にするため8を加算する。
for(i = 0; i < N; i++)
{
CyDelay(100);
if(type == 0)
LCD_1_DrawVerticalBG(1,i,2,average_wave[i]);
else
LCD_1_DrawVerticalBG(1,i,2,average_wave[i] + 8);
}
//この時点でのaverage_waveの値を配列initial_waveに移し、
//initial_wave内の値を参照しながら計算を行いつつaverage_waveに
//値を入れていく。
for(i = 0; i < N; i++){
initial_wave[i] = average_wave[i];
}
ini = 0;
for(i = 0; i < N - (point - 1); i++){
//変数typeが0なら加算、そうでなければ減算が行われる。
if(type == 0){
for(j = 0; j < point; j++){
ini += initial_wave[i + j];
}
}
else{
ini = initial_wave[i] - initial_wave[i + 1];
}
average_wave[i] = ini / point;
ini = 0;
}
}
LCD_1_ClearDisplay();
//平均化された波を元に戻す。
for(i = 0; i < N; i++){
average_wave[i] = sample_wave[i];
}
//平均化が終了したので、変数eに値が代入される。
e=1;
}
/* [] END OF FILE */
}