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

📄 htlcd_lib.c

📁 ST736单片机
💻 C
字号:

#include "73x_lib.h"
#include "73x_type.h"
#include "HTLCD_SPI.h"
#define HTLCD_C
#include "HTLCD_lib.h"
#include "div.h"

#include "string.h"

/**********************************************************************************/
void Delayn10MS(INT32U n)
{
  INT32U i;
  //for(i=0;i<n*25000;i++);
  for(i=0;i<n*5000;i++);
}
/**********************************************************************************
函数功能:初始化LCD
入口:
        
出口:  无
**********************************************************************************/
void LCD_InitiMultiMode(INT8U Flag)
{
 
  switch(Flag)
  {
    case 0:
 	Init_HTLCD_WorkStatus();
	//lcd_special_show(1);
    break;
    
   case 1:
 	Init_HTLCD_PwrDownStatus();	
	//lcd_special_show(0x10);
    break;
  default:
        Init_HTLCD_WorkStatus();
    break;    
  }
}

/**********************************************************************************
函数功能:获取Sx的seg位置
入口:    ShouID----显示设备ID
出口:    0--------不存在
**********************************************************************************/
INT16U GetPixySegPos_SxNxDx(INT16U DeviceID,INT8U Type)
{
  INT16U i,MaxNum;
  //void *Ptr;
  
  switch(Type)
  {
    case Sx:
      MaxNum=MAX_S_NUM;
      for(i=0;i<MaxNum;i++)
      {
         if(LCD_S_Const[i].Sign==DeviceID)
          {
            return i;
          } 
      }
    break;
    
    case Dx:
      MaxNum=MAX_D_NUM;
      for(i=0;i<MaxNum;i++)
      {
         if(LCD_D_Const[i].Sign==DeviceID)
          {
            return i;
          } 
      }
    break;
    
    case Nx:
      MaxNum=MAX_N_NUM;
      for(i=0;i<MaxNum;i++)
      {
         if(LCD_N_Const[i].Sign==DeviceID)
          {
            return i;
          } 
      }
    break;
    
    default:
    return 0;
  }
  
  /*for(i=0;i<MaxNum;i++)
  {
     if((*)(Ptr[i].Sign==DeviceID)
      {
        return i;
      } 
  }*/
    return 0;
}
/**********************************************************************************
函数功能:点亮或者熄灭某一个显示标志
入口:    Flag----1:显示;0:熄灭
出口:    1---------有此设备;0------找不到设备
**********************************************************************************/
INT8U SetOrClrAndChkSEGCOM(INT16U Seg,INT8U Com,INT8U Type,INT8U ClrOrSet)
{
  if((Seg<=MAX_SEG)&&(Com<=MAX_COL))
  {    
    if(ClrOrSet)
    {
      if(ChkBit(Show_Lcd_Ram[Seg],Com))  //检查内存是否已经置位或者 seg/com配置表错误
      return 0;
      
      Show_Lcd_Flag=1;
      SetBit(Show_Lcd_Ram[Seg],Com);
      return 1;
    }
    else
    {
    	ClrBit(Show_Lcd_Ram[Seg],Com);
    	return 1;
    }  
  }
  return 0;
}
/**********************************************************************************
函数功能:点亮或者熄灭某一个显示标志
入口:    Flag----1:显示;0:熄灭
出口:    1---------有此设备;0------找不到设备
**********************************************************************************/
INT8U SetOrClrPixPiyDot(INT16U ShouID,INT8U ClrOrSet,INT8U Type)
{
  INT16U Pos,Seg,Com;
  INT8U Flag,i,temp;
  
  Pos=GetPixySegPos_SxNxDx(ShouID,Type);
  if(!Pos)
    return 0;
  
  switch(Type)
  {
    case Sx:
       Seg=SEG(LCD_S_Const[Pos].x);
       Com=COM(LCD_S_Const[Pos].y);
       Flag=SetOrClrAndChkSEGCOM(Seg,Com,Type,ClrOrSet);
       return Flag;
  
    case Dx:
       Seg=SEG(LCD_D_Const[Pos].x);
       Com=COM(LCD_D_Const[Pos].y);
       Flag=SetOrClrAndChkSEGCOM(Seg,Com,Type,ClrOrSet);
       return Flag;

  case Nx: 
#ifdef CONFLICT_TAB_CHKEN
				temp=7;
#else
				temp=1;
#endif
      for(i=0;i<temp;i++)
      { 
        Seg=SEG(LCD_N_Const[Pos+i].x);
        Com=COM(LCD_N_Const[Pos+i].y);
      	Flag=SetOrClrAndChkSEGCOM(Seg,Com,Type,ClrOrSet);
      	if(!Flag)
      	return 0;
      }
      return 1;

			
      
	}

  return 0;
}
/**********************************************************************************
函数功能:点亮某一个显示设备
入口:    无
出口:    无
**********************************************************************************/
INT8U SetOnDevice_PUCK(INT16U Device)
{
  INT8U Flag;
  Flag=SetOrClrPixPiyDot(Device,1,Sx);
  return Flag;
}
/**********************************************************************************
函数功能:熄灭某一个显示设备
入口:    无
出口:    无
**********************************************************************************/
INT8U SetOnDevice_D_PUCK(INT16U Device)
{
  INT8U Flag;
  Flag=SetOrClrPixPiyDot(Device,1,Dx);
  return Flag;
}
/**********************************************************************************
函数功能:点亮或者熄灭某'8'中的某一个元素:'A'~'G'
入口:    
         offset----具体的设备对应的偏移
         Bit---------------清除还是显示的具体位:0~6('A'~'G')
出口:   1-----------成功;0-------------失败
**********************************************************************************/
INT8U SetOnPixyLED8(INT16U Device,INT8U DisChar)
{
  INT16U Seg,Com,Pos;
  
    //找合理位置
  Pos=GetPixySegPos_SxNxDx(Device,Nx);
  if(!Pos)
    return 0;
    
  if(Pos>=MAX_N_NUM) //防止越界
    return 0;
  
  //检查显示的字段是否合法
  if(DisChar<'A')
    return 0;
  
  if(DisChar>'G')
    return 0;
  
  DisChar=DisChar-'A';
  
  Seg=SEG(LCD_N_Const[Pos+DisChar].x);
  Com=COM(LCD_N_Const[Pos+DisChar].y);
    
  if((Seg<=MAX_SEG)&&(Com<=MAX_COL)) //防止越界
  {
     Show_Lcd_Flag=1;
     SetBit(Show_Lcd_Ram[Seg],Com);
  }
  return 1;
}

/**********************************************************************************
函数功能:点亮0~9,A,b,C,d,E,F,...等具有意义的字符,如"9:","2."
入口:    
         DeviceID----具体的'8'设备名称
         DisChar----------点亮0~9,A,b,C,d,E,F,...等具有意义的字符
出口:   1-----------成功;0-------------失败
**********************************************************************************/
INT8U SetOnLED8Device_PUCK(INT16U DeviceID,INT8U DisChar)
{
  INT8U i,CharPos;
  
  //检索LED8显示的内容是否合法:0~9,A,b,C,d,E,F,...
  for(CharPos=0,i=0;i<MAX_LED_NUM;i++)
  {
    if(LED_Pixy8_Const[i].Type_8==DisChar)
    {
      CharPos=i;
      break;
    }
  }
  //没有找到显示的字符
  if(!CharPos)
    return 0;
  
  //根据 LED_Pixy8_Const 描笔
  for(i=0;i<LED_Pixy8_Const[CharPos].Num;i++)
  {
    SetOnPixyLED8(DeviceID,LED_Pixy8_Const[CharPos].Pxy8[i]);
  }
  return 1;
}

/**********************************************************************************
函数功能:更新显示屏
入口:    Flag----1:表示初始化;0:表示进入主程序调用
出口:    无
**********************************************************************************/
void UpdataLcdShow(void)
{
  if(Show_Lcd_Flag)
  {
    
    //mem_set(Show_Lcd_Ram,0xff,sizeof(Show_Lcd_Ram),Show_Lcd_Ram,sizeof(Show_Lcd_Ram));    
    //HTLCDWriteMultiData(0,Show_Lcd_Ram,sizeof(Show_Lcd_Ram));
    //mem_set(Show_Lcd_Ram,0x0f,sizeof(Show_Lcd_Ram),Show_Lcd_Ram,sizeof(Show_Lcd_Ram));
    HTLCDWriteMultiData(0,Show_Lcd_Ram,sizeof(Show_Lcd_Ram));
    Show_Lcd_Flag=0;
    mem_set(Show_Lcd_Ram,0x00,sizeof(Show_Lcd_Ram),Show_Lcd_Ram,sizeof(Show_Lcd_Ram));    
  }
}
/**********************************************************************************
函数功能:清除整屏
入口:    无
出口:    无
**********************************************************************************/
void ClearAllScreen(void)
{
  mem_set(Show_Lcd_Ram,0x00,sizeof(Show_Lcd_Ram),Show_Lcd_Ram,sizeof(Show_Lcd_Ram));    
  Show_Lcd_Flag=1;
  UpdataLcdShow();
}
/**********************************************************************************
函数功能:填满整屏
入口:    无
出口:    无
**********************************************************************************/
void FillAllScreen(void)
{
  mem_set(Show_Lcd_Ram,0xff,sizeof(Show_Lcd_Ram),Show_Lcd_Ram,sizeof(Show_Lcd_Ram));    
  Show_Lcd_Flag=1;
  UpdataLcdShow();
}
/**********************************************************************************/
void testlcd(void)
{
  INT16U i;
  for(i=1;i<43;i++)
      SetOnDevice_PUCK(i); 
      
  for(i=3;i<13;i++)   
  {
  	SetOnLED8Device_PUCK(N_LED(i),'1'+i-3);
  }
  
  for(i=14;i<22;i++)   
  {
  	SetOnLED8Device_PUCK(N_LED(i),'1'+21-i);
  	if(i==20)
  		SetOnDevice_D_PUCK(D_(20));
  }
}
/**********************************************************************************
函数功能:初始化显示RAM
入口:    无
出口:    无
**********************************************************************************/
void InitLcdAllRam(void)
{
  
 //mem_set(Show_Lcd_Ram,0x00,MAX_SEG+1,Show_Lcd_Ram,MAX_SEG+1);
  //mem_set(Show_Lcd_Ram,0x00,sizeof(Show_Lcd_Ram),Show_Lcd_Ram,sizeof(Show_Lcd_Ram));
  //mem_set(void *pDst, INT8U Value,INT32U SetLen,void *pDst_Start,INT32U Dst_Len)
   memset(Show_Lcd_Ram,0x00,sizeof(Show_Lcd_Ram)); 
}
/**********************************************************************************
函数功能:检查配置表是否配置矛盾
入口:    无
出口:    无
**********************************************************************************/
void Chk_Table_Conflict(void)
{
  
#ifdef CONFLICT_TAB_CHKEN
  INT16U i;
  INT8U Flag;

  for(i=0;i<MAX_S_NUM;i++)
  {      
    Flag=SetOrClrPixPiyDot(LCD_S_Const[i].Sign,1,Sx);
    if(!Flag)
    {
     DEBUG_PRINT(PUCK,PRINT_PUCK_CUR,"Config Table Error,Sign=S%d\n",LCD_S_Const[i].Sign); 
    }
  }
  
  for(i=0;i<MAX_D_NUM;i++)
  {      
    Flag=SetOrClrPixPiyDot(LCD_D_Const[i].Sign,1,Dx);
    if(!Flag)
    {
     DEBUG_PRINT(PUCK,PRINT_PUCK_CUR,"Config Table Error,Sign=D%d\n",LCD_D_Const[i].Sign); 
    }
  } 
  
  for(i=0;i<MAX_N_NUM;i+=7)  //7个seg为一个单位
  {      
    Flag=SetOrClrPixPiyDot(LCD_N_Const[i].Sign,1,Nx);
    if(!Flag)
    {
     DEBUG_PRINT(PUCK,PRINT_PUCK_CUR,"Config Table Error,Sign=N%d\n",LCD_N_Const[i].Sign); 
    }
  } 
  while(1);
#endif
}

/**********************************************************************************
函数功能:HTLCD处理程序
入口:    Flag----1:表示初始化;0:表示进入主程序调用
出口:    无
**********************************************************************************/
void MainHTLCD_Puck_Pub(INT8U Flag)
{
  if(Flag)
  {
    LCD_InitiMultiMode(0);
    InitLcdAllRam();
    Chk_Table_Conflict();
    LIGHT_ON;
    FillAllScreen();
    Delayn10MS(500);
    return ;
  } 
  testlcd();
  UpdataLcdShow();
  
  while(1);
  //ClearAllScreen();
}

⌨️ 快捷键说明

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