MSP430F4250中断问题
采用的是MSP430F4250 P1.4,P1.3,P1.2为中断按键; Init_LCD()为LCD初始化函数; 当在主函数中启用Init_LCD()后,P1.4管脚不停的中断执行中断函数中的if(P1IFG == BIT4)P6OUT ^= BIT7;; 当在主函数中屏蔽Init_LCD()后,工作正常; 于是怀疑是对Init_LCD()内的语句逐条屏蔽,发现当屏蔽LCDAVCTL1 = VLCD_3_32; 此条语句时,按键工作正常!但是LCD无法正常工作! 再次改善程序,屏蔽P1.4中断,开启P1.3和P1.2中断,开启Init_LCD()函数,发现中断按键无法正常工作!(怀疑可能是中断仍然在触发!)
#include#pragma vector = PORT1_VECTOR __interrupt void Port_1(void) { volatile unsigned int i; for (i = 0; i < 30000; i++); // Delay for 32 kHz crystal to if(P1IFG == BIT4)P6OUT ^= BIT7; if(P1IFG == BIT3)P6OUT ^= BIT7; if(P1IFG == BIT2)P6OUT ^= BIT7; P1IFG = 0X00; } //------------------------------------------------------------------------------ // LCD初始化函数 //------------------------------------------------------------------------------ void Init_LCD() { P5SEL = 0xFF; // Set COM pins for LCD P2SEL = 0xFF; LCDACTL = LCDON + LCD4MUX + LCDFREQ_64; // 4mux LCD, ACLK/64 LCDAPCTL0 = 0x0F; // Segs S0-S15 = outputs LCDAVCTL0 = LCDCPEN; // Enable LCDA charge pump LCDAVCTL1 = VLCD_3_32; } void main(void) { volatile unsigned int i; // volatile在编程源代码时,对这个变量不要使用优化 WDTCTL = WDTPW + WDTHOLD; // 停止看门狗 FLL_CTL0 |= XCAP14PF; for (i = 0; i < 10000; i++); // Delay for 32 kHz crystal to P6DIR |= BIT7; //P6.7为输出; P6OUT &= ~BIT7; //P6.7输出0; P1IE |=0X1C; //P1.4、P1.3、P1.2中断开启; P1IES &= ~0X1C; //下降沿触发中断; P1IFG &= ~0X1C; //清除中断标志位; _EINT(); Init_LCD(); //LCD初始化函数 for(;;); }
求大虾指教!非常感谢!!!求大虾指教!非常感谢!!!
灰小子:
楼主你好,能提供下电路图吗?
只从代码看不出有什么问题。
hsiangtong young1:
回复 灰小子:
图纸如上,感谢了!
hsiangtong young1:
回复 灰小子:
你好!图纸我发在下面的回复里面了!麻烦你了!
hsiangtong young1:
回复 灰小子:
你好!图纸我发在下面的回复里面了!麻烦你了!
灰小子:
回复 hsiangtong young1:
我觉得应该是在io中断服务程序中,你使用了一个循环进行长时间延时的原因。
建议你把这个延时改成用定时器来处理。
Ken Wang:
回复 hsiangtong young1:
楼主,
看了你的程序,有两个小的建议:
1. 把使能中断的语句放到初始化LCD的语句之后。
2. 可以尝试使用定时器中断检测来是实现具备软件消抖的按键功能。在中断处理程序中,一般不建议加入延时程序。
谢谢
hsiangtong young1:
回复 灰小子:
今天将延时屏蔽后,还是同样的情况!问题主要是在Init函数,逐句屏蔽,发现
//LCDAVCTL0 = LCDCPEN; // Enable LCDA charge pump LCDAVCTL1 = VLCD_3_44; // to 3.44V
此两句任意一句屏蔽(即不开启LCD),则按键中断就正常,但是LCD也不工作,
hsiangtong young1:
回复 Ken Wang:
你好!我按照你所说的将中断使能函数置于LCD初始化函数之后,现在中断语句中的延时已经屏蔽了,仍然是同样的现象!
hsiangtong young1:
回复 Ken Wang:
现在测量发现,开启LCD和中断后,P1.4脚的电压为2.6V左右,P1.2、P1.3均为3V,是否有可能是DAC不断输出低电平导致P1.4不断中断呢?
求大虾指教!谢谢!
Ken Wang:
回复 hsiangtong young1:
楼主,
2.6V也算是高电平了。你的供电电路用怎么样的,电源芯片的供的电流有多大呢?
你用示波器监控下P1.4管脚的电压,看不会不出现高低电平不断切换的波形?
谢谢