Example #1
0
//**********************************************************************
//                         LCD 初始化 
//**********************************************************************
void Lcd_Reset() 
{ 
    Lcd_WriteCmd(0x30);        //选择基本指令集
    Lcd_WriteCmd(0x01);        //清除显示,并且设定地址指针为00H
    Lcd_WriteCmd(0x0c);        //开显示(无游标、不反白)
    Lcd_Clear();               //清除液晶GDRAM中的数据
    Lcd_WriteCmd(0x01);        //清除显示,并且设定地址指针为00H
    Lcd_WriteCmd(0x06);        //在资料的读取及写入时游标自动右移
}
Example #2
0
/****************************************************************************
Function: Name
Description: LCD初始化程序
Input:
Output:
Notes:
*****************************************************************************/
void Lcd_Init(void)
{
  ANSEL = 0x00;
  Lcd_Delay(10);
  Lcd_WriteCmd(0x30);       
  Lcd_Delay(1);
  Lcd_WriteCmd(0x30);          
  Lcd_Delay(1);
  Lcd_WriteCmd(0x0c);          
  Lcd_Delay(1);
  Lcd_WriteCmd(0x01);   
  Lcd_Delay(10);
}
Example #3
0
//====================================================================//
// 语法格式:void Lcd_Init(void)
// 实现功能:LCD初始化
// 参    数:无
// 返 回 值:无
//====================================================================//
void Lcd_Init(void)
{ 

	LCD_PSB = 1;         //并口方式
	
	Lcd_WriteCmd(0x34);      //扩充指令操作
	delay(5);
	Lcd_WriteCmd(0x30);      //基本指令操作
	delay(5);
	Lcd_WriteCmd(0x0C);      //显示开,关光标
	delay(5);
	Lcd_WriteCmd(0x01);      //清除LCD的显示内容
	delay(5);
}
Example #4
0
//**********************************************************************
//              向 LCD 指定起始位置写入一个字符串
//**********************************************************************
void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str) 
{
    Lcd_WriteCmd(0x30);
    switch(y) 
    { 
        case 0: Lcd_WriteCmd(0x80+x); break;
        case 1: Lcd_WriteCmd(0x90+x); break; 
        case 2: Lcd_WriteCmd(0x88+x); break; 
        case 3: Lcd_WriteCmd(0x98+x); break; 
    } 
    while(*Str>0)
    { 
        Lcd_WriteData(*Str);
        Str++; 
    }  
}
//当i=0时显示上面128×32,当i=8时显示下面128×32
//当i=0时显示上面128×32,当i=8时显示下面128×32
void Lcd_Fill(u8 test)
{  
u8 x,y,i;
    for(i=0;i<9;i=i+8)   
		for(y=0;y<0x20;y++)
		{     
		  for(x=0;x<8;x++)
		       { 
		          Lcd_WriteCmd(0x36);   //扩充指令 绘图显示
		          Lcd_WriteCmd(y+0x80);       //行地址
		          Lcd_WriteCmd(x+0x80+i);     //列地址     
		          Lcd_WriteData(test);   //写数据 D15-D8 
		          Lcd_WriteData(test);   //写数据 D7-D0  
		      	  Lcd_WriteCmd(0x30);
		       }
		} 
}
Example #6
0
//**********************************************************************
//                    清除液晶GDRAM中的数据
//**********************************************************************
void Lcd_Clear(void)
{
    unsigned char i,j,k;
    Lcd_WriteCmd(0x34);         //打开扩展指令集
    i = 0x80;            
    for(j = 0;j < 32;j++)
    {
        Lcd_WriteCmd(i);
        Lcd_WriteCmd(0x80);
  	for(k = 0;k < 16;k++)
	    Lcd_WriteData(0x00);
        Lcd_WriteCmd(i++);
        Lcd_WriteCmd(0x88);	   
  	for(k = 0;k < 16;k++)
	    Lcd_WriteData(0x00);
    }
}
//图片取模方式:横向取模,字节正序
void pic_Disp(u8 *pic)    //显示Gdram内容(显示图片)
{
u8 x,y;
//for(i=0;i<9;i=i+8)
for(y=0;y<16;y++)
{
  for(x=0;x<1;x++)
  {
   Lcd_WriteCmd(0x36);   //扩充指令,开绘图显示
   Lcd_WriteCmd(0x80+y);  //行地址
   Lcd_WriteCmd(0x80+x);  //列地址
   Lcd_WriteData(*pic++);  //写数据 D15-D8
   Lcd_WriteData(*pic++);  //写数据 D7-D0
   Lcd_WriteCmd(0x30);
  }
}
}
void Table_Disp(u8 x,u8 y,u8  *s)//x:0~3   y:
{
	Lcd_WriteCmd(addr_tab[8*x+y]); //写地址
	while(*s)
    { 
      Lcd_WriteData(*s);    //写数据
      s++;     
    }
}
Example #9
0
void hanzi_Disp(Uint16 x,Uint16 y,char  *s)
{
 Lcd_WriteCmd(addr_tab[8*x+y]);  //写地址
 while(*s>0)
    {
  Lcd_WriteData(*s);    //写数据
  DelayUS2(1);
  s++;   
    }
}
/*****初始化LCD*****/
void Lcd_Init(void)
{ 
	RCC->APB2ENR|=1<<3;    //使能PORTb时钟	   A是2   E是6///
	
	GPIOB->CRH&=0XFF00FFFF; 
	GPIOB->CRH|=0X00330000;//PB12 13 推挽输出   	 
											  


	delay_ms(50);
    Lcd_WriteCmd(0x30);        //选择基本指令集
	delay_ms(1);
    Lcd_WriteCmd(0x30);        //选择8bit数据流
	delay_ms(1);
    Lcd_WriteCmd(0x0c);        //开显示(无游标、不反白)
	delay_ms(1);
    Lcd_WriteCmd(0x01);        //清除显示,并且设定地址指针为00H
	delay_ms(30);
}
/******************************************************** 
 名称:GUI_Point(打点) 
 说明:X:横坐标(代表列的位置,0~127)    Y:纵坐标(代表行的位置,0~63) 
       根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,经过或和移位后再把数据重新写入 
           GDRAM每行有16个位元,共64行,每个位元有两个8位(高低8位) 
           计算出在那个位元,在该位元的哪一位 
易出现的问题:1、打点位置的定位 
              2、读取当前显示的数据 
              3、或和移位,即重新写人的新数据 
********************************************************/ 
void GUI_Point(u8 x,u8 y,u8 flag) 
{       
   u8 x_Dyte,x_byte;                       //定义列地址的字节位,及在字节中的哪1位  
   u8 y_Dyte,y_byte;                       //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
   u8 GDRAM_hbit,GDRAM_lbit; 
   Lcd_WriteCmd(0x36);                       //绘图模式命令 
   /***X,Y坐标互换,即普通的X,Y坐标***/ 
   x_Dyte=x/16;                               //计算在16个字节中的哪一个 
   x_byte=x&0x0f;                             //计算在该字节中的哪一位 
   y_Dyte=y/32;                               //0为上半屏,1为下半屏 
   y_byte=y&0x1f;                             //计算在0~31当中的哪一行 
    
   Lcd_WriteCmd(0x80+y_byte);                //设定行地址(y坐标) 
   Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 
                       
   Lcd_ReadData(); 
   GDRAM_hbit=Lcd_ReadData();                    //读取当前显示高8位数据 
   GDRAM_lbit=Lcd_ReadData();                    //读取当前显示低8位数据 
   delay_us(5); 
    
   if(flag==1) 
   {  
     Lcd_WriteCmd(0x80+y_byte);                //设定行地址(y坐标) 
     Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);       //设定列地址(x坐标),并通过8*y_Dyte选定上下屏 
     delay_us(5); 
         if(x_byte<8)                                   //判断其在高8位,还是在低8位 
     { 
          Lcd_WriteData(GDRAM_hbit|(0X01<<(7-x_byte)));   //显示GDRAM区高8位数据 
      Lcd_WriteData(GDRAM_lbit);                      //显示GDRAM区低8位数据  
         } 
         else 
         { 
          Lcd_WriteData(GDRAM_hbit); 
          Lcd_WriteData(GDRAM_lbit|(0x01<<(15-x_byte))); 
         }  
   } 
   else 
   { 
     Lcd_WriteData(0x00);                           //清除GDRAM区高8位数据 
     Lcd_WriteData(0x00);                           //清除GDRAM区低8位数据 
   }         
}
/*****整屏显示横条*****/
void LcdFill_Level(void)
{ 
  u8 x,y,i;
    u8 k;   
    for(i=0;i<9;i+=8)    
       for(y=0;y<0x20;y++)
       {     
   if((y%2)==1) k=0xff;
            else k=0;
            for(x=0;x<8;x++)
            {  
       			Lcd_WriteCmd(0x36);   //扩充指令 绘图显示
                Lcd_WriteCmd(y+0x80); //行地址
                Lcd_WriteCmd(x+0x80+i); //列地址            
                Lcd_WriteData(k);
                Lcd_WriteData(k);
         		Lcd_WriteCmd(0x30);
            }
        }     
}
Example #13
0
void Init_lcd(void)
{
    Init_lcd_Gpio();

  
     DelayUS2(50000);
    Lcd_WriteCmd(0x30);        //选择基本指令集
    DelayUS2(10000);
    Lcd_WriteCmd(0x30);          //选择8bit数据流
 DelayUS2(10000);
    Lcd_WriteCmd(0x0c);          //开显示(无游标、不反白)
 DelayUS2(10000);
    Lcd_WriteCmd(0x01);          //清除显示,并且设定地址指针为00H
 DelayUS2(10000);

  hanzi_Disp(0,0,"永磁同步电机实验");
  hanzi_Disp(1,0,"UDC:000 RPM:0000");
  hanzi_Disp(2,0,"IA:00.0 IB:00.0");
  hanzi_Disp(3,0,"+000  停止  正常");

}
/*****画点函数*****/
void Lcd_DrawPoint(u8 X,u8 Y,u8 Color )	  //0000 1111     0000 0000    
{
    u8 Row , Lie , Lie_bit    ;
    u8 ReadOldH, ReadOldL ;
    Lcd_WriteCmd(0x34);
    Lcd_WriteCmd(0x36);

    Lie=X>> 4 ;    							   //0000 0000		  右移4等同于除以16,得到大地址
    Lie_bit=X&0x0f ;						   //0000 1111		  15	得到小地址
    if(Y<32)
    {
        Row=Y;								  //0000 0000		   0
    }
    else
    {
        Row=Y-32;
        Lie+=8;
    }

    Lcd_WriteCmd(Row+0x80);						 //0
    Lcd_WriteCmd(Lie+0x80);					 //0

    Lcd_ReadData();		                 //虚读一次
    ReadOldH =Lcd_ReadData(); 
    ReadOldL =Lcd_ReadData(); 

    Lcd_WriteCmd(Row+0x80);
    Lcd_WriteCmd(Lie+0x80);

    if(Lie_bit<8)
    {
        switch( Color)
        {
            case 0 : ReadOldH&=(~(0x01<<(7-Lie_bit))) ; break;       //将该点变为0
            case 1 : ReadOldH|=(0x01<<(7-Lie_bit)); break;		      //将该点变为1
            case 2 : ReadOldH^=(0x01<<(7-Lie_bit )); break;		  //将该点翻转
            default : break ;    
        }
        Lcd_WriteData(ReadOldH) ;
        Lcd_WriteData(ReadOldL) ;
    }
    else
    {
        switch(Color)
        {
            case 0 : ReadOldL&=(~(0x01<<(15-Lie_bit)));break ;		   //将该点变为0
            case 1 : ReadOldL|=(0x01<<(15-Lie_bit));break ;		   //将该点变为1
            case 2 : ReadOldL^=(0x01<<(15-Lie_bit));break ;		//将该点翻转
            default : break ;
        }
        Lcd_WriteData(ReadOldH);
        Lcd_WriteData(ReadOldL);
    }
    Lcd_WriteCmd(0x30);
}
Example #15
0
//====================================================================//
// 语法格式:void Lcd_SetPos(uchar X,uchar Y)
// 实现功能:设定显示位置
// 参    数:X - 行,Y - 列
// 返 回 值:无
//====================================================================//
void Lcd_SetPos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   Lcd_WriteCmd(pos);     //显示地址
}
Example #16
0
/****************************************************************************
Function: Name
Description:在LCD写入一个字符
Input:
Output:
Notes:
*****************************************************************************/
void Lcd_StrDisp(u8 x,u8 y,const u8 *s)
{
  const u8 addr_tab[]=
  {
  0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
  0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
  0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
  0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
  };
  Lcd_WriteCmd(addr_tab[8*x+y]);
  while(*s>0)
  {
    Lcd_WriteData(*s);   
    s++;   
  }
}
Example #17
0
//**********************************************************************
//         有反白显示功能的打点函数:(X-水平位址,Y-竖直位址)
//**********************************************************************
void GUI_Point(unsigned char x,unsigned char y,unsigned char color)
{
    unsigned char x_Dyte,x_byte;		//定义列地址的字节位,及在字节中的哪1位
    unsigned char y_Dyte,y_byte;		//定义为上下两个屏(取值为0,1),行地址(取值为0~31)
    unsigned char GDRAM_hbit,GDRAM_lbit;
    Lcd_WriteCmd(0x36);		                //扩展指令命令
    x_Dyte=x/16;				//计算在16个字节中的哪一个
    x_byte=x&0x0f;				//计算在该字节中的哪一位
    y_Dyte=y/32;				//0为上半屏,1为下半屏
    y_byte=y&0x1f;				//计算在0~31当中的哪一行
    Lcd_WriteCmd(0x80+y_byte);			//设定行地址(y坐标)
    Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);		//设定列地址(x坐标)
    Lcd_ReadData();				//预读取数据
    GDRAM_hbit=Lcd_ReadData();			//读取当前显示高8位数据
    GDRAM_lbit=Lcd_ReadData();			//读取当前显示低8位数据
    Lcd_WriteCmd(0x80+y_byte);			//设定行地址(y坐标)
    Lcd_WriteCmd(0x80+x_Dyte+8*y_Dyte);		//设定列地址(x坐标)
    if(x_byte<8)				//判断其在高8位,还是在低8位
    {
      if(color==1)
      {
        Lcd_WriteData(GDRAM_hbit|(0x01<<(7-x_byte)));//置位GDRAM区高8位数据中相应的点
      }
      else
        Lcd_WriteData(GDRAM_hbit&(~(0x01<<(7-x_byte))));//清除GDRAM区高8位数据中相应的点	
      Lcd_WriteData(GDRAM_lbit);		        //显示GDRAM区低8位数据
    }
    else
    {
      Lcd_WriteData(GDRAM_hbit);
      if(color==1)
        Lcd_WriteData(GDRAM_lbit|(0x01<<(15-x_byte)));//置位GDRAM区高8位数据中相应的点
      else
        Lcd_WriteData(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点
    }
    Lcd_WriteCmd(0x30);			        //恢复到基本指令集
}
Example #18
0
/****************************************************************************
Function: Name
Description: LCD清屏
Input:
Output:
Notes:
*****************************************************************************/
void Lcd_ClrScreen(void)
{
  Lcd_WriteCmd(CLEAR_SCREEN);
}
/*****显示一个字节*****/
void Disp_achar(u8 x,u8 y,u8 achar)//x:0~3   y:
{ 
	Lcd_WriteCmd(addr_tab[8*x+y]); //写地址
	Lcd_WriteData(achar);    //写数据
}