您的位置 首页 产品

LCD1602驱动显现试验STM32

声明:本文是在网友追梦的程序基本上修改而来。程序移植性强,可读性强,特此感谢追梦同学。*******************************************

声明:本文是在网友追梦的程序基本上修正而来。程序移植性强,可读性强,特此感谢追梦同学。

/**************************************************************************
**文件名称:LCD1602.h for STM32
**************************************************************************/
#ifndef LCD1602_STM32_H
#define LCD1602_STM32_H

#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0–(LCD)RS
#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0
#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1–(LCD)RW
#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1
#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2–(LCD)E
#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2
#define DATAOUT GPIOD->ODR //PD[0..7]–(LCD)D0~D7

#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif

extern void delay_nms(unsigned long n);
extern void delay_nus(unsigned long n);

uint8_t LCD_busy(void); //读LCD繁忙状况,直到LCD1602不忙停止
void Wait_Leisure(void);//一向等候到LCD1602闲暇
void LCD_WriteInitcmd(uchar cmd);//写入LCD初始化时的指令,不能够检测忙状况
void LCD_Writecmd(uchar cmd);//写指令到LCD1602,指令数据占一个字节
void LCD_Writedata(uchar dat);//写一字节数据到LCD1602
void LCD_pos(uchar pos);//设定显现方位 00h~27h,40h~47h
void LCD_Setpos(uchar row,uchar col);//依据习气设定显现方位
void LCD_DispChar(char ch);//显现一个字符
void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定方位显现一个字符
void LCD_DispString(char str[]);//使LCD1602显现一个字符串,显现方位需提早设定
void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602从指定方位开端显现一个字符串
void LCD_Dispnum(uint32_t num);//显现一个不超越8位的整数,显现方位需提早设置
void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定方位显现一个不超越8位的整数
void LCD_DispDecimal(uint32_t num,uchar dot);//显现一个有用位不超越8位的浮点数,显现方位需求提早设定
//在指定方位显现一个有用位不超越8位的浮点数
void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);
//显现日历,显现日期与时刻
void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);
//显现秒表,显现时,分,秒,10毫秒,准确到10ms
void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);
//显现频率计,动态主动调整频率显现
void LCD_DispFreq(uint32_t freq);
void LCD_ShiftLeft(void);//屏幕全体左移一格,用于翻滚显现
void LCD_ShiftRight(void);//屏幕全体右移一格,用于翻滚显现
void LCD_Clear(void);//清屏,铲除显现
void LCD_Return(void);//使光标还回原点方位
void LCD_Close(void);//关显现
void LCD_Open(void);//开显现
void LCD_FlickerChar(uchar row,uchar col);//使指定方位字符闪耀,不显现光标
void LCD_CloseFlicker(void);//封闭字符闪耀
void LCD_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
*********************************************************************/
void LCD_Init(void);

#endif

/*********************************************************************
* 文件名称:LCD1602.C
* 功用:为51单片机供给LCD1602驱动程序,处理LCD1602与上层软件的阻隔问题
*********************************************************************/
#include “stm32f10x.h”
#include “LCD1602.h”
#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_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闲暇
*********************************************************************/
void Wait_Leisure(void)
{
LCD_busy();
}
/*********************************************************************
*功 能:写入LCD初始化时的指令,不能够检测忙状况
*********************************************************************/
void LCD_WriteInitcmd(uchar cmd)
{
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:待写入的指令
*出口参数:无
*********************************************************************/
void LCD_Writecmd(uchar cmd)
{
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开端作业
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/317427.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部