LCD1602库函数.docx
- 文档编号:12278164
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:21
- 大小:18.41KB
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 ****************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD1602 库函数