외부 인터럽트 0 사용하기 외부 인터럽트 0 를 이용한 프로그램을 작성합니다. main() 함수에서 인터럽트 설정을 하고 LED 를 오른쪽으로 이동시키는 프로그램을 작성하여 동작시킵니다. 외부 인터럽트 0 신호가 입력되면 전체LED 를 3 번 ON/OFF 시키도록 하겠습니다. 인터럽트 서비스 루틴이 종료되면 다시 main() 함수로 돌아가서 LED 를 이동시키는 프로그램입니다. #include typedef unsigned char byte; void delay(int dly) { int k; while(dly--) for(k=0; k
인터럽트에 관계된 레지스터 인터럽트(가로채기)는 외부 또는 내부 요청으로 현재 진행되고 있는 프로그램을 중단하고 인터럽트에 의한 서비스 프로그램을 실행하는 것을 말합니다. 함수호출(CALL) 과 다른 점은 함수호출은 프로그램 어디에서 발생하는가 그 시점이 명시가 되어 있지만 인터럽트는 인터럽트를 받아들일 수 있도록 설정한 후에 어느 시점에서 발생한다는 것을 모르는 경우가 많습니다. AT89S52 의 인터럽트 종류는 6 가지가 있습니다. 1. 외부 인터럽트 0 2. 타이머/카운터 인터럽트 0 3. 외부 인터럽트 1 4. 타이머/카운터 인터럽트 1 5. 시리얼 인터럽트 6. 타이머/카운터 인터럽트 2 아래 표는 AT89S52 의 SFR 영역을 나타낸 것입니다. 이중 (외부) 인터럽트에 관계된 레지스터에 대해..
SND 에 숫자 표시하기 어드레스와 데이터 표시 SND 에 어드레스와 데이터를 표시하는 프로그램을 작성해 보겠습니다. 어드레스와 주소는 16 진수로 표시되므로 SND 에 표시하는 숫자값을 16 진수로 확장하고, 출력할 포인터와 포인터가 가리키는 데이터를 배열에(snd_data[6]) 입력해서 SND 에 출력하는 함수를(snd_set()) 실행하는 방식으로 작성하겠습니다. #include char snd_num[16]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x27, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; char snd_loc[6]={0x04,0x08,0x10,0x20,0x40,0x80}; char snd_data[6]={0,0,0,0,0,0}..
SND 에 숫자 표시하기 델타키트에는 아래 그림과 같이 SND 가 연결되어 있습니다. 이번 강좌에서는 SND 에 6 자리 숫자를 모두 표시하는 방법을 알아보겠습니다. SND 에 "012345" 여섯 자리를 출력해 보겠습니다. 먼저, 첫번째 SND 에 숫자를 표시하려면, 표시할 숫자를 포트 D 에 보내고("0"->0x3F), 표시할 위치를 포트 C 에서 부논리로 선택 (0xFE) 하면 됩니다. 마찬가지로 두번째 SND 에 숫자를 표시하려면, 포트 D 에 "1"->0x06 을 출력하고, 포트 C 에 표시할 위치 값(0xF7) 을 출력합니다. 이렇게 6 개의 출력값과 자리값을 출력합니다. 숫자를 출력하는 시간 간격을 짧게 하면 6 자리 전체가 동시에 켜져 있는 듯이 보입니다. 프로그램 소스에서 표시 될 자리값..
코드 메모리를 LCD 에 표시하기 (헥사파일 설명) EngineISP 를 사용하여 헥사 파일을 열면 다음과 같은 화면이 나옵니다. 헥사 파일의 각 줄은 콜른(":") 으로 시작됩니다. 다음에 있는 두 수는 (03) 한줄에 있는 데이터의 수를 나타냅니다. 즉 첫줄에 다운 할 데이터의 수가 세개라는 것입니다. 다음에 있는 네 수는 (0000) 데이터가 들어갈 번지를 나타냅니다. 다음 두수는 (00) 레코드 형식을 나타냅니다. 00 은 정상적인 레코드를 나타내고 01 은 마지막 레코드를 나타냅니다. 각 줄(레코드) 의 마지막 데이터는 체크섬(Check Sum) 으로 앞의 데이터를 전부 더한 값의 2 의 보수를 취한 값을 넣습니다. 첫줄에서 다운 할 데이터 수는 3 개이고 0000 번지에 02 라는 데이터가 들..
포인터를 이용하여 내부 데이터 메모리를 LCD 에 표시하기 변수는 데이터를 값으로 갖는 반면에, 포인터는 데이터가 들어 있는 메모리의 번지값을 갖는 변수 입니다. 포인터를 사용하면 쉽게 임의 번지의 내용을 참조(읽기 와 쓰기)할 수 잇습니다. 8051 의 특성상 포인터가 어느 메모리 영역을 가리키는지를 선언해 주어야 합니다. 즉 내부 데이터 메모리를 가리키는 포인터는 data 라는 예약어를 사용하고, 코드 메모리를 가리키는 포인터는 code 라는 예약어를 사용합니다. 다음 프로그램은 내부 데이터 메모리 30h 번지부터 34h 번지까지 임의의 데이터를 입력하고 각 번지와 데이터를 LCD 에 표시하는 프로그램입니다. #include #include "lcd.h" char asc[2]; void htoa(ch..
캐릭터 LCD 에 16 진수 숫자 출력하기 캐릭터 LCD 에 문자나 숫자를 출력하려면 그에 해당하는 아스키 코드로 값을 보내주어야 합니다. 문자는 그 자체가 아스키 코드 값으로 저장되어 있기 때문에 그대로 출력하면 LCD 에 표시가 되지만 숫자는 그대로 출력하면 제대로 표시가 되지 않습니다. 예를 들어 38 이란 수를 LCD 에 출력하려면 3 에 대한 아스키 코드(0x33)를 LCD 에 보내고, 8 에 대한 아스키 코드(0x38)를 LCD 에 보내주어야 합니다. 그래서 16진수 헥사값을 아스키 코드로 변환하는 함수(htoa)를 만들어 주어야 합니다. 원리를 설명하면 16진 숫자 0 부터 9 까지의 아스키 코드는 16 진수로 0x30 부터 0x39 까지 연속되어 있고, A 부터 F 까지는 0x41 부터 0..
캐릭터 LCD 에 문자(열) 출력하기 이번에는 캐릭터 LCD 를 제어하는 프로그램을 만들어 보겠습니다. 캐릭터 LCD 의 구성에 대해서는 "C 제어 강좌 11번 "캐릭터 LCD 의 구성과 명령"을 참조하세요. 베타 키트에서는 LCD 의 제어단자가 포트 0 의 하위 세 비트에 연결되어 있습니다. P0.0 - RS (레지스터 선택) P0.1 - R/W (읽고 쓰기 선택) P0.2 - E (인에이블 신호) 또한 LCD 의 데이터 버스가 포트 1 에 연결되어 있습니다. P1.0 - DB0 ... P1.7 - DB7 [참고] 비지 플래그를 체크하지 않고 시간 지연 방식을 사용하여 LCD 를 제어하도록 하겠습니다. 비지 플래그를 사용하는 방식은 후반부에 기술합니다. LCD 구동 프로그램을 만들때는 첫째 비지 플래그..
DJNZ 명령으로 루프(LOOP) 만들기 어셈블리어에서 명령어는 오피코드(Operation Code) 와 오퍼랜드(Operand) 로 구성되어 있습니다. 쉽게 말하면 '무엇을 어떻게 해라' 가 명령어 이고, 무엇을이 오퍼랜드(데이터)이고 어떻게 해라가 오피코드입니다. 오퍼랜드는 데이터 자체도 되지만 데이터를 갖고 있는 레지스터 일 수도 있고, 데이터가 들어 있는 메모리를 가리키는 포인터 일 수도 있기 때문에 이를 통들어서 오퍼랜드라고 합니다. 간단한 예로 inc a 명령에서 inc 는 '증가시켜라'는 op code 이고 a (어큐물레이터) 가 오퍼랜드(데이터를 갖고 있는 레지스터) 가 됩니다. add a, #12h 이 명령은 a 레지스터의 내용을 직접수치 12h 와 더해서(ALU 에서 연산이 이루어 짐)..
SFR (특수기능 레지스터) 영역 살펴보기 SFR 영역에는 8051 에서 사용하는 특별한 기능의 레지스터 들이 있습니다. 이 영역의 레지스터들은 앞으로 계속해서 하나 씩 공부해 나갈 것입니다. 8051 을 잘 사용한다는 것은 결국 SFR 영역에 있는 레지스터의 기능을 잘 알고 활용한다는 것입니다. C 언어에서는 헤더 파일에 SFR 영역에 있는 레지스터를 정의 해 두었기 때문에 변수 선언 없이 그대로 사용할 수 있습니다. reg52.h 의 헤더 파일은 C:\RIDE\INC\51 폴더에 있습니다. 편집기로 파일을 열어 보면 SFR 영역에 있는 레지스터들이 선언되어 있는 것을 볼 수 있습니다. (모든 레지스터가 대문자로 선언되어 있습니다.) 아래 프로그램은 SFR 영역에 있는 B 레지스터에 값을(0x5B) 증..