⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 基于ARM7的直流电机的驱动,还有FLASH驱动,LCD驱动等
💻 C
📖 第 1 页 / 共 3 页
字号:
	      OutString(70+i*120,417,str1[i]);
	  if(Tab==3)
	    for(i=0;i<2;i++)
	      OutString(190+i*240,417,str5[i]);
	}
	else
	{
	  if(Tab==0)
	    for(i=0;i<2;i++)
	      OutString(190+i*240,417,str6[i]);
	  if(Tab==1)
	    for(i=0;i<5;i++)
	      OutString(70+i*120,417,str2[i]);
      if(Tab==2)
        for(i=0;i<5;i++)
	      OutString(70+i*120,417,str3[i]);
	  if(Tab==3)
	    for(i=0;i<2;i++)
	      OutString(190+i*240,417,str7[i]);
	}      

}

uint JS_H(uchar *a,uchar i)
{
   int j,sum=0;
   for(j=0;j<i;j++)
     sum+=a[j];
   return sum;
}

//显示菜单选项 共 MenuMaxNum 行 一次显示8行 next 代表起始行数  隔行显示

void LCD_Menu(uchar i)
{

    char str[MenuMaxNum][10]={
    "--步进--","-- VD --","-- CYL--","测量方式","自动次数",
    "角膜曲率","屏幕亮度","按键声音","输出打印",
    "号码打印","--预览--","屏幕保护","用户信息","日期格式",
    "时间模式","设置日期","设置时间","设置语言","附加功能",
    };
    char str1[MenuMaxNum][40]={
    "SETP","--VD--","--CYL--","CLFF","AUTO NUM",
    "-JMQL-","SCREEN LIGHT","SOUND","PRINT",
    "NUM PRINT","-Y L-","SCREEN","USER INFO","DATA MODE",
    "TIME MODE","SET DATA","SET TIME","SET LANGUAGE","ADD GN",
    };
	uint j;
	if(Language==1)
	  for(j=0;j<8;j++)
	    OutString(menu_x+16,menu_y+j*32,str[j+i-1]);
	else
	  for(j=0;j<8;j++)
	    OutString(menu_x+16,menu_y+j*32,str1[j+i-1]);
}

// 显示帮助内容 i 选择码 行距为5

void LCD_HELP(uint i)
{
    char str[MenuMaxNum][40]={
    "调整步进电机步进长度","选择不同测试类型","我也不明白?","测量方式好多种阿","可以测几次",
    "角膜曲率","屏幕亮度","按键声音","输出打印",
    "号码打印","时间预览","屏幕保护","用户信息","日期格式",
    "时间模式","设置日期","设置时间","设置语言","附加功能",
    };
    char str1[MenuMaxNum][40]={
    "fdjkhfkh","english","I KNOW","I KNOW","I KNOW",
    "I KNOW","I KNOW","sound","printf",
    "I KNOW","I KNOW","I KNOW","I KNOW","I KNOW",
    "I KNOW","I KNOW","I KNOW","I KNOW","I KNOW",
    };
    
    CLR_Help();
    if(Language==1)
      OutString(help_x,help_y,str[i-1]);
    else
      OutString(help_x,help_y,str1[i-1]);
  
}

// 显示设置内容 i 选择码 行距为5

void LCD_SETTING(uint i)
{
    uchar a,b,c=0; 
    //选项宽度最好不超过6个字
    char str[60][40]={
    "调整马达步进长度","0.25","0.12",
    "设置VD类型","默认","欧洲人","隐型眼镜",
    "-- CYL设置--",
    "测量方式","手动测量默认值","自动测量","自动测量+打印",
    "自动次数","1次","3次","5次","7次",
    "角膜曲率",
    "屏幕亮度","1<最亮>"," 2 "," 3 ","4<最暗>",
    "按键声音","OFF(关)","MID(中)","ON(响)",
    "输出打印","ALL","IMG()","ECONO()","OFF()",
    "号码打印","ON()","OFF()","RESET()",
    "--预览--",
    "屏幕保护","OFF()","3分钟","5分钟","10分钟",
    "用户信息",
    "日期格式","-Y-M-D-","-D-M-Y","-M-D-Y",
    "时间模式","12H()","24H()",
    "设置日期",
    "设置时间",
    "请选择操作语言","中文","ENGLISH",
    "附加功能",
    };
    char str1[60][40]={
    "SET-MOTOR","0.25","0.12",
    "SET-VD-TYPE","默认","欧洲人","隐型眼镜",
    "-- CYL设置--",
    "CL MODE","手动测量默认值","自动测量","自动测量+打印",
    "AUTO NUM","1次","3次","5次","7次",
    "JMQL",
    "SCREEN","1<MAX>"," 2 "," 3 ","4<MIN>",
    "SOUND","OFF(关)","MID(中)","ON(响)",
    "OUT PRINT","ALL","IMG()","ECONO()","OFF()",
    "NUM PRINT","ON()","OFF()","RESET()",
    "--预览--",
    "SCREEN","OFF()","3 M","5 M","10 M",
    "USERING INFORMATION",
    "DATA MODE","-Y-M-D-","-D-M-Y","-M-D-Y",
    "TIME MODE","12H()","24H()",
    "SETTING DATE",
    "SETTING TIME",
    "SETTING LANGUAGE","中文","ENGLISH",
    "附加功能",
    };
    uint x,y;
    x=set_x+16;
    y=set_y+16;
    if(select_num[i-1]!=0 && select_num[i-1]<=6)    //选择模式
    {
      if(Language==1)                                                    //中文
      {
        OutString(x+48,y,str[i-1+JS_H(select_num,i-1)]);
        for(a=1;a<=select_num[i-1];a++) 
          {
            int j=a;
            b=i-1+JS_H(select_num,i-1)+a;
            if(j>3)
            {
              c=1;
              j-=3;
            }
            
            DrawRect(x+8+144*c,y+32*j,x+8+144*c+10,y+32*j+10,44);
            OutString(x+22+144*c,y+32*j,str[b]);  
          }
      }
      else
      {         
        OutString(x+48,y,str1[i-1+JS_H(select_num,i-1)]);
        for(a=1;a<=select_num[i-1];a++) 
          {
            int j=a;
            b=i-1+JS_H(select_num,i-1)+a;
            if(j>3)
            {
              c=1;
              j-=3;
            }
            DrawRect(x+8+144*c,y+32*j,x+8+144*c+10,y+32*j+10,44);
            OutString(x+22+144*c,y+32*j,str1[b]);  
          }
       }
      
    }
    if(select_num[i-1]==0||select_num[i-1]>6)   //调整模式
    {
    }
    
}


/******************** 按键 操作 ***********************/


/*保存键*/

void LCD_Save_Data(uint *Data_Temp)
{
  int i;
  for(i=0;i<MenuMaxNum;i++)
    Data[i]=Data_Temp[i];
}

void LCD_Temp_Save(uint *Data_Temp,uint i,uint local_i)
{
  Data_Temp[i-1]=local_i;
}

/*下移键*/

void LCD_MOVEDOWN(uint *a,uint *b)
{
   int p,q;
   p=*a;
   q=*b;
   if(q==MenuMaxNum&&p==8) return;
   if(p==8)
   {
     q++;
     CLR_Menu();
     LCD_Menu(q-7);
     LCD_Select(8);
     *b=q;
   }
   else
   {
     LCD_Select(p++);
     LCD_Select(p);
     q++;
     *a=p;
     *b=q;
   }      
}

/*上移键*/

void LCD_MOVEUP(uint *a,uint *b)
{
   int p,q;
   p=*a;
   q=*b;
   if(p==1&&q==1) return;
   if(p==1)
   {
     q--;
     CLR_Menu();
     LCD_Menu(q);
     LCD_Select(1);
     *b=q;
   }
   else
   {
     LCD_Select(p--);
     LCD_Select(p);
     q--;
     *a=p;
     *b=q;
   }
}

/*进入键*/

void LCD_Enter(uint i)
{
   SET_Enter();
   LCD_SETTING(i);
}

/*保存键*/

void LCD_Save()
{
  LCD_Board_P();
  Draw_Board();
  drawbmp(Board_x+70,Board_y+20,save,sizeof(save));
  OutString(Board_x+34,Board_y+80,"确定要保存吗?");
}

/*退出键*/

void LCD_Exit()
{
  LCD_Board_P();
  Draw_Board();
  drawbmp(Board_x+70,Board_y+20,exit,sizeof(exit));
  OutString(Board_x+30,Board_y+80,"确定要直接退出吗?");
}

// 按键处理
void DoKey(UCHAR KeyValue)
{
	void SelectState(UCHAR); 
	switch(CurState)
	{
		// 设置模式下的相应处理
		case SETSTATE:
			
			//第一层按键操作
			if(Layle==1)             
	        {
	    	   	if(KeyValue==32)   //上键
	           	{   
	           		Button_Press(1);
	             	LCD_MOVEUP(&local,&i);
	             	LCD_HELP(i);
	             	LCD_Scroll_UP(i);
	           	}
	    	   	if(KeyValue==1)     //下键
	           	{   
	             	Button_Press(2);
	             	LCD_MOVEDOWN(&local,&i);
	             	LCD_HELP(i);
	             	LCD_Scroll_DOWN(i);
	           	}
	           	if(KeyValue==16)   //进入键
	           	{
	             	CLR_Setting();
	             	Button_Press(3);
	             	Button_Change(2);
	             	LCD_Enter(i);
	            	Change_Set_Iint(i,Data_Temp);
	             	local_i=Data_Temp[i-1];
	            	Layle=2;
	           	}
	           	if(KeyValue==4)    //保存键
	          	{
	             	Button_Press(4);
	             	Button_Change(3);
	             	LCD_Save();
	             	Layle=3;
	           	}
	           	if(KeyValue==64)    //退出键
	           	{
	             	Button_Press(5);
	             	Button_Change(0);
	             	LCD_Exit();
	             	Layle=4;
	        	}
	        }
	        
	        //第二层按键操作
	      	if(Layle==2)             
	      	{
	   		   	if(KeyValue==32)   //改变数值+
	           	{
		             Button_Press(1);
		             if(select_num[i-1]!=0)
		               Change_Set_Up(&local_i);
	           	}
	           	if(KeyValue==1)   //改变数值-
	           	{
		             Button_Press(2);
		             if(select_num[i-1]!=0)
		               Change_Set_Down(i,&local_i);
	           	}
	           	if(KeyValue==4)   //保存修改数据
	           	{
		             Button_Press(4);
		             Button_Change(1);
		             LCD_Temp_Save(Data_Temp,i,local_i);
		             LCD_Board_P();
		             Draw_Board();
		             drawbmp(Board_x+70,Board_y+20,exit,sizeof(exit));
		             OutString(Board_x+40,Board_y+80,"设置成功!");
		             tm_delay(100);
		             LCD_Board_V();
		             if(i==18)          //修改显示生效
		             {
		               L_Tab=2;         //改变语言标记
		               //LcdMain();
		               SelectState(SETSTATE);
		             }
		             Layle=1;
		             //LcdMain();
		             SelectState(SETSTATE);
	           	}
	           	if(KeyValue==64)  //返回第一层
	           	{
		             CLR_Setting();
		             Button_Press(5);
		             Button_Change(1);
		             Layle=1;
		             drawbmp(menu_x+290,menu_y+30,logo,sizeof(logo));
	           	}     
	      	}
	      	
	      	//顶层保存层
	      	if(Layle==3)           
	      	{
	         	if(KeyValue==1)   //确认
	            {
		             Button_Press(2);
		             LCD_Save_Data(Data_Temp);
		             Draw_Board();
		             drawbmp(Board_x+70,Board_y+20,set_ok,sizeof(set_ok));
		             OutString(Board_x+40,Board_y+80,"保存成功!");
		             tm_delay(100);
		             LCD_Board_V();
		             Button_Change(1);
		             Layle=1;
	            }
	         	if(KeyValue==4)   //返回 
	            {
		            Layle=1;
		            Button_Press(4);
		            Button_Change(1);
		            LCD_Board_V();
	            }     
	      	}
	      	
	      	//顶层退出层
	      	if(Layle==4)           
	      	{
	           	if(KeyValue==1)   //确认
	           	{
		             Button_Press(2);
		             L_Tab=1;  
	          	}
	           	if(KeyValue==4)   //返回 
	           	{
		             Layle=1;
		             Button_Press(4);
		             Button_Change(1);
		             LCD_Board_V();
	          	}  
	        }  
			break;
		case 2:
			break;
	}
}

// 设置状态初始化
void SetStateInit(void)
{
	if(L_Tab==1)
       LCD_Data_Iint(Data_Temp);        //导入设置值
    Language=Data_Temp[17];             //语言选择
    Lcd_Clr();                          //LCD 清屏                         
    SetTextColor(2);                    //设置前景色 即边框颜色
    LCD_Menu_Iint();                    //彩单边框初始化
    LCD_Menu(1);                        //显示选项
    LCD_Select(1);                      //选中第一项
    LCD_HELP(1);                        //显示帮助
    LCD_Scroll_Iint();                  //画滚动
    Button_Change(1);                   //画按键
    drawbmp(set_x+50,set_y+30,logo,sizeof(logo));//公司标志
}

// 状态选择
void SelectState(UCHAR CurState)
{
	switch(CurState)
	{
		case SETSTATE:
			SetStateInit();
			break;
		case 2:
			break;	
	}
}

// 状态刷新
void UpdateState(UCHAR CurState)
{
	switch(CurState)
	{
		case SETSTATE:
			break;
	}
} 

// LCD初始化
void Lcd_Init(void)
{
	UINT	fb = (UINT)DC - (LCD_XSIZE*32+12);

	// 设置LCD颜色数、分辨率、显存地址
	rLCDCON1 = (0)|(1<<2)|(0<<3)|(1<<4)|(DISMOD_8BITS<<5)|(0<<7)|(0x0<<8)|(0x0<<10)|(CLKVAL_MONO<<12);
	rLCDCON2 = (LINEVAL)|(HOZVAL<<10)|(10<<21);
	rLCDSADDR1 = (0<<27)|(fb>>1);
	rLCDSADDR2 = (((fb+(LCD_XSIZE*LCD_YSIZE))>>1)&0x1fffff)|(13<<21)|(1<<29);
	rLCDSADDR3 = (0 << 9) | ((LCD_XSIZE / 2) & 0x1FF);

	// 设置抖动调色板
	rREDLUT  =0xfdb96420;
	rGREENLUT=0xfdb96420;
	rBLUELUT =0xfb40;

	rDITHMODE=0x0;
	rDP1_2 =0xa5a5;      
	rDP4_7 =0xba5da65;
	rDP3_5 =0xa5a5f;
	rDP2_3 =0xd6b;
	rDP5_7 =0xeb7b5ed;
	rDP3_4 =0x7dbe;
	rDP4_5 =0x7ebdf;
	rDP6_7 =0x7fdfbfe;

	attr = 0;
	bgcr = 0;

	// 打开LCD显示
	rLCDCON1 |= 1;
}

// LCD任务
void LcdMain(void *args) 
{
	// 相关变量初始化
	CurState = SETSTATE;
	
	// 相关画面初始化
	SelectState(CurState);
		
	while(1)
	{
		// 等待按键按下,等待半秒,其间有键按下则立即唤醒
		// 可提高键盘的响应速度
		int i = sm_p(smKey, 50); 
		
		// 屏幕保护状态则跳过按键处理
		if(Greening) continue;
		
		// 处理需要自动刷新的页面
		UpdateState(CurState);
		
		// 有键按下,执行按键处理
		if(i == ENOERR)
		{
			DoKey(KeyValue);
		}
		
		//上面p操作已经延时,此处不需要延时
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -