답변 : avr LCD가 작동을 안합니다.
페이지 정보
작성자 master 작성일18-06-12 12:28 조회9,559회 댓글3건본문
// 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:{ // 스위치 1
if (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:{ // 스위치 2
if (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; // 커서를 오른쪽 한칸 이동 // 스위치 3
case 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
조회수 : 9,559
yf12님의 댓글
yf12 작성일
네 컴파일해도 아무런 오류가 나오지 않습니다.
LCD에 원하는 글자 까지는 나오는데 keyuse1 함수의 LCD(CURSOR_ON)부터
동작이 되지 않습니다.
master님의 댓글
master 작성일
오류가 발생하지 않는 것은 컴파일러에서 오류를 체크 해제 했기 때문에 오류메시지가 나오지 않은 것일테고요
int main(void){
int passward=1111; char buf1[4];
이 변수들은 로컬함수인데 main함수 안에서만 사용할 수 있습니다.
Keyuse1() 함수로 다 빼갔기 때문에
Keyuse1() 함수로 변수 선언을 이동하셔야 합니다.
메인함수에서도 사용하고 있으니 두 개의 함수 모두 같은 변수를 선언해야겠습니다.
한 개만 선언하고 싶다면 전역 변수로 선언해야겠죠
yf12님의 댓글
yf12 작성일
어제부터 안되던게 드디어 해결됬네요 변수떄문이라니 생각도 못했습니다.
감사합니다.