LCD1602库函数.docx
《LCD1602库函数.docx》由会员分享,可在线阅读,更多相关《LCD1602库函数.docx(21页珍藏版)》请在冰豆网上搜索。
LCD1602库函数
/********************************************************************/
#include"stm32f10x.h"
#include"LCD1602.h"
#ifndefLCD1602_STM32_C
#defineLCD1602_STM32_C
#endif
/*********************************************************************
*名称:
LCD_busy()
*功能:
读LCD忙碌状态,直到LCD1602不忙为止
*入口参数:
无
*出口参数:
无符号字节类型,返回0表示LCD已经操作完毕
,空闲。
*说明:
一般在写入新命令或数据之前用while
(LCD_busy())语句等待LCD就绪
**************************************************
*******************/
uint8_tLCD_busy(void)
{
LCD_RS_0;
delay_nus
(1);
LCD_RW_1;
delay_nus
(1);
do
{
LCD_EN_0;
delay_nus(200);
LCD_EN_1;
delay_nus(200);
}
while(GPIOD->IDR&0x8000);//GPIO->IDR&10000000
一直等到STA7为0即最高位表示允许进行读写操作
LCD_EN_0;
return(uint8_t)0;
}
/*************************************************
********************
*功能:
一直等待到LCD1602空闲
**************************************************
*******************/
voidWait_Leisure(void)
{
LCD_busy();
}
/*************************************************
********************
*功能:
写入LCD初始化时的命令,不可以检测忙状态
**************************************************
*******************/
voidLCD_WriteInitcmd(ucharcmd)
{
LCD_RS_0;
//delay_nus
(1);
LCD_RW_0;
//delay_nus
(1);
DATAOUT=cmd;
LCD_EN_0;
//delay_nus(300);
LCD_EN_1;
delay_nus(300);
LCD_EN_0;
delay_nms
(2);
}
/*************************************************
********************
*名称:
LCD_Writecmd()
*功能:
写指令到LCD1602,指令数据占一个字节
*入口参数:
cmd:
待写入的指令
*出口参数:
无
**************************************************
*******************/
voidLCD_Writecmd(ucharcmd)
{
//while(LCD_busy());//空闲的话返回值为0
LCD_RS_0;//对同一个寄存器的两次写入,中间延时一
会
//delay_nus
(1);
LCD_RW_0;
//delay_nus
(1);
LCD_EN_0;
//delay_nus(300);//产生脉冲
DATAOUT=cmd;
LCD_EN_1;
delay_nus(300);//必要的延时
LCD_EN_0;//下降沿,LCD1602开始工作
delay_nus(50);
}
/*************************************************
********************
*名称:
LCD_Writedata()
*功能:
写一字节数据到LCD1602
*入口参数:
dat:
无符号字节类型,0~255包括各个ASCII
码字符
*出口参数:
无
**************************************************
*******************/
voidLCD_Writedata(uchardat)
{
//while(LCD_busy());//等待LCD1602空闲
LCD_RS_1;
//delay_nus
(1);
LCD_RW_0;
//delay_nus
(1);
DATAOUT=dat;
LCD_EN_1;//先拉高
delay_nus(300);//很重要的延时,经调试,延时300us
以上才可以
LCD_EN_0;//下降沿,开始写入有效数据
delay_nus(50);
}
/*************************************************
********************
*名称:
LCD_pos()
*功能:
设定显示位置
*入口参数:
pos:
显示位置,值的范围如下:
*0x00----------------0x0f0x10-------0x27第一
行(一次显示16个字符)
*0x40----------------0x4f0x50-------0x67第二
行
*出口参数:
无
**************************************************
*******************/
voidLCD_pos(ucharpos)
{
LCD_Writecmd(pos|0x80);
}
/*************************************************
********************
*名称:
LCD_Setpos()
*功能:
根据习惯设定显示位置
*入口参数:
row:
行,row=1表示第一行,row=2表示第二行
*col:
列,0~15,用于指定显示的列,范围可以
是0~40
*出口参数:
无
**************************************************
*******************/
voidLCD_Setpos(ucharrow,ucharcol)
{
if(row==1)LCD_Writecmd(col|0x80);//10000000
第一行
elseLCD_Writecmd(col|0xC0);//11000000第二
行
}
/*************************************************
********************
*功能:
显示一个字符
*入口:
ch:
待显示的字符
**************************************************
*******************/
voidLCD_DispChar(charch)
{
LCD_Writedata(ch);
}
/*************************************************
********************
*功能:
在指定位置显示一个字符
*入口:
row:
行1或2col:
列,0~15
*ch:
待显示的字符
**************************************************
*******************/
voidLCD_Setpos_DispChar(ucharrow,ucharcol,char
ch)
{
LCD_Setpos(row,col);
LCD_Writedata(ch);
}
/*************************************************
********************
*名称:
LCD_DispString()
*功能:
使LCD1602显示一个字符串,显示位置需提前设
定
*入口参数:
str[]:
待显示的字符串
*出口参数:
无
**************************************************
*******************/
voidLCD_DispString(charstr[])
{
uchari=0;
while(str[i]!
='\0')
{
LCD_Writedata(str[i]);
++i;
}
}
/*************************************************
********************
*名称:
LCD_Setpos_DispString()
*功能:
使LCD1602从指定位置开始显示一个字符串
*入口参数:
row:
显示行,1或2
*col:
显示列,0~15(0~40)
*str[]:
待显示的字符串
*出口参数:
无
*说明:
指定位置是显示的初始位置,第一个字符显示
的位置
**************************************************
*******************/
voidLCD_Setpos_DispString(ucharrow,uchar
col,charstr[])
{
LCD_Setpos(row,col);
LCD_DispString(str);
}
/*************************************************
********************
*名称:
LCD_Dispnum()
*功能:
显示一个不超过8位的整数,显示位置需提前设
置
*入口参数:
num:
待显示的整数,不超过8位
*出口参数:
无
**************************************************
*******************/
voidLCD_Dispnum(uint32_tnum)
{
uinti=0,j,k=0,wei,q;
charstr[9];
if(num>=10000000)wei=8;
elseif(num>=1000000)wei=7;
elseif(num>=100000)wei=6;
elseif(num>=10000)wei=5;
elseif(num>=1000)wei=4;
elseif(num>=100)wei=3;
elseif(num>=10)wei=2;
elsewei=1;
for(i=wei;i>0;i--)
{q=1;
j=1;//i=1时,q=1,得到个位
for(;j
str[k++]=num/q+'0';
num%=q;
}
str[k]='\0';//添加字符串结束标志
LCD_DispString(str);//显示字符串
}
/*************************************************
********************
*名称:
LCD_Setpos_Dispnum()
*功能:
在指定位置显示一个不超过8位的整数
*入口参数:
num:
待显示的整数,不超过8位
*出口参数:
无
**************************************************
*******************/
voidLCD_Setpos_Dispnum(ucharrow,uchar
col,uint32_tnum)
{
LCD_Setpos(row,col);
LCD_Dispnum(num);
}
/*************************************************
********************
*名称:
LCD_DispDecimal()
*功能:
显示一个有效位不超过8位的浮点数,显示位置
需要提前设定
*入口参数:
num:
待显示的浮点数放大后得到的整数,不超
过8位
*dot:
小数点的位数
*出口参数:
无
**************************************************
*******************/
voidLCD_DispDecimal(uint32_tnum,uchardot)
{
uinti=0,j,k=0,wei,q;
charstr[10];
if(num>=10000000)wei=8;
elseif(num>=1000000)wei=7;
elseif(num>=100000)wei=6;
elseif(num>=10000)wei=5;
elseif(num>=1000)wei=4;
elseif(num>=100)wei=3;
elseif(num>=10)wei=2;
elsewei=1;
for(i=wei;i>0;i--)
{q=1;
j=1;//i=1时,q=1,得到个位
for(;j
str[k++]=num/q+'0';
num%=q;
}
str[k]='\0';//添加字符串结束标志
for(i=8;i>0;i--)
{if((str[i]>='0')&&(str[i]<='9'))break;
}
str[i+2]='\0';//添加字符串结束符
for(j=0;j备插入
{
str[i+1]=str[i];
}
str[i+1]='.';//插入小数点
LCD_DispString(str);//显示浮点小数
}
/*************************************************
********************
*名称:
LCD_Setpos_DispDecimal()
*功能:
在指定位置显示一个有效位不超过8位的浮点数
*入口参数:
row:
待显示的行1,2
*col:
待显示的列0~15
*num:
待显示的浮点数放大10的整数倍后得到的
整数,不超过8位
*dot:
小数点的位数
*出口参数:
无
**************************************************
*******************/
voidLCD_Setpos_DispDecimal(ucharrow,uchar
col,uint32_tnum,uchardot)
{
LCD_Setpos(row,col);
LCD_DispDecimal(num,dot);
}
/*************************************************
********************
*名称:
LCD_DispDateTime()
*功能:
显示日历,显示日期与时间
*入口参数:
year:
年,可以是任意值
*month:
月,1~12
*day:
日,1~31
*hour:
时,1~24或1~12
*min:
分,0~59
*sec:
秒,0~59
*出口参数:
无
*说明:
使用前必须先宏定义USE_LCD_DISP_DATE,在包
含文件之前定义有效
*显示格式:
Date:
yyyy-mm-dd*
*Time:
hh:
mm:
ss*
**************************************************
*******************/
voidLCD_DispDateTime(uint32_tyear,uchar
month,ucharday,ucharhour,ucharmin,ucharsec)
{
LCD_Setpos(1,0);
LCD_DispString("Date:
");
LCD_Dispnum((uint32_t)year);
LCD_DispChar('-');
LCD_Dispnum((uint32_t)month);
LCD_DispChar('-');
LCD_Dispnum((uint32_t)day);
LCD_Setpos(1,15);
LCD_DispChar('*');//第一行结束符显示
LCD_Setpos(2,0);
LCD_DispString("Time:
");
LCD_Dispnum((uint32_t)hour);
LCD_DispChar(':
');
LCD_Dispnum((uint32_t)min);
LCD_DispChar(':
');
LCD_Dispnum((uint32_t)sec);
LCD_Setpos(2,15);
LCD_DispChar('*');//第二行结束符显示
}
/*************************************************
********************
*名称:
LCD_DispStopWatch()
*功能:
显示秒表,显示时,分,秒,10毫秒,精确到
10ms
*入口参数:
hour:
时,1~24或1~12
*min:
分,0~59
*sec:
秒,0~59
*tenms:
10ms计数值,如3表示30ms
*出口参数:
无
*显示格式:
CurrentTime:
*
*hh:
mm:
ss:
tt*
**************************************************
*******************/
voidLCD_DispStopWatch(ucharhour,ucharmin,uchar
sec,uchartenms)
{
LCD_Setpos(1,0);
LCD_DispString("CurrentTime:
");
LCD_Setpos(1,15);
LCD_DispChar('*');//第一行结束符显示
LCD_Setpos(2,2);
LCD_Dispnum((uint32_t)hour);
LCD_DispChar(':
');
LCD_Dispnum((uint32_t)min);
LCD_DispChar(':
');
LCD_Dispnum((uint32_t)sec);
LCD_DispChar(':
');
LCD_Dispnum((uint32_t)tenms);
LCD_Setpos(2,15);
LCD_DispChar('*');//第二行结束符显示
}
/*************************************************
********************
*名称:
LCD_DispFreq()
*功能:
显示频率计,动态自动调整频率显示
*入口参数:
freq:
可以显示8位整数表示的频率值,频率范
围1Hz~99MHz
*出口参数:
无
*说明:
入口的频率值单位是Hz,显示函数自动选择合
适的显示方式
*freq>=1000000显示成6位小数的MHz
*elsefreq>=1000显示成3位小数的KHz
*elsefreq>=0默认显示单位是Hz(三个区
间互斥)
**************************************************
*******************/
voidLCD_DispFreq(uint32_tfreq)
{
LCD_Setpos(1,0);
LCD_DispString("CurrentFreq:
");
LCD_Setpos(2,1);//显示位置
if(freq>=1000000)
{
LCD_DispDecimal(freq,6);
LCD_DispString("MHz");
}
elseif(freq>=1000)
{
LCD_DispDecimal(freq,3);
LCD_DispString("KHz");
}
else{LCD_Dispnum(freq);
LCD_DispString("Hz");
}
LCD_Setpos(2,14);
LCD_DispString("OK");
}
//屏幕整体左移一格,用于滚动显示
voidLCD_ShiftLeft()
{
LCD_Writecmd(0x18);
}
//屏幕整体右移一格,用于滚动显示
voidLCD_ShiftRight(void)
{
LCD_Writecmd(0x1C);
}
//清屏,清除显示
voidLCD_CLEAR(void)
{
LCD_Writecmd(0x01);
}
//使光标还回原点位置
voidLCD_Return(void)
{
LCD_Writecmd(0x02);
}
//关显示
voidLCD_Close(void)
{
LCD_Writecmd(0x08);
}
//开显示
voidLCD_Open(void)
{
LCD_Writecmd(0x0C);
}
/*************************************************
********************
*名称:
LCD_FlickerChar()
*功能:
使指定位置字符闪烁,不显示光标
*入口参数:
row:
行1,2
*col:
列0~15
*出口参数:
无
*说明:
写命令0x0D不显示光标的闪烁,写命令0x0F是
显示光标的闪烁
*一旦设定闪烁后,会根据位置变化闪烁,关闪
烁写命令0x0C
****************