본문 바로가기
공부,일/c언어

간단한 키보드 제어

by fromnothing1 2021. 6. 17.

pokeb() 

segment:offset  으로 지정된 메모리 영역에 1 byte 를 써 넣는 함수

 

 

원형 

void pokeb(unsigned segment , unsigned offset , char value);

 

 

int peek(unsigned segment , unsigned offset);

offest:segment 인 위치에서 2 byte 읽어 오는 함수 

 

peekb 는 1 byte 읽어온다.

 

#include<stdio.h>
#include<dos.h>
#include<conio.h>

// 키보드 입력 버퍼에 저장된 키 코드 값 직접 읽어내기 
int main()
{
	char ch;
	pokeb(0, 0x41A, 0x1E); // front 에 버버의 선두 번지를 기록
	pokeb(0, 0x41C, 0x1E); // rear 에도 버퍼의 선두 번지를 기록

	ch = getch();

	printf("scna|ascll\n");
	printf("%c = %02x | %02x\n",ch,(unsigned)peekb(0, 0x41F), (unsigned)peekb(0, 0x41E));

	return 0;
}

 

 

 

16h 인터럽트 방식으로 

#include<stdio.h>
#include<dos.h>

unsigned int my_getch()
{
	union REGS r;

	r.h.ah = 0x00; // 키보드로부터 한 문자를 읽어 들이는 서비스 00h
	int86(0x16, &r, &r); // ah  에 할당한 다음 인터럽트 16h 를 발생
	return (r.x.ax); // 반환값 AH = 스캔 코드 , AL = 아스키 코드 
}

unsigned int my_kbhit()
{
	union REGS r;
	char empty;

	r.h.ah = 0x01; //1번 서비스 루틴 할당 
	int86(0x16, &r, &r); //int 16 을 호출 하면 키 값의 존재 유무를 알려줌 
	empty = (r.x.flags >> 6) & 0x001; // 플래그 레지스터 ZF 가 0 임면 읽어 들일 키가 존재
	if (!empty) 
	{
		return 1;// 키 읽음  1 return 
	}
	else
	{
		return 0;
	}

}

int main()
{
	unsigned int keycode;
	char scan, ascii;

	clrscr();

	printf("press any key to test .. \n");

	while (!my_kbhit()); // 키 입력 까지 대기 
	


	keycode = my_getch();  // 입력된 키 값을 읽어 2byte 정수로 저장
	scan = keycode >> 8; // 우측으로 8 bit   시프트 하여 스캔 코드 추출 
	ascii = keycode & 0x00FF; // 상위 바이트 0 으로 만들어 아스키 코드만 추출

	printf("scan|ascii");
	printf("%c = (%02X | %02X)\n", keycode, scan, ascii);
	getch();
	return 0;
	

}

 

'공부,일 > c언어' 카테고리의 다른 글

터보C 함수 모음 사이트  (0) 2021.06.18
간단한 메모리 접근  (0) 2021.06.18
비디오 램 영역을 통한 화면 출력  (0) 2021.06.16
룸 바이오스 데이터 영역 접근  (0) 2021.06.16
터보C 설치 사용  (0) 2021.06.15

댓글