📄 lcd.h
字号:
#ifndef _LCD
#define _LCD
/*********************预定义***************************/
#define uchar unsigned char
#define DelayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*******************LCD端口配置************************/
#define LCD_data P0 //12864数据口
sbit RS=P1^0; //寄存器选择输入
sbit RW=P1^1; //液晶读/写控制
sbit EN=P1^2;
//液晶使能控制
/******************************************************/
/* 函数名称:Delay(uint m)
/* 功 能:延迟时间=a*1ms
/* 入口参数:
/* 出口参数:无
/******************************************************/
void Delay(uchar m)
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
/******************************************************/
/* 函数名称:LCD_Busy(void)
/* 功 能:检测BF标志,0时为闲
/* 入口参数:
/* 出口参数:无
/******************************************************/
bit LCD_Busy(void)
{
bit result;
RS = 0;
RW = 1;
EN = 1;
DelayNOP();
result = (bit)(P0&0x80);
EN = 0;
return(result);
}
/******************************************************/
/* 函数名称:LCD_Wcmd(uchar cmd)
/* 功 能:RS=L,RW=L,E=高脉冲,D0-D7=指令码
/* 入口参数:cmd
/* 出口参数:无
/******************************************************/
void LCD_Wcmd(uchar cmd)
{
while(LCD_Busy());
RS = 0;
RW = 0;
EN = 0;
_nop_();
_nop_();
P0 = cmd;
Delay(1);
EN = 1;
Delay(1);
EN = 0;
}
/******************************************************/
/* 函数名称:LCD_Wdat(uchar dat)
/* 功 能:RS=H,RW=L,E=高脉冲,D0-D7=数据
/* 入口参数:dat
/* 出口参数:无
/******************************************************/
void LCD_Wdat(uchar dat)
{
while(LCD_Busy());
RS = 1;
RW = 0;
EN = 0;
P0 = dat;
DelayNOP();
EN = 1;
Delay(1);
EN = 0;
}
/******************************************************/
/* 函数名称:LCD_Init()
/* 功 能:LCD初始化
/* 入口参数:
/* 出口参数:无
/******************************************************/
void LCD_Init()
{
P0=0xFF;
P2=0xFF;
Delay(40);
//并口方式。
Delay(1);
Delay(1);
Delay(10);
LCD_Wcmd(0x30);
Delay(100);
LCD_Wcmd(0x30);
Delay(37);
LCD_Wcmd(0x08);
Delay(100);
LCD_Wcmd(0x10);
Delay(100);
LCD_Wcmd(0x0c); //显示开,关光标
Delay(100);
LCD_Wcmd(0x01); //清除LCD的显示内容
Delay(100);
LCD_Wcmd(0x06);
Delay(100);
}
/******************************************************/
/* 函数名称:LCD_Pos(uchar X,uchar Y)
/* 功 能:字符显示位置设置
/* 入口参数:X,Y
/* 出口参数:无
/******************************************************/
void LCD_Pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
LCD_Wcmd(pos); //显示地址
}
/******************************************************/
/* 函数名称:Display()
/* 功 能:消除反白图形出现噪点
/* 入口参数:无
/* 出口参数:无
/******************************************************/
void Display()
{
uchar i,j;
LCD_Wcmd(0x34); //写数据时,关闭图形显示
for(i=0;i<32;i++)
{
LCD_Wcmd(0x80+i); //写入水平坐标值
LCD_Wcmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //写入两个8位元的数据
LCD_Wdat(0x00);
Delay(1);
}
for(i=0;i<32;i++)
{
LCD_Wcmd(0x80+i);
LCD_Wcmd(0x88);
for(j=0;j<16;j++)
LCD_Wdat(0x00);
Delay(1);
}
LCD_Wcmd(0x36); //写完数据,开图形显示
}
/******************************************************/
/* 函数名称:Photo_Display(uchar x,uchar y,uchar width)
/* 功 能:反白显示
/* 入口参数:X,Y,width
/* 出口参数:无
/******************************************************/
void Photo_Display(uchar x,uchar y,uchar width) //反白,X值为0-7,Y值为0-3,width为行反白格数
{
uchar i,j,flag=0x00;
Display();
if(y>1)
{
flag=0x08;
y=y-2;
}
LCD_Wcmd(0x34); //写数据时,关闭图形显示,且打开扩展指令集
for(i=0;i<16;i++)
{
LCD_Wcmd(0x80+(y<<4)+i);
LCD_Wcmd(0x80+flag+x);
for(j=0;j<width;j++)
{
LCD_Wdat(0xff);
LCD_Wdat(0xff);
}
Delay(1);
}
LCD_Wcmd(0x36); //写完数据,开图形显示
}
/******************************************************/
/* 函数名称:LCD_Show(uchar *clock_time,uchar *number)
/* 功 能:基本界面显示
/* 入口参数:clock_time,number
/* 出口参数:无
/******************************************************/
void LCD_Show(uchar *clock_time,uchar *number)
{
LCD_Pos(0,0);
LCD_Wdat(0x4c);
LCD_Wdat(0x4c);
LCD_Pos(0,1);
LCD_Wdat(0x59);
LCD_Wdat(0xba);
LCD_Pos(0,3);
LCD_Wdat(number[clock_time[7]/10]);
LCD_Wdat(number[clock_time[7]%10]);
LCD_Pos(0,4);
LCD_Wdat(number[clock_time[6]/16]);
LCD_Wdat(number[clock_time[6]%16]);
LCD_Pos(0,7);
LCD_Wdat(0x0e);
LCD_Wdat(0x0e);
LCD_Pos(1,0);
LCD_Wdat(number[clock_time[4]/16]);
LCD_Wdat(number[clock_time[4]%16]);
LCD_Pos(1,1);
LCD_Wdat(0xd4);
LCD_Wdat(0xc2);
LCD_Pos(1,2);
LCD_Wdat(number[clock_time[3]/16]);
LCD_Wdat(number[clock_time[3]%16]);
LCD_Pos(1,3);
LCD_Wdat(0xc8);
LCD_Wdat(0xd5);
LCD_Pos(1,5);
LCD_Wdat(0xd0);
LCD_Wdat(0xc7);
LCD_Pos(1,6);
LCD_Wdat(0xc6);
LCD_Wdat(0xda);
LCD_Pos(1,7);
LCD_Wdat(number[clock_time[5]%16]);
LCD_Pos(2,0);
LCD_Wdat(number[clock_time[2]/16]);
LCD_Wdat(number[clock_time[2]%16]);
LCD_Pos(2,1);
LCD_Wdat(':');
LCD_Wdat(number[clock_time[1]/16]);
LCD_Pos(2,2);
LCD_Wdat(number[clock_time[1]%16]);
LCD_Wdat(':');
LCD_Pos(2,3);
LCD_Wdat(number[clock_time[0]/16]);
LCD_Wdat(number[clock_time[0]%16]);
}
/******************************************************/
/* 函数名称:LCD_Clear()
/* 功 能:LCD屏幕清除
/* 入口参数:无
/* 出口参数:无
/******************************************************/
void LCD_Clear()
{
RS=0;
RW=0;
Delay(100);
LCD_Wcmd(0x01);
Delay(100);
}
/******************************************************/
/* 函数名称:LCD_Wstr(uchar *p)
/* 功 能:单行字符显示
/* 入口参数:P
/* 出口参数:无
/******************************************************/
void LCD_Wstr(uchar *p)
{
while(*p)
LCD_Wdat(*p++);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -