BASIC4MCU | 8051/PIC | DT-516 강좌 | GLCD 막대로 ADC 표시하기
페이지 정보
작성자 키트 작성일2017-09-12 10:00 조회1,467회 댓글0건본문
sum0=sum1=0;
for(i=0;i<64;i++)sum0+=read_ADC(0); ADC_p0=sum0/64;
for(i=0;i<64;i++)sum1+=read_ADC(1); ADC_p1=sum1/64;
//sum을 취해서 안정적인 ADC 값을 만들었는데 사용하고 있지 않네요?//
//ADC_p0=(unsigned int)((float)read_ADC(0) * 256.0 / 1023.0); // read_ADC(0) 함수를 부르지말고
ADC_p0=(unsigned int)((float)ADC_p0 * 256.0 / 1023.0); // 위에서 구한 평균값을 사용해야 합니다.
//ADC_p1=(unsigned int)((float)read_ADC(1) * 256.0 / 1023.0);ADC_p1=(unsigned int)((float)ADC_p1 * 256.0 / 1023.0);
//----------
adc는 10비트라서 1024개의 데이터가 들어오고
LCD의 가로폭은 128개입니다.
//
ADC_p0=(unsigned int)((float)ADC_p0 * 256.0 / 1023.0);ADC_p1=(unsigned int)((float)ADC_p1 * 256.0 / 1023.0);
산술적인 연산을 해줘도 되지만
ADC_p0>>=3;
ADC_p1>>=3;
논리적인 연산자인 시프트를 사용해도 됩니다.ADC값이나 LCD의 폭(128)이 2의 배수이기 때문에 가능합니다.
DT-516키트의 경우 직렬로 저항이 가변저항에 연결 되어 있으므로 ADC분해능의 반 밖에 사용하지 않습니다.
ADC_p0>>=2;
ADC_p1>>=2;
따라서 2번만 시프트 시키면 되지만직렬 저항값의 오류로 인해서 엉뚱한 결과가 나올 수 있으므로 범위를 벗어나지 않도록 처리를 해줍니다.
if(ADC_p0>511)ADC_p0=511;
if(ADC_p1>511)ADC_p1=511;
ADC_p0>>=3;
ADC_p1>>=3;
//----------
box와 데이터를 동시에 그리면 더 편할 수 있습니다.
0xFF,0xFF = 0b11111111 0b11111111 // 처음과 마지막 (box)
0x80,0x01 = 0b10000000 0b00000001 // 데이터 0
0xBF,0xFD = 0b10111111 0b11111101 // 데이터 1
위 데이터를 버퍼없이 LCD에 직접 뿌리는 함수를 만들면 간단해집니다.
9-5. GLCD 사각형 그리기 | ◈ K128LCD-A 강좌
위 예제에서 GLCD에 비트맵 버퍼를 전송하는 함수를 보면
//==============================================================================================
void glcdL_send_buf(char type,char ch){ char i,j;
for(j=0;j<8;j++){
glcd_cmnd(type,ch,0,0xB8+j);
glcd_cmnd(type,ch,0,0x40);
for(i=0;i<64;i++)glcd_data(type,ch,0,disp_buf[j][0][i]);glcd_cmnd(type,ch,1,0xB8+j);
glcd_cmnd(type,ch,1,0x40);
for(i=0;i<64;i++)glcd_data(type,ch,1,disp_buf[j][8][i]);
};
}
//==============================================================================================
커서의 x,y 좌표를 설정 한 뒤에 64개씩 2번 전송 하고 있습니다.페이지 0~7 중에서 막대 그래프는
adc 채널0이 페이지2,3에
adc 채널1이 페이지6,7에 표시되므로
함수를 일부 수정하면 <페이지 2 표시>는 j가 2가 되겠죠
// LCD 왼쪽
glcd_cmnd(type,ch,0,0xB8+j);
glcd_cmnd(type,ch,0,0x40);
glcd_data(type,ch,0,0xFF); // 처음 boxfor(i=1;i<64;i++){
if(i<=ADC_p0){ // 데이터 채움
if((j%2)==0)glcd_data(type,ch,0,0xFD); //짝수, 페이지 2,6
if((j%2)==0)glcd_data(type,ch,0,0xBF); //홀수, 페이지 3,7
}
else{ // 데이터 비움
if((j%2)==0)glcd_data(type,ch,0,0x01); //짝수, 페이지 2,6
if((j%2)==0)glcd_data(type,ch,0,0x80); //홀수, 페이지 3,7
}
}
// LCD 오른쪽
glcd_cmnd(type,ch,1,0xB8+j);
glcd_cmnd(type,ch,1,0x40);
for(i=0;i<63;i++){if((i+64)<=ADC_p0){ // 데이터 채움
if((j%2)==0)glcd_data(type,ch,1,0xFD); //짝수, 페이지 2,6
if((j%2)==0)glcd_data(type,ch,1,0xBF); //홀수, 페이지 3,7
}
else{ // 데이터 비움
if((j%2)==0)glcd_data(type,ch,1,0x01); //짝수, 페이지 2,6
if((j%2)==0)glcd_data(type,ch,1,0x80); //홀수, 페이지 3,7
}
}
glcd_data(type,ch,1,0xFF); // 마지막 box
함수를 복사해서 새로운 이름으로 만든 후에 8051에 맞도록 잘 수정해서 만들어보세요
if(i<=ADC_p0){ 색칠한 ADC 변수 비교 부분은 플래그나 인수로 직접 넘기든지 하면 함수 1개로도 사용이 가능 할겁니다.^^
4개의 페이지에 표시 하므로
함수는 모두 4번 호출하면 됩니다.
댓글 0
조회수 1,467등록된 댓글이 없습니다.