作者:jianji | 来源:互联网 | 2023-10-12 16:45
*******main.c*************************u8KeyValue0;externu8*LCD_Box[20];#defineRxSize9
*******main.c*************************
u8 KeyValue=0;
extern u8 *LCD_Box[20];
#define RxSize 9
extern u8 RxBuffer[RxSize];
extern u8 second;
extern u8 TimeSet;
int main(void)
{
unsigned char i;
u8 val;
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
//EXIT_Configuration();
USART1_Configuration();
USART3_Configuration();
TIMER_Configuration();
TIM_Cmd(TIM2, ENABLE);//TIM2_CH1---能量调节
TIM_Cmd(TIM4, ENABLE);//TIM4_CH3---IGBT调节
//PORTA_ENABLE-------PB5
//GPIO_SetBits(GPIOB, GPIO_Pin_5);
//GPIO_ResetBits(GPIOB, GPIO_Pin_5);
//PORTB_ENABLE-------PB6
//GPIO_SetBits(GPIOB, GPIO_Pin_6);
//GPIO_ResetBits(GPIOB, GPIO_Pin_6);
//PORT_SELECT____PB7
//GPIO_SetBits(GPIOB, GPIO_Pin_7);
//GPIO_ResetBits(GPIOB, GPIO_Pin_7);
LCD_On(1);
for(i=0;i<0xff;i++)
{
USART485_SendChar(i);
}
while(1)
{
val=LCD_Rdata(RxBuffer,LCD_Box);
HandSelct(val);
Initial_Mode();
//USART485_SendChar(0xa3);
//USART_SendChar(USART1,0X12);
hanfoot_switch(val);
YuRan(val);//标志位SetFlag[4]
//ChangePower(val);
SetPower();
ChangeIGBT(val);
WorkTime_Set(val);
Work_Switch();//标志位SetFlag[3]
while(((SetFlag&BIT3)==BIT3)&&((SetFlag&BIT4)==BIT4))//当开关被打开、预燃成功
{
val=LCD_Rdata(RxBuffer,LCD_Box);
YuRan(val);
ChangePower(val);
SetPower();
ChangeIGBT(val);
SetIGBT();
Work_Switch();
if(((SetFlag&BIT3)==BIT3)&&((SetFlag&BIT4)==BIT4))
{
Start();
WorkTime_Count(TimeSet);
//WorkTime_Display(second);
//Work_Switch();
}
/*
else if(((SetFlag&BIT3)!=BIT3)||((SetFlag&BIT4)!=BIT4))
{
Stop();
secOnd=0;
}
*/
}
if(((SetFlag&BIT3)!=BIT3)||((SetFlag&BIT4)!=BIT4))
{
Stop();
//secOnd=0;
}
}
}
*****************LCD.h***************************
//枪选择
u8 handnum=0;
void HandSelct(u16 value)
{
int t=0,i=0;
if(value=0x02)
{
t++;
if(*(*(LCD_Box+0)+8)==0x01)
{
handnum=1;
LCD_PicCmd[6]=0x04;
for(i=0;i<7;i++)
USART_SendData(USART1,LCD_PicCmd[i]);
}
else if(*(*(LCD_Box+0)+8)==0x02)
{
handnum=2;
LCD_PicCmd[6]=0x05;
for(i=0;i<7;i++)
USART_SendData(USART1,LCD_PicCmd[i]);
}
else if(*(*(LCD_Box+0)+8)==0x03)
{
handnum=3;
LCD_PicCmd[6]=0x06;
for(i=0;i<7;i++)
USART_SendData(USART1,LCD_PicCmd[i]);
}
if(t>=2)
*(*(LCD_Box+0)+5)=0x00;
}
*(*(LCD_Box+0)+5)=0x00;
}
这个程序是处理从TFT LCD屏上接收的数据,从TFT得到的数据通过LCD_Rdata函数放在变量val中,我单步调试运行到HandSelct(val)时,并进入该函数可以得到预期的结果,但如果是全速运行的话当执行了val=LCD_Rdata(RxBuffer,LCD_Box)后却不执行HandSelct(val)而跳到下一句,请问大家有谁知道这个问题?
我初步怀疑是“C/C++设置”中优先级的问题,但我试了几个优先级都不行,我从Level 0到Level 3都试了不行,请问大家问题出在什么地方?除了优先级以外还有其它可能的原因吗?
下面是一些程序及相关设置截图:
4 个解决方案
那估计是你做的延时时间不够,这个问题我也遇到过,操作I2C,延时时间不够就会写/读不成功,但调试是OK的。
遇到过你这种问题,应该是延时不够造成的,像这种一般都是时序的问题,你可以在单步合适但全速不合适的地方增加延时时间试试看。