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

📄 kb.c

📁 ARM微处理器LPC2214对日本东芝的液晶控制芯片T6963的驱动程序代码
💻 C
字号:
/*******************************************************************/
#include  "chinese.h"
#include  "char.h"

#define  LCD_Data		 (*((volatile unsigned char *) 0x83000000))
#define  LCD_Command		 (*((volatile unsigned char *) 0x83000001))
//#define  Blight_Addr		 (*((volatile unsigned long *) 0x83000002))
#define  GRAPHIC_START_ADDR	 0x0000
#define  TEXT_START_ADDR	 0x1000

 BYTE  textchar[255];


/*******************************************************************/
void Write_Control_Byte( BYTE Num,BYTE Add0,BYTE Add1,BYTE Command)
{
    BYTE IC;

  if (Num==0)
   {
	
	IC=0;
    while((IC<100)&&((LCD_Command & 0x03)!=0x03))	
	  {
	     IC=IC+1;
	  }
	
	LCD_Command=Command;
   }
 
  else if(Num==1)
   {
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;

	  }
	
	LCD_Data   =Add0   ;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Command=Command;
   
   }
  
  else if(Num==2)
   {
	IC=0;
	while ( (IC<100)&& ((LCD_Command & 0x03) != 0x03) )
	  {

	    IC=IC+1;
	  }
	
	LCD_Data   =Add0   ;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	   IC=IC+1;
	  }
	
	LCD_Data   =Add1   ;
	
	IC=0;
	while ( (IC<100)&& ((LCD_Command & 0x03)!=0x03) )
	  {
	   IC=IC+1;
	  }
	
	LCD_Command=Command;
   }
   
  else
    return;
}

/*****************************************************************************/
void Clear_Text_Area(void)
{
    UINT Addr	 ;
    UINT IY ;
    BYTE IC;

    Addr=TEXT_START_ADDR; /*Clear Text Area*/
    Write_Control_Byte(2,00 ,0x10,0x24);
    Write_Control_Byte(0x00,0x00,0x00,0xB0);/*AUTO WR*/
    for ( IY=0;IY<=127;IY++)/*16*8 Char*/
     {
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x08)!=0x08) )
	    {
	       IC=IC+1;
	    }

       LCD_Data=0x00;
     }
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x08)!=0x08) )
	  {
	     IC=IC+1;
	  }
    
    Write_Control_Byte(0x00,0x00,0x00,0xB2);/*Disable AUTO WR*/
}
/*****************************************************************************/
void Clear_Graphic_Area(void)
{
    UINT IY    ;
    UINT Addr  ;
    BYTE IC;

    Addr=GRAPHIC_START_ADDR; /*Clear GRAPHIC Area*/
    Write_Control_Byte(2,00,00,0x24);
    Write_Control_Byte(0x00,0x00,0x00,0xB0);/*AUTO WR*/
    for(IY=0;IY<=1023;IY++)
     {
	   IC=0;
	   while ((IC<100) && ((LCD_Command & 0x08)!=0x08) )
	    {
	       IC=IC+1;
	    }
       
       LCD_Data=0x00;
     }
   
   IC=0;
   while ( (IC<100) && ((LCD_Command & 0x08)!=0x08) )
	  {
	    IC=IC+1;
	  }
  
   Write_Control_Byte(0x00,0x00,0x00,0xB2);/*Disable AUTO WR*/
}
/*****************************************************************************/

void Clear_Screen(void)
{
     Clear_Text_Area();
     Clear_Graphic_Area();
}

/*****************************************************************************/
void Init_LCD(void)
{
//    UINT Temp ;

//    Temp=TEXT_START_ADDR;
    Write_Control_Byte(2,00,0x10,0x40);
//    Temp=16; /*16 char width*/
    Write_Control_Byte(2,16 ,00,0x41);

//    Temp=GRAPHIC_START_ADDR;
    Write_Control_Byte(2,00,00,0x42);/*Graphic Disp Start_Addr*/
//    Temp=16; /*16 char width*/
    Write_Control_Byte(2,16,00,0x43);/*Graphic Disp col.MAX=16*/

    Write_Control_Byte(0,0x00,0x00,0x80);/*Method Set*/
    Write_Control_Byte(0,0x00,0x00,0x9F);/*Text Cursor Blink*/
    Write_Control_Byte(0,0x00,0x00,0xA7);
    Write_Control_Byte(2,0x00,0x00,0x21);


    Clear_Text_Area();
    Clear_Graphic_Area();
}
/*************************************************************************/
void Write_One_Chinese( BYTE China, BYTE X, BYTE Y)
{
     UINT  Start_Addr	;
     UINT  Addr 	;
     UINT  IX	;
     BYTE  IC;

  Start_Addr=GRAPHIC_START_ADDR+(UINT) X+(UINT)Y*16;
  for(IX=0;IX<16;IX++)
  {
	Addr=Start_Addr+IX*16 ;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Data   =Addr % 256	 ;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Data   =Addr/256 ;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Command=0x24;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Data   =Chinese[China][IX*2+0];
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Command=0xC0;
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Data =Chinese[China][IX*2+1];
	
	IC=0;
	while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	  {
	     IC=IC+1;
	  }
	
	LCD_Command=0xC0;
  }
}
/*************************************************************************/
void Write_Chinese_String(BYTE *China_Ptr, BYTE Num, BYTE X,BYTE Y)
{
    BYTE IX  ;

    if(Num==0) return;
    for( IX=0;IX<Num;IX++)
      {
	    Write_One_Chinese(China_Ptr[IX],X+IX*2,Y);
      }
}
/*************************************************************************/
void Write_Blank_Chinese( BYTE Num,BYTE X,BYTE Y)
{
     UINT Start_Addr	;
     UINT Addr		;
     UINT IX,IY,XX	;
     BYTE IC;

     if(Num==0) return;
     Start_Addr=GRAPHIC_START_ADDR+ (UINT) X +(UINT)Y*16;
     XX=Num;
   for( IX=0;IX<XX;IX++)
    {
	for(IY=0;IY<16;IY++)
	 {
	   Addr       =Start_Addr+IX*2+IY*16;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }
	   
	   LCD_Data   = Addr % 256   ;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

	   LCD_Data   = Addr / 256   ;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

	   LCD_Command=0x24	;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

	   LCD_Data   =0 ;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }
 
	   LCD_Command=0xC0	;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

	   LCD_Data   =0 ;
	   
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

	   LCD_Command=0xC0	;
	 
	 }
   }
}
/*************************************************************************/
void Write_One_Char(BYTE Char,BYTE X, BYTE Y)
{
     UINT Start_Addr	;
     UINT Addr		;
     UINT IY		;
     BYTE IC;

     Start_Addr=GRAPHIC_START_ADDR+(UINT) X + (UINT)Y *16;
     for (IY=0;IY<8;IY++)
      {
        Addr =Start_Addr+IY*16	 ;
	  
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

       LCD_Data   = Addr%256	;
	  
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

        LCD_Data   = Addr/256 ;
	  
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

        LCD_Command=0x24 ;
	  
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

        LCD_Data   =Char_Set[Char][IY]	   ;
	  
	   IC=0;
	   while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
	    {
	       IC=IC+1;
	    }

        LCD_Command=0xC0;
	 
	  }
}
/*************************************************************************/
void Write_Char_String(BYTE *Char_Ptr,BYTE Num,BYTE X,BYTE Y)
{
    BYTE IX;

    if(Num==0) return;
    for( IX=0;IX<Num;IX++)
     {
       Write_One_Char(Char_Ptr[IX],X+IX,Y);
     }
}
/*************************************************************************/
void Write_Blank_Char(BYTE Num,BYTE X,BYTE Y)
{
     UINT Start_Addr	;
     UINT Addr		;
     UINT IX,IY,XX	;
     BYTE IC;

     if(Num==0) return;
     Start_Addr=GRAPHIC_START_ADDR+(UINT) X+(UINT)Y *16;
     XX=Num;
     for( IX=0;IX<XX;IX++)
      {
        for(IY=0;IY<8;IY++)
         {
           Addr =Start_Addr+IX+IY*16;
           
           IC=0;
           while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
            {
              IC=IC+1;
            }

 
           LCD_Data   = Addr% 256	  ;
           
           IC=0;
           while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
            {
              IC=IC+1;
            }

           LCD_Data   = Addr/256;
           
           IC=0;
           while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
            {
              IC=IC+1;
            }

           LCD_Command=0x24		  ;
          
           IC=0;
           while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
            {
              IC=IC+1;
            }

           LCD_Data   =0		  ;
          
           IC=0;
           while ( (IC<100) && ((LCD_Command & 0x03)!=0x03) )
            {
              IC=IC+1;
            }

           LCD_Command=0xC0	;
        
         }
      }
}
/*************************************************************************/
void Write_Text_String(BYTE *Buffer,BYTE Bytes,BYTE X,BYTE Y)
{
      UINT Addr ;
      BYTE IX ;
      BYTE IC;

      Addr=TEXT_START_ADDR+(UINT)X+(UINT)Y *16;
      Write_Control_Byte(2,Addr % 256,Addr/256,0x24);
      Write_Control_Byte(0x00,0x00,0x00,0xB0);/*AUTO WR*/
      if(Bytes!=0)
        {
	     for(IX=0;IX<Bytes;IX++)
	      {
           IC=0;
           while ( (IC<100) && ((LCD_Command & 0x08)!=0x08) )
            {
              IC=IC+1;
            }

            LCD_Data=Buffer[IX];
          }
        }
       else 
         return;
           
       IC=0;
       while ( (IC<100) && ((LCD_Command & 0x08)!=0x08) )
         {
           IC=IC+1;
         }

 
      Write_Control_Byte(0x00,0x00,0x00,0xB2);/*Disable AUTO WR*/
}
/*************************************************************************/
void Write_Text_Char(BYTE Char,BYTE X,BYTE Y)
{
      UINT  Addr     ;

      Addr=TEXT_START_ADDR+(UINT) X+ ((UINT) Y)*16;
      Write_Control_Byte(2,Addr % 256 ,Addr / 256,0x24);
      
//      IC=0;
//      while ( (IC<100) && ((LCD_Command & 0x03) != 0x03) )
//       {
//	     IC=IC+1;
//       }
      
//      LCD_Data=Char;
      Write_Control_Byte(1,Char,0x00,0xC4);/*One Write*/
}
/*************************************************************************/
void Set_Cursor(BYTE X,BYTE Y)
{

    Write_Control_Byte(0x00,0x00,0x00,0x9F);/*Text Cursor Blink*/
    Write_Control_Byte(2,X,Y,0x41);
}
/*************************************************************************/
void Close_Cursor(void)            //  ??????????????????
{
    Write_Control_Byte(0x00,0x00,0x00,0x9D);/*Close Cursor*/
}
/*************************************************************************/

void Write_String( BYTE *Buffer,BYTE Bytes,BYTE X,BYTE Y)
 {
    Write_Text_String(Buffer,Bytes,X,Y);
 }
/*************************************************************************/
void Write_Char( BYTE Char,BYTE X,BYTE Y)
 {
      UINT  Addr      ;

      Addr=TEXT_START_ADDR+(UINT) X+(UINT) Y *16;
      Write_Control_Byte(2,Addr % 256,Addr/256,0x24);
//      IC=0;
//      while ( (IC<250) && ((LCD_Command & 0x03)!=0x03) )
//	   {
//	    IC=IC+1;
//	   }
//      LCD_Data=Char;
      Write_Control_Byte(1,Char,0x00,0xC4);  /*One Write*/
 }
/*************************************************************************/
void Write_Data( UINT Value,BYTE X,BYTE Y,BYTE Byte_Size,BYTE BIN_OR_BCD)
{
      UINT  Temp   ;
      BYTE  Buff[5];
      BYTE  I;

      if(BIN_OR_BCD==YES) Temp=16;
      else		  Temp=10;
      Buff[4]=	 (Value % Temp) %256 ; Value=Value/Temp;
      Buff[3]=	 (Value % Temp) %256 ; Value=Value/Temp;
      Buff[2]=	 (Value % Temp) %256 ; Value=Value/Temp;
      Buff[1]=	 (Value % Temp) %256 ; Value=Value/Temp;
      Buff[0]=	 (Value 	);
      for(I=0;I<=4;I++)
	{
	  Buff[I]=CHAR_DIGITAL[Buff[I]];
	}
      Write_String(&Buff[5-Byte_Size],Byte_Size,X,Y);
}
/*************************************************************************/
//void Init_KeyBoard_Parameter(void)
//{

//    Blight_Register		 =0xFF;
//    Blight_Addr 	 =0xff;

//}

/*****************************************************************************/


void Draw_Cover(void)
{

//    Write_One_Chinese(90,4,8);
//    Write_One_Chinese(90,0,0);
//    Write_One_Char(0x12,4,24);
    Write_One_Chinese(90,6,8);
    Write_One_Chinese(90,6,24);
//    Write_One_Char(0x21,5,24);
//    Write_One_Char(0x21,5,32);
//    Write_Text_Char(0x20,0,0);
//    Write_Text_String(textchar,255,0,0);
    
}

/*****************************************************************************/
void KeyBoard_Init(void)
{
 
     Init_LCD();
//     Clear_Graphic_Area();
     Draw_Cover();
//     Close_Cursor();
}
/*************************************************************************/


int main(void)
{
    BYTE  ix;
    
    for(ix=0;ix<=254;ix++)
       textchar[ix]=ix;

    
    KeyBoard_Init();
    Draw_Cover();
    
    
    
//    Write_Text_String(textchar,255,0,0);

    while (1)
     ;
}

⌨️ 快捷键说明

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