BASIC4MCU | 질문게시판 | 답변 : avr LCD가 작동을 안합니다.
페이지 정보
작성자 master 작성일2018-06-12 12:28 조회14,009회 댓글3건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=1763
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-06-12 오후 12:31:50// by Ok-Hyun Park////--------------------------keypad.h//#ifndef __KEYPAD_H__#define __KEYPAD_H__//키패드 버튼 코드값#define SW0 0x18 // 0-번째 행#define SW1 0x14#define SW2 0x12#define SW3 0x11#define SW4 0x28 // 1-번째 행#define SW5 0x24#define SW6 0x22#define SW7 0x21#define SW8 0x48 // 2-번째 행#define SW9 0x44#define SW10 0x42#define SW11 0x41#define SW12 0x88 // 3-번째 행#define SW13 0x84#define SW14 0x82#define SW15 0x81#define NO_KEY 0x00//함수 정의void KeyInit(void);unsigned char KeyInput(void);int Keyuse1(void);#endif//--------------------------keypad.c//#include "keypad.h"#define N_COL 4 // 스캔할 키패드 열 수#define KEY_OUT PORTF // Keypad 출력 포트#define KEY_IN PINF // Keypad 입력 포트#define KEY_DIR DDRF // Keypad 입출력 방향 레지스터static unsigned char Key_scan(void);static unsigned char pin=NO_KEY; // 이전 코드 값//void KeyInit(){KEY_OUT=0xF0; // 출력 초기값으로 0을 출력KEY_DIR=0x0F; // 하위 니블->출력,상위 니블->입력}//=======================================// 키패드의 스캔 코드값을 반환한다.// 리턴 값: 0이 아닐 때: 스캔 코드값 // 0일 때: 입력 값이 없음//=======================================unsigned char KeyInput(void){unsigned char in,in1;in=Key_scan(); // 키 스캔을 하여 코드값을 읽는다.while(1){_delay_ms(30); // 디바운싱 시간 지연in1=Key_scan(); // 한 번 더 읽는다.if(in==in1)break;in=in1;}if(!(in&0xF0)){ pin=0; return 0; } // 눌러진 키가 없음if(pin==in)return 0; // 같은 키를 계속 누르고 있음 // 새로운 키 입력이 없는 것으로 리턴pin=in; // 키 값을 저장함return in; // 코드를 반환한다.}//---------------------------------------------------------------//스캔 코드값을 리턴함//---------------------------------------------------------------static unsigned char Key_scan(void){unsigned char out,i,in;out=0x01; // 3-열부터 스캔for(i=0; i<N_COL; i++){KEY_OUT=~out; asm("nop"::); // 출력 포트에 스캔 출력을 낸다.// 1사이클 지연in=(~KEY_IN)&0xF0; // 입력된 값의 상위 4비트를 취한다.if(in){ in+=out; break; } // 출력과 입력을 조합하여 코드 생성 // 입력이 있으므로 루프 탈출out<<=1; // 다음 스캔 코드값으로 변경}return in; // 스캔 코드값 반환}//int Keyuse1(void){int passward=1111; char buf1[4];static int cursorlocation=0; unsigned char key; // 입력값KeyInit();while(1){key=KeyInput(); int passward[2]={1111,1111}; char buf1[4]; LcdCommand(CURSOR_ON);switch(key){case SW0:{ // 스위치 1if (cursorlocation==0&&passward[1]<9000){ passward[1]=passward[1]+1000; sprintf(buf1,"%d",passward[1]); LcdPuts(buf1); LcdCommand(HOME); } // 천다위 더하기else if(cursorlocation==1&&passward[1]<9900){ passward[1]=passward[1]+100; sprintf(buf1,"%d",passward[1]); LcdCommand(HOME); LcdPuts(buf1); LcdCommand(HOME); LcdCommand(CURSOR_RSHIFT); } // 100단위 더하기else if(cursorlocation==2&&passward[1]<9990){ passward[1]=passward[1]+10; sprintf(buf1,"%d",passward[1]); LcdCommand(HOME); LcdPuts(buf1); LcdCommand(CURSOR_LSHIFT); LcdCommand(CURSOR_LSHIFT); } //10단위 더하기else if(cursorlocation==3&&passward[1]<9999){ passward[1]=passward[1]+1; sprintf(buf1,"%d",passward[1]); LcdCommand(HOME); LcdPuts(buf1); LcdCommand(CURSOR_LSHIFT); } //1단위 더하기break;}case SW1:{ // 스위치 2if (cursorlocation==0&&passward[1]>2000){ passward[1]=passward[1]-1000; sprintf(buf1,"%d",passward[1]); LcdPuts(buf1); LcdCommand(HOME); }else if(cursorlocation==1&&passward[1]>1200){ passward[1]=passward[1]-100; sprintf(buf1,"%d",passward[1]); LcdCommand(HOME); LcdPuts(buf1); LcdCommand(HOME); LcdCommand(CURSOR_RSHIFT); }else if(cursorlocation==2&&passward[1]>1120){ passward[1]=passward[1]-10; sprintf(buf1,"%d",passward[1]); LcdCommand(HOME); LcdPuts(buf1); LcdCommand(CURSOR_LSHIFT); LcdCommand(CURSOR_LSHIFT); }else if(cursorlocation==3&&passward[1]>1111){ passward[1]=passward[1]-1; sprintf(buf1,"%d",passward[1]); LcdCommand(HOME); LcdPuts(buf1); LcdCommand(CURSOR_LSHIFT); }break;}case SW2: if(cursorlocation<3){ cursorlocation=cursorlocation+1; LcdCommand(CURSOR_RSHIFT); } break; // 커서를 오른쪽 한칸 이동 // 스위치 3case SW3: if(cursorlocation>0){ cursorlocation=cursorlocation-1; LcdCommand(CURSOR_LSHIFT); } break; // 커서를 왼쪽으로 한칸이동 // 스위치 4}}}//--------------------------main.c//#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#include <stdio.h>#include "iseg7.h"#include "lcd.h"#include "keypad.c"//int main(void){int passward=1111; char buf1[4];LcdInit();StringInit();sprintf(buf1,"%d",passward);LcdMove(0,0); LcdPuts(buf1); // LCD 첫줄에에 1111을 표시LcdMove(1,0); LcdPuts(string[8]); // LCD의 둘째줄에 LCD.C에 선언한 문자를 표시LcdMove(0,0); LcdCommand(CURSOR_ON); // 커서 키키Keyuse1(); // 스위치를 통해서 LCD 첫줄의 숫자 변경}
컴파일 오류는 발생하지 않던가요?
댓글 3
조회수 14,009yf12님의 댓글
yf12 작성일
네 컴파일해도 아무런 오류가 나오지 않습니다.
LCD에 원하는 글자 까지는 나오는데 keyuse1 함수의 LCD(CURSOR_ON)부터
동작이 되지 않습니다.
master님의 댓글
master 작성일
오류가 발생하지 않는 것은 컴파일러에서 오류를 체크 해제 했기 때문에 오류메시지가 나오지 않은 것일테고요
int main(void){
int passward=1111; char buf1[4];
이 변수들은 로컬함수인데 main함수 안에서만 사용할 수 있습니다.
Keyuse1() 함수로 다 빼갔기 때문에
Keyuse1() 함수로 변수 선언을 이동하셔야 합니다.
메인함수에서도 사용하고 있으니 두 개의 함수 모두 같은 변수를 선언해야겠습니다.
한 개만 선언하고 싶다면 전역 변수로 선언해야겠죠
yf12님의 댓글
yf12 작성일
어제부터 안되던게 드디어 해결됬네요 변수떄문이라니 생각도 못했습니다.
감사합니다.