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

📄 lpc21_lcd.c

📁 1、arm7芯片2148驱动大液晶 2、ym320240的液晶驱动 3、I2c通信at24c256 4、各种字符的显示
💻 C
📖 第 1 页 / 共 3 页
字号:
{
    Ushort16 j;
	Uchar8 temp_row, p;
	temp_row = ROW;

	if((legth + y_start) > 240)					 //防止数据溢出
	{
		legth = legth - ((legth + y_start) - 240);
	}

	j= temp_row * y_start + x_start;
	LCD_WriteCMD(CSRDIR_DOWN);			   //CSRDIR_DOWN = 0x4F 令规定了光标地址指针自动移动的方向
	LCD_WriteCMD(CSRW);					//CSRW = 0x46 CSRW 代码
	LCD_WriteData(j%256);				//设置光标地址
    LCD_WriteData(j/256);				//设置光标地址
	LCD_WriteCMD(MWRTTE);				//MWRTTE = 0x42 MWRITE 代码
	for(p = 0; p < legth; p++)
	{ 
		LCD_WriteData(0x80);				//写入合成数据
	}
}

/*********************************************************************************************************
** 函数名称:void LCD_Write_ROW_Right(Ushort16 x_start, Ushort16 y_start, Ushort16 legth)
** 输 入: x坐标(<320),Y坐标(<240), 对头坐标
** 输 出: 
** 全局变量: ROW 
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 
	1、 画右竖数
************************************************************/
void LCD_Write_ROW_Right(Uchar8 x_start, Uchar8 y_start, Uchar8 legth)
{
    Ushort16 j;
	Uchar8 temp_row, p;
	temp_row = ROW;

	if((legth + y_start) > 240)					 //防止数据溢出
	{
		legth = legth - ((legth + y_start) - 240);
	}

	j= temp_row * y_start + x_start;
	LCD_WriteCMD(CSRDIR_DOWN);			   //CSRDIR_DOWN = 0x4F 令规定了光标地址指针自动移动的方向
	LCD_WriteCMD(CSRW);					//CSRW = 0x46 CSRW 代码
	LCD_WriteData(j%256);				//设置光标地址
    LCD_WriteData(j/256);				//设置光标地址
	LCD_WriteCMD(MWRTTE);				//MWRTTE = 0x42 MWRITE 代码
	for(p = 0; p < legth; p++)
	{ 
		LCD_WriteData(0x01);				//写入合成数据
	}
}
/*********************************************************************************************************
** 函数名称:void LCD_Write_rectangle(Ushort16 x_start,Ushort16 y_start, Ushort16 x_end,Ushort16 y_end)
** 输 入: x坐标(<320),Y坐标(<240), 对头坐标
** 输 出: 
** 全局变量: ROW 
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 
	1、 画矩形
************************************************************/
void LCD_Write_rectangle(Uchar8 x_start,Uchar8 y_start, Uchar8 x_end,Uchar8 y_end)
{
    Ushort16 x_num, y_num;
	x_num = x_end - x_start;
	y_num = y_end - y_start;
	if(y_num != 0)			//画直线
	{
		LCD_Write_ROW_Left(x_start, y_start, y_num);		  //画左竖线
		LCD_Write_ROW_Right((x_end - 1), y_start, y_num);	  //画右竖线
	}
	if(x_num != 0)						//画横线
	{
		LCD_Write_Line(x_start, y_start, x_num);	  //画上横线
		LCD_Write_Line(x_start, (y_end - 1), x_num);	  //画上横线
	}
}


/*********************************************************************************************************
** 函数名称: void LCD_CLR(void)
** 输 入: x坐标(<320),Y坐标(<240), 所在定值
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述:清屏
********************************************************************************************************/
void LCD_CLR(void)
{
	Ushort16 j;
	Uchar8 i;
	LCD_WriteCMD(CSRDIR_RIGHT);			   //CSRDIR_RIGHT = 0x4c 令规定了光标地址指针自动移动的方向
	LCD_WriteCMD(CSRW);			  		   //CSRW = 0x46 /令设置了光标地址CSR
	LCD_WriteData(0x00);				   //设置参数光标指针低8位
	LCD_WriteData(0x00);				   //设置参数光标指针高8位
	LCD_WriteCMD(MWRTTE);			  		//MWRTTE = 0x42 指令允许MPU连续地把显示数据写入显示区内,在使用指令之前要首先设置好光标地址和光标移动方向的参数
	for(j = 0; j < 2195; j++)    			//清64K的显示存储器*/
	{
		for(i = 0;i < 30; i++)     /*写入一行*/
      	{
        	LCD_WriteData(0x00);     /* 写入数据 */
      	}
	}
}


/*********************************************************************************************************
** 函数名称:void LCD_Init(void)
** 输 入: 无
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 液晶初始化
********************************************************************************************************/
void LCD_Init(void)
{
	Uchar8 p;
	SCS = 0x00000000;
	PINSEL0 &= LCD_CS_A0;				 //引脚定义为I/O口
	PINSEL1 &= LCD_WR_RD;				 //引脚定义为I/O口
	PINSEL2 |= 0x00000004;				 //P1口的P1[31:26]用作调试端口,P1[25:16]用作I/0口

	IO1DIR |= 0x00ff0000;			//设置引脚为输出 
	IO0DIR |= LCD_CTRL;		  //设置LCD控制引脚为输出
	IO0SET |= LCD_CTRL;		  //输出设置LCD控制引脚为输出 
	IO0DIR |= LCD_RST;
	IO0CLR = LCD_RST;
	delay_us(1000);
	IO0SET |= LCD_RST;		  //复位

	LCD_WriteCMD(SYSTEMSET);			//SYSTEMSET = 0x40 该指令是SID13305软件初始化指令
	for(p = 0; p < 8; p++)
	{
		LCD_WriteData(SYSTEMSET_code[p]);
	}
	LCD_WriteCMD(SCROLL);			//SCROLL = 0x44 设置了显示RAM区中各显示区的起始地址及所占有的显示行数
	for(p = 0; p < 10; p++)
	{
		LCD_WriteData(SCRTAB_code[p]);
	}
	LCD_WriteCMD(HDOTSET);			//HDOTSET = 0x5a 设置以点为单位的显示画面水平移动量,相当于一个字节内的卷动
	LCD_WriteData(0x00);

	LCD_WriteCMD(CSRFORM);				//CSRFORM = 0x5d 该指令设置了光标的显示方式及其形状
	LCD_WriteData(0x00);				   //设置光标水平点为CSX=8 
	LCD_WriteData(0x00);				   //光标为块状形式,垂直点为CSY=8  

	LCD_WriteCMD(OYLAY);				//OYLAY = 0x5b 令规定画面重叠显示的合成方式及显示一、三区的显示属性
	LCD_WriteData(0x0d);				//图行方式,异或显示一三区

	LCD_WriteCMD(CSRW);			  		   //CSRW = 0x46 /令设置了光标地址CSR
	LCD_WriteData(0x00);				   //设置参数光标指针低8位
	LCD_WriteData(0x00);				   //设置参数光标指针高8位

	LCD_WriteCMD(DISP_ON);			//DISP_ON = 0x59 开(59H)/关(58H)显示
	LCD_WriteData(0x54);			//设置参数:显示一~四区开显示
	LCD_CLR();						 //清屏
}

void   TextDisp(void) 
{   

	LCD_WR_string_16x16(0, 10, 8, 3, (Uchar8 *)&Time_code_16[0][0]);		//显示“低”
}


/*********************************************************************************************************
** 函数名称:void WR_Date(Uchar8 T_Type, Uchar8 *Date_time)
** 输 入: 
			T_Type显示类型			0表示8*8的字体,1表示16*8的字体
			Date_time显示的时间.
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写日期
		typedef struct{					 //时间的结构体
						Ushort16 YE;
						Uchar8	MO;
						Uchar8 	DD;
						Uchar8	HH;
						Uchar8	MI;
						Uchar8	SS;
					}Str_Date;
********************************************************************************************************/
void WR_Date(Uchar8 T_Type, Uchar8 temp_x, Uchar8 temp_y, Uchar8 *Date_time)
{
	Uchar8 m;
	Ushort16 temp_year; 
	Uchar8 temp_month, temp_day, temp_hour, temp_minute, temp_second; 
	Uchar8 temp_time[19];

	m = *Date_time;
	Date_time++;
	temp_year = *Date_time;
	temp_year = temp_year << 8;
	temp_year |= m;
	Date_time++;

	temp_month = *Date_time;
	Date_time++;

	temp_day = *Date_time;
	Date_time++;

	temp_hour = *Date_time;
	Date_time++;
	temp_minute = *Date_time;
	Date_time++;
	temp_second = *Date_time;

	temp_time[0] = temp_year / 1000;
	temp_year = temp_year % 1000;
	temp_time[1] = temp_year / 100;
	temp_year = temp_year % 100;
	temp_time[2] = temp_year / 10;
	temp_time[3] = temp_year % 10;
	temp_time[4] = 62;
	temp_time[5] = (temp_month / 10) & 0x01;	  //防止月份溢出
	temp_time[6] = temp_month % 10;
	temp_time[7] = 62;
	temp_time[8] = (temp_day / 10) & 0x03;		  //防止月份溢出
	temp_time[9] = temp_day % 10;
	temp_time[10] = 65;
	temp_time[11] = temp_hour / 10;
	temp_time[12] = temp_hour % 10;
	temp_time[13] = 63;
	temp_time[14] = temp_minute / 10;
	temp_time[15] = temp_minute % 10;
	temp_time[16] = 63;
	temp_time[17] = temp_second / 10;
	temp_time[18] = temp_second % 10;

    if(T_Type == 0)		//表示8*8的时间显示
	{
		LCD_WR_string_8x8(0, temp_x, temp_y, 19, temp_time);
	}
	else		   	//表示16*8的时间显示
	{
		LCD_WR_string_16x8(0, temp_x, temp_y, 19, temp_time);
	}
}
/*********************************************************************************************************
** 函数名称:void WR_Date(Uchar8 T_Type, Uchar8 *Date_time)
** 输 入: 
			T_Type显示类型			0表示8*8的字体,1表示16*8的字体
			Date_time显示的时间.
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写日期
		typedef struct{					 //时间的结构体
						Ushort16 YE;
						Uchar8	MO;
						Uchar8 	DD;
						Uchar8	HH;
						Uchar8	MI;
						Uchar8	SS;
					}Str_Date;
********************************************************************************************************/
void WR_Date_Modify(Uchar8 T_Type, Uchar8 temp_x,  Uchar8 temp_y)
{
	Uchar8 m;
	Ushort16 temp_Data;
	Uchar8 temp_time[4];

    m = T_Type & 0x0f;
    switch(m)
    {
        case 0:             //修改年
            temp_Data = Time_Data.YE;
        	temp_time[0] = temp_Data / 1000;
        	temp_Data = temp_Data % 1000;
        	temp_time[1] = temp_Data / 100;
        	temp_Data = temp_Data % 100;
        	temp_time[2] = temp_Data / 10;
        	temp_time[3] = temp_Data % 10;
    
            T_Type = (T_Type >> 4);
            if(T_Type == 0)		//表示8*8的时间显示
        	{
        		LCD_WR_string_8x8(0, temp_x, temp_y, 4, temp_time);
        	}
        	else if(T_Type == 1)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(0, temp_x, temp_y, 4, temp_time);
        	}
        	else if(T_Type == 2)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_8x8(1, temp_x, temp_y, 4, temp_time);
        	}
        	else if(T_Type == 3)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(1, temp_x, temp_y, 4, temp_time);
        	}
            break;
        case 1:           //修改月
            temp_Data = Time_Data.MO;
            temp_Data = temp_Data % 100;
        	temp_time[0] = (temp_Data / 10) & 0x01;	  //防止月份溢出
        	temp_time[1] = temp_Data % 10;
            T_Type = (T_Type >> 4);
            if(T_Type == 0)		//表示8*8的时间显示
        	{
        		LCD_WR_string_8x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 1)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 2)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_8x8(1, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 3)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(1, temp_x, temp_y, 2, temp_time);
        	}
            break;
        case 2:           //修改日
            temp_Data = Time_Data.DD;
            temp_Data = temp_Data % 100;
        	temp_time[0] = (temp_Data / 10) & 0x03;		  //防止月份溢出
        	temp_time[1] = temp_Data % 10;
            T_Type = (T_Type >> 4);
            if(T_Type == 0)		//表示8*8的时间显示
        	{
        		LCD_WR_string_8x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 1)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 2)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_8x8(1, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 3)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(1, temp_x, temp_y, 2, temp_time);
        	}
            break;
        case 3:           //修改时
            temp_Data = Time_Data.HH;
            temp_Data = temp_Data % 100;
        	temp_time[0] = temp_Data / 10;
        	temp_time[1] = temp_Data % 10;
            T_Type = (T_Type >> 4);
            if(T_Type == 0)		//表示8*8的时间显示
        	{
        		LCD_WR_string_8x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 1)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 2)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_8x8(1, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 3)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(1, temp_x, temp_y, 2, temp_time);
        	}
            break;
        case 4:           //修改分
            temp_Data = Time_Data.MI;
            temp_Data = temp_Data % 100;
        	temp_time[0] = temp_Data / 10;
        	temp_time[1] = temp_Data % 10;
            T_Type = (T_Type >> 4);
            if(T_Type == 0)		//表示8*8的时间显示
        	{
        		LCD_WR_string_8x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 1)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 2)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_8x8(1, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 3)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(1, temp_x, temp_y, 2, temp_time);
        	}
            break;
        case 5:           //修改秒
            temp_Data = Time_Data.SS;
            temp_Data = temp_Data % 100;
        	temp_time[0] = temp_Data / 10;
        	temp_time[1] = temp_Data % 10;
            T_Type = (T_Type >> 4);
            if(T_Type == 0)		//表示8*8的时间显示
        	{
        		LCD_WR_string_8x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 1)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(0, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 2)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_8x8(1, temp_x, temp_y, 2, temp_time);
        	}
        	else if(T_Type == 3)		   	//表示16*8的时间显示
        	{
        		LCD_WR_string_16x8(1, temp_x, temp_y, 2, temp_time);
        	}
            break;
    }

}

/*********************************************************************************************************
** 函数名称:void WR_temperature(Uchar8 T_Type, Uchar8 *Date_time)
** 输 入: 
			T_Type显示类型			0表示8*8的字体,1表示16*8的字体
			Date_time显示的温度.
** 输 出: 
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 写温度16*8
********************************************************************************************************/
void WR_temperature(Uchar8 T_Type, Ushort16 TData)
{
	Uchar8 temp_buf[8], m;
	Uchar8 temp_x, temp_y;
	for(m = 0; m < 5; m++)
	{
		temp_buf[(4 - m)] = TData % 10;
		if((TData == 0) && (m > 2))
		{
			temp_buf[(4 - m)] = 10;		//不显示
		}
		TData = TData / 10;
	}
	temp_buf[5] = temp_buf[4];
	temp_buf[4] = 64;  
	temp_buf[6] = 67;  
	temp_buf[7] = CHAR_C;
	  

	if(T_Type == 0)		//表示8*8的时间显示
	{
		temp_x = Tem8_addr_x;
		temp_y = Tem8_addr_y;
		LCD_WR_string_8x8(0, temp_x, temp_y, 8, temp_buf);
	}
	else 			  	//表示16*8的时间显示
	{
		temp_x = Tem16_addr_x;
		temp_y = Tem16_addr_y;
		LCD_WR_string_16x8(0, temp_x, temp_y, 8, temp_buf);
	}
}

⌨️ 快捷键说明

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