BASIC4MCU | 질문게시판 | 답변 : 정수선언에 대해 문의 드립니다
페이지 정보
작성자 master 작성일2019-07-17 22:55 조회16,308회 댓글5건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-07-17 오후 10:51:26// by Ok-Hyun Park//#include "MIDIUSB.h"#include <string.h>//#define U16 unsigned int#define U32 unsigned long//#define DATA_WIDTH 40//int ploadPin=3; // Connects to Parallel load pin the HC165int clockEnablePin=5; // Connects to Clock Enable pin the HC165int dataPin=7; // Connects to the Q7 pin the HC165int clockPin=9; // Connects to the Clock pin the HC165//byte shift1,shift2,shift3,data[40]={0,},old_data[40]={0,};//void noteOn(byte channel,byte pitch,byte velocity){midiEventPacket_t noteOn={0x09,0x90|channel,pitch,velocity};MidiUSB.sendMIDI(noteOn);}//void noteOff(byte channel,byte pitch,byte velocity){midiEventPacket_t noteOff={0x08,0x80|channel,pitch,velocity};MidiUSB.sendMIDI(noteOff);}//void controlChange(byte channel,byte control,byte value){midiEventPacket_t event={0x0B,0xB0|channel,control,value};MidiUSB.sendMIDI(event);}//void read_shift_regs(){digitalWrite(clockEnablePin,HIGH); digitalWrite(ploadPin,LOW);delayMicroseconds(5);digitalWrite(ploadPin,HIGH); digitalWrite(clockEnablePin,LOW);for(int i=0; i<40; i++){data[i]=digitalRead(dataPin);digitalWrite(clockPin,HIGH); delayMicroseconds(1); digitalWrite(clockPin,LOW);}}//void display_pin_values(){if(data[2]){ shift1=1; shift2=0; shift3=0; }if(data[3]){ shift1=0; shift2=1; shift3=0; }byte pitch;for(int i=0; i<40; i++){Serial.print(data[i]); Serial.print("\r\n");if(data[i]){// Serial.print(i); Serial.print("\r\n");switch(i){case 0:pitch=i+1;noteOn(0,pitch,64); MidiUSB.flush(); delay(200); //Channel 0,middle C,normal velocitynoteOff(0,pitch,64); MidiUSB.flush(); delay(200); //Channel 0,middle C,normal velocitybreak;case 1:..case 39:pitch=i+1;noteOn(0,pitch,64); MidiUSB.flush(); delay(200); //Channel 0,middle C,normal velocitynoteOff(0,pitch,64); MidiUSB.flush(); delay(200); //Channel 0,middle C,normal velocitybreak;}}}}//void setup(){Serial.begin(9600);pinMode(dataPin,INPUT); pinMode(clockEnablePin,OUTPUT);pinMode(ploadPin,OUTPUT); digitalWrite(ploadPin,HIGH);pinMode(clockPin,OUTPUT); digitalWrite(clockPin,LOW);}//void loop(){read_shift_regs();if(memcmp(old_data,data,40)){ display_pin_values(); memcpy(old_data,data,40); }delay(1);}
댓글 5
조회수 16,308지니아빠님의 댓글
지니아빠 작성일
loop문을
memcmp(old_data,data,5) => memcmp(old_data,data,DATA_WIDTH)
memcpy(old_data,data,5) ==> memcpy(old_data,data,DATA_WIDTH)
이렇게 수정하였습니다. 알단은 잘 됩니다. 아무리 많아도 되겠네요
그런데 같은키 반복입력을 차단하지 못하네요
최초 입력이 없으면 data와 old_data가 전부 0으로 같으니 다시 loop로 가고
어떤 키값 입력후에는 memcpy이후에는 old_data에 그값이 있어야하고 똑같은값이 들어오면 loop로 가고 이러지 않나요
그래서 조금 수정해봤습니다.
8개의 입력만으로 수정한 전체소스입니다.
#include "MIDIUSB.h"
#include <string.h>
#define U16 unsigned int
#define U32 unsigned long
#define DATA_WIDTH 8
int ploadPin=3; // Connects to Parallel load pin the HC165
int clockEnablePin=5; // Connects to Clock Enable pin the HC165
int dataPin=7; // Connects to the Q7 pin the HC165
int clockPin=9; // Connects to the Clock pin the HC165
byte shift1,shift2,shift3,shift4,shift5,shift6,shift7;
byte Oldshift1,Oldshift2,Oldshift3,Oldshift4,Oldshift5,Oldshift6,Oldshift7;
byte data[DATA_WIDTH]={0,},old_data[DATA_WIDTH]={0,};
void noteOn(byte channel,byte pitch,byte velocity){
midiEventPacket_t noteOn={0x09,0x90|channel,pitch,velocity};
MidiUSB.sendMIDI(noteOn);
}
void noteOff(byte channel,byte pitch,byte velocity){
midiEventPacket_t noteOff={0x08,0x80|channel,pitch,velocity};
MidiUSB.sendMIDI(noteOff);
}
void controlChange(byte channel,byte control,byte value){
midiEventPacket_t event={0x0B,0xB0|channel,control,value};
MidiUSB.sendMIDI(event);
}
void read_shift_regs(){
digitalWrite(clockEnablePin,HIGH);
digitalWrite(ploadPin,LOW);
delayMicroseconds(5);
digitalWrite(ploadPin,HIGH);
digitalWrite(clockEnablePin,LOW);
for(int i=0; i<DATA_WIDTH; i++){
data[i]=digitalRead(dataPin);
digitalWrite(clockPin,HIGH);
delayMicroseconds(1);
digitalWrite(clockPin,LOW);
}
}
void display_pin_values(){
byte pitch;
for(int i=0; i<DATA_WIDTH; i++){
if(data[i]){
// Serial.print(i); Serial.print(data[i]);Serial.print("\r\n");
switch(i){
case 0:
pitch=i+8;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 1:
pitch=i+6;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 2:
pitch=i+4;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 3:
pitch=i+2;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 4:
pitch=i;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 5:
pitch=i-2;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 6:
pitch=i-4;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
case 7:
pitch=i-6;
Serial.print(pitch); Serial.print("\r\n");
noteOn(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
noteOff(0,pitch,64); //Channel 0,middle C,normal velocity
MidiUSB.flush();
delay(200);
break;
}
}
}
}
void setup(){
Serial.begin(9600);
pinMode(dataPin,INPUT); pinMode(clockEnablePin,OUTPUT);
pinMode(ploadPin,OUTPUT); digitalWrite(ploadPin,HIGH);
pinMode(clockPin,OUTPUT); digitalWrite(clockPin,LOW);
}
void loop(){
read_shift_regs();
if (memcmp(old_data,data,DATA_WIDTH)==0) {
Serial.print("data match"); Serial.print("\r\n");
}
else {
Serial.print("data notmatch"); Serial.print("\r\n");
display_pin_values();
memcpy(old_data,data,DATA_WIDTH);
}
delay(1);
}
그래도 같은키 반복 입력되네요
master님의 댓글
master 작성일
같은키 반복입력이라는 것이
어떤 키를 누르고 있으면
if(memcmp(old_data,data,5)){ display_pin_values(); memcpy(old_data,data,5); }
위 if()문이 실행 된다는 것인가요?
old_data 와 data가 같은 값이면 if()문이 실행되지 않습니다.
지니아빠님의 댓글
지니아빠 작성일
old_data 와 data가 같은 값이면 if()문이 실행되지 않습니다. 그런데
다음 loop를 실행하면서 read_shift_regs에 갔다오니 아무입력 없이 data값이 전체 0으로 바껴버려
old_data 와 data가 틀리는 바람에 if()가 실행되네요
Serial.print로 모니터하니 그냥있어도 loop가 한번돌때마다 0가 계속 들어옵니다
버튼키 입력이 없으면 처리를 하지 않던지 data배열의 전체가 0이면 빠져나가야 할것 같네요
그래서 여쭤봅니다.
data[] 전체가 0인지 비교를 for문 없이 한문장으로 비교할수 없나요?
그리고 memcmp(old_data,data,5) 여기서 5는 data에서 5칸만 비교한다는거 맞는가요
그런줄 알고 5대신 DATA_WIDTH로 바꿨는데 틀린건가요?
master님의 댓글
master
0이 계속 들어오는 것은 문제가 있군요
한 번씩만 들어와야 합니다.
if(memcmp(old_data,data,40)){ display_pin_values(); memcpy(old_data,data,40); }
5대신 40으로 변경해서 돌려보세요
지니아빠님의 댓글
지니아빠
40, DATA_WIDTH 둘다 마찬가지고요
제 예상대로 read_shift_regs에 들러 data값을 0로 set하고 old와 비교하여 틀리니
if()처리하고 다시 0인 data를 old에 넣고를 반복하게되고 그래서 같은키도 반복으로
들어갔던것이네요
그래서 loop문을 수정 하였습니다.
먼저 data와 old_data를 선언할때 mem_data[DATA_WIDTH]={0,}; 를 선언후
void loop(){
read_shift_regs();
if (memcmp(mem_data,data,DATA_WIDTH)!=0){
if (memcmp(old_data,data,DATA_WIDTH)!=0) {
display_pin_values();
memcpy(old_data,data,DATA_WIDTH);
}
}
delay(1);
}
이렇게 고치니 반복실행이 차단되었습니다.
제가 원하는대로 되었습니다.
master님 긴 시간과 긴 글로 도움 주셔서 감사합니다.
많은 공부가 되었습니다.