📄 lcd.c
字号:
/********************************************************/
/* 液晶显示模块控制函数定义(模拟端口方式) */
/* 液晶显示屏大小:128*64 */
/* 控制器:HD61202/3 */
/* 控制方式:单片机端口线模拟时序控制 */
/* 作者:倪晓军 最后修改:2005-11-4 13:43 */
/********************************************************/
#include <reg52all.h>
#include "LCD.H"
unsigned char CmdWord = 0xe0;
/********************************************************/
/* 背光显示控制 */
/* 参数:0/1:熄灭/点亮 */
/********************************************************/
void LCD_BackLight(int bl)
{
if(bl)
CmdWord &= 0x7f;
else
CmdWord |= 0x80;
CPort = CmdWord;
}
/********************************************************/
/* 等待液晶显示屏复位 */
/* 参数:n 表示等待哪个控制器复位,0为第1块,1为第2块 */
/********************************************************/
void LCD_WaitIdle(unsigned char n)
{
if(n==0)
{
CmdWord &= (~DI); // DI=0
CmdWord |= (RW | DBusOE); // RW=1,read
CPort = CmdWord;
CmdWord |= CS0; // CS0=1
CPort = CmdWord;
CmdWord |= E; // E=1;
CPort = CmdWord;
while(P13);
CmdWord &= (~E);
CPort = CmdWord;
CmdWord &= (~CS0);
CPort = CmdWord;
}
else
{
CmdWord &= (~DI);
CmdWord |= (RW | DBusOE);
CPort = CmdWord;
CmdWord |= CS1;
CPort = CmdWord;
CmdWord |= E;
CPort = CmdWord;
while(P13);
CmdWord &= (~E);
CPort = CmdWord;
CmdWord &= (~CS1);
CPort = CmdWord;
}
}
/********************************************************/
/* 向液晶显示屏写入命令字 */
/* 参数:n 表示向哪个控制器写入,0为第1块,1为第2块 */
/* Cmd 命令字 */
/********************************************************/
void LCD_WriteCommand(unsigned char n,unsigned char Cmd)
{
LCD_WaitIdle(n);
DBus = Cmd;
if(n==0)
{
CmdWord &= (~(DI | RW | DBusOE));
CPort = CmdWord;
CmdWord |= CS0;
CPort = CmdWord;
CmdWord |= E;
CPort = CmdWord;
CmdWord &= (~E);
CPort = CmdWord;
CmdWord &= (~CS0);
CPort = CmdWord;
CmdWord |= DBusOE;
CPort = CmdWord;
}
else
{
CmdWord &= (~(DI | RW | DBusOE));
CPort = CmdWord;
CmdWord |= CS1;
CPort = CmdWord;
CmdWord |= E;
CPort = CmdWord;
CmdWord &= (~E);
CPort = CmdWord;
CmdWord &= (~CS1);
CPort = CmdWord;
CmdWord |= DBusOE;
CPort = CmdWord;
}
}
/********************************************************/
/* 液晶显示屏复位 */
/********************************************************/
void LCD_Reset(void)
{
int i,j;
CmdWord &= (~LCDRST);
CPort = CmdWord;
for(i=0;i<20;i++) for(j=0;j<10000;j++);
CmdWord |= LCDRST;
CPort = CmdWord;
for(i=0;i<20;i++) for(j=0;j<10000;j++);
LCD_WriteCommand(0,0x3f); /* 打开LCD显示 */
LCD_WriteCommand(1,0x3f);
LCD_WriteCommand(0,0xc0); /* 设置起始显示行=0 */
LCD_WriteCommand(1,0xc0);
}
/*********************************************************/
/* 设置X地址(页地址,对应显示屏的行,8行一组)函数 */
/* 参数:chip 控制器芯片号; x 页地址,取值范围0~7 */
/*********************************************************/
void LCD_SetXAddress(unsigned char chip, unsigned char x)
{
if( chip == 0)
{
LCD_WaitIdle(0);
LCD_WriteCommand(0,0xB8 | (x & 0x07));
}
else
{
LCD_WaitIdle(1);
LCD_WriteCommand(1,0xB8 | (x & 0x07));
}
}
/*********************************************************/
/* 设置Y地址函数(列地址,对应显示屏的列) */
/* 参数:chip 控制器芯片号; y 列地址,取值范围0~63 */
/*********************************************************/
void LCD_SetYAddress(unsigned char chip, unsigned char y)
{
if(chip == 0)
{
LCD_WaitIdle(0);
LCD_WriteCommand(0,0x40 | (y & 0x3F));
}
else
{
LCD_WaitIdle(1);
LCD_WriteCommand(1,0x40 | (y & 0x3F));
}
}
/********************************************************/
/* 向液晶显示屏写入数据 */
/* 参数:c 待写入数据 */
/* X x方向地址,范围(0~127) */
/* Y y方向地址,范围(0~7)[显示屏左上角为参考点] */
/********************************************************/
void LCD_WriteData(unsigned char c,unsigned char X,unsigned char Y)
{
if(X<64) /* 数据应写入第1块控制器 */
{
LCD_SetXAddress(0,Y);
LCD_SetYAddress(0,X);
LCD_WaitIdle(0);
DBus = c;
CmdWord |= DI;
CmdWord &= ~(RW | DBusOE);
CPort = CmdWord;
CmdWord |= CS0;
CPort = CmdWord;
CmdWord |= E;
CPort = CmdWord;
CmdWord &= (~E);
CPort = CmdWord;
CmdWord &= (~CS0);
CPort = CmdWord;
CmdWord |= DBusOE;
CPort = CmdWord;
}
else /* 数据写入第2块控制器 */
{
LCD_SetXAddress(1,Y);
LCD_SetYAddress(1,X-64);
LCD_WaitIdle(1);
DBus = c;
CmdWord |= DI;
CmdWord &= ~(RW | DBusOE);
CPort = CmdWord;
CmdWord |= CS1;
CPort = CmdWord;
CmdWord |= E;
CPort = CmdWord;
CmdWord &= (~E);
CPort = CmdWord;
CmdWord &= (~CS1);
CPort = CmdWord;
CmdWord |= DBusOE;
CPort = CmdWord;
}
}
/*********************************************************/
/* 显示屏清屏并填充字符 */
/* 参数:c 填充字符的ASCII码 */
/*********************************************************/
void LCD_ClrScr(unsigned char c)
{
unsigned char x,y;
for(x=0;x<=7;x++)
{
for(y=0;y<=127;y++)
{
LCD_WriteData(c,y,x);
LCD_WriteData(c,y,x);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -