// ver1.1 변경사항 : 1. 키패드의 버튼을 눌렀을때, LCD에 *가 하나씩 표시되게 만들어야 함.
// 2. LCD 서브함수를 이용하여 프로그래밍한다.
// 큰목표 : 1. 키패드를 이용하여 비밀번호를 설정하고, 비밀번호가 맞으면 문이 열리는 도어락을 설계한다.
// 작은 목표 : 1. LCD의 제어와 키패드의 제어를 합쳐서 관리할 수 있게 만든다.
// 2. 키패드의 버튼을 눌렀을때, LCD에 *가 하나씩 추가되어 표시되게 만들기.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 헤더파일 선언 부분
#include <mega128.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <delay.h>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 통용 전역변수 선언 부분
char button = 0; // 버튼이 눌렸는지 안눌렸는지를 판단하는 변수
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// LCD 전역변수 선언 부분
//char lcd_ast [5] = {\'*\',\'*\',\'*\',\'*\',\'0\'}; // 키패드의 버튼이 눌렸을 때, 이 배열의 문자가 하나씩 LCD화면에 추가됨
char lcd_cnt = 0; // LCD에 관련된 카운트 변수는 이 변수를 사용할 것
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 키패드의 전역변수 선언 부분
#define DATA1 PINA.0
#define DATA2 PINA.1
#define DATA3 PINA.2
#define DATA4 PINA.3
#define SCAN1 PORTA.4
#define SCAN2 PORTA.5
#define SCAN3 PORTA.6
char scan[3] = {0x10,0x20,0x40},cnt = 0;
char data = 0;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 서브함수 선언 부분
void keyscan ();
void lcd();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main ()
{
DDRA = 0xf0;
PORTD=0x00;
DDRD=0x00;
// LCD module initialization
lcd_init(16);
///////////////// LCD 처음 화면
lcd_gotoxy( 0 , 0 );
lcd_putsf("Password Please?");
lcd_gotoxy( 0 , 1 );
lcd_putsf(" _ _ _ _ ");
///////////////////////////
while(1)
{
keyscan ();
lcd();
PORTA = ~scan[++cnt % 3] & 0xf0;
}
}
void keyscan ()
{
if(DATA1 == 0)
{
if(SCAN1 == 0) data = 1 , button = 1;
if(SCAN2 == 0) data = 2 , button = 1;
if(SCAN3 == 0) data = 3 , button = 1;
}
if(DATA2 == 0)
{
if(SCAN1 == 0) data = 4 , button = 1;
if(SCAN2 == 0) data = 5 , button = 1;
if(SCAN3 == 0) data = 6 , button = 1;
}
if(DATA3 == 0)
{
if(SCAN1 == 0) data = 7 , button = 1;
if(SCAN2 == 0) data = 8 , button = 1;
if(SCAN3 == 0) data = 9 , button = 1;
}
if(DATA4 == 0)
{
if(SCAN1 == 0) data = \'*\' , button = 1;
if(SCAN2 == 0) data = 0 , button = 1;
if(SCAN3 == 0) data = \'#\' , button = 1;
}
}
void lcd ()
{
int button_case = 1; // 스위치 케이스 문을 사용하기 위하여 선언
// 키패드의 버튼이 눌렸을 때의 상황을 설정하는 부분
if(button == 1)
{
button = 0;
switch (button_case)
{
case 1 : lcd_gotoxy ( 5 , 1 );
lcd_putsf("*");
button_case++;
break;
case 2 : lcd_gotoxy ( 7 , 1 );
lcd_putsf("*");
button_case++;
break;
case 3 : lcd_gotoxy ( 9 , 1 );
lcd_putsf("*");
button_case++;
break;
case 4 : lcd_gotoxy ( 11 , 1 );
lcd_putsf("*");
button_case++;
break;
}
}
//////////////////////////
}
코드는 이정도인데, switch case 문에 넣은 내용이 작동을 하지가 않음요.
생각해보면 맞는 코드인것 같은데 뭐가 문제인지 알려주실 분?
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.