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

📄 lcd_12864_drv.c

📁 基于LPCarm 128*64驱动
💻 C
字号:
/****************************************************************************
* 文件名:	128_64_DRV.C
* 功能:	128_64驱动程序
硬件使用:NT7532H-BDT型号的液晶屏,使用SPI接口方式
硬件连接设计:

#define		RST_pin		(1<<20)//--------复位引脚				P1.20
#define		CS_pin		(1<<21)//--------片选引脚				P1.21

#define		RS_pin		(1<<19)//--------数据/命令控制引脚  	P1.19
#define		CLK_pin		(1<<18)//--------时钟引脚  				P1.18
#define		DIO_pin		(1<<17)//--------数据引脚  			 	P1.17


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

#include  "config.h"
#include    "LPC2294.h"
#include  "ctype.h"
#include  "word_pixel.h"



#define		RST_pin		(1<<21)//--------复位引脚				P1.21
#define		CS_pin		(1<<20)//--------片选引脚				P1.20

#define		RS_pin		(1<<25)//--------数据/命令控制引脚  	P1.25
#define		CLK_pin		(1<<24)//--------时钟引脚  				P1.24
#define		DIO_pin		(1<<23)//--------数据引脚  			 	P1.23



#define		CS_PIN_H()	(IO1SET|=CS_pin)
#define		CS_PIN_L()	(IO1CLR|=CS_pin)

#define		RS_pin_H()	(IO1SET|=RS_pin)
#define		RS_pin_L()	(IO1CLR|=RS_pin)

#define		CLK_pin_H()	(IO1SET|=CLK_pin)
#define		CLK_pin_L()	(IO1CLR|=CLK_pin)

#define		DIO_pin_H()	(IO1SET|=DIO_pin)
#define		DIO_pin_L()	(IO1CLR|=DIO_pin)



#define		RST_pin_H()	(IO1SET|=RST_pin)
#define		RST_pin_L()	(IO1CLR|=RST_pin)

void SET_LCD_RESER_PIN_L(void);
void SET_LCD_RESER_PIN_H(void);


								 
void delay_lcd(uint8 delay_msec)    								 
{

	uint8 k=0;
	int m=0;
	for(k=0;k<delay_msec;k++)
		{
		for(m=0;m<1055;m++)
			;
		} 
		
}	
    								 
/****************************************************************************
* 名称:send_lcd_command()
* 功能:发送命令字节函数
* 入口参数:comand
			命令
* 出口参数:无
****************************************************************************/
void  send_lcd_command(uint8  comand)
{
	uint8 k=0;
	CS_PIN_L();
	RS_pin_L();
	for(k=0;k<8;k++)
		{
		CLK_pin_L();

		
		if(comand&(0x80>>k))
			{
			DIO_pin_H();
			}
			else
				{
				 DIO_pin_L();
				}
		CLK_pin_H();			 
		}
	RS_pin_H();			

}    								 
/****************************************************************************
* 名称:send_lcd_data()
* 功能:发送数据字节函数
* 入口参数:data
			数据

* 出口参数:无
****************************************************************************/
void  send_lcd_data(uint8  data)
{

	uint8 k=0;
	CS_PIN_L();
	RS_pin_H();
	for(k=0;k<8;k++)
		{
		CLK_pin_L();
			
		if(data&(0x80>>k))
			
			DIO_pin_H();
			else
			 DIO_pin_L();
		CLK_pin_H();			 
		}

	
				
}      								 
/****************************************************************************
* 名称:set_scr_postion()
* 功能:设定光标位置
* 入口参数:X_position----------X方向的位置
			Y_position----------Y方向的位置


* 出口参数:无
****************************************************************************/
void  set_scr_postion(uint8  X_position,uint8 Y_position)
{

	X_position+=4;
	if(X_position<128)
		{
		send_lcd_command(0x10|(X_position>>4));			
		send_lcd_command(X_position&0x0F);
		}
	if(Y_position<64)
		{
		send_lcd_command(0xB0|Y_position);
		}
	
} 

/****************************************************************************
* 名称:GET_ZM_Zk_INDEX()
* 功能:输入一个字母得到字库索引
* 入口参数:data--------------------输入的字符
* 出口参数:字库的索引实际为字库的首地址
****************************************************************************/
int   GET_ZM_Zk_INDEX(uint8	data)
{
	int k=0;
	for(k=0;k<82;k++)
		{
		if(ZM_ZK_INDEX[k][0]==data)
		  return ZM_ZK_INDEX[k][1];
		}
	return 1;
	
}
/****************************************************************************
* 名称:wzf_0816()
* 功能:写字符函数,为6*16的字符
* 入口参数:
  x=0-15
  y=0-8
  hz_no=字符编号
  c=颜色
* 出口参数:无
* 说明:写字符函数,为6*16的字符
****************************************************************************/
void wzf_0816(uint8 x,uint8 y,uint8 zf,uint8 c)   //8x16 写字符?(x=0-15,y=0-8hz_no=字符编号,c=颜色)
{

  int i;
  uint8 dd;
  uint8	zf_index=GET_ZM_Zk_INDEX(zf);
	

      set_scr_postion(x*8,y);
      for(i=0;i<8;i++) {
         if(c) dd=ZM_ZK[zf_index][7-i];
            else dd=~ZM_ZK[zf_index][7-i];
         send_lcd_data(dd);
         }
      set_scr_postion(x*8,y+1);  
      for(i=0;i<8;i++) {
         if(c) dd=ZM_ZK[zf_index][7-i+8];
            else dd=~ZM_ZK[zf_index][7-i+8];
         send_lcd_data(dd);
         }
       
}
/****************************************************************************
* 名称:wzf_0816_str()
* 功能:写字符函数,为6*16的字符
* 入口参数:
  x=0-15
  y=0-3
  hz_no=字符编号
  c=颜色
* 出口参数:无
* 说明:写字符函数,为6*16的字符
****************************************************************************/
void wzf_0816_str(uint8 x,uint8 y,uint8 * data_str,uint8 data_str_len,uint8 c)   //8x16 写字符?(x=0-15,y=0-8hz_no=字符编号,c=颜色)
{

	uint8 k=0;
	uint8 point_Y;
	uint8	temp_data[16];
	x=16-data_str_len-x;
	point_Y=y;
	if(data_str_len>16)
		data_str_len=16;
	for(k=0;k<16;k++)
		temp_data[k]=data_str[k];
	
	point_Y*=2;
	for(k=0;k<data_str_len;k++)
		{
		wzf_0816(x+k,point_Y,temp_data[data_str_len-1-k],c);	
		}
	
}
/****************************************************************************
* 名称:GET_ZM_INDEX()
* 功能:输入一个双字得到字库索引
* 入口参数:data--------------------输入的字符
* 出口参数:字库的索引实际为字库的首地址
****************************************************************************/
int   GET_HZ_Zk_INDEX(uint8	data_H,uint8 data_L)
{
	int k=0;
	for(k=0;k<HZK_MAX_INDEX;k++)
		{
		if(HZ_ZK_INDEX[k].KZ_[0]==data_H&&HZ_ZK_INDEX[k].KZ_[1]==data_L)
		  return HZ_ZK_INDEX[k].KZ_index;
		}
	return 1;
	
}
/****************************************************************************
* 名称:whz_1616_ZK()
* 功能:写汉字函数,为16*16的汉字,使用的是字库---menu_ZK
* 入口参数:
   x=0-7
   y=0-8
   hz_no=汉字编号
   c=颜色
* 出口参数:无
* 说明:V998液晶屏清屏函数
****************************************************************************/
void whz_1616_ZK(uint8 x,uint8 y,uint8 hz_no,uint8 c)    //16x16 写汉字 (x=0-7,y=0-8,hz_no=汉字编号,c=颜色)
{

  uint8 i,dd;
  int zx_pt;

     zx_pt=hz_no*32;
      set_scr_postion(x*8,y);
      for(i=0;i<16;i++) 
      	{
         if(c) dd=HZ_ZK[zx_pt+15-i];
            else dd=~HZ_ZK[zx_pt+15-i];
         send_lcd_data(dd);
      	}
      set_scr_postion(x*8,y+1);
      for(i=0;i<16;i++) 
      	{
         if(c) dd=HZ_ZK[zx_pt+16+15-i];
            else dd=~HZ_ZK[zx_pt+16+15-i];
         send_lcd_data(dd);
      	}
    
     
}
/****************************************************************************
*函数说明:show_16X16_str()
	显示一行宽度为16*16的点阵数据,数据长度可以改变
*函数输入:
	ZK_start-----------起始象素的起点(在字库中)
	len---------------长度,实际的象素长度为len*16
	color--------------颜色
*函数输出:
*使用的全局变量
*调用的模块
****************************************************************************/
void show_16X16_str_(uint8 X,uint8 Y,uint8* str,uint8 len,uint8 color)
{
		
	uint8 k;
	if(len+X>8)
		len=8-X;//保护
	X=8-len-X;
	for(k=0;k<len;k++)
		whz_1616_ZK(2*(k+X),2*Y,GET_HZ_Zk_INDEX(str[(len-1-k)*2],str[(len-1-k)*2+1]),color);
}
/****************************************************************************
* 名称:INI_LCD()
* 功能:初始化LCD
* 入口参数:无
			
* 出口参数:无
****************************************************************************/
void	INI_LCD(void)
{

	IO1DIR|=(RST_pin|CS_pin|RS_pin|CLK_pin|DIO_pin);
	
	SET_LCD_RESER_PIN_L();
	delay_lcd(250);
	SET_LCD_RESER_PIN_H();

	CS_PIN_H();
	//设置管脚状态

	send_lcd_command(0xE2);
	

	send_lcd_command(0xAF);	
	send_lcd_command(0x23);
	send_lcd_command(0x2F);	
	send_lcd_command(0x40);	
	send_lcd_command(0x81);	
	send_lcd_command(0x23);	
	send_lcd_command(0xA1);	
	send_lcd_command(0xA3);	
	send_lcd_command(0xA4);
	send_lcd_command(0xA6);	
	
	send_lcd_command(0xB0);	
	send_lcd_command(0xC8);	
	send_lcd_command(0xAD);	
	send_lcd_command(0x03);	
	send_lcd_command(0xA8);	
	send_lcd_command(0x3F);	
	send_lcd_command(0xa9);	
	send_lcd_command(0x63);	
	send_lcd_command(0xAA);	
	send_lcd_command(0xD4);	
	send_lcd_command(0x40);	

	//打开显示
	//设置对比度
	//
}
/****************************************************************************
* 名称:SET_LCD_RESER_PIN_L()
* 功能:设置LCD复位引脚为低(复位有效)
* 入口参数:无
			
* 出口参数:设置LCD复位引脚为低(复位有效)
****************************************************************************/
void	SET_LCD_RESER_PIN_L(void)
{
	RST_pin_L();
}

/****************************************************************************
* 名称:SET_LCD_RESER_PIN_H()
* 功能:设置LCD复位引脚为高(复位完成)
* 入口参数:无
			
* 出口参数:设置LCD复位引脚为高(复位完成)
****************************************************************************/
void	SET_LCD_RESER_PIN_H(void)
{
	RST_pin_H();
}
/****************************************************************************
* 名称:write_ZF_HZ_STR()
* 功能:写到LCD上的汉字和字符混合串
* 入口参数:无
	  x------------列(0-15)
	  y------------行(0-3)
	  data-------------数据指针
	  c=颜色

			
* 出口参数:写到LCD上的汉字和字符混合串,有长度限制
****************************************************************************/
void write_ZF_HZ_STR(uint8 x,uint8 y,uint8 * data,uint8 len,uint8 color)
{

	uint8 	x_x=x;
	uint8	y_y=y*2;
	uint8 k;
	for(k=0;k<len&&k<16;)
		{
		if(isprint(data[k]))
			{
			if(x_x+1>16)
					break;
			wzf_0816(15-x_x,y_y,data[k],color);
			x_x++;
			k++;
			}
			else
				{
				if(x_x+2>16)
					break;
				whz_1616_ZK(14-x_x,y_y,GET_HZ_Zk_INDEX(data[k],data[k+1]),color);
				k+=2;
				x_x+=2;
				}
		}
}

/****************************************************************************
* 名称:wzf_0816_str_sp_index()
* 功能:写字符函数,为8*16的字符,并且给定一个高亮的索引,从前往后排0-----16
* 入口参数:
  x=0-15
  y=0-3
  hz_no=字符编号
  sel_index----------高亮索引
* 出口参数:无
* 说明:写字符函数,为8*16的字符,并且给定一个高亮的索引,从前往后排0-----16
****************************************************************************/
void wzf_0816_str_sp_index(uint8 x,uint8 y,uint8 * data_str,uint8 data_str_len,uint8 sel_index)
{

	uint8 k=0;
	uint8 point_Y;
	uint8	temp_data[16];
	x=16-data_str_len-x;
	point_Y=y;
	if(data_str_len>16)
		data_str_len=16;
	for(k=0;k<16;k++)
		temp_data[k]=data_str[k];
	
	point_Y*=2;
	for(k=0;k<data_str_len;k++)
		{
		if((15-sel_index)==k)
			wzf_0816(x+k,point_Y,temp_data[data_str_len-1-k],0);	
			  else
			    			wzf_0816(x+k,point_Y,temp_data[data_str_len-1-k],1);	
		}
	
}




⌨️ 快捷键说明

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