📄 lpc21_lcd.c
字号:
#include "LCD.H"
#include "char_16.h"
/*
//--------------240*128点阵液晶 的SYSTEM SET 参数 -----------------------------
const Uchar8 SYSTEMSET_code[8]={0x30,0x87,0x07,0x27,0x2c,0xf0,0x30,0x00};
const Uchar8 SCRTAB_code[10]={0x00,0x00,0xf0,0x00,0x40,0xf0,0x00,0x80,0x00,0x00};
*/
//--------------320*240点阵液晶 的SYSTEM SET 参数 -----------------------------
//const Uchar8 SYSTEMSET_code[8] = {0x38, 0x87, 0x07, 0x27, 0x42, 0xf0, 0x30, 0x00}; //P1-P8参数
//const Uchar8 SCRTAB_code[10] = {0x00, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x80, 0x00, 0x00}; // P1-P10参数
const Uchar8 SYSTEMSET_code[8] = {0x32, 0x87, 0x07, 0x27, 0x42, 0xef, 0x28, 0x00}; //P1-P8参数
const Uchar8 SCRTAB_code[10] = {0x00, 0x00, 0xef, 0x00, 0x40, 0xef, 0x00, 0x80, 0x00, 0x00}; // P1-P10参数
/* 在此可以观察文本方式下的字符及光标的显示效果(写入内容为"Support tel:0571-85121742") */
//unsigned char CTAB1[16]={0x70,0x88,0x88,0x88,0xf8,0x88,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char CTAB1[8]={0x70,0x88,0x88,0x88,0xf8,0x88,0x88,0x00};
/******************************************************************************************************************
* 函数名称:LCM12864_Delay()
* 功 能:软件延时函数。用于LCM12864显示输出时序控制。
* 入口参数:无
* 出口参数:无
*******************************************************************************************************************/
void delay_us(Ushort16 time)
{
do
{
time--;
}
while (time>1);
}
/******************************************************************************************************************
* 函数名称:LCM12864_Delay()
* 功 能:软件延时函数。用于LCM12864显示输出时序控制。
* 入口参数:无
* 出口参数:无
*******************************************************************************************************************/
void delay_ms(Ushort16 time)
{
Uint32 TEMP;
do
{
time--;
for(TEMP = 0; TEMP < 1000; TEMP++)
{
;
}
}
while (time>1);
}
/*********************************************************************************************************
** 函数名称: Uchar8 RdIOData (void)
** 输 入: 无
** 输 出: ret 读了I/0口的数据
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 200_08_21
** 功能描述: 读取I/0口的数据
********************************************************************************************************/
Uchar8 LCD_RdIOData (void)
{
Uchar8 ret;
Uint32 TEMP;
IO1CLR |= LCD245_dir; //设置245为B-A方向
IO1CLR |= LCD_FOOT;
IO1SET |= LCD245_dir; //设置245为A-B方向
IO1DIR = IO1DIR & 0xff00ffff; //设置引脚为输入
LCD_RE_DATA_START();
delay_us(10);
TEMP = IO1PIN;
H_LCD_RE();
IO0SET |= LCD_CS;
L_LCD_RE();
IO1DIR |= 0x00FF0000; //设置引脚为输出
IO1CLR |= LCD245_dir; //设置245为B-A方向
TEMP = TEMP >> 16;
ret = TEMP & 0x000000ff;
return(ret);
}
/*********************************************************************************************************
** 函数名称: Uchar8 RdIOData (void)
** 输 入: 无
** 输 出: ret 读了I/0口的数据
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 200_08_21
** 功能描述: 读取I/0口的数据
********************************************************************************************************/
//8080时序
void LCD_Busy(void)
{
Uchar8 ret;
Uint32 TEMP;
do
{
ret = 0x00;
IO1CLR |= LCD245_dir; //设置245为B-A方向
IO1CLR |= LCD_FOOT;
IO1SET |= LCD245_dir; //设置245为A-B方向
IO1DIR = IO1DIR & 0xff00ffff; //设置引脚为输入
LCD_RE_BUZY_START();
delay_us(10);
TEMP = IO1PIN;
H_LCD_RE();
IO0SET |= LCD_CS;
L_LCD_RE();
IO1DIR |= 0x00FF0000; //设置引脚为输出
IO1CLR |= LCD245_dir; //设置245为B-A方向
TEMP = TEMP >> 16;
ret = TEMP & 0x000000ff;
if(ret == 0xff)
{
ret = 0x00;
}
ret = ret & 0x40;
}
while(ret !=0x40);
}
/*********************************************************************************************************
** 函数名称: void LCD_WriteCMD(Uchar8 command)
** 输 入: 命令command
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 向LCD写命令
********************************************************************************************************/
void InputData (Uchar8 dat)
{
Uint32 temp;
temp = dat;
temp = temp << 16;
temp = temp | (IO1PIN & 0xff00ffff);
IO1PIN = temp;
}
/*********************************************************************************************************
** 函数名称: void LCD_WriteCMD(Uchar8 command)
** 输 入: 命令command
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 向LCD写命令
*******************************************************************************************************/
void LCD_WriteCMD(Uchar8 command)
{
IO1CLR |= LCD245_dir; //设置245为B-A方向
LCD_COM_START();
InputData(command);
H_LCD_WR(); //LCD进入写的状态
H_LCD_CS();
}
/*********************************************************************************************************
** 函数名称: void LCD_WritEDAta(Uchar8 dat)
** 输 入: 数据dat
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述: 向LCD写数据
********************************************************************************************************/
//8080时序
void LCD_WriteData(Uchar8 dat)
{
IO1CLR |= LCD245_dir; //设置245为B-A方向
LCD_DATA_START();
InputData(dat);
H_LCD_WR(); //LCD进入写的状态
H_LCD_CS();
}
/*********************************************************************
** 函数名称: void LCD_Write16_16(Ushort16 x, Uchar8 y, Uchar8 data)
** 输 入: x坐标(<320),Y坐标(<240), 所在定值
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述:
1、 在文本方式下显示汉字, 首先要建立汉字CGRAM,要定义汉字代码
2、 在文本方式下写汉字需要写入4 个代码以组成一个汉字
3、 16*16点阵中文写入函数 CCW1_PR
4、汉字写入子程序(文本方式)
************************************************************/
void LCD_WAIT_16(Uchar8 x, Uchar8 y)
{
Ushort16 i,j;
Uchar8 m, temp_row, n;
temp_row = ROW;
j= temp_row * y + x;
n = 0;
for( ; ;)
{
n = n % 4;
j= temp_row * y + x;
for(m = 0; m < 2; m++)
{
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(i = 0; i < 16; i++)
{
LCD_WriteData(ASCII_BUZY_16[n][ (m * 16) + i]); //写入汉字代码
}
j++;
}
LCD_WriteCMD(DISP_ON); //DISP_ON = 0x59 开(59H)/关(58H)显示
LCD_WriteData(0x54); //设置参数:显示一~四区开显示
delay_ms(2500);
n++;
}
}
void LCD_WAIT_48(Uchar8 x, Uchar8 y)
{
Ushort16 i,j;
Uchar8 m, temp_row, n, p;
temp_row = ROW;
j= temp_row * y + x;
n = 0;
for( ; ;)
{
n = n % 4;
j= temp_row * y + x;
for(p = 0; p < 6; p++)
{
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(i = 0; i < 48; i++)
{
LCD_WriteData(ASCII_BUZY_48[n][(p * 48) + i]); //写入汉字代码
}
j++;
}
LCD_WriteCMD(DISP_ON); //DISP_ON = 0x59 开(59H)/关(58H)显示
LCD_WriteData(0x54); //设置参数:显示一~四区开显示
delay_ms(10000);
n++;
for(m = 0; m < 3; m++)
{
j= temp_row * y + x;
for(p = 0; p < 6; p++)
{
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(i = 0; i < 48; i++)
{
LCD_WriteData(ASCII_BUZY_48[n][(p * 48) + i]); //写入汉字代码
}
j++;
}
LCD_WriteCMD(DISP_ON); //DISP_ON = 0x59 开(59H)/关(58H)显示
LCD_WriteData(0x54); //设置参数:显示一~四区开显示
delay_ms(2000);
n++;
}
}
}
/*********************************************************************
** 函数名称: void LCD_Write16_16(Ushort16 x, Uchar8 y, Uchar8 data)
** 输 入: x坐标(<320),Y坐标(<240), 所在定值
** 输 出:
** 全局变量: 无
** 调用模块: 无
** 作 者: 邱志城
** 日 期: 2008_08_21
** 功能描述:
3、 16*16点阵中文写入函数 CCW1_PR
4、汉字写入子程序(文本方式)
************************************************************/
void LCD_WR_char16(Uchar8 x, Uchar8 y)
{
Ushort16 i,j;
Uchar8 m, temp_x, temp_y, temp_row;
temp_x = x;
temp_y = y;
temp_row = ROW;
j= temp_row * temp_y + temp_x;
for(m = 0; m < 28; m++)
{
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(i = 0; i < 16; i++)
{
LCD_WriteData(ASCII_Big_Char_16[m][i]); //写入汉字代码
}
j++;
}
/*
temp_y += 16;
j= temp_row * temp_y + temp_x;
for(m = 0; m < 28; m++)
{
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(i = 0; i < 16; i++)
{
LCD_WriteData(ASCII_Small_Char[(m)][i]); //写入汉字代码
}
j++;
}
temp_y += 16;
j= temp_row * temp_y + temp_x;
for(m = 0; m < 34; m++)
{
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(i = 0; i < 16; i++)
{
LCD_WriteData(ASCII_SIGN[m][i]); //写入汉字代码
}
j++;
}
*/
}
void LCD_WR_char_string_16(Uchar8 x, Uchar8 y, Uchar8 unm, Uchar8 *font)
{
Ushort16 i,j;
Uchar8 m, temp_x, temp_y, temp_row;
temp_x = x;
temp_y = y;
temp_row = ROW;
j= temp_row * temp_y + temp_x;
for(m = 0; m < unm; m++)
{
LCD_WriteCMD(CSRDIR_DOWN); //CSRDIR_DOWN = 0x4F 令规定了光标地址指针自动移动的方向
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -