STM32的1602程序.docx
《STM32的1602程序.docx》由会员分享,可在线阅读,更多相关《STM32的1602程序.docx(18页珍藏版)》请在冰点文库上搜索。
STM32的1602程序
#ifndefLCD1602_STM32_H
#defineLCD1602_STM32_H
#defineLCD_RS_1GPIOE->BSRR=GPIO_Pin_0//PE.0--(LCD)RS
#defineLCD_RS_0GPIOE->BRR=GPIO_Pin_0
#defineLCD_RW_1GPIOE->BSRR=GPIO_Pin_1//PE.1--(LCD)RW
#defineLCD_RW_0GPIOE->BRR=GPIO_Pin_1
#defineLCD_EN_1GPIOE->BSRR=GPIO_Pin_2//PE.2--(LCD)E
#defineLCD_EN_0GPIOE->BRR=GPIO_Pin_2
#defineDATAOUTGPIOD->ODR//PD[0..7]--(LCD)D0~D7
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
externvoiddelay_nms(unsignedlongn);
externvoiddelay_nus(unsignedlongn);
uint8_tLCD_busy(void);//读LCD忙碌状态,直到LCD1602不忙为止
voidWait_Leisure(void);//一直等待到LCD1602空闲
voidLCD_WriteInitcmd(ucharcmd);//写入LCD初始化时的命令,不可以检测忙状态
voidLCD_Writecmd(ucharcmd);//写指令到LCD1602,指令数据占一个字节
voidLCD_Writedata(uchardat);//写一字节数据到LCD1602
voidLCD_pos(ucharpos);//设定显示位置00h~27h,40h~47h
voidLCD_Setpos(ucharrow,ucharcol);//根据习惯设定显示位置
voidLCD_DispChar(charch);//显示一个字符
voidLCD_Setpos_DispChar(ucharrow,ucharcol,charch);//在指定位置显示一个字符
voidLCD_DispString(charstr[]);//使LCD1602显示一个字符串,显示位置需提前设定
voidLCD_Setpos_DispString(ucharrow,ucharcol,charstr[]);//使LCD1602从指定位置开始显示一个字符串
voidLCD_Dispnum(uint32_tnum);//显示一个不超过8位的整数,显示位置需提前设置
voidLCD_Setpos_Dispnum(ucharrow,ucharcol,uint32_tnum);//在指定位置显示一个不超过8位的整数
voidLCD_DispDecimal(uint32_tnum,uchardot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定
//在指定位置显示一个有效位不超过8位的浮点数
voidLCD_Setpos_DispDecimal(ucharrow,ucharcol,uint32_tnum,uchardot);
//显示日历,显示日期与时间
voidLCD_DispDateTime(uint32_tyear,ucharmonth,ucharday,ucharhour,ucharmin,ucharsec);
//显示秒表,显示时,分,秒,10毫秒,精确到10ms
voidLCD_DispStopWatch(ucharhour,ucharmin,ucharsec,uchartenms);
//显示频率计,动态自动调整频率显示
voidLCD_DispFreq(uint32_tfreq);
voidLCD_ShiftLeft(void);//屏幕整体左移一格,用于滚动显示
voidLCD_ShiftRight(void);//屏幕整体右移一格,用于滚动显示
voidLCD_Clear(void);//清屏,清除显示
voidLCD_Return(void);//使光标还回原点位置
voidLCD_Close(void);//关显示
voidLCD_Open(void);//开显示
voidLCD_FlickerChar(ucharrow,ucharcol);//使指定位置字符闪烁,不显示光标
voidLCD_CloseFlicker(void);//关闭字符闪烁
voidLCD_FlickerScreen(void);//屏幕秒闪烁一次
/*********************************************************************
*名称:
LCD_Init()
*功能:
初始化LCD1602
*入口参数:
无
*出口参数:
无
*常用命令:
0x38:
16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us
*0x0C:
开显示,关光标40us
*0x08:
关显示,关光标40us
*0x0D:
字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右
*0x0F:
字符闪烁,开光标
*0x06:
写完数据自动右移光标,普通情形,从左向右显示40us
*0x04:
写完数据自动左移光标,可以从右向左显示40us
*0x01:
清除显示内容,即清屏1.64ms
*0x02:
使光标还回起始位置1.64ms
*0x18:
屏幕上所有字符同时左移一格,适合滚动显示40us
*0x1C:
屏幕上所有字符同时右移一格,适合滚动显示40us
*********************************************************************/
voidLCD_Init(void);
#endif
/*********************************************************************
*文件名称:
LCD1602.C
*功能:
为51单片机提供LCD1602驱动程序,解决LCD1602与上层软件的隔离问题
*by:
追梦2011-4-5
*********************************************************************/
#include"stm32f10x.h"
#include"LCD1602.h"
#ifndefLCD1602_STM32_C
#defineLCD1602_STM32_C
/*********************************************************************
*名称:
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&0x80);
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());
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开始工作
}
/*********************************************************************
*名称:
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;//下降沿,开始写入有效数据
}
/*********************************************************************
*名称:
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);
elseLCD_Writecmd(col|0xC0);
}
/*********************************************************************
*功能:
显示一个字符
*入口:
ch:
待显示的字符
*********************************************************************/
voidLCD_DispChar(charch)
{
LCD_Writedata(ch);
}
/*********************************************************************
*功能:
在指定位置显示一个字符
*入口:
row:
行1或2col:
列,0~15
*ch:
待显示的字符
*********************************************************************/
voidLCD_Setpos_DispChar(ucharrow,ucharcol,charch)
{
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,ucharcol,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,ucharcol,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,ucharcol,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,ucharmonth,ucharday,ucharhour,ucharmin,ucharsec)
{
LCD_Setpos(1,0);
LCD_DispString("Date:
");
LCD_Dispnum((uint32_t)year);
L