int main(void) { // Hardware Init delay_init(); //ÑÓʱº¯Êý³õʼ»¯ pwr_init(); #ifdef YANMING3 charger_init(); if (check_standby_flag() == SUCCESS && check_charging() != CHARGING) { Key_GPIO_Config(); exti_key_init(); #ifdef DEBUG_POWER_OFF_WAKE_UP Screen_Init(); OLED_Clear(); OLED_Display_On(); draw_about_mesage(); #endif check_standby_wakeup_button_press(); // If we boot up from standby by pressing 5 times, the system will reboot again without // this code block. } #endif // OLED Init Screen_Init(); OLED_Clear(); // low_switch_power_init(); TIMx_Int_DeInit(); EXTIX_DeInit(); // Key Key_GPIO_Config(); // PID related code ADC1_Configuration(); PWM_Configuration(); VoltagePID_Init(); TIMx_Int_Init(); rtc_init(); // Our Init system_init(); #ifndef YANMING3 //iwdg_init(); #endif while(1) { #ifndef YANMING3 //iwdg_feed(); #endif task_schedule(); } }
void oled_show(void) { OLED_Display_On(); //显示屏打开 //=============显示滤波器=======================// OLED_ShowString(00,0,"WAY-"); OLED_ShowNumber(30,0, Way_Angle,1,12); if(Way_Angle==1) OLED_ShowString(45,0,"DMP"); else if(Way_Angle==2) OLED_ShowString(45,0,"Kalman"); else if(Way_Angle==3) OLED_ShowString(45,0,"Hubu"); //=============显示温度=======================// OLED_ShowString(00,10,"Wendu"); OLED_ShowNumber(45,10,Temperature/10,2,12); OLED_ShowNumber(68,10,Temperature%10,1,12); OLED_ShowString(58,10,"."); OLED_ShowString(80,10,"`C"); //=============显示编码器1=======================// OLED_ShowString(00,20,"Enco1"); if( Encoder_Left<0) OLED_ShowString(45,20,"-"), OLED_ShowNumber(65,20,-Encoder_Left,5,12); else OLED_ShowString(45,20,"+"), OLED_ShowNumber(65,20, Encoder_Left,5,12); //=============显示编码器2=======================// OLED_ShowString(00,30,"Enco2"); if(Encoder_Right<0) OLED_ShowString(45,30,"-"), OLED_ShowNumber(65,30,-Encoder_Right,5,12); else OLED_ShowString(45,30,"+"), OLED_ShowNumber(65,30,Encoder_Right,5,12); //=============显示电压=======================// OLED_ShowString(00,40,"Volta"); OLED_ShowString(58,40,"."); OLED_ShowString(80,40,"V"); OLED_ShowNumber(45,40,Voltage/100,2,12); OLED_ShowNumber(68,40,Voltage%100,2,12); if(Voltage%100<10) OLED_ShowNumber(62,40,0,2,12); //=============显示角度=======================// OLED_ShowString(0,50,"Angle"); if(Angle_Balance<0) OLED_ShowNumber(45,50,Angle_Balance+360,3,12); else OLED_ShowNumber(45,50,Angle_Balance,3,12); //=============刷新=======================// OLED_Refresh_Gram(); }
/* *@功能:在空闲状态的几个任务 *1.检测是否有按键按下 *2.检测是否读到RFID *3.检测是否接受到串口传来的指令 *4.检测是否有USB连接到计算机上 *5.检测锂电池电压是否低电 共5个任务按各自的时间轴转动,基本上无冲突 */ void ST_Idle(void) { uint16_t ss_num=0; uint16_t power_num=0; uint16_t usb_bit; uint8_t key_r=KEYNO; uint8_t usb_r=0; uint8_t bt_r=0; uint8_t time_num=0; uint8_t p_c=0; uint8_t ss_flag=0; ResetKey(); //KeyNum是一个全局变量 //Init_KeyNumuber(); //Key_Num =KEYINIT //根据flsah中的信息,更改主菜单中的信息 SPI_FLASH_Read(HsMenu[1].Name,GROUP_INFORMATION,10); SPI_FLASH_Read(HsMenu[2].Name,KEY_INFORMATION,8); // //for debug // SPI_FLASH_Read(item,GROUP_INFORMATION,10); // UART1nSendChar(1,item,10); // delay_ms(1000); // //for dedug // SPI_FLASH_Read(item,KEY_INFORMATION,8); // UART1nSendChar(1,item,8); // delay_ms(1000); //for dedug // UART1nSendChar(1,HsMenu[1].Name,10); // delay_ms(1000); // UART1nSendChar(1,HsMenu[2].Name,8); // delay_ms(1000); OLED_Clear(); ShowMenuNoInverse(HsMenu); Main_Oled_Power(); Main_Oled_Time(); //Choose_MenuOp1(); //主界面显示 while(1) { // if(g_State!=ST_IDLE) // return; if(time_num==20) { Main_Oled_Time(); time_num=0; } ++time_num; delay_ms(50); //按键按下检测,如果有按键就按下就进入菜单操作 key_r =GetKey(); //判断是否有按键操作 if(ss_flag==0&&key_r==KEYNO) //超时关屏 { ss_num++; if(ss_num>=choosetime*6)//按下超过10秒钟 300/50=6 { OLED_Display_Off(); ss_flag=1; ss_num=0; } } if(ss_flag==1&&(key_r ==KEYCLEAR||key_r ==KEYSURE||key_r ==KEYDOWN||key_r == KEYUP)) { OLED_Display_On(); ss_flag=0; ResetKey(); key_r=KEYNO; } if(key_r !=KEYNO&&key_r !=KEYINIT) { //ResetKey(); //读完按键值后,将按键值复位 g_State =ST_LCDMENU; return; //按任意按键进入可选择菜单 } // //RFID检测 // nChar =Read_RfidData(2,Rfid_Buff,0xff); //非常重要的一点,是理解Trismit()的关键 // if(nChar >=3) // { // g_State =ST_KEY;return; //检测ID信息数据,如果读到了rfid数据,则将g_State置为st_key // } //检测上位机连接下位机命令,从菜单界面进入USB通信中 usb_r =UART1ReadFrm(1,g_Buff,MAX_BUFF); //USB串口1,g_Buff是一个全局变量;#define MAX_BUFF 520 if(usb_r==7&&g_Buff[0]==0xaa&&g_Buff[1]==0x75&&g_Buff[2]==0x0d&&g_Buff[3]==0x02&&g_Buff[4]==0x00&&g_Buff[5]==0x01&&g_Buff[6]==0xD1)//如果返回0x00就发下一条授权 { usb_bit=(USB_CHEAK&(GPIO_Pin_1))>>1; if(usb_bit==1) //USB插上 { bluetooth_uart_switch=0; pc_to_slave(); //上位机连接下位机的处理 g_State =ST_USB; //进入USB通信 return; } } bt_r =UART3ReadFrm(3,g_Buff,MAX_BUFF); //蓝牙串口2,g_Buff是一个全局变量;#define MAX_BUFF 520 if(bt_r==7&&g_Buff[0]==0xaa&&g_Buff[1]==0x75&&g_Buff[2]==0x0d&&g_Buff[3]==0x02&&g_Buff[4]==0x00&&g_Buff[5]==0x01&&g_Buff[6]==0xD1)//如果返回0x00就发下一条授权 { bluetooth_uart_switch=1; pc_to_slave(); //上位机连接下位机的处理;使用接受到的g_Buff // m_UB3; // m_UB3.RBuff; g_State =ST_USB; //进入USB通信 return; } usb_bit=(USB_CHEAK&(GPIO_Pin_1))>>1; if(usb_bit==1) //USB已经插上,即从蓝牙切换到USB bluetooth_uart_switch=0; //电池电量检测 power_num++; if( power_num==0x15) //0x15*20时Power_Cheak()才会返回有效值 { power_num =0; IWDG_Feed(); Main_Oled_Power(); //更新电池电量 p_c=Power_Cheak(); //此函数运行20次才返回有效值 if(p_c==4) //检测电池电压,如果电池电压过低,则进入关机模式,并进行提示 { // Main_Oled_Time(); // Main_Oled_Power(); OLED_Show_LowBattry(); //延时1s后关机 g_WaitTimeOut = 0; SetTimer(TIMER_TIMEOUT,100,Do_TimeOut,THREE_MIN); while( g_WaitTimeOut == 0 ) { IWDG_Feed(); } KillTimer(TIMER_TIMEOUT); Sys_Enter_Standby(); } } }