📄 lcd_control.c
字号:
* 入口参数:无
* 出口参数:无
****************************************************************************/
void CommandChanelOpen()
{
//#define _RS 0x00000001 //A0 P3.0 //1:指令寄存器 0:数据寄存器
//#define _CS1 0x02000000 //CS1 P3.25 //片选1; 1=被选中
IO3SET = _RS;//0x08000000; // RS 1:指令寄存器
IO3CLR = _CS1;//0x00000100; // CS1 1=被选中
}
/****************************************************************************
* 名称:ChanelClose() 内部函数
* 功能:使LCD模块处于读写通道关闭状态
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ChanelClose()
{
//#define _CS1 0x02000000 //CS1 P3.25 //片选1; 1=被选中
IO3SET = _CS1;//0x00000100; // CS1 1=被选中
}
//---------------------------------------------------
//==========================================================
/*------------------写控制寄存器参数------------------------------*/
/****************************************************************************
* 名称:write_com() 内部函数
* 功能:写控制寄存器参数
* 入口参数:unsigned char reg 寄存器地址
unsigned char ptr 寄存器内容
* 出口参数:无
****************************************************************************/
void write_com(unsigned char reg,unsigned char ptr)
{
//while(BUSY){}
LcdBusDelay(100);
//E=0;
IO1CLR = _EN;
OutPutData(reg);
LcdBusDelay(50);
//CS1=0; //cs
IO3SET = _CS1;
//RS=1; //读写指令 寄存器
IO3SET = _RS;
//RW=0; //PIN wirte is 0
IO3CLR = _RW;
//E=1; //PIN is 1
IO1SET = _EN;
LcdBusDelay(50);
IO1CLR = _EN;
//RW=1; //PIN wirte is 1
LcdBusDelay(10);
IO3SET = _RW;
//while(BUSY){}
//P1=ptr;
LcdBusDelay(100);
OutPutData(ptr);
//E=0;
LcdBusDelay(10);
IO1CLR = _EN;
//CS1=0;
// LcdBusDelay(100);
IO3SET = _CS1;
//CS2=1;
//RS=1;
// LcdBusDelay(100);
IO3SET = _RS;
//RW=0;
// LcdBusDelay(100);
IO3CLR = _RW;
//INT=0;
//E=1;
// LcdBusDelay(100);
IO1SET = _EN;
//E=0;
LcdBusDelay(50);
IO1CLR = _EN;
//RW=1;
// LcdBusDelay(100);
IO3SET = _RW;
}
//==========================================================
/*------------------写控制寄存器参数------------------------------*/
/****************************************************************************
* 名称:write_com() 内部函数
* 功能:写控制寄存器参数
* 入口参数:unsigned char reg 寄存器地址
unsigned char ptr 寄存器内容
* 出口参数:无
****************************************************************************/
unsigned char read_com(unsigned char reg)
{
uint8 u8Return;
//while(BUSY){}
//P1=cmd;
LcdBusDelay(100);
OutPutData(reg);
//E=0;
LcdBusDelay(50);
IO1CLR = _EN;
//CS1=0;
IO3SET = _CS1;
//RS=1;
IO3SET = _RS;
//RW=0;
IO3CLR = _RW;
//E=1;
IO1SET = _EN;
//E=0;
LcdBusDelay(50);
IO1CLR = _EN;
//RW=1;
IO3SET = _RW;
//while(BUSY){}
//P1=0xFF;
LcdBusDelay(100);
OutPutData(0xFF);
//E=0;
LcdBusDelay(50);
IO1CLR = _EN;
//CS1=0;
IO3SET = _CS1;
//RS=1;
IO3SET = _RS;
//RW=1;
IO3SET = _RW;
//INT=0;
//E=1;
IO1SET = _EN;
//res=P1;
LcdBusDelay(50);
u8Return = InputData();
//E=0;
LcdBusDelay(50);
IO1CLR = _EN;
//RW=1;
IO3SET = _RW;
return u8Return;
}
/*-------------------写数据到LCD----------------------------*/
/****************************************************************************
* 名称:write_data() 内部函数
* 功能:写数据存储区
* 入口参数:unsigned char Dispdata 要写的数据
* 出口参数:无
****************************************************************************/
void write_data(unsigned char Dispdata)
{
//while(BUSY){}
//P1=Dispdata;
LcdBusDelay(100);
OutPutData(Dispdata);
//E=0;
LcdBusDelay(50);
IO1CLR = _EN;
//CS1=0;
IO3SET = _CS1;
//RS=0;
IO3CLR = _RS;
//RW=0;
IO3CLR = _RW;
//E=1;
IO1SET = _EN;
LcdBusDelay(50);
IO1CLR = _EN;
}
/*************清除屏幕汉字*********/
/****************************************************************************
* 名称:clearhz() 外部函数
* 功能:清除屏幕汉
* 入口参数:unsigned char Dispdata 要写的数据
* 出口参数:无
****************************************************************************/
void clearhz(void)
{
unsigned char i;
write_com(0x60,0x00);
write_com(0x70,0x00);
for(i=0;i<120;i++)
{
// write_data(0xBC);
write_data(0x0A0);
// write_data(0xAA);
write_data(0x0A1);
}
}
/********************光标显示*************************/
/****************************************************************************
* 名称:CursorDisplayOn() 外部函数
* 功能:光标显示打开
* 入口参数:无
* 出口参数:无
****************************************************************************/
void CursorDisplayOn(void)
{
write_com(0x10,0x2f);
}
/****************************************************************************
* 名称:CursorDisplayOff() 外部函数
* 功能:光标显示关闭
* 入口参数:无
* 出口参数:无
****************************************************************************/
void CursorDisplayOff(void)
{
write_com(0x10,0x28);
}
/*********************设定光标位置*********************/
/****************************************************************************
* 名称:Position_Cursor() 外部函数
* 功能:光标显示
* 入口参数:unsigned char x 光标的X位置 数值范围 0 ~ 29
unsigned char y 光标的Y位置 数值范围 0 ~ 127
* 出口参数:无
****************************************************************************/
void Position_Cursor(unsigned char x,unsigned char y)
{
write_com(0x60,x);
write_com(0x70,y);
}
/****************************************************************************
* 名称:puthz() 外部函数
* 功能:在光标(X,Y)处显示汉字hzcode(字型码)
* 入口参数:unsigned char x 光标的X位置 数值范围 0 ~ 29
unsigned char y 光标的Y位置 数值范围 0 ~ 127
unsigned int hzcode 汉字编码
* 出口参数:无
****************************************************************************/
void puthz(unsigned char x,unsigned char y,unsigned int hzcode)
{
unsigned char ph,pl;
ph=(unsigned char)(hzcode>>8);
pl=(unsigned char)hzcode;
write_com(0x60,x);
write_com(0x70,y);
write_data(ph);
write_data(pl);
}
/****************************************************************************
* 名称:Bright_Set() 外部函数
* 功能:液晶屏亮度控制
* 入口参数:unsigned char p 亮度值 数值范围 0~31
* 出口参数:无
****************************************************************************/
void Bright_Set(unsigned char p)
{
unsigned char ptr;
ptr=p|0x20;
write_com(0xD0,ptr);
}
/****************************************************************************
* 名称:init_lcd() 外部函数
* 功能:初始化LCD屏
* 入口参数:无
* 出口参数:无
****************************************************************************/
uint8 u8Test;
void init_lcd(void)
{
Lcd_PinSet_PINSEL2();
Lcd_PinSet_Dir();
// testLCD_interface();
// testLCD_interface();
// testLCD_interface();
// testLCD_interface();
LcdBusDelay(100);
ResetLCD();
LcdBusDelay(500);
write_com(0x00,0xCD); // CD=1100 1101 (11:正常电源模式,D3=1:显示模式为交字模式,写入资料被视为GB/BIG/ASCII
// D2=1:屏幕打开 D1=0:正常显示 D0=1:正常显示
//D7-D6:电源模式(Power Mode)
// 11:正常模式(Normal Mode),控制器的所有功能都可以使用(Available) 。
// 10:等待模式(Standby Mode),只有DRAM与ROM的存取功能被禁止,其他功能都可以使用,LCD亦照常工作。
// 01:睡眠模式(Sleep Mode),除了允许寄存器的读写外,其他LCD显示与DDRAM、ROM的存取将被禁止。
// 00:关闭模式(Off Mode),除了唤醒(Wake-Up)电路工作处,其他功能都被禁止.当Wake-Up电路被触发,控制器将进入正常模式。
//D5:软体重置,所有寄存器回到初始值,但是RAM的内容不会被清除。1:重置所有寄存器,0:无作用
//D4:设定自动重置功能,当此位元处于致能(设为1)时,若控制器无法在2毫秒内得到一完整指令或资料时,则控制器会忽视这个指令或资料。
// 1:致能自动重置功能,0:禁能自动重置功能
//D3:选择显示工作模式
// 1:交字模式,写入的资料被视为是GB/BIG/ASCII等字码。
// 0:绘图模式,写入的资料被视为是Bit-Map的模式。
//D2:设定荧幕显示为开启或关闭,此位元用来控制连接到LCD驱动器界面的”DISP_OFF”信号
// 1:DISP_OFF” 信号输出High(荧幕显示开启)
// 0:DISP_OFF” 信号输出Low(荧幕显示关闭)
//D1:闪烁模式选择
// 1:整个荧幕闪烁,闪烁时间由寄存器[80h]BTR来设定
// 0:正常显示
//D0:荧幕反白显示选择
// 1:正常显示
// 0:全荧幕反白显示,DDRAM内的资料会被全部反相。
write_com(0x08,0x73); // 0X73=0111 0011 D6=1:CLK OUT 使能控制 D5=1:工作视窗 D4=1:INT 和BUSY 高电平
// D1D0=11:8MHz
write_com(0x10,0x2f); //光标显示 0x2F=0010 1111 D5=1:直接存储资料于DDRAM中,D4=0:非粗体
//D3=1:光标自动移位。D2=1:设置光标ON。D1=1:光标闪烁。D0=1:光标宽度
//D7:光标自动移位设定,此位元用来设定当资料读出DDRAM时,光标是否自动移位,1:致能,0:禁能
//D6:中/英文字对齐,1:致能,0:禁能,此功能能仅在文字模式时有效,可以将全形与半形混合显示时作对齐调整。
//D5:储存当前资料(正相/反相)于 DDRAM
// 1:直接储存资料于DDRAM中
// 0:存入相反的资料于DDRAM中
//D4:设定粗体字型(仅文字模式适用),1:粗体字型,0:正常字型
//D3:光标自动移位设定,此位元用来设定当资料写入DDRAM时,光标是否自动移位,
// 如果此位元被Enable,则不论在文字或是绘图模式,光标都会自动移位。,1:致能,0:禁能
//D2:光标显示On/Off设定,1:设定光标 On,0:设定光标 Off
//D1:光标闪烁控制,1:光标闪烁,闪烁时间由寄存器[80h]BTR来决定,0:光标不闪烁
//D0:设定光标宽度
// 1:会随着输入的资料而变动光标宽度,当资料为半型时,光标为一个位元组宽度(8个Pixel),当资料为全型时,光标为二个位元组宽度(16个Pixel)。
// 0:光标固定为一个位元组的宽度(8个Pixel)
write_com(0x18,0x20); //D7-D4:设定光标高度。D3-D0:设定行距。
write_com(0x10,0x2b);//光标隐藏
write_com(0x20,0x1D); //D5-D0:设定工作视窗的右边界:29
write_com(0x30,0x7f); //D7-D0:设定工作视窗的下边界:127
write_com(0x40,0x00); //D5-D0:设定工作视窗的左边界:0
write_com(0x50,0x00); //D7-D0:设定工作视窗的上边界:0
write_com(0x28,0x1D); //D5-D0:设定显示视窗的右边界:(240/8)-1 = 29
write_com(0x38,0x80); //D7-D0:设定显示是窗的下边界: 128-1 = 127
write_com(0x48,0x00); //D5-D0:设定显示视窗的左边界:00
write_com(0x58,0x00); //D7-D0:设定显示视窗的上边界:00
write_com(0x60,0x00); //D5-D0:设定光标Segment位址
write_com(0x70,0x00); //D7-D0:设置光标Common位址
write_com(0x90,0x1D); //D7-D0:Shift Clock Control Register
write_com(0xB0,0x27); //D5-D0:设定行 (Column)位址中断,假如光标位置X寄存器(CPXR)=INTX,中断发生
write_com(0xB8,0xEF); //D7-D0:设定列 (Row)位址中断,假如光标位置Y寄存器(CPXR)=INTY,中断发生
write_com(0xA0,0x08); //D7:忙碌状况指示
// 1:控制器为忙碌状态,MCU需暂时等候到忙碌状态终止。
// 0:控制器为关置状态,随时可接受MCU存取。
//D6:触摸屏中断标志位
// 1:触触摸屏有侦测到接触(Touch)
// 0:触摸屏未侦测到接触
//D5:光标行(Column)状态
// 1:光标的Column等于寄存器[B0h]INTX
// 0:光标的Column不等于寄存器[B0h]INTX
//D4:光标列(Column)状态
// 1:光标的列等于寄存器[B8h]INTY
// 0:光标的列不等于寄存器[B8h]INTY
//D3:忙碌中断屏蔽
// 1:使能BUSY去产生中断输出
// 0:禁能BUSY去产生中断输出
//D2:触摸屏中断屏蔽
// 1:如果触摸屏被侦测到,则产生中断输出。
// 0:如果触摸屏被侦测到,则不产生中断输出。
//D1:寄存器[B0h]INTX是否发生中断
// 1:使能INTX中断
// 0:禁能INTX中断
//D0:设定寄存器[B8h]INTY是否发生中断
write_com(0xC0,0xF0); //D7:触摸屏功能启动,1:禁能,0:致能
//D6:触摸屏资料输出,1:禁能触摸屏资料输出,0:使能触摸屏资料输出
//D5:保留
//D4:触控状态位元指示,1:触控未发生。0:触控发生
//D3-D0:触摸屏控制位元
// Bit3 = 0 Switch SW3 OFF, Bit3 = 1 Switch SW3 ON
// Bit2 = 0 Switch SW2 OFF, Bit2 = 1 Switch SW2 ON
// Bit1 = 0 Switch SW1 OFF, Bit1 = 1 Switch SW1 ON
// Bit0 = 0 Switch SW0 OFF, Bit0 = 1 Switch SW0 ON
write_com(0xD0,0x30); //D7:LCD 亮度控制,1:禁能,0:使能
//D6:DAC写入使能
// 1:不允许MCU把资料写入Bit[4..0]
// 0:允许MCU把资料写入Bit[4..0]
//D5:重置LCD亮度调整控制功能
// 1:正常操作
// 0:DAC重置,设定Iout为0uA
//D4-D0: 设定LCD亮度控制Iout值
// 00000b .. 0uA (Min. Current)
// :
// :
// 11111b .. 500uA (Max. Current)
write_com(0xE0,0x00); //D7-D0:设定写入到DDRAM的资料
// 当寄存器[F0h]的bit3为‘1’,控制器内部将自动读取本寄存器[E0h]的Data,
// 然后全部填写到DDRAM内,之后寄存器[F0h]的bit3被清除为‘0’
write_com(0xF0,0xA0); //D7:字型ROM的转换,1:使能,0:禁能
//D6:内部/外部字型ROM选择,1:选择外部字型ROM,0:选择内部字型ROM
//D5-D4:字型ROM的语系选择,0 1:选择繁体(BIG5)字型,1 0:原则简体(GB)字型
//D3:重复写入REG [E0h]的资料到DDRAM,1:开始写入,0:未动作
//D2:文字码的类别选择,1:输入ASCII码,输出为符号等,0:输入GB/BIG5码,输出为中文字
//D1-D0:4种ASCII区块选择
// 0 0:ASCII选择区块0
// 0 1:ASCII选择区块1
// 1 0:ASCII选择区块2
// 1 1:ASCII选择区块3
}
//==================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -