📄 lpc21_lcd.c
字号:
{
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 + -