BASIC4MCU | 질문게시판 | 답변 : 8051 프로그램
페이지 정보
작성자 master 작성일2019-06-03 21:31 조회3,537회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=9191
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-06-03 오후 9:38:32// by Ok-Hyun Park//#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;//char flag1=0,flag2=0;//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 *s){ while(*s)msg_char_display(*s++); }//interrupt[0x13]void msg_lcd(void){ // 시각장애인 버튼flag1=1;else if(led1==0){msg_cmd_write(1); msg_string_display("the signal changed go through");for(k=0; k<12; k++){ msg_cmd_write(TO_L_SHIFT); }}}//void main(void){int i,k=0;R_PPI_CR=0x80;D_PPI_CR=0x80;while(1){if(SW1==1){led3=0; R_PPI_B=0x0f;msg_cmd_write(0x80); msg_string_display(" ");msg_cmd_write(0xC0); msg_string_display(" ");for(i=0;i<100;i++){if(flag1){ flag1=0; flag2=1;msg_cmd_write(0x80); msg_string_display("Please ");msg_cmd_write(0xC0); msg_string_display("wait a moment ");}delay(800);}led3=1; led2=0;msg_cmd_write(0x80); msg_string_display(" ");msg_cmd_write(0xC0); msg_string_display(" ");for(i=0;i<100;i++){if(flag1 || flag2){ flag1=0; flag2=0;msg_cmd_write(0x80); msg_string_display("signal changed ");msg_cmd_write(0xC0); msg_string_display("go through ");}delay(500);}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(1);}else{P1=0xff; R_PPI_B=0xff; SW1=0xff; SW2=0xff; led1=0xff; led2=0xff; led3=0xff; msg_cmd_write(1);}}}//현재 이렇게 해서 신호등과 비슷한 효과를 내려하고 있습니다.다른 작동은 다 잘 되는데 인터럽트 스위치만 계속 이상하게 작동되서 질문드려요인터럽트 스위치는 시각장애인 버튼이라는 가정하에led3=0; 즉 차량신호등의 초록불이 켜있을 때는 인터럽트 스위치를 누를 시 LCD판에 기다려 달라는 메세지가 뜨고일정 시간 후l ed3=1; 소등되고 led1=0;(차량 적색불)R_PPI_B=0xf0;(보행자 초록불)로 변경되면 LCD판에 불이 바뀌었으니 건너도 좋다 라고 하고 싶었습니다.그런데 처음 신호를 주면 인터럽트 스위치를 누르기 전까지는 운행이 잘 되나인터럽트 스위치를 누르면 현재 진행중이던 프로그램 중에 작동되지 않고 한 번의 프로그래밍 후 눌렀던 인터럽트 스위치의 작동이 되면서led3 차량 녹색불 점등과 메세지만 뜨고 다른 작동을 안합니다.(버튼 누르면 계속 메세지만 리셋)추가로 신호등 작동중에 인터럽트를 눌러도 아무 반응이 없고 한 번의 진행이 끝나고 나서야 넘어갑니다.....어찌해야하나요
댓글 0
조회수 3,537등록된 댓글이 없습니다.