MENU
Close
메인
About (회사소개)
NEWS(공지사항)
Request(요청/문의)
Company(회사소개)
Downloader(다운로더)
ArmEdit
AvrEdit
ComEdit
FontEdit
Products(제품소개)
Products(제품소개)
FORUM(포럼)
땜쟁이 포럼
FAQ
땜쟁이 포럼
땜쟁이 포럼입니다.
key4*4 누른값 LCD에 쓰기
테라뱅크
팁자료
1
10,749
2016.01.04 17:54
//Project: HkKey.c
//Key Use Port: PORTB HI=Write,LOW=Read
//LCD Use Port(DATA): PORTC Write
//LCD Use Port(Control):PORTA Write(pin5,6,7)
//CPU Type: Atmel AVR8535,8515,103
//Clock Frequency: 4.9152Mhz
//Comfiler: AvrEdit3.1(AVRGCC)
//Date: 2001/08/05
//Author: hwang hae kwon
#include <io.h>
#include <interrupt.h>
#include <signal.h>
void delay( int del);
//---------------------------
#define PortA_In_Out DDRA //A 입출력 설정
#define PortB_In_Out DDRB //B 입출력 설정
#define PortC_In_Out DDRC //C 입출력 설정
#define PortD_In_Out DDRD //D 입출력 설정
#define LCD_PORT_OUT_Bit PORTA
#define KEY_PORT_OUT PORTB
#define LCD_PORT_OUT PORTC
//#define LCD_PORT_INPUT PINA
#define KEY_PORT_INPUT PINB
#define LCD_PORT_INPUT PINC
#define LCD_RS 5 // PORT C LCD 4
#define LCD_RW 6 // PORT C LCD 5
#define LCD_E 7 // PORT C LCD 6
#define PORT_IN 0x00 //포트 입력
#define PORT_OUT 0xff //포트 출력
#define LOW_PORT_OUT 0x0f //하위 포트 출력
#define HI_PORT_OUT 0xf0 //상위 포트 출력
//--------------------------------
#define run_enable 0
#define run_disable 1
unsigned char run;
//----------------4*4 key---------
unsigned char KEY_SCAN_VALUE[4]={0xf7,0xfb,0xfd,0xfe};
unsigned char HexToAsiic_Map[16] = {"0123456789ABCDEF"};
unsigned char scan_count; //0111,1011.1101.1110 DATA LOW
unsigned char key_off; //3210.3210.3210.3210 PORT LOW
unsigned char key_enable;
unsigned char scan_keyold,scan_key,scan_Tempkey,key_output_value;
int key_Temp;
//-----------------------------
void delay(int del)
{
while ( del--);
}
//-------------------------
#include <lcd2_16.h>
#include <key4_4.h>
//-----------------------
void port_init(void)
{
scan_key=scan_keyold=scan_count=key_Temp=0;
key_enable=0;
outp(0x0f,DDRB);
outp(HI_PORT_OUT,PortA_In_Out);
outp(PORT_OUT,PortC_In_Out);
}
//---------------------------
void main( void )
{
port_init();
lcd_init();
lcd_clr();
lcd_string_out(0,0," 4*4Key Test ");
do
{
key_input();
LCD_curse_OFF();
LCD_curse_leftt();
lcd_char_out(0,1,HexToAsiic_Map[key_Temp]);
}
while(1);
}
0
Comments
테라뱅크
2016.01.04 17:54
/*
Project: 4*4KEY.H
Use Port: PORTB HI=Write,LOW=Read
CPU Type: Atmel AVR8535,8515,103
Clock Frequency:4.9152Mhz
Comfiler: AvrEdit3.1(AVRGCC)
Date: 2001/08/05
Author: hwang hae kwon */
void key_scanmain(void)
{ //7654 3210
if(0xe0==scan_Tempkey)//1110 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=1 ;
break;
case 1:
key_Temp=4;
break;
case 2:
key_Temp=7;
break;
case 3:
key_Temp=14;
break;
}
} //7654 3210
if(0xd0==scan_Tempkey)//1101 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=2;
break;
case 1:
key_Temp=5;
break;
case 2:
key_Temp=8;
break;
case 3:
key_Temp=0;
break;
}
} //7654 3210
if(0xb0==scan_Tempkey)//1011 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=3 ;
break;
case 1:
key_Temp=6 ;
break;
case 2:
key_Temp=9 ;
break;
case 3:
key_Temp=15 ;
break;
}
} //7654 3210
if(0x70==scan_Tempkey) //0111 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=10 ;
break;
case 1:
key_Temp=11 ;
break;
case 2:
key_Temp=12 ;
break;
case 3:
key_Temp=13 ;
break;
}
}
}
//----------------------------------------
void key_read(void)
{
if(scan_keyold==scan_key)//정확성을 위해 2번 읽음
{
key_scanmain(); //키값 읽음
key_output_value=scan_count;
// 출력 순번값 저장1110->1101->1011->0111
key_enable=1; //키읽음값 정확함
scan_keyold=0xff;
}
if(key_enable==0) //1번은 무조건 들어감
{
scan_keyold=scan_key;//1번 읽음값 현재읽은값 같게
}
}
void key_scan_start(void)
{ //0123 0123 포트로 보냄
for(scan_count=0;scan_count<4;scan_count++)
{//1110->1101->1011->0111
outp(0xf0 | KEY_SCAN_VALUE[scan_count],KEY_PORT_OUT);
scan_Tempkey=inp( KEY_PORT_INPUT);//상위만 읽음
scan_Tempkey=0xf0 & scan_Tempkey;
scan_key=scan_Tempkey;
if(scan_Tempkey !=0xf0) //KEY가 눌려지짐
{
key_read(); //키값 읽음
}
}
delay(10);
}
void key_input(void)
{
if(key_enable!=1)
{
key_scan_start();//키를 읽음 함수 실행
}//상위는 1111로 바꾸고 하위에 KEY_SCAN_VALUE값을 보냄
outp(0xf0 | KEY_SCAN_VALUE[key_output_value],KEY_PORT_OUT);
scan_Tempkey=inp(KEY_PORT_INPUT);
//하위는 무시하고 상위(눌린 키값)만 읽음
scan_Tempkey=0xf0 & scan_Tempkey;
if(scan_Tempkey==0xf0) //키가 눌려지지 않음
{
key_enable=0;
}
}
/* Project: 4*4KEY.H Use Port: PORTB HI=Write,LOW=Read CPU Type: Atmel AVR8535,8515,103 Clock Frequency:4.9152Mhz Comfiler: AvrEdit3.1(AVRGCC) Date: 2001/08/05 Author: hwang hae kwon */ void key_scanmain(void) { //7654 3210 if(0xe0==scan_Tempkey)//1110 0000 HIGHT { switch(scan_count) { case 0: key_Temp=1 ; break; case 1: key_Temp=4; break; case 2: key_Temp=7; break; case 3: key_Temp=14; break; } } //7654 3210 if(0xd0==scan_Tempkey)//1101 0000 HIGHT { switch(scan_count) { case 0: key_Temp=2; break; case 1: key_Temp=5; break; case 2: key_Temp=8; break; case 3: key_Temp=0; break; } } //7654 3210 if(0xb0==scan_Tempkey)//1011 0000 HIGHT { switch(scan_count) { case 0: key_Temp=3 ; break; case 1: key_Temp=6 ; break; case 2: key_Temp=9 ; break; case 3: key_Temp=15 ; break; } } //7654 3210 if(0x70==scan_Tempkey) //0111 0000 HIGHT { switch(scan_count) { case 0: key_Temp=10 ; break; case 1: key_Temp=11 ; break; case 2: key_Temp=12 ; break; case 3: key_Temp=13 ; break; } } } //---------------------------------------- void key_read(void) { if(scan_keyold==scan_key)//정확성을 위해 2번 읽음 { key_scanmain(); //키값 읽음 key_output_value=scan_count; // 출력 순번값 저장1110->1101->1011->0111 key_enable=1; //키읽음값 정확함 scan_keyold=0xff; } if(key_enable==0) //1번은 무조건 들어감 { scan_keyold=scan_key;//1번 읽음값 현재읽은값 같게 } } void key_scan_start(void) { //0123 0123 포트로 보냄 for(scan_count=0;scan_count<4;scan_count++) {//1110->1101->1011->0111 outp(0xf0 | KEY_SCAN_VALUE[scan_count],KEY_PORT_OUT); scan_Tempkey=inp( KEY_PORT_INPUT);//상위만 읽음 scan_Tempkey=0xf0 & scan_Tempkey; scan_key=scan_Tempkey; if(scan_Tempkey !=0xf0) //KEY가 눌려지짐 { key_read(); //키값 읽음 } } delay(10); } void key_input(void) { if(key_enable!=1) { key_scan_start();//키를 읽음 함수 실행 }//상위는 1111로 바꾸고 하위에 KEY_SCAN_VALUE값을 보냄 outp(0xf0 | KEY_SCAN_VALUE[key_output_value],KEY_PORT_OUT); scan_Tempkey=inp(KEY_PORT_INPUT); //하위는 무시하고 상위(눌린 키값)만 읽음 scan_Tempkey=0xf0 & scan_Tempkey; if(scan_Tempkey==0xf0) //키가 눌려지지 않음 { key_enable=0; } }
로그인한 회원만 댓글 등록이 가능합니다.
이전
다음
목록
Login
자동로그인
회원가입
|
정보찾기
카테고리
땜쟁이 포럼
3
포럼
질문/답변
팁자료
FAQ
최근글
고양이 고개한쪽으로 기울기 도리도리
강아지 애교
많이 좋아 하는 아이
기분좋은 하루
1
포인트는 어떻게 모으나요ㅠㅠ
최근댓글
earsthief
저도 궁금합니다.
최근통계
현재 접속자
18 명
오늘 방문자
485 명
어제 방문자
879 명
최대 방문자
2,440 명
전체 방문자
1,359,785 명
전체 회원수
478 명
전체 게시물
745 개
Project: 4*4KEY.H
Use Port: PORTB HI=Write,LOW=Read
CPU Type: Atmel AVR8535,8515,103
Clock Frequency:4.9152Mhz
Comfiler: AvrEdit3.1(AVRGCC)
Date: 2001/08/05
Author: hwang hae kwon */
void key_scanmain(void)
{ //7654 3210
if(0xe0==scan_Tempkey)//1110 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=1 ;
break;
case 1:
key_Temp=4;
break;
case 2:
key_Temp=7;
break;
case 3:
key_Temp=14;
break;
}
} //7654 3210
if(0xd0==scan_Tempkey)//1101 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=2;
break;
case 1:
key_Temp=5;
break;
case 2:
key_Temp=8;
break;
case 3:
key_Temp=0;
break;
}
} //7654 3210
if(0xb0==scan_Tempkey)//1011 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=3 ;
break;
case 1:
key_Temp=6 ;
break;
case 2:
key_Temp=9 ;
break;
case 3:
key_Temp=15 ;
break;
}
} //7654 3210
if(0x70==scan_Tempkey) //0111 0000 HIGHT
{
switch(scan_count)
{
case 0:
key_Temp=10 ;
break;
case 1:
key_Temp=11 ;
break;
case 2:
key_Temp=12 ;
break;
case 3:
key_Temp=13 ;
break;
}
}
}
//----------------------------------------
void key_read(void)
{
if(scan_keyold==scan_key)//정확성을 위해 2번 읽음
{
key_scanmain(); //키값 읽음
key_output_value=scan_count;
// 출력 순번값 저장1110->1101->1011->0111
key_enable=1; //키읽음값 정확함
scan_keyold=0xff;
}
if(key_enable==0) //1번은 무조건 들어감
{
scan_keyold=scan_key;//1번 읽음값 현재읽은값 같게
}
}
void key_scan_start(void)
{ //0123 0123 포트로 보냄
for(scan_count=0;scan_count<4;scan_count++)
{//1110->1101->1011->0111
outp(0xf0 | KEY_SCAN_VALUE[scan_count],KEY_PORT_OUT);
scan_Tempkey=inp( KEY_PORT_INPUT);//상위만 읽음
scan_Tempkey=0xf0 & scan_Tempkey;
scan_key=scan_Tempkey;
if(scan_Tempkey !=0xf0) //KEY가 눌려지짐
{
key_read(); //키값 읽음
}
}
delay(10);
}
void key_input(void)
{
if(key_enable!=1)
{
key_scan_start();//키를 읽음 함수 실행
}//상위는 1111로 바꾸고 하위에 KEY_SCAN_VALUE값을 보냄
outp(0xf0 | KEY_SCAN_VALUE[key_output_value],KEY_PORT_OUT);
scan_Tempkey=inp(KEY_PORT_INPUT);
//하위는 무시하고 상위(눌린 키값)만 읽음
scan_Tempkey=0xf0 & scan_Tempkey;
if(scan_Tempkey==0xf0) //키가 눌려지지 않음
{
key_enable=0;
}
}