51单片机常用头文件LCD1602.docx
- 文档编号:19075484
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:10
- 大小:17.71KB
51单片机常用头文件LCD1602.docx
《51单片机常用头文件LCD1602.docx》由会员分享,可在线阅读,更多相关《51单片机常用头文件LCD1602.docx(10页珍藏版)》请在冰豆网上搜索。
51单片机常用头文件LCD1602
自制51单片机常用头文件(LCD1602)
C512008-09-2420:
11:
05阅读946评论0 字号:
大中小 订阅
/*--------------------------------------------------------------------------
LCD1602.H
TheuserfunctionisC51.
Copyright(c)1988-2004KeilElektronikGmbHsumzhaojun
Allrightsreserved.
--------------------------------------------------------------------------*/
#ifndef__LCD1602_H__
#define__LCD1602_H__
/*连接线图:
---------------------------------------------------
|LCM-----51 |LCM-----51 | LCM------51 |
|-----------------------------------------------|
|DB0-----P0.0|DB4-----P0.4|RS-------P2.0 |
|DB1-----P0.1|DB5-----P0.5|RW-------P2.1 |
|DB2-----P0.2|DB6-----P0.6|E--------P2.2 |
|DB3-----P0.3|DB7-----P0.7|VLCD接1K电阻到GND|
---------------------------------------------------*/
/****************** LCD1602指令 ***********************************/
//输入方式设置
#defineLCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#defineLCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#defineLCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#defineLCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
#defineLCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#defineLCD_DISPLAY_ON 0x0C //显示开
#defineLCD_DISPLAY_OFF 0x08 //显示关
#defineLCD_CURSOR_ON 0x0A //光标显示
#defineLCD_CURSOR_OFF 0x08 //光标不显示
#defineLCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#defineLCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
//光标、画面移动,不影响DDRAM
#defineLCD_LEFT_MOVE 0x18 //LCD显示左移一位
#defineLCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#defineLCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#defineLCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
//工作方式设置
#defineLCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#defineLCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
#defineLCD_CLEAR_SCREEN 0x01 //清屏
/***********************LCD1602地址相关******************************/
#defineLINE1_HEAD 0x80 //第一行DDRAM起始地址
#defineLINE2_HEAD 0xc0 //第二行DDRAM起始地址
#defineLINE1 0 //第一行
#defineLINE2 1 //第二行
#defineLINE_LENGTH 8 //每行的最大字符长度
/***********************LCD1602接线引脚定义**************************/
#defineLCM_RS P2_0 //数据/命令选择信号
#defineLCM_RW P2_1 //读/写选择信号
#defineLCM_E P2_2 //使能信号
#defineLCM_Data P0 //显示数据端口
#defineBusy 0x80 //用于检测LCM状态字中的Busy标识
#defineucharunsignedchar
#defineuintunsignedint
//================================LCM1602控制部分=========================================================
/*****************************************************
函数名:
voidDelay_LCD(void)
功 能:
5ms延时
说 明:
LCD显示延时
入口参数:
无
返回值:
无
*****************************************************/
voidDelay_LCD(void)
{
uintTempCyc=5552;//放入延时数据
while(TempCyc--)
{
;
}
}
/*****************************************************
函数名:
ucharReadStatusLCM()
功 能:
读忙状态
说 明:
判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
入口参数:
无
返回值:
LCM_Data
*****************************************************/
//读状态
ucharReadStatusLCM(void)
{
LCM_Data=0xFF; //LCM数据口先置1
LCM_RS=0;
LCM_RW=1;
LCM_E=0;
LCM_E=0;
LCM_E=1;
while(LCM_Data&Busy) //检测忙信号.如果忙,则不执行
{
;
}
return(LCM_Data); //不忙返回读取数据
}
/*****************************************************
函数名:
voidWriteDataLCM()
功 能:
向LCM1602中写入数据
说 明:
将形参WDLCM中的数据写入LCM中
入口参数:
WDLCM
返回值:
无
*****************************************************/
//写数据
voidWriteDataLCM(ucharWDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data=WDLCM;//写入数据到LCM
LCM_RS=1;
LCM_RW=0;
LCM_E=0; //若晶振速度太高可以在这后加小的延时
LCM_E=0; //延时
LCM_E=1;
}
/*****************************************************
函数名:
voidWriteCommandLCM()
功 能:
向LCM1602中写入指令
说 明:
向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
入口参数:
WCLCM,BuysC
返回值:
无
*****************************************************/
//写指令
voidWriteCommandLCM(ucharWCLCM,BuysC)//BuysC为0时忽略忙检测
{
if(BuysC)
{
ReadStatusLCM(); //根据需要检测忙
}
LCM_Data=WCLCM; //写入指令
LCM_RS=0;
LCM_RW=0;
LCM_E=0;
LCM_E=0;
LCM_E=1;
}
/*****************************************************
函数名:
voidLCMInit()
功 能:
初始化LCM1602
说 明:
LCM在工作前先要对显示屏初始化,否则模块无法正常工作
入口参数:
无
返回值:
无
*****************************************************/
//LCM初始化
voidLCMInit(void)
{
LCM_Data=0;
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);//三次显示模式设置,不检测忙信号
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);//0x38指令表示:
8位数据显示模式,俩行多显示
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1);//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(LCD_DISPLAY_OFF,1); //关闭显示
WriteCommandLCM(LCD_CLEAR_SCREEN,1); //显示清屏
WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); //显示光标移动设置
WriteCommandLCM(LCD_DISPLAY_ON,1); //显示开及光标设置
}
/*****************************************************
函数名:
voidDisplayOneChar()
功 能:
按指定坐标中写入数据
说 明:
X-横坐标,Y-纵坐标,DData为ASCII值
入口参数:
X,Y,DData
返回值:
无
*****************************************************/
//按指定位置显示一个字符
voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
Y&=0x01;
X&=0x0F; //限制X不能大于15,Y不能大于1
if(Y)
{
X|=LINE2_HEAD; //当要显示第二行时地址码:
0xc0
}
X|=LINE1_HEAD; //第一行的地址码:
0x80
WriteCommandLCM(X,0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
/*在LCD1602中使用此函数,在DIPS082中使用下面的函数
/*****************************************************
函数名:
voidDisplayListChar(ucharx,uchary,uchar*DData)
功 能:
向指定坐标中写入字符串(在LCD1602中使用此函数)
说 明:
X-横坐标,Y-纵坐标
入口参数:
X,Y,*DData
返回值:
无
*****************************************************
//按指定位置显示字符串
voidDisplayListChar(ucharx,uchary,uchar*DData)
{
if(y==LINE1) //判断是否写入第1行
{
if(x { WriteCommandLCM(LINE1_HEAD+x,0); //写入第1行地址 for(; x ='\0'; x++) { WriteDataLCM(*(DData++)); //写入数据 } if(*DData! ='\0') //判断数据是否写完 { x=0; //没写完写入第2行 y=LINE2; } } } if(y==LINE2) //判断是否写入第2行 { WriteCommandLCM(LINE2_HEAD+x,0); //写入第2行地址 for(;x ='\0';x++) //判断数据是否写完 { WriteDataLCM(*(DData++)); //写入数据 } } }*/ /***************************************************** 函数名: voidDisplayListChar(ucharX,ucharY,ucharcode*DData) 功 能: 向指定坐标中写入字符串(在DIPS082中使用此的函数) 说 明: X-横坐标,Y-纵坐标 入口参数: X,Y,*DData 返回值: 无 *****************************************************/ //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示*** voidDisplayListChar(ucharX,ucharY,ucharcode*DData) { ucharListLength,j; ListLength=strlen(DData); //strlen: 读取字符串的长度 Y&=0x1; X&=0xF; //限制X不能大于15,Y不能大于1 if(X<=0x0F) //X坐标应小于0xF { for(j=0;j { DisplayOneChar(X,Y,DData[j]); //显示单个字符 X++; //横坐标加1,纵坐标不变 } } } /***************************************************** 函数名: voidMychar() 功 能: 自定义字符--CGRAM 说 明: LCM1602字符库中没有温度符号,自定义温度符号 入口参数: 无 返回值: 无 /*****************************************************/ voidMychar(void) { //---------自定义字符代码--00H------闹铃符号------------- WriteCommandLCM(0x40,1);//第1行 WriteDataLCM(0x01);// WriteCommandLCM(0x41,1);//第2行 WriteDataLCM(0x1b);// WriteCommandLCM(0x42,1);//第3行 WriteDataLCM(0x1d);// WriteCommandLCM(0x43,1);//第4行 WriteDataLCM(0x19);// WriteCommandLCM(0x44,1);//第5行 WriteDataLCM(0x1d);// WriteCommandLCM(0x45,1);//第6行 WriteDataLCM(0x1b);// WriteCommandLCM(0x46,1);//第7行 WriteDataLCM(0x01);// WriteCommandLCM(0x47,1);//第8行 WriteDataLCM(0x00);// //---------自定义字符代码--01H-------温度符号------------ WriteCommandLCM(0x48,1);//第1行 WriteDataLCM(0x02);// WriteCommandLCM(0x49,1);//第2行 WriteDataLCM(0x05);// WriteCommandLCM(0x4a,1);//第3行 1------**-- WriteDataLCM(0x05);// 2----**--** WriteCommandLCM(0x4b,1);//第4行 3----**--** WriteDataLCM(0x02);// 4------**-- WriteCommandLCM(0x4c,1);//第5行 5---------- WriteDataLCM(0x00);// 6---------- WriteCommandLCM(0x4d,1);//第6行 7---------- WriteDataLCM(0x00);// 8---------- WriteCommandLCM(0x4e,1);//第7行 WriteDataLCM(0x00);// WriteCommandLCM(0x4f,1);//第8行 WriteDataLCM(0x00);// //---------自定义字符代码--02H-------当前时间------------ WriteCommandLCM(0x50,1);//第1行 WriteDataLCM(0x1f);// WriteCommandLCM(0x51,1);//第2行 WriteDataLCM(0x11);// WriteCommandLCM(0x52,1);//第3行 WriteDataLCM(0x15);// WriteCommandLCM(0x53,1);//第4行 WriteDataLCM(0x11);// WriteCommandLCM(0x54,1);//第5行 WriteDataLCM(0x1b);// WriteCommandLCM(0x55,1);//第6行 WriteDataLCM(0x0a);// WriteCommandLCM(0x56,1);//第7行 WriteDataLCM(0x1f);// WriteCommandLCM(0x57,1);//第8行 WriteDataLCM(0x00);// //----------------------------------------------- } #endif
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 常用 文件 LCD1602