一个仪器通过按键设置参数(写eeprom)时,无法用外部中断,就是设置的四个数字,比如设置到第二个数字时,不想设置了,想退出,但是退不出来,只有设置完四个数字后才退出设置状态,用外部中断也打不断
#define s1 PB_IDR_bit.IDR7 #define s2 PB_IDR_bit.IDR4 #define s3 PB_IDR_bit.IDR0 #define s4 PB_IDR_bit.IDR6//PD_IDR_bit.IDR6
void KEY2Init() //PB0做外部中断 { PB_DDR_bit.DDR0 = 0; // PB_CR1_bit.C10 = 1; //GPB->PIN2 PB_CR2_bit.C20 = 1; //1 //GPB->PIN2 EXTI_CR1_bit.P0IS = 2;//2 //Portx EXTI_CONF_bit.PBLIS = 0; //PB[3:0] } #pragma vector = EXTI0_vector //2 //外部中断线2_中断向量号 __interrupt void GPIOB_Line0_IRQHandler(void) //2 { if(EXTI_SR1_bit.P0F == 1) //2 { delay(2000); if(EXTI_SR1_bit.P0F == 1) { EXTI_SR1_bit.P0F = 1;//清除中断标志 //PD_ODR_bit.ODR3 = 0; //关背开 //delay(1500); //delay(1500); //PD_ODR_bit.ODR3 = 1; //关背光 if(te == 0) te = 1; else te = 0; //if(PB_ODR_bit.ODR0 == 0)delay(300); //LED4_ON(); //delay(100); //LED4_OFF(); //delay(100); } } }
void EEPROM_Word_Write(unsigned int address , unsigned char *data)
{ eepromaddress = address; FLASH_CR1_bit.FIX = 1; //设定编程时间为标准编程时间 //MASS 密钥,解除EEPROM的保护 FLASH_DUKR = 0xae; //P FLASH_DUKR = 0x56; //P FLASH_CR2_bit.WPRG = 1; //设置字编模式 *((unsigned int *)address) = data[0]; //写第一个字节 //char //while(FLASH_IAPSR_bit.EOP == 1); *(((unsigned int *)address) + 1) = data[1]; //写第二个字节 //while(FLASH_IAPSR_bit.EOP == 1); *(((unsigned int *)address) + 2) = data[2]; //写第三个字节 //while(FLASH_IAPSR_bit.EOP == 1); *(((unsigned int *)address) + 3) = data[3]; //写第四个字节 while(FLASH_IAPSR_bit.EOP == 1); //等待编程结束 } void ADC_key_t(void) { uchar mr=0x2d,mt=0x25,mm=0x1c,me=0x13; uchar mh=0x01; //0x02 uchar Di=0; // delay(2000); // if(s1==0) return; //PD_ODR_bit.ODR3 = 0; clear_screen(); if(s2 == 0x00) // { //PD_ODR_bit.ODR3 = 0; //delay(200); Di=0; while(s2 != 0x00) {delay(200); FeedTheIWDog(); } while(s2 == 0x00) { delay(300);//while(PA_IDR_bit.IDR4 == 0x00); Di++; if(Di==10) Di=0; if(Di==0){display_graphic_8x16(mh,mr,ing0);} if(Di==1){display_graphic_8x16(mh,mr,ing1);} //Dgh_kong; if(Di==2){display_graphic_8x16(mh,mr,ing2);} if(Di==3){display_graphic_8x16(mh,mr,ing3);} if(Di==4){display_graphic_8x16(mh,mr,ing4);} if(Di==5){display_graphic_8x16(mh,mr,ing5);} if(Di==6){display_graphic_8x16(mh,mr,ing6);} if(Di==7){display_graphic_8x16(mh,mr,ing7);} if(Di==8){display_graphic_8x16(mh,mr,ing8);} if(Di==9){display_graphic_8x16(mh,mr,ing9);} delay(5000); //FeedTheIWDog(); } D_data[0]=S_qianwei = Di;//设置千位 // EEPROM_Word_Write(0x1000, D_data); //------------------------------------------------ while(s2 != 0x00) {delay(200); FeedTheIWDog(); } while(s2 == 0x00) { Di++; if(Di==10) Di=0; if(Di==0){display_graphic_8x16(mh,mt,ing0);} if(Di==1){display_graphic_8x16(mh,mt,ing1);} if(Di==2){display_graphic_8x16(mh,mt,ing2);} if(Di==3){display_graphic_8x16(mh,mt,ing3);} if(Di==4){display_graphic_8x16(mh,mt,ing4);} if(Di==5){display_graphic_8x16(mh,mt,ing5);} if(Di==6){display_graphic_8x16(mh,mt,ing6);} if(Di==7){display_graphic_8x16(mh,mt,ing7);} if(Di==8){display_graphic_8x16(mh,mt,ing8);} if(Di==9){display_graphic_8x16(mh,mt,ing9);} //display_graphic_8x16(0x04,0x50,Dgh_kong); delay(2000); //FeedTheIWDog(); } D_data[1]=S_baiwei = Di;//设置百位 //EEPROM_Word_Write(0x1000, D_data); //------------------------------------------------- while(s2 != 0x00) {delay(200); FeedTheIWDog(); } while(s2 == 0x00) { Di++; if(Di==10) Di=0; if(Di==0){display_graphic_8x16(mh,mm,ing0);} if(Di==1){display_graphic_8x16(mh,mm,ing1);} if(Di==2){display_graphic_8x16(mh,mm,ing2);} if(Di==3){display_graphic_8x16(mh,mm,ing3);} if(Di==4){display_graphic_8x16(mh,mm,ing4);} if(Di==5){display_graphic_8x16(mh,mm,ing5);} if(Di==6){display_graphic_8x16(mh,mm,ing6);} if(Di==7){display_graphic_8x16(mh,mm,ing7);} if(Di==8){display_graphic_8x16(mh,mm,ing8);} if(Di==9){display_graphic_8x16(mh,mm,ing9);} delay(2000); //FeedTheIWDog(); } //------------------------------------------------- D_data[2]=S_shiwei = Di;//设置十位 //EEPROM_Word_Write(0x1000, D_data); //------------------------------------------------- while(s2 != 0x00) {delay(200); //FeedTheIWDog(); } while(s2 == 0x00) { Di++; if(Di==10) Di=0; if(Di==0){display_graphic_8x16(mh,me,ing0);} if(Di==1){display_graphic_8x16(mh,me,ing1);} if(Di==2){display_graphic_8x16(mh,me,ing2);} if(Di==3){display_graphic_8x16(mh,me,ing3);} if(Di==4){display_graphic_8x16(mh,me,ing4);} if(Di==5){display_graphic_8x16(mh,me,ing5);} if(Di==6){display_graphic_8x16(mh,me,ing6);} if(Di==7){display_graphic_8x16(mh,me,ing7);} if(Di==8){display_graphic_8x16(mh,me,ing8);} if(Di==9){display_graphic_8x16(mh,me,ing9);} delay(2000); //FeedTheIWDog(); } D_data[3] = S_gewei = Di; //设置个位 //--------------------------------------------------- S_Data = S_qianwei*1000 + S_baiwei*100 + S_shiwei*10 + S_gewei;//设置的参数 EEPROM_Word_Write(0x1000, D_data); } } int main(void) { CLK_CKDIVR = 0x00; //内部时钟为1分频 = 16Mhz asm("sim"); //关闭系统总中断 LED1_Init(); KEY1Init(); ADC_Init(); Timer4Init(); KEY2Init(); KEY6Init(); eepromaddress = 0x1000; //设EEPROM的首地址为0X1000 D_data[0] = *((unsigned int*)eepromaddress); //读第一个字节数据 D_data[1] = *(((unsigned int*)eepromaddress) + 1); //读第二个字节数据 D_data[2] = *(((unsigned int*)eepromaddress) + 2); //读第三个字节数据 D_data[3] = *(((unsigned int*)eepromaddress) + 3); //读第四个字节数据 Ddata_read ();//液晶屏显示数据 //-------------------------------------------- S_Data = D_data[0]*1000 + D_data[1]*100 + D_data[2]*10 + D_data[3]; //------------------------------------------------------- asm("rim"); //打开系统总中断 while(1) { if((s1==1)&&(s2==0)) {delay(200);PD_ODR_bit.ODR3 =!PD_ODR_bit.ODR3;} //********************************************************************************************************** if((s1==0)&&(s2==1)) {delay(200);PD_ODR_bit.ODR4 = !PD_ODR_bit.ODR4;} //********************************************************************************************************** if((s1==0)&&(s2==0)) {PD_ODR_bit.ODR3 = 0;PD_ODR_bit.ODR4 = 0; ADC_key_t();PD_ODR_bit.ODR3 = 1; } //fg=0; } }
您有Code可以上傳描述嗎?
看文字描述不太清楚問題在哪
EEPROM是走One Wire,以時序來傳送Data,
不管ISR還是Busy waiting,
可隨時中斷傳輸的,
但具體要看您寫法,
以上可再討論
看一下代码吧,应该是做了限制了的。
应该是写EEPROM时关中断了吧。
会判断是不是设置完成了4个数,设置完了再开中断,没有设置完就等着。
你要启用外部中断才行,这个在程序里面就要实现,就是说你在程序里面用一个中断跳转指令,一旦检测到退出的信号就跳出循环设置
找个程序给你吧,参考一下这篇文章http://www.doc88.com/p-087373540971.html