我用的是EasyARM615,编译环境IAR,昨天我写了一段程序,程序的作用如下:系统默认初始显示值为30,用户根据自己的要求在一段时间内通过按下KEY2和KEY3来改变默认值,按下key2为加1,按下key3为减1,按后刷新显示屏,按下KEY4为设定完毕,此时,按下KEY2和KEY3不会改变设定值。可设定的范围在10到50之间,如果设定时间内无按键操作,显示值将衡定为为30。程序如下:<br />#include "hw_types.h"<br />#include "hw_memmap.h"<br />#include "hw_gpio.h"<br />#include "hw_ints.h"<br />#include "sysctl.h"<br />#include "I2CINT.H"<br />#include "PCF8576.H"<br />#include "LCD_TH3144.H"<br />#include "hw_adc.h"<br />#include "gpio.h"<br />#include "adc.h"<br />#include "debug.h"<br /><br />#define KEY GPIO_PIN_4<br />#define KEY2 GPIO_PIN_5<br />#define KEY3 GPIO_PIN_5<br />#define KEY4 GPIO_PIN_4<br />void Go2Jtag(void)//防止jtag死锁<br />{<br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);<br /> GPIODirModeSet(GPIO_PORTD_BASE,KEY,GPIO_DIR_MODE_IN);<br /> if(GPIOPinRead(GPIO_PORTD_BASE,KEY)==0)<br /> {<br /> while(1);<br /> }<br />}<br /><br />void delay(unsigned int n) // 软件延迟函数<br />{<br /> volatile int i;<br /> for(;n>0;n--)<br /> {<br /> for(i=0;i<1000;i++);<br /> }<br />}<br /><br /><br />int SetTemp=30;//设定初始显示值<br /><br /><br />void PlusOne(void) //设定显示值加1中断函数<br />{<br /> int SetTempH;//十位数<br /> int SetTempL;//个位数<br /> GPIOPinIntClear(GPIO_PORTD_BASE,KEY2);//清除中断<br /> if(SetTemp>50)//如果设定显示值已经大于50,显示“错误”<br /> {<br /> Lcd_Seg.D1 = HexToSeg(0xe); <br /> }<br /> else<br /> {<br /> SetTemp++;<br /> SetTempH=SetTemp/10;<br /> SetTempL=SetTemp%10;<br /> Lcd_Seg.D1 = HexToSeg(SetTempH); <br /> Lcd_Seg.D2 = HexToSeg(SetTempL)+LCD_DP;<br /> Lcd_Seg.D3 = HexToSeg(0);<br /> Lcd_Seg.D4 = HexToSeg(0); <br /> }<br /> Lcd_Update();//到这里有问题了!!!!!!!!!!!!!!!问题见最后<br />}<br />void SubOne(void) //设定初始值减1中断函数<br />{<br /> int SetTempH;//SetTemp的十位数<br /> int SetTempL;//SetTemp个位数<br /> GPIOPinIntClear(GPIO_PORTB_BASE,KEY3);//清除中断<br /> if(SetTemp<10)//如果设定值已经小于10,显示“错误”<br /> {<br /> Lcd_Seg.D1 = HexToSeg(0xe); <br /> }<br /> else<br /> {<br /> SetTemp--;<br /> SetTempH=SetTemp/10;<br /> SetTempL=SetTemp%10;<br /> Lcd_Seg.D1 = HexToSeg(SetTempH); <br /> Lcd_Seg.D2 = HexToSeg(SetTempL)+LCD_DP;<br /> Lcd_Seg.D3 = HexToSeg(0);<br /> Lcd_Seg.D4 = HexToSeg(0);<br /> }<br /> Lcd_Update();();//到这里有问题了!!!!!!!!!!!!!!!问题见最后<br /><br />}<br /><br />void StopWatingForInt(void) //退出等待加减中断<br />{<br /> GPIOPinIntClear(GPIO_PORTA_BASE,KEY4);//清除中断<br /> GPIOPinIntDisable(GPIO_PORTD_BASE,KEY2);//禁能中断<br /> GPIOPinIntDisable(GPIO_PORTB_BASE,KEY3);<br />}<br /><br />int main(void)<br />{<br /> <br /> I2CInit(100000, 1);<br /> if(PCF8576_Ini(MODE_E, NOGLITTER)!=1) // 初始化PCF8576驱动<br /> { while(1); }<br /> Lcd_Seg.D1 = HexToSeg(3); //显示初值<br /> Lcd_Seg.D2 = HexToSeg(0)+LCD_DP;<br /> Lcd_Seg.D3 = HexToSeg(0);<br /> Lcd_Seg.D4 = HexToSeg(0);<br /> Lcd_Update(); <br /> Go2Jtag();<br /> SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);<br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);<br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);<br /> GPIODirModeSet(GPIO_PORTD_BASE,KEY2,GPIO_DIR_MODE_IN);<br /> GPIODirModeSet(GPIO_PORTB_BASE,KEY3,GPIO_DIR_MODE_IN);<br /> GPIODirModeSet(GPIO_PORTA_BASE,KEY4,GPIO_DIR_MODE_IN);<br /> GPIOIntTypeSet(GPIO_PORTD_BASE,KEY2,GPIO_FALLING_EDGE);<br /> GPIOIntTypeSet(GPIO_PORTB_BASE,KEY3,GPIO_FALLING_EDGE);<br /> GPIOIntTypeSet(GPIO_PORTA_BASE,KEY4,GPIO_FALLING_EDGE);<br /> GPIOPortIntRegister(GPIO_PORTD_BASE,PlusOne);//注册中断处理程序函数<br /> GPIOPortIntRegister(GPIO_PORTB_BASE,SubOne);<br /> GPIOPortIntRegister(GPIO_PORTA_BASE,StopWatingForInt);<br /> GPIOPinIntEnable(GPIO_PORTD_BASE,KEY2);<br /> GPIOPinIntEnable(GPIO_PORTB_BASE,KEY3);<br /> GPIOPinIntEnable(GPIO_PORTA_BASE,KEY4);<br /> delay(10000);//等待时间<br />}<br />可是当我按下key2后,程序执行到ISR(任何一个)的Lcd_Update()就走不下去了,我在调试的时候,发现这是由于在执行Lcd_Update()中的ISendByte(PCF8576, drive)函数即器件的选择与控制时出现了问题:似乎因控制PCF8576的数据一直都没有传送完成而停留在了while(I2C_state != STATE_IDLE)这一循环语句上。这是为什么阿?<br /> |
|