BASIC4MCU | 질문게시판 | 8051로 차량용 엘리베이터 프로그램 제작중에 질문이 있습니다 - 인터럽트
페이지 정보
작성자 까마키 작성일2019-06-17 23:17 조회337회 댓글1건본문
도트매트릭스 - 문열림 표현 [위, 아래]
릴레이 - 엘리베이터 이동경로
LCD - 상태표시 [열림, 닫힘]
LED(황색) - 상태표시 [차량 입차 OR 출차중]
인터럽트 - ???
#include <io51.h>
// LCD
#define L_PPI_A *((unsigned char *) 0x1c008)
#define L_PPI_B *((unsigned char *) 0x1c009)
#define L_PPI_C *((unsigned char *) 0x1c00a)
#define L_PPI_CR *((unsigned char *) 0x1c00b)// 도트매트릭스
#define D_PPI_A *((unsigned char *) 0x1c014)
#define D_PPI_B *((unsigned char *) 0x1c015)
#define D_PPI_C *((unsigned char *) 0x1c016)
#define D_PPI_CR *((unsigned char *) 0x1c017)// 릴레이
#define R_PPI_A *((unsigned char *) 0x1c01c)
#define R_PPI_B *((unsigned char *) 0x1c01d)
#define R_PPI_C *((unsigned char *) 0x1c01e)
#define R_PPI_CR *((unsigned char *) 0x1c01f)#define ALL_CLR 0x01
#define IM21 0xc0
bit SW1=P1.4;
bit SW2=P1.5;
bit led1 = P1.0;
bit led2 = P1.1;
bit led3 = P1.2;
// 스위치 부분
P1_1 = 0x1f;
P1_2 = 0x2f;
P1_3 = 0x3f;
P1_4 = 0x4f;
P1_5 = 0x5f;
P1_6 = 0x6f;
P1_7 = 0x7f;
P1_8 = 0x8f;char flag1=0,flag2=0;
void delay (long i)
{
while(i--);
}// LCD부분 - 상태표시
void busy_flag_check(void)
{
data unsigned char ir_value;L_PPI_CR = 0x92;
L_PPI_C = 0xf3;do
{
L_PPI_C = 0xf6;
ir_value = L_PPI_B;
L_PPI_C = 0xf2;
}
while(ir_value& 0x80);L_PPI_CR = 0x90;
L_PPI_C = 0xf3;
}void lcd_cmd_write(unsigned char lcd_cmd)
{
busy_flag_check();L_PPI_C = 0xf4;
L_PPI_B = lcd_cmd;
L_PPI_C = 0xf0;
L_PPI_C = 0xf3;
}void lcd_char_display(char write_char)
{
busy_flag_check();L_PPI_C = 0xf5;
L_PPI_B = write_char;
L_PPI_C = 0xf0;
L_PPI_C = 0xf3;
}void lcd_string_display(char *write_string)
{
while(*write_string)
{
lcd_char_display(*write_string);
write_string++;
delay(5000);
}
}//인터럽트 부분
interrupt[3]void msg_lcd(void)
{
flag1=1;
if(SW1==1)
{R_PPI_B=0xf0;
R_PPI_B=0x1f;
delay(2000);
R_PPI_B=0x3f;
delay(2000);
R_PPI_B=0x7f;
delay(2000);
R_PPI_B=0x0f;
delay(2000);
}
}//릴레이 부분
void h_d(unsigned char pb_font)
{
int k;
for(k=0; k<8; k++)
{
D_PPI_A = 0x00;
D_PPI_B = pb_font;
D_PPI_C = 0x00;pb_font = ((pb_font>>1)|0x00);
delay(12500);
D_PPI_A = 0xff;
D_PPI_B = pb_font;
D_PPI_C = 0xff;
}
}void l_d(unsigned char pb_font)
{
int k;
for(k=0; k<=8; k++)
{
D_PPI_A = 0x00;
D_PPI_B = pb_font;
D_PPI_C = 0x00;
pb_font = (pb_font<<1|0x01);
delay(12500);
}}
//메인
void main(void)
{
int k=0;
D_PPI_CR = 0x80;
R_PPI_CR = 0x80;do
{
if(SW1==1)
{R_PPI_B=0x0f;
delay(20000);
R_PPI_B=0x8f;
delay(20000);
R_PPI_B=0xcf;
delay(20000);
R_PPI_B=0xef;
delay(20000);
R_PPI_B=0xf0;
lcd_cmd_write(0x01);
lcd_string_display("Open");
h_d(0xff);
led2=0;
delay(100000);
lcd_cmd_write(1);
led2=1;
lcd_cmd_write(0x01);
lcd_string_display("Close");
l_d(0x00);
lcd_cmd_write(1);
R_PPI_B=0xff;
R_PPI_B=0xef;
delay(20000);
R_PPI_B=0xcf;
delay(20000);
R_PPI_B=0x8f;
delay(20000);
R_PPI_B=0x0f;
delay(20000);
R_PPI_B=0xf0;
delay(20000);
P1=0xff;
R_PPI_B=0xff;
D_PPI_CR=0x80;
SW1=0xff;
SW2=0xff;
led1=1;
led2=1;
led3=1;
lcd_cmd_write(1);
}
else
{
P1=0xff;
R_PPI_B=0xff;
SW1=0xff;
SW2=0xff;
led1=1;
led2=1;
led3=1;
lcd_cmd_write(1);
}
}
while(1);
}
프로그램은 이렇게 제작했는데 인터럽트 부분은 도저히 모르겠어서 질문드립니다 ㅠ
인터럽트 눌렀을때 LED적색에 불이 들어오고 LCD에 비상이라고 띄우고
모든 기능을 정지하고 싶은데 어떻게 해야할까요..
인터럽트에 명령어들을 넣어도 눌렀을 때 잠깐만 멈추고 지속이 되지 않아요..도와주세요...
댓글 1
조회수 337master님의 댓글
master 작성일
8255를 사용하고 있어서 좀 더 까다롭겠군요
8255로 직접 입출력하지말고 변수를 사용해서 변수 내용을 변경한 후 변수를 출력하세요
그 이유는 아래에서 설명합니다.
//
다른 방법도 있겠지만 인터럽트 안에서 처리하는 방법을 알려드리겠습니다.
인터럽트(){
if(비상키?){
모든 출력을 임시변수에 저장; // 저장용 임시 변수를 선언하셔야합니다.
출력을 정지;
while(비상키?); // 비상키가 눌려있는동안 대기
임시변수에 저장해둔 값을 읽어서 출력; // 원래 출력으로 복구
}
}