Testseite „Embedded Blue Bridge Cup“: Probleme mit der LCD-Schnittstelle und der Modusumschaltung

Homepage des Autoren-Blogs
Autor: Eterlove
, Schlag auf Schlag, Aufzeichnung meines Studienlebens! Auf den Schultern von Giganten stehend
Dieser Artikel ist ein Original, bitte geben Sie die Quelle und den Autor für den Nachdruck an

Vorwort

       Für den alljährlichen Blue Bridge Cup sind Interface Switching und Mode Switching gängige Testpunkte und wurden in den letzten 10., 11. und 12. Provinzwettbewerben untersucht.Es braucht ein wenig Zeit, um es zu meistern.
       Die übliche Testmethode besteht darin, zwischen den beiden Schnittstellen von Datendaten und Paraparametern umzuschalten. Das Folgende ist ein Beispiel für die Embedded Design and Development Hochschulgruppe (Teil II) des 11. zweiten Landeswettbewerbs.

(1) Fachliche Anforderungen

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

B1: Definiert als Taste „Schnittstellenumschaltung“, LCD umschalten, um „Datenschnittstelle“ und Parameterschnittstelle anzuzeigen.
B4: Definiert als Taste „Modussteuerung“, Umschalten zwischen „manuellem Modus“ und automatischem Modus.

(2) Problemanalyse

Diese Art von Problem wird oft durch die Definition einer globalen Variablen Variable flag bit gelöst .

int Mode_Flag =1;     //模式切换标志 1为自动     0为手动
int Window_Flag = 1;  //界面切换标志 1为Data界面 0为Para界面

Das Umschalten erfolgt über die Schaltfläche, und das Ansteuern der Schaltfläche ist in zwei Arten unterteilt: Abfragetyp und Interrupt-Typ
Abfragetyp : In while() wird die GPIO_ReadInputDataBit-Funktion kontinuierlich zum Abfragen (oder Schaltflächenscan genannt ) durch Erkennen verwendet den Zustand der Schaltfläche, um den Wert des Flag-Bits umzuschalten.

#define B1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define B2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define B3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define B4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)

Interrupt-Typ : Schalten Sie den externen Interrupt ein und schalten Sie den Wert des Flag-Bits in der Interrupt-Service-Funktion um.

void EXTI0_IRQHandler(void)
{
    
      
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    
    
    /* Clear the  EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
    /*用户编写程序,按键按下是做什么事情?*/
	}
}

Schließlich beurteilen wir die Werte von Window_Flag und Mode_Flag durch if( ) in the big while(), um verschiedene Schnittstellen und Modi einzugeben.
Programmrahmen

while()
{
    
    
    if(Window_Flag==DATA ) //Data界面
		 {
    
    
			 if(Mode_Flag==Auto)  //自动模式
			 {
    
    
	     //进入Data界面下的自动模式的相关程序
			 }
			 else if(Mode_Flag==Manu)//手动模式
			 {
    
    
		 //进入Data界面下的手动模式的相关程序
			 }	 
		 }
	  
    if(Window_Flag==PARA) //Para界面
		 {
    
    
			 if(Mode_Flag==Auto)  //自动模式
			 {
    
    
			//进入Para界面下的手动模式的相关程序	
			 }
			 else if(Mode_Flag==Manu)//手动模式
			 {
    
    
			//进入Para界面下的手动模式的相关程序
			 }
		 }
 }
		

(3) Teilverfahren

Das Quellcodeprogramm übernimmt das Schlüsselscanverfahren

u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
void Key_Scan();
/*切换变量区*/
#define PARA  0
#define DATA  1
#define Auto  1
#define Manu  0

int Window_Flag = 1;  //界面切换标志 1为Data界面 0为Para界面
int Mode_Flag =2;     //模式切换标志 2为自动     3为手动


float Voltage = 0.00; //电压

float Duty1 = 0.10;   //PA6实际占空比
float Duty2 = 0.10;   //PA7实际占空比

int PA6_Duty = 10;    //表示占空比参数10%, 实际计算要除以100,  10/100=0.1=10%
int PA7_Duty = 10;
//sprintf()用来显示LCD所需要的数组
unsigned char Data_VoltageStr[20]={
    
    0};
unsigned char Para_PA6[20]={
    
    0};
unsigned char Para_PA7[20]={
    
    0};


int main(void)
{
    
    
	SysTick_Config(SystemCoreClock/1000);
	Delay_Ms(200);
	STM3210B_LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	Led_Control(LED_ALL , OFF);
	Key_Init();  
  Adc_Init();
	Led_Init();
	TIM3_TIM_OCMode_Toggle();

	while(1)
	{
    
    
		
		 Voltage = get_adc(100); //adc采集的电压
		 Key_Scan();  //按键扫描
if(Window_Flag==DATA ) //Data界面
		 {
    
    
			 if(Mode_Flag==Auto)  //自动模式
			 {
    
    
			  LCD_DisplayStringLine(Line0 ,(unsigned char *)"       Data          ");
    	      sprintf(Data_VoltageStr, "     %s%4.2fV         " ,"V:",Voltage);
              LCD_DisplayStringLine(Line2 ,Data_VoltageStr);
			  LCD_DisplayStringLine(Line4 ,(unsigned char *)"     Mode:AUTO");
			 }
			 else if(Mode_Flag==Manu)//手动模式
			 {
    
    
				 
			  LCD_DisplayStringLine(Line0 ,(unsigned char *)"       Data          ");
              sprintf(Data_VoltageStr, "     %s%4.2fV         " ,"V:",Voltage);
              LCD_DisplayStringLine(Line2 ,Data_VoltageStr);	
		      LCD_DisplayStringLine(Line4 ,(unsigned char *)"     Mode:MANU");
			 }
			 
		 }
	  
		 if(Window_Flag==PARA) //Para界面
		 {
    
    
			 if(Mode_Flag==Auto)  //自动模式
			 {
    
    
				 //自动模式:PA6 和 PA7 输出信号占空比相同,与R37值有关,不受按键控制
				 PA6_Duty = (Voltage/3.30)*100; 
    		     PA7_Duty = PA6_Duty;
				 LCD_DisplayStringLine(Line0 ,(unsigned char *)"       Para          ");
		         sprintf(Para_PA6, "     %s%d%c         " ,"PA6:",PA6_Duty,'%');
                 LCD_DisplayStringLine(Line2 ,Para_PA6);	
		         sprintf(Para_PA7, "     %s%d%c         " ,"PA7:",PA7_Duty,'%');
                 LCD_DisplayStringLine(Line4 ,Para_PA7);	
			 }
			 else if(Mode_Flag==Manu)//手动模式
			 {
    
    
				  //手动模式:PA6、PA7 输出信号占空比通过按键控制,与 VR37值无关
				 PA6_Duty = Duty1*100;
				 PA7_Duty = Duty1*100;
				 LCD_DisplayStringLine(Line0 ,(unsigned char *)"       Para          ");
		         sprintf(Para_PA6, "     %s%d%c         " ,"PA6:",PA6_Duty,'%');
                 LCD_DisplayStringLine(Line2 ,Para_PA6);	
		         sprintf(Para_PA7, "     %s%d%c         " ,"PA7:",PA7_Duty,'%');
                 LCD_DisplayStringLine(Line4 ,Para_PA7);	
			 }
		 }
  }
}

void Key_Scan()
{
    
    
		if(B1==0)
	 {
    
    
		  Delay_Ms(100);  //延时消抖
		 if(B1==0)
		 {
    
    
			 if(Window_Flag)        Window_Flag=0;
			 else if(!Window_Flag)  Window_Flag=1;
		 }				
	 }
	
	 
	else if(B2==0 && Window_Flag==PARA&& Mode_Flag==Manu)
	{
    
    
		Delay_Ms(100);
		if(B2==0 && Window_Flag==PARA && Mode_Flag==Manu)
		{
    
    
			if(PA6_Duty>=90) PA6_Duty = 10;
			else PA6_Duty += 10;
			
			Duty1= (float)PA6_Duty/100.00;
		}
	}
	
	
	else if(B3==0 && Window_Flag==PARA && Mode_Flag==Manu)
	{
    
    
		Delay_Ms(100);
		if(B3==0 && Window_Flag==0&& Mode_Flag==Manu)
		{
    
    
			if(PA7_Duty>=90) PA7_Duty = 10;
			else PA7_Duty += 10;
			
			Duty2= (float)PA7_Duty/100.00;
		}
	}
	
	else if(B4==0)
	 {
    
    
		  Delay_Ms(100);
		 if(B4==0)
		 {
    
    
			 if(Mode_Flag==Auto)     Mode_Flag=Manu;
			 else if(Mode_Flag==Manu)    Mode_Flag=Auto;
			 }			
		}
}
	
//毫秒延时函数
void Delay_Ms(u32 nTime)
{
    
    
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

Denken Sie daran, dass die Essenz von Makros die Textersetzung ist, die in der Vorverarbeitungsphase des Programms erfolgt, nicht in der Kompilierungsphase.

Supongo que te gusta

Origin blog.csdn.net/Eterlove/article/details/123807213
Recomendado
Clasificación