8051 프로그램
페이지 정보
작성자 QumQ 작성일19-06-03 16:32 조회3,560회 댓글0건본문
#include <io51.h>
#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 TO_L_SHIFT 0x18
bit led1 = P1.0;
bit led2 = P1.1;
bit led3 = P1.2;
bit led4 = P1.3;
bit SW1 = P1.4;
bit SW2 = P1.5;
bit SW3 = P1.6;
bit SW4 = P1.7;
void delay(long i)
{
while(i--);
}
void f_w(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;
delay(12500);
D_PPI_A = 0xff;
pb_font = (pb_font << 1);
D_PPI_C = 0xff;
}
}
void bosig(unsigned char sig_ext)
{
R_PPI_B = 0xf0;
delay(100000);
R_PPI_B = 0x0f;
delay(100000);
}
void car_sig(void)
{
led1=0;
delay(80000);
led1=1;
led2=0;
delay(50000);
led2=1;
led3=0;
delay(80000);
}
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 msg_cmd_write(unsigned char msg_cmd )
{
busy_flag_check();
L_PPI_C = 0xf4;
L_PPI_B = msg_cmd;
L_PPI_C = 0xf0;
L_PPI_C = 0xf3;
}
void msg_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 msg_string_display(char *write_string)
{
while(*write_string)
{
msg_char_display(*write_string);
write_string++;
delay(1000);
}
}
interrupt[0x13]void msg_lcd(void)
{
EA=0;
if(led3==0)
{ int k=0;
msg_cmd_write(0x01);
msg_string_display("Please wait a moment");
for(k=0; k<14; k++)
{
msg_cmd_write(TO_L_SHIFT);
}
EA = 1;
}
else if(led1==0)
{ int k=0;
msg_cmd_write(0x01);
msg_string_display("the signal changed go through");
for(k=0; k<12; k++)
{
msg_cmd_write(TO_L_SHIFT);
}
EA=1;
}
return;
}
void main(void)
{
int k=0;
R_PPI_CR=0x80;
D_PPI_CR=0x80;
do
{
if(SW1==1)
{ msg_lcd;
led3=0;
R_PPI_B=0x0f;
delay(80000);
led3=1;
led2=0;
delay(50000);
led2=1;
led1=0;
R_PPI_B=0xf0;
f_w(0xff);
led1=1;
PX0=1;
IT0=1;
EX0=1;
EA=1;
}
else if (SW2==1)
{
led2=0;
delay(5000);
led2=1;
delay(5000);
R_PPI_B=0xff;
P1=0xff;
SW1=0xff;
SW2=0xff;
led1=0xff;
led2=0xff;
led3=0xff;
msg_cmd_write(0x01);
}
else
{
P1=0xff;
R_PPI_B=0xff;
SW1=0xff;
SW2=0xff;
led1=0xff;
led2=0xff;
led3=0xff;
msg_cmd_write(0x01);
}
} while(1);
}
현재 이렇게 해서 신호등과 비슷한 효과를 내려하고 있습니다.
다른 작동은 다 잘 되는데 인터럽트 스위치만 계속 이상하게 작동되서 질문드려요
인터럽트 스위치는 시각장애인 버튼이라는 가정하에 led3=0; 즉 차량신호등의 초록불이 켜있을 때는 인터럽트 스위치를 누를 시 LCD판에 기다려 달라는 메세지가 뜨고 일정 시간 후l ed3=1; 소등되고 led1=0; (차량 적색불) R_PPI_B=0xf0; (보행자 초록불)로 변경되면 LCD판에 불이 바뀌었으니 건너도 좋다 라고 하고 싶었습니다.
그런데 처음 신호를 주면 인터럽트 스위치를 누르기 전까지는 운행이 잘 되나 인터럽트 스위치를 누르면 현재 진행중이던 프로그램 중에 작동되지 않고 한 번의 프로그래밍 후 눌렀던 인터럽트 스위치의 작동이 되면서 led3 차량 녹색불 점등과 메세지만 뜨고 다른 작동을 안합니다. (버튼 누르면 계속 메세지만 리셋)
추가로 신호등 작동중에 인터럽트를 눌러도 아무 반응이 없고 한 번의 진행이 끝나고 나서야 넘어갑니다..... 어찌해야하나요
댓글 : 0
조회수 : 3,560
등록된 댓글이 없습니다.