STM32的1602程序.docx

上传人:b****8 文档编号:12812095 上传时间:2023-06-08 格式:DOCX 页数:18 大小:19.37KB
下载 相关 举报
STM32的1602程序.docx_第1页
第1页 / 共18页
STM32的1602程序.docx_第2页
第2页 / 共18页
STM32的1602程序.docx_第3页
第3页 / 共18页
STM32的1602程序.docx_第4页
第4页 / 共18页
STM32的1602程序.docx_第5页
第5页 / 共18页
STM32的1602程序.docx_第6页
第6页 / 共18页
STM32的1602程序.docx_第7页
第7页 / 共18页
STM32的1602程序.docx_第8页
第8页 / 共18页
STM32的1602程序.docx_第9页
第9页 / 共18页
STM32的1602程序.docx_第10页
第10页 / 共18页
STM32的1602程序.docx_第11页
第11页 / 共18页
STM32的1602程序.docx_第12页
第12页 / 共18页
STM32的1602程序.docx_第13页
第13页 / 共18页
STM32的1602程序.docx_第14页
第14页 / 共18页
STM32的1602程序.docx_第15页
第15页 / 共18页
STM32的1602程序.docx_第16页
第16页 / 共18页
STM32的1602程序.docx_第17页
第17页 / 共18页
STM32的1602程序.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

STM32的1602程序.docx

《STM32的1602程序.docx》由会员分享,可在线阅读,更多相关《STM32的1602程序.docx(18页珍藏版)》请在冰点文库上搜索。

STM32的1602程序.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2