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

📄 12864.h

📁 完整msp430驱动12864液晶程序
💻 H
字号:
 //disp_char(8,4,'x');           例子!!!!
   //disp_char(9,4,'x');
  //disp_str(1,1,"haha");
  /* char n=9;
  Write_Cmd(0x7F + 2); //第一行 第二位
  Write_Data(0x30+n);//ACSLL码*/
  
  /*LCD_Draw_Point(10,10,1);
       LCD_Draw_Point(1,1,2);*/
  /*LCD_Draw_Line_x(1,127,1,1);
   LCD_Draw_Line_x(1,50,0,2);
    LCD_Draw_Line_x(1,50,60,2);
     LCD_Draw_Line_x(1,50,63,2);*/
   //LCD_Draw_Line_Y(0,0,63,1);   // 第0列  从第一行划线到最后一行,颜色1
 // LCD_Draw_Line(0,0,127,63,1);//只能画45°斜线
typedef unsigned char uchar;
typedef unsigned int  uint;

extern const unsigned char shuzi_table[];

#define LCD_DataIn    P6DIR=0x00    //数据口方向设置为输入
#define LCD_DataOut   P6DIR=0xff    //数据口方向设置为输出
#define LCD2MCU_Data  P6IN
#define MCU2LCD_Data  P6OUT
#define LCD_CMDOut    P3DIR|=0x07     //P3口的低三位设置为输出
#define LCD_RS_H      P3OUT|=BIT0      //P3.0
#define LCD_RS_L      P3OUT&=~BIT0     //P3.0
#define LCD_RW_H      P3OUT|=BIT1      //P3.1
#define LCD_RW_L      P3OUT&=~BIT1     //P3.1
#define LCD_EN_H      P3OUT|=BIT2      //P3.2
#define LCD_EN_L      P3OUT&=~BIT2     //P3.2

/*******************************************
函数名称:Delay_1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void Delay_1ms(void)
{
	uchar i;
    
	for(i = 150;i > 0;i--)  _NOP();
} 
/*******************************************
函数名称:Delay_Nms
功    能:延时N个1ms的时间
参    数:n--延时长度
返回值  :无
********************************************/
void Delay_Nms(uint n)
{
    uint i;
    
    for(i = n;i > 0;i--)    Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功    能:向液晶中写控制命令
参    数:cmd--控制命令
返回值  :无
********************************************/
void Write_Cmd(uchar cmd)
{
    uchar lcdtemp = 0;
			
    LCD_RS_L;
    LCD_RW_H;
    LCD_DataIn;  
    do                       //判忙
    {    
        LCD_EN_H;
       	_NOP();					
       	lcdtemp = LCD2MCU_Data; 
       	LCD_EN_L;
        
    }
    while(lcdtemp & 0x80); 
    
    LCD_DataOut;    
    LCD_RW_L;  		
    MCU2LCD_Data = cmd; 
    LCD_EN_H;
    _NOP();						  			
    LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功    能:向液晶中写显示数据
参    数:dat--显示数据
返回值  :无
********************************************/
void  Write_Data(uchar dat)
{
    uchar lcdtemp = 0;   
        
    LCD_RS_L;
    LCD_RW_H;  
    LCD_DataIn;   
    do                       //判忙
    {    
        LCD_EN_H;
        _NOP();						
        lcdtemp = LCD2MCU_Data; 
        LCD_EN_L;      
    }
    while(lcdtemp & 0x80);  
    
    LCD_DataOut; 
    LCD_RS_H;
    LCD_RW_L;  
        
    MCU2LCD_Data = dat;
    LCD_EN_H;
    _NOP();
    LCD_EN_L;
}  
/*********
函数功能:读数据
   读数据???

***********/
uchar Read_Data()
{
    uchar lcdtemp = 0; 
    uchar data=0;
        
    LCD_RS_L;      
    LCD_RW_H;    
    LCD_DataIn;   
    do                       //判忙
    {    
        LCD_EN_H;
        _NOP();						
        lcdtemp = LCD2MCU_Data; 
        LCD_EN_L;      
    }
    while(lcdtemp & 0x80);  
    LCD_DataIn;
    LCD_RS_H;     //选择数据
    LCD_RW_H;     //读数据
    LCD_EN_H;     
    _NOP();
    data = LCD2MCU_Data;
    
    _NOP();
    LCD_EN_L;
    return data; 
}
/*******************************************
函数名称:Ini_Lcd
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void Init_Lcd(void)
{                  
    LCD_CMDOut;    //液晶控制端口设置为输出
    
    Delay_Nms(500);
    Write_Cmd(0x30);   //基本指令集
    Delay_1ms();
    Write_Cmd(0x02);   // 地址归位
    Delay_1ms();
	Write_Cmd(0x0c);   //整体显示打开,游标关闭
    Delay_1ms();
	Write_Cmd(0x01);   //清除显示
    Delay_1ms();
	Write_Cmd(0x06);   //游标右移
    Delay_1ms();
	Write_Cmd(0x80);   //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功    能:控制液晶显示汉字
参    数:addr--显示位置的首地址
          pt--指向显示数据的指针
          num--显示字符个数
返回值  :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
    uchar i;
		
    Write_Cmd(addr); 
   	for(i = 0;i < (num*2);i++) 
        Write_Data(*(pt++)); 
} 
/*******************************************
函数名称:Clear_GDRAM
功    能:清除液晶GDRAM中的随机数据
参    数:无
返回值  :无
********************************************/
void Clear_GDRAM(void)
{
    uchar i,j,k;
    
	Write_Cmd(0x34);        //打开扩展指令集
	i = 0x80;            
	for(j = 0;j < 32;j++)
	{
        Write_Cmd(i++);
        Write_Cmd(0x80);
  		for(k = 0;k < 16;k++)
  		{
  		    Write_Data(0x00);
  		}
	}
	i = 0x80;
 	for(j = 0;j < 32;j++)
	{
 	    Write_Cmd(i++);
        Write_Cmd(0x88);	   
  		for(k = 0;k < 16;k++)
  		{
   		    Write_Data(0x00);
   		} 
	}   
	Write_Cmd(0x30);        //回到基本指令集
}
/*******************************************
函数名称:Draw_PM
功    能:在整个液晶屏幕上画图
参    数:无
返回值  :无
********************************************/
void Draw_PM(const uchar *ptr)
{
    uchar i,j,k;
    
	
	i = 0x80;   
         Write_Cmd(0x36);        //打开绘图显示
	for(j = 0;j < 32;j++)
	{
        Write_Cmd(i++);
        Write_Cmd(0x80);
  		for(k = 0;k < 16;k++)
  		{
  		    Write_Data(*ptr++);
  		}
	}
	i = 0x80;
 	for(j = 0;j < 32;j++)
	{
 	    Write_Cmd(i++);
        Write_Cmd(0x88);	   
  		for(k = 0;k < 16;k++)
  		{
   		    Write_Data(*ptr++);
   		} 
	}  
   Write_Cmd(0x34);        //打开扩展指令集
	Write_Cmd(0x30);        //回到基本指令集
}
/*******************************************
函数名称:Draw_TX
功    能:显示一个16*16大小的图形
参    数:Yaddr--Y地址
          Xaddr--X地址
          dp--指向图形数据存放地址的指针
返回值  :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) 
{
    uchar j;
    uchar k=0;
 
    Write_Cmd(0x01);  //清屏,只能清除DDRAM
    Write_Cmd(0x34);  //使用扩展指令集,关闭绘图显示
    for(j=0;j<16;j++)
    {
         Write_Cmd(Yaddr++);       //Y地址
  		Write_Cmd(Xaddr);    //X地址
  		Write_Data(dp[k++]);  
  		Write_Data(dp[k++]);
    }
    Write_Cmd(0x36);  //打开绘图显示
    Write_Cmd(0x30);  //回到基本指令集模式
}
/****************定位函数*****x(1~8)y(1~4)****************/
void LCD_SetXY(uchar X, uchar Y) 
{
   switch(Y) {
		case 1: Write_Cmd(0x7F + X);break;
		case 2: Write_Cmd(0x8F + X);break;
		case 3: Write_Cmd(0x87 + X);break;
		case 4: Write_Cmd(0x97 + X);break;
                default:break;
	    }
}

/****************在指定的位置显示某个字符****************/
void disp_char(unsigned char X, unsigned char Y, unsigned char wdata)
{
    LCD_SetXY(X, Y);
    Write_Data(wdata);
}
/***********
函数功能:在指定的位置显示字符串
************/
void disp_str(unsigned char X, unsigned char Y, unsigned char *Str)
{
    unsigned char temp;
    LCD_SetXY(X, Y);
    temp = *Str;
    while(temp != 0)
    {
        Write_Data(temp);
        temp = *(++Str);
    }
}
/**********************
函数功能:画点x(0~127)   y(0~63)

color 0蓝色 1,2白色
***********************/
void LCD_Draw_Point( uchar X,uchar Y,uchar Color )   //X为列,Y为行!!!!!!!!
{
    uchar Row,Tier,Tier_bit;//
    uchar ReadOldH,ReadOldL;//
    Write_Cmd(0x34);//扩充指令集
    Write_Cmd(0x36);
    Tier= X >> 4 ;  //Tier 为X除以16
    Tier_bit = X & 0x0f ;
    if( Y < 32 )//定义点的位置x为0到63,y为0到7
    {
        Row = Y ;
    }
    else
    {
        Row = Y - 32 ;
        Tier += 8 ;
    }
    Write_Cmd( Row + 0x80 );//送行的地址
    Write_Cmd( Tier + 0x80 );//送列的地址
    Read_Data();//读出该点的数据,即状态
    ReadOldH = Read_Data(); 
    ReadOldL = Read_Data(); 
    Write_Cmd( Row + 0x80 );
    Write_Cmd( Tier + 0x80 );
    if( Tier_bit < 8 )
    {
        switch( Color)
        {
            case 0 : ReadOldH &=(~( 0x01 << ( 7 - Tier_bit ))); break ;
            case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;
            case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit )) ; break ;
            default: break ;    
        }
        Write_Data( ReadOldH ) ;
        Write_Data( ReadOldL ) ;
    }
    else
    {
        switch(Color)
        {
            case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit )));break ;
            case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit )) ; break ;
            case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
            default : break ;
        }
       Write_Data( ReadOldH );
       Write_Data( ReadOldL );
    }
    Write_Cmd(0x30);
}
/******************画水平线*********************/
void LCD_Draw_Line_x( uchar X0, uchar X1, uchar Y, uchar Color )
{   
    uchar Temp ;
    if( X0 > X1 )
    {
        Temp = X1 ;
        X1 = X0 ;
        X0 = Temp ;
    }
    for( ; X0 <= X1 ; X0++ )
    LCD_Draw_Point( X0, Y, Color );    
}
//画垂直线  第x列  从第y0行画到第y1行  颜色 color
void LCD_Draw_Line_Y( uchar X, uchar Y0, uchar Y1, uchar Color )
{
    uchar Temp ;
    if( Y0 > Y1 )
    {
        Temp = Y1 ;
        Y1 = Y0 ;
        Y0 = Temp ;
    }
    for(; Y0 <= Y1 ; Y0++)
    LCD_Draw_Point( X, Y0, Color);
}
//画斜线(x,y)到(end x,end y)
void LCD_Draw_Line( uchar StartX, uchar StartY, uchar EndX, uchar EndY, uchar Color )
{
    int distance;      /*根据屏幕大小改变变量类型(如改为int型)*/
    int delta_x, delta_y ;
    int incx, incy ;
do{
    delta_x = EndX - StartX ;
    delta_y = EndY - StartY ;
    if( delta_x > 0 )
    {
        incx = 1;
    }
    else if( delta_x == 0 )
    {
       incx = 0;
    }
    else
    {
        incx = -1 ;
    }
    if( delta_y > 0 )
    {
        incy = 1 ;
    }
    else if(delta_y == 0 )
    { 
       incy = 0 ;
    }
    else
    {
        incy = -1 ;
    }
    delta_x = incx * delta_x ;    
    delta_y = incy * delta_y ;
    
    if( delta_x > delta_y )
   {
     distance = delta_x ;
     StartX+=incx;
     StartY+=incy;
   }
   else
   {
     distance = delta_y;
     StartX+=incx;
     StartY+=incy;
   }
   LCD_Draw_Point( StartX, StartY, Color ); 
}while(distance!=0);
}

/**********************
函数功能:清除一个点


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

void LCD_Draw_Point_clear( uchar X,uchar Y )  
{
    uchar Row,Tier,Tier_bit;//
    uchar ReadOldH,ReadOldL;//
    Write_Cmd(0x34);//扩充指令集
    Write_Cmd(0x36);
    Tier= X >> 4 ;  //Tier 为X除以16
    Tier_bit = X & 0x0f ;
    if( Y < 32 )//定义点的位置x为0到63,y为0到7
    {
        Row = Y ;
    }
    else
    {
        Row = Y - 32 ;
        Tier += 8 ;
    }
    Write_Cmd( Row + 0x80 );//送行的地址
    Write_Cmd( Tier + 0x80 );//送列的地址
    Read_Data();//读出该点的数据,即状态
    ReadOldH = Read_Data(); 
    ReadOldL = Read_Data(); 
    Write_Cmd( Row + 0x80 );
    Write_Cmd( Tier + 0x80 );
  
       Write_Data( 0x00);
       Write_Data(0x00);
   
    Write_Cmd(0x30);
}


//清除一条垂直线
void LCD_Draw_Line_Y_clear( uchar X, uchar Y0, uchar Y1 )
{
    uchar Temp ;
    if( Y0 > Y1 )
    {
        Temp = Y1 ;
        Y1 = Y0 ;
        Y0 = Temp ;
    }
    for(; Y0 <= Y1 ; Y0++)
 LCD_Draw_Point_clear( X, Y0);
}

⌨️ 快捷键说明

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