📄 lcd display.c
字号:
//Editor: zhangmin
//Version: V1.0
//Description: LCD1602驱动程序
//Date:2008.11.10
/**********************************************************
头文件定义
**********************************************************/
#include<at89x51.h>
#include<intrins.h>
/**********************************************************
自变量定义
**********************************************************/
#define uchar unsigned char
#define uint unsigned int
sbit RS=P3^0; //数据/指令选择端
sbit RW=P3^1; //读写选择端
sbit E=P3^2; //使能信号,从低到高有效
sbit busyFlag=P2^7; //读忙标志位
uchar date[]="2008";
uchar mon[]="11";
uchar day[]="16";
//uchar inputdata[]="Donghua University--Information Colledge--Zhangmin--Major in theRecognition^_^";
//待显示的内容
/**********************************************************
函数名称: delay
函数描述: 延时ms (11.0592MHz)
入口参数: uint i
**********************************************************/
void delay(uint i)
{
uchar a;
while(i--)
{
for(a=0;a<250;a++)
{
_nop_();_nop_();_nop_();_nop_();
}
}
}
/**********************************************************
函数名称: testBusy
函数描述: LCD检测是否忙碌函数
入口参数: 无
**********************************************************/
uchar testBusy(void)
{
bit flag;
P2=0xff;
RS=0; //选择指令端
RW=1; //选择读取
E=1; //使能端由低到高有效
if (busyFlag==1) flag=1;
else flag=0;
E=0;
return flag;
}
/**********************************************************
函数名称: writeCommand
函数描述: LCD写入指令函数
入口参数: 指令参数command
**********************************************************/
void writeCommand(uchar command)
{ while(testBusy());
RS=0; //选择指令端
RW=0; //选择写入
E=1; //下降沿读入
P2=command;
E=0;
}
/**********************************************************
函数名称: writeData
函数描述: LCD写入数据函数
入口参数: 指令参数writedata
**********************************************************/
void writeData(uchar writedata)
{
while(testBusy());
RS=1; //选择数据端
RW=0; //选择写入
E=1;
P2=writedata;
E=0;
}
/**********************************************************
函数名称: initialLcd1602()
函数描述: LCD写入指令函数
入口参数: 无
**********************************************************/
void initialLcd1602(void)
{
/*delay(100);
writeCommand(0x38);
delay(10);
writeCommand(0x38);
delay(10);
writeCommand(0x38);
delay(10); */ //初次使用
writeCommand(0x38); //设置显示格式为:8位,双行显示,5X7点阵
writeCommand(0x80);
writeCommand(0x01);
writeCommand(0x0c);//设置显示状态:显示器开,有光标,关闪烁 writeCommand(0x0f)
//writeCommand(0x0c);writeCommand(0x0e)
writeCommand(0x06);
}
/**********************************************************
函数名称: display_xy
函数描述: LCD确定光标位置函数
入口参数: 列坐标x,行坐标y
**********************************************************/
void display_xy(uchar x,uchar y)
{
if(y==1) //若第二行则光标地址加0x80
x+=0x40;
x+=0x80;
writeCommand(x);
}
/**********************************************************
函数名称: display_char
函数描述: 显示字符函数
入口参数: 列坐标x,行坐标y,输入数据
**********************************************************/
void display_char(uchar x,uchar y,uchar inputData)
{
display_xy(x,y); //确定光标位置
writeData(inputData); //输入字符数据
}
/**********************************************************
函数名称: display_string
函数描述: 显示字符串函数
入口参数: 列坐标x,行坐标y,输入数据串
**********************************************************/
void display_string(uchar x,uchar y,uchar *stringData)
{
uchar columnCoordinate=x; //定义列坐标
uchar rowCoordinate=y; //定义行坐标
while(*stringData!='\0') //循环条件:字符串没有结束
{
display_char(columnCoordinate,rowCoordinate,*stringData);
columnCoordinate++;
stringData++;
/* if(*stringData==0x60) //设置是否回车显示
rowCoordinate++;
if(rowCoordinate==2)
rowCoordinate=0; */
if(columnCoordinate==16)
{
columnCoordinate=0;
rowCoordinate++;
if(rowCoordinate==2) //当前页面显示完,准备下一页显示
{
delay(400); //翻页速度
writeCommand(0x01); //显示完一页后清屏,下一页内容更新
rowCoordinate=0; //重新在第一行显示
}
}
} //一次显示结束
// delay(400);//停留时间,全部内容重新显示
}
/**********************************************************
函数名称: display_character()
函数描述:自定义汉字初始化函数
入口参数: 无
**********************************************************/
void initial_character(void)
{
uchar i,j,cgRam;
uchar zimo[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, // '年' 0x00
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, // '月' 0x01
0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00}; // '日' 0x02
cgRam=0x40; //初始化CGRAM地址
for(j=0;j<3;j++)
{
for(i=0;i<8;i++)
{
writeCommand(cgRam+i); //设置字符地址为:0x00,0x01,0x02
delay(2);
writeData(zimo[8*j+i]); //依次写入每行字字模
delay(2);
}
cgRam=cgRam+8; //写入下一个地址
}
}
/***************以上均为驱动函数***************************/
/**********************************************************
函数名称: main
函数描述:主函数
入口参数: 无
**********************************************************/
void main(void)
{
delay(100); //等待LCD进入工作状态
initialLcd1602();
initial_character();
while(1) //循环显示内容
{
display_string(0,0,date);
display_char(4,0,0x00);
display_string(5,0,mon);
display_char(7,0,0x01);
display_string(8,0,day);
display_char(10,0,0x02);
//display_string(0,0,inputdata); //起始显示位置
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -