BASIC4MCU | 질문게시판 | 4x4 키 매트릭스 질문드립니다
페이지 정보
작성자 귤티 작성일2019-05-29 20:10 조회25,548회 댓글9건본문
4x4 키매트릭스에 대해 공부를 하고 있는데, 가장 기본적인 키스캔은 계속 공부하다 보니 할 수 있겠더군요.
#include <at89x51.h>
code unsigned char font[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void TMR1_int(void) interrupt 3 // 타이머/카운터 1 인터럽트 벡터 번호 = 3
{
unsigned char i, column_data, row_data;
EA=0; // 전체 인터럽트 디스에이블
column_data=0xfe; // 초기 열을 검사할 데이터
for (i=0; i<4; i++) {
P2=column_data; // 열 데이터를 P2에 출력
row_data=P2; // P2로부터 행 데이터를 읽음
row_data=row_data & 0xf0; // 하위 4비트를 마스크
if (row_data==0xe0) {P1=font[i]; break;}
else if (row_data==0xd0) {P1=font[i+4]; break;}
else if (row_data==0xb0) {P1=font[i+8]; break;}
else if (row_data==0x70) {P1=font[i+12]; break;}
else P1=0xff; // 어떤 키도 눌리지 않은 경우
column_data=(column_data<<1) | 0x01;
}
TH1=0x3c; // 시정수 설정(0.05초)
TL1=0xb0; // (65536-50000)=15536=3CB0H
EA=1; // 전체 인터럽트 인에이블
return;
}
void main(void)
{
TMOD=0x11; // 타이머 1을 모드 1로 설정
TH1=0x3c; // 시정수 설정(0.05초)
TL1=0xb0; // 65536-50000=3CB0H
ET1=1; // 타이머 1 인터럽트 인에이블
EA=1; // 전체 인터럽트 인에이블
PT1=1; // 타이머 1 인터럽트 우선순위 High
TR1=1; // 타이머 1 run
while(1); // 인터럽트 대기
}
=> 그래서 조금 더 응용하고자 해서 자료를 찾아보다가
https://cafe.naver.com/circuitsmanual/116122
이 게시글을 보게 되었는데, 제가 프로그램을 공부한지 얼마 안됐고, keil로 공부를 하다보니 도무지 해석이 되지 않습니다.
혹시 저기 있는 코드를 keil문으로 변환이 가능한지 여쭈어 보고 싶습니다 ㅠㅠ
댓글 9
조회수 25,548master님의 댓글
master 작성일
포트를 비트 단위로 입력 및 출력이 가능한가요?
배워서 알고 있는지를 묻는 겁니다.
일단, 예제소스와 동일하게 바이트 단위로 처리해드리죠
master님의 댓글
master 작성일
char KeyScan(void){
char KeyBuf=0xFF; // 키 값이 들어갈 버퍼, 초기값 0xFF
DDRC=0; PORTC=0xFF; // 포트 초기값, 입력핀 내부풀업저항 사용
//
DDRC=0x10; PORTC&=~0x10; _delay_us(1); // 1번째 줄 선택
if(!(PINC&1))KeyBuf='0';
if(!(PINC&2))KeyBuf='1';
if(!(PINC&4))KeyBuf='2';
if(!(PINC&8))KeyBuf='3';
DDRC=0; PORTC=0xFF; // 1번째 줄 해제
//
예제 중 위 코드에 대해서만 변환해드리면
char KeyScan(void){
char KeyBuf=0xFF; // 키 값이 들어갈 버퍼, 초기값 0xFF
P1=0xFF; // 포트 초기값, 입력핀 내부풀업저항 사용
//
P1&=~0x10; // 1번째 줄 선택(P1.4=0)
if(!(P1&1))KeyBuf='0'; // P1.0
if(!(P1&2))KeyBuf='1'; // P1.1
if(!(P1&4))KeyBuf='2'; // P1.2
if(!(P1&8))KeyBuf='3'; // P1.3
P1=0xFF; // 1번째 줄 해제
//
귤티님의 댓글
귤티
아앗..! 감사합니다 ㅠㅠ 근데 인터럽트 부분을 잘 모르겠어서
interrupt [TIM0_COMP] void timer0_comp_isr(void){ // 매치 인터럽트
인터럽트 부분은 변환을 어떻게 하면될까요! 번거롭게 해서 죄송합니다 ㅠㅠ
master님의 댓글
master
10ms 정도마다 읽어도 됩니다. (정확하지 않아도 됩니다.)
타이머 인터럽트 사용법 공부하세요
귤티님의 댓글
귤티
바꾸고 있는 중에 질문 있어서 하나만 더 여쭤봐도될까요
DDRA=0xFF; DDRB=0xFF;
TCCR0=0x0C; OCR0=249; TIMSK=2; //16000000/ 64/(1+249)= 1000Hz=1ms
SREG=0x80;
각각의 문자들이 뭐랑 대응이 되는지 잘 모르겠습니다
master님의 댓글
master
https://cafe.naver.com/circuitsmanual/132931
이 글에서 포트입출력 부터 읽어보세요
//
AVR을 모두 공부하려면 너무 어렵지 않나요?
https://cafe.naver.com/circuitsmanual/20408
8051 호환보드의 강좌입니다.
이 강좌글 뒷쪽에는 8051을 공부한 학생이 AVR 예제를 8051로 바꿔서 올린 글도 있습니다.
(지금은 학생이 아니고 직장인입니다.)
귤티님의 댓글
귤티
정말 감사합니다! 보다가 안되는 거 있으면 또 질문드리겠습니다
너무너무 감사합니다
귤티님의 댓글
귤티
너무 죄송한데 interrupt [TIM0_COMP] void timer0_comp_isr(void) 이 매치 인터럽트가 왜 사용이 됐는지 모르겠네요 ㅠㅠ
keil 인터럽트 부분도 살펴봤는데 대비되는 인터럽트도 못찼겠어요
master님의 댓글
master
AVR과 8051이 호환 mcu가 아닌데 왜 동일한 대치 코드를 찾나요?
타이머 인터럽트 아무 것이나 사용하면 됩니다.