STM32的1602程序_第1页
STM32的1602程序_第2页
STM32的1602程序_第3页
STM32的1602程序_第4页
STM32的1602程序_第5页
已阅读5页,还剩37页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#ifndef LCD1602 STM32 H#defi ne LCD1602 STM32 H#defi neLCD RS 1GP IOE-BSRR=G PIO Pin 0P E.0-(LCD)RS#define LCD RS 0 GPIOE-BRR =GPIO Pin 0#defi neLCD RW 1GP IOE-BSRR=G PIO Pin 1P E.1-(LCD)RW#define LCD RW 0 GPIOE-BRR =GPIO Pin 1#defi neLCD EN 1GP IOE-BSRR=G PIO Pin 2P E.2-(LCD)E #define LCD EN 0 GPIO

2、E-BRR =GPIO Pin 2#defi neDATAOUTGP IOD-ODRP D0.7-(LCD)D0D7 #if ndef uchar #define uchar unsigned char #endif #if ndef uint #define uint unsigned int #endif extern void delay_nms(unsigned long n);exter n void delay_ nus(un sig ned long n);uint8_t LCD_busy(void); / 读 LCD 忙碌状态,直到 LCD1602 不忙为止void Wait_

3、Leisure(void);/ 一直等待到 LCD1602 空闲void LCD_WriteInitcmd(ucharcmd);/ 写入 LCD 初始化时的命令,不可以检测忙状态void LCD_Writecmd(uchar cmd);/ 写指令到 LCD1602,指令数据占一个字节void LCD_Writedata(uchar dat);/写一字节数据到 LCD1602voidLCD_ pos(ucharp os);/设 定 显 示 位 置OOh27h,40h47hvoid LCD_Setpos(ucharrow,uchar col);/ 根据习惯设定显示位置void LCD_Dis pC

4、har(char ch);/显示一个字符void LCD_Set pos_Dis pChar(uchar row,uchar col,char ch);/在指定位置显示一个字符void LCD_DispString(char str);/ 使 LCD1602 显示一个字符row,uchar col,char串,显示位置需提前设定voidLCD_Set pos_Dis pStri ng(uchar显示一个不超过8位的整str);/使LCD1602从指定位置开始显示一个字符串 void LCD_Dis pn um(ui nt32_t num);/数,显示位置需提前设置col,ui nt32_t显示

5、一个voidLCD_Set pos_Dis pDecimal(ucharrow,ucharvoid LCD_Set pos_Dis pnu m(ucharrow,ucharnum);/在指定位置显示一个不超过 8位的整数 void LCD_Dis pDecimal(ui nt32_t nu m,uchar dot);/有效位不超过8位的浮点数,显示位置需要提前设定/在指定位置显示一个有效位不超过8位的浮点数void LCD_O pen (void);/开显示col,u in t32_t num ,uchar dot);mon th,uchar/显示日历,显示日期与时间 void LCD_Dis

6、pDateTime(uint32_t year,uchar day,uchar hour,uchar min ,uchar sec);/显示秒表,显示时,分,秒,10毫秒,精确到10mshour,ucharmin ,ucharvoidLCD_Dis pSto pWatch(uchar sec,uchar tenm s);/显示频率计,动态自动调整频率显示 void LCD_Dis pFreq(ui nt32_t freq);void LCD_ShiftLeft(void);/屏幕整体左移一格,用于滚动显示void LCD_ShiftRight(void);/屏幕整体右移一格,用于滚动显void

7、 LCD_Clear(void);/清屏,清除显示void LCD_Return(void);/使光标还回原点位置void LCD_Close(void);/关显示void LCD_FlickerChar(ucharrow,uchar col);/使指定位置字符闪烁,不显示光标void LCD_CloseFlicker(void);/关闭字符闪烁void LCD_FlickerScree n(void);/屏幕秒闪烁一次*称:LCD_Init()*功 能:初始化LCD1602*入口参数:无*出口参数:无*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us0x0

8、C:开显示,关光标40us0x08:关显示,关光标40us#in elude stm32f10x.h#i nclude LCD1602.h0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右0x0F:字符闪烁,开光标0x06:写完数据自动右移光标, 普通情形,从左向右显示40us0x04:写完数据自动左移光标,可以从右向左显示40us0x01:清除显示内容,即清屏1.64ms40us0x02:使光标还回起始位置1.64ms0x18:屏幕上所有字符同时左移一格,适合滚动显示0x1C:屏幕上所有字符同时右移一格,适合滚动显示40us*void LCDni t(void);#en dif

9、/*文件名称:LCD1602.C *功能:为51单片机提供LCD1602驱动程序,解决 LCD1602与上层软件的隔离问题* by :追梦 2011-4-5*#ifndef LCD1602 STM32 C#define LCD1602 STM32 C*称:LCD_busy()能:读LCD忙碌状态,直到LCD1602不忙为止*入口参数:无*出口参数:无符号字节类型,返回 0表示LCD已经操作完毕,空闲。*说明: 一般在写入新命令或数据之前用while(LCD_busy()语句等待LCD就绪*uint8_t LCD_busy(void)LCD_RS_O;delay_ nu s(1);LCD RW

10、1;delay_ nu s(1);doLCD_EN_0;delay_nus(200);LCD_EN_1;delay_nus(200);while(G PI OD-IDR & 0x80);LCD EN 0;return (uint8_t)0;*功能:一直等待到 LCD1602空闲*void Wait_Leisure(void)LCD_busy();/*功 能:写入LCD初始化时的命令,不可以检测忙状态void LCD_Writel nitcmd(uchar cmd)*LCD_RS_O;delay_ nu s(1);LCD RW 0;delay_ nu s(1);DATAOUT = cmd;LCD

11、_EN_0;delay_nus(300);LCD EN 1;delay_nus(300);LCD_EN_0;delay_ nm s(2);* 名 称:LCD_Writecmd()能:写指令到LCD1602,指令数据占一个字节*入口参数:cmd:待写入的指令*出口参数:无 void LCD_Writecmd(uchar cmd)while(LCD_busy();LCD_RS_0; /对同一个寄存器的两次写入,中间延时一会delay_ nu s(1);LCD RW 0;delay_ nu s(1);LCD_EN_O;delay_nus(300);/产生脉冲DATAOUT = cmd;LCD EN

12、1;delay_nus(300);/必要的延时LCD_EN_0; /下降沿,LCD1602开始工作* 名 称:LCD_Writedata()*功 能:写一字节数据到 LCD1602*入口参数:dat :无符号字节类型,0255包括各个 ASCII码字符*出口参数:无*void LCD_Writedata(uchar dat)while(LCD_busy();/ 等待 LCD1602 空闲LCD RS 1;delay_ nu s(1);LCD_RW_0;delay_ nu s(1);DATAOUT = dat;LCD EN 1;/先拉高delay_nus(300); / 很重要的延时,经调试,延

13、时300us以上才可以LCD_EN_0;/下降沿,开始写入有效数据* 名 称:LCD_pos()*功能:设定显示位置*入口参数:Pos:显示位置,值的范围如下:*0x000x0f 0x100x27第一行(一次显示16个字符)*0x400x4f 0x500x67第二行*出口参数:无*void LCD_ pos(uchar pos)LCD_Writecmd( pos | 0x80);/* 名 称:LCD_Setpos()*功能:根据习惯设定显示位置*入口参数:row:行,row=1表示第一行,row=2表示第二行col:列,015,用于指定显示的列,范围可以是040*出口参数:无*void LCD

14、_Set pos(uchar row,uchar col)if(row=1) LCD_Writecmd(col I 0x80);else LCD_Writecmd(col I 0xC0);*功 能:显示一个字符*入 口: ch :待显示的字符*void LCD_Dis pChar(char ch)LCD_Writedata(ch);*功 能:在指定位置显示一个字符*入 口: row:行1或2col:列,015ch :待显示的字符*void LCD_Set pos_Dis pChar(uchar row,uchar col,char ch)LCD_Set pos(row,col);LCD_Wri

15、tedata(ch);*名称:LCD_DispString()能:使LCD1602显示一个字符串,显示位置需提前设定*入口参数:str:待显示的字符串*出口参数:无*void LCD_Dis pStri ng(char str)uchar i=0;while(stri != 0)LCD_Writedata(stri);+i;*称:LCD_Setpos_DispString()*功 能:使LCD1602从指定位置开始显示一个字符串*入口参数:row:显示行,1或2col:显示列,015( 040)str:待显示的字符串*出口参数:无*说明:指定位置是显示的初始位置,第一个字符显示的位*void

16、LCD_Set pos_Dis pStri ng(uchar row,uchar col,char str)LCD_Set pos(row,col);LCD_Dis pStrin g(str);/*称:LCD_Dispnum()*功能:显示一个不超过8位的整数,显示位置需提前设置*入口参数:num:待显示的整数,不超过8位*出口参数:无*void LCD_Dis pnu m(ui nt32_t num)uint i=0,j,k=0,wei,q;char str9;if(n um=10000000)wei=8;else if(n um=1000000)wei=7;else if(nu m=100

17、000)wei=6;else if(num =10000)wei=5;else if(n um=1000) wei=4;else if(n um=100)wei=3;else if(num =10) wei=2;else wei=1;for(i=wei;i0;i-) q=i;j=1; /i=1 时,q=1,得到个位for(;jvi;j+)q *=10;strk+=num/q +0;num %= q;strk = 0; /添加字符串结束标志LCD_Dis pStri ng(str);/显示字符串* 名 称:LCD_Setpos_Dispnum()*功能:在指定位置显示一个不超过 8位的整数*入口

18、参数:num:待显示的整数,不超过8位*出口参数:无*void LCD_Set pos_Dis pnu m(ucharrow,ucharcol,u in t32_t num)LCD_Set pos(row,col);LCD_Dis pnum(nu m);/*称:LCD_DispDecimaK)*功能:显示一个有效位不超过 8位的浮点数,显示位置需要提前设定*入口参数:num:待显示的浮点数放大后得到的整数,不超过8dot:小数点的位数*出口参数:uint i=O,j,k=O,wei,q;char str10;if(n um=10000000)wei=8;else if(n um=1000000

19、)wei=7;else if(nu m=100000)wei=6;else if(num =10000)wei=5;else if(n um=1000) wei=4;else if(n um=100)wei=3;else if(num =10) wei=2;else wei=1;for(i=wei;i0;i-) q=i;j=1; /i=1 时,q=1,得到个位for(;jvi;j+)q *=10;strk+=num/q +0;num %= q;strk = 0; /添加字符串结束标志for(i=8;i0;i-)if(stri=0)&(striv=9) break;stri+2=0;/添加字符串

20、结束符for( j=O;jvdot;j+,i-)/小数点后各位依次右移,准备插入stri+1=stri;stri+1=.;/插入小数点voidLCD_Set pos_Dis pDecimal(ucharrow,ucharLCD_Dis pStri ng(str);/显示浮点小数*称:LCD_Setpos_DispDecimal()*功能:在指定位置显示一个有效位不超过 8位的浮点数*入口参数:row:待显示的行1,2col:待显示的列015num:待显示的浮点数放大10的整数倍后得到的整数,不超过8位dot:小数点的位数*出口参数:无*col,u in t32_t num ,uchar dot

21、)LCD_Set pos(row,col);LCD_Dis pDecimal( nu m,dot);*称:LCD_DispDateTimeO*功能:显示日历,显示日期与时间*入口参数:year:年,可以是任意值mon th:月,112day:日,131hour:时,124 或112min:分,059 sec:秒,059*出口参数:无*说明:使用前必须先宏定义USE LCD DISP DATE,在包含文件之前定义有效* 显示格式:Date:yyyy-mm-ddTime:hh:mm:ss*day,uchar hour,uchar min, uchar sec)LCD_Set pos(1,0);LC

22、D_Dis pStri ng(Date:);LCD_Dis pn um(ui nt32_t)year);LCD_Dis pChar(-);LCD_Dis pn um(ui nt32_t)mo nth);LCD_Dis pChar(-);LCD_Dis pn um(ui nt32_t)day);LCD_Set pos(1,15);LCD_Dis pChar(*); / 第一行结束符显示LCD_Set pos(2,0);LCD_Dis pStri ng(Time:);LCD_Dis pn um(ui nt32_t)hour);LCD_Dis pChar(:);LCD_Dis pnu m(ui nt

23、32_t)mi n);LCD_Dis pChar(:);LCD_Dis pn um(ui nt32_t)sec);LCD_Set pos(2,15);LCD_Dis pChar(*); / 第二行结束符显示/*称:LCD_DispStopWatchO*功能:显示秒表,显示时,分,秒,10毫秒,精确到10ms*入口参数:hour:时,124 或112min:分,059sec:秒,059*出口参数:*显示格式:tenm s:10ms 计数值,Current Time:*如3表示30mshh:mm:ss:tt *voidLCD_Dis pSto pWatch(ucharhour,ucharmin ,

24、ucharLCD_Set pos(2,#);sec,uchar tenms)LCD_Set pos(1,0);LCD_Dis pStri ng(Curre nt Time:);LCD_Set pos(1,15);LCD_Dis pChar(*); / 第一行结束符显示LCD_Dis pn um(ui nt32_t)hour);LCD_Dis pChar(:);LCD_Dis pnu m(ui nt32_t)mi n);LCD_Dis pChar(:);LCD_Dis pn um(ui nt32_t)sec);LCD_Dis pChar(:);LCD_Dis pnu m(ui nt32_t)te

25、 nms);LCD_Set pos(2,15);LCD_Dis pChar(*); / 第二行结束符显示*称:LCD_DispFreqO能:显示频率计,动态自动调整频率显示*入口参数:freq:可以显示8位整数表示的频率值,频率范围 1Hz99MHz*出口参数:无*说明:入口的频率值单位是 Hz,显示函数自动选择合适的显示方式elseelsefreq=1OOOOOOfreq=1000freq=0显示成6位小数的 MHz显示成3位小数的KHz默认显示单位是 Hz (三个区间互*斥)*void LCD_Dis pFreq(ui nt32_t freq)LCD_Set pos(1,0);LCD_Di

26、s pStri ng(Curre nt Freq:);LCD_Set pos(2,1); / 显示位置if(freq=1000000)LCD_Dis pDecimal(freq,6);LCD_Dis pStri ng(MHz);else if(freq=1000)LCD_Dis pDecimal(freq,3);LCD_Dis pStri ng(KHz);else LCD_Dis pnu m(freq);LCD_Dis pStri ng(Hz);LCD_Dis pStri ng(OK);LCD_Set pos(2,#);/屏幕整体左移一格,用于滚动显示 void LCD_ShiftLeft()

27、LCD_Writecmd(0x18);/屏幕整体右移一格,用于滚动显示 void LCD_ShiftRight(void)LCD_Writecmd(0x1C);/清屏,清除显示 void LCD_Clear(void)LCD_Writecmd(0x01);/使光标还回原点位置 void LCD_Return(void)/关显示LCD_Writecmd(0x08);/开显示 void LCD_Open (void)LCD_Writecmd(0x0C);*称:LCD_FlickerChar()能:使指定位置字符闪烁,不显示光标*入口参数:row:行1,2col:列 015*出口参数:无*说 明:写

28、命令0x0D不显示光标的闪烁,写命令 0x0F是显示光标的闪烁一旦设定闪烁后,会根据位置变化闪烁,关闪烁写命令0x0C*void LCD_FlickerChar(uchar row,uchar col)LCD_Writecmd(OxOD);LCD_Set pos(row,col);/关闭字符闪烁 void LCD_CloseFlicker(void)LCD_Writecmd(OxOC);/屏幕秒闪烁一次 void LCD_FlickerScree n(void)LCD_Writecmd(0x08);/ 关显示delay_ nm s(500);LCD_Writecmd(0x0C);/ 开显示de

29、lay_ nm s(500);/* 名 称:LCD_Init()*功 能:初始化LCD1602*入口参数:无void LCDnit(void)*出口参数:无*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us0x0C:开显示,关光标40us0x08:关显示,关光标40us0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右0x0F:字符闪烁,开光标显示40us0x06:写完数据自动右移光标,普通情形,从左向右0x04:与完数据自动左移光标,可以从右向左显示40us0x01:清除显示内容,即清屏1.64ms0x02:使光标还回起始位置1.64ms0x

30、18:屏幕上所有字符同时左移一格,适合滚动显示40us0x1C:屏幕上所有字符同时右移一格,适合滚动显示40us*delay_ nm s(200);/延时20msLCD_Writel nitcmd(0x38);/16*2显示,5*7点阵,8位数据delay_ nm s(10);LCD_Writel nitcmd(0x38);/16*2显示,5*7点阵,8位数据delay_ nm s(5);LCD_WriteI nitcmd(0x38);/16*2显示,5*7点阵,8位数据delay_ nm s(5);LCD_WriteI nitcmd(0x08);/先关显示,后开显示delay_ nm s(5

31、);LCD_WriteI nitcmd(0x06);/自动右移光标,0x04为左移光标delay_ nm s(5);LCD_WriteI nitcmd(0x01);/清除LCD的显示内容delay_ nm s(6);LCD_WriteI nitcmd(0x0c);/显示开,关光标;0x08为关显示delay_ nm s(5);#endif /防止多次编译 /*LCD1602驱动显示实验*by 追梦 2011-4-3 、5*/ #in elude stm32f10x.h#i nclude LCD1602.h#defi ne P E00 (ui nt32_t *)0x40230180/时钟配置函数

32、 8MHz*9=72MHz void RCC_Co nfiguratio n()RCC_De In it();RCC_HSEConfig(RCC_HSE_ON);/ 使能 HSEif(RCC_WaitForHSEStartU p()=SUCCESS)RCC_HCLKCo nfig(RCC_SYSCLK_Div1); /HCLK=SYSCLKRCC _P CLK2C on fig(RCC_HCLK_Div1);RCC_ PCLK1Co nfig(RCC_HCLK_Div2);RCC _P LLCo nfig(RCC _P LLSource_HSE_Div1,RCC_ PLLMul_9);RCC_ PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG _P LLRDY)=RESET);RCC_SYSCLKCo nfig(RCC_SYSCLKSource_ PLLCLK);while(RCC_GetSYSCLKSource()!=0x08);RCC_A PB2Perip hClock

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论