新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2013-10-3
- 在线时间
- 0 小时
|
发表于 2014-5-24 16:32:55
|
显示全部楼层
回复【7楼】hack906447:
---------------------------------
改了个了个很蹩脚的,给你。注意连接的引脚。用的是原子哥的工程。
/???? 头文件 //////
/******************************************************************************************
说明:该文件定义了STM32F103RDT6对LCD1602操作相关的函数
******************************************************************************************/
#ifndef __LCD_H
#define __LCD_H
//-------------------------------------------------------------------
// 该文件包含的头文件声明
//-------------------------------------------------------------------
#include "sys.h"
#include "delay.h"
//------------------------------/
extern const char ST1[];/*******/
extern const char ST2[];/*******/
//------------------------------/
//-------------------------------------------------------------------
// 该文件用到的宏定义声明
//-------------------------------------------------------------------
#define RS_ENA  Cout(8)=1 //RS使能
#define RS_DIS  Cout(8)=0 //RS除能
#define RW_ENA  Cout(7)=1 //RW使能
#define RW_DIS  Cout(7)=0 //RW除能
#define EN_ENA  Cout(6)=1 //EN使能
#define EN_DIS  Cout(6)=0 //EN除能
//LCD1602的数据输出端口0-7
#define LCDData0  Bout(15)
#define LCDData1  Bout(14)
#define LCDData2  Bout(13)
#define LCDData3  Bout(12)
#define LCDData4 PBout(1)
#define LCDData5 PBout(0)
#define LCDData6 PCout(5)
#define LCDData7 PCout(4)
//-------------------------------------------------------------------
// 该文件要定义的函数声明
//-------------------------------------------------------------------
//----------------------------------------------------------
// 函数名: LCD1602PortInit
// 功 能: 初始化LCD1602的控制端口
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void LCD1602ControlPortInit(void);
//----------------------------------------------------------
// 函数名: DataPortCInit
// 功 能: 初始化单片机GPIOC上的LCD的数据端口
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void DataPortCInit(void);
//----------------------------------------------------------
// 函数名: DataPortBInit
// 功 能: 初始化单片机GPIOB上的LCD的数据端口
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void DataPortBInit(void);
//----------------------------------------------------------
// 函数名: LCD_WriteData
// 功 能: 单片机向LCD1602写数据
// 输 入: Data: 单片机向LCD写入的数据
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteData(u8 Data);
//----------------------------------------------------------
// 函数名: LCD_WriteCommand
// 功 能: 单片机向LCD1602写命令
// 输 入: CMD: 单片机向LCD写入的命令
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteCommand(u8 CMD);
//----------------------------------------------------------
// 函数名: LCD_WriteOneChar
// 功 能: 单片机向LCD1602指定的位置写入要显示的字符
// 输 入: X_Pos: X座标
// Y_Pos: Y座标
// CHAR: 要显示的字符
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteOneChar(u8 X_Pos, u8 Y_Pos, unsigned char CHAR);
//----------------------------------------------------------
// 函数名: LCD_WriteOneChar
// 功 能: 单片机向LCD1602指定的位置写入要显示的字符串
// 输 入: X_Pos: X座标
// Y_Pos: Y座标
// *Add: 要显示的字符串的起始地址
// Len: 字符串的长度
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteOneString(u8 X_Pos, u8 Y_Pos, char *Add, u8 Len);
//----------------------------------------------------------
// 函数名: LCD1602Init
// 功 能: 单片机初始化LCD1602
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void LCD1602Init(void);
#endif
/***************************** end *******************************************/
/******************************************************************************************
说明:该文件定义了STM32F103RDT6对LCD1602操作相关的函数
******************************************************************************************/
//-------------------------------------------------------------------
// 该文件包含的头文件声明
//-------------------------------------------------------------------
#include "LCD.h"
//---------------------------------------------------
const char ST1[]=" ";/**************/
const char ST2[]=" ";/**************/
//---------------------------------------------------
//----------------------------------------------------------
// 函数名: LCD1602PortInit
// 功 能: 初始化LCD1602的控制端口
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void LCD1602ControlPortInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PD和PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8; //映射LCD1602的EN, RW, RS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC
RS_DIS; //控制端口除能
RW_DIS;
EN_DIS;
}
//----------------------------------------------------------
// 函数名: DataPortCInit
// 功 能: 初始化单片机GPIOC上的LCD的数据端口
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void DataPortCInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PD和PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; //映射LCD1602的bit7,bit6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC
LCDData7 = 0; //数据端口初始输出低电平
LCDData6 = 0;
}
//----------------------------------------------------------
// 函数名: DataPortBInit
// 功 能: 初始化单片机GPIOB上的LCD的数据端口
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void DataPortBInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PD和PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13
|GPIO_Pin_12|GPIO_Pin_1|GPIO_Pin_0; //映射LCD1602的bit7,bit6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOC
LCDData5 = 0; //数据端口初始输出低电平
LCDData4 = 0;
LCDData3 = 0;
LCDData2 = 0;
LCDData1 = 0;
LCDData0 = 0;
}
//----------------------------------------------------------
// 函数名: LCD_WriteData
// 功 能: 单片机向LCD1602写数据
// 输 入: Data: 单片机向LCD写入的数据
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteData(u8 Data)
{
LCDData0 = ((Data >> 0) & 0x01);
LCDData1 = ((Data >> 1) & 0x01);
LCDData2 = ((Data >> 2) & 0x01);
LCDData3 = ((Data >> 3) & 0x01);
LCDData4 = ((Data >> 4) & 0x01);
LCDData5 = ((Data >> 5) & 0x01);
LCDData6 = ((Data >> 6) & 0x01);
LCDData7 = ((Data >> 7) & 0x01);
}
//----------------------------------------------------------
// 函数名: LCD_WriteCommand
// 功 能: 单片机向LCD1602写命令
// 输 入: CMD: 单片机向LCD写入的命令
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteCommand(u8 CMD)
{
RS_DIS;
RW_DIS;
EN_DIS;
delay_ms(2);
EN_ENA;
LCD_WriteData(CMD);
delay_ms(2);
EN_DIS;
}
//----------------------------------------------------------
// 函数名: LCD_WriteOneChar
// 功 能: 单片机向LCD1602指定的位置写入要显示的字符
// 输 入: X_Pos: X座标
// Y_Pos: Y座标
// CHAR: 要显示的字符
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteOneChar(u8 X_Pos, u8 Y_Pos, unsigned char CHAR)
{
X_Pos &= 0x0f; /* X位置范围 0~15 */
Y_Pos &= 0x01; /* Y位置范围 0~ 1 */
if(Y_Pos==1)
X_Pos += 0x40;
X_Pos += 0x80;
LCD_WriteCommand(X_Pos);
delay_ms(2);
RS_ENA;
RW_DIS;
EN_DIS;
delay_ms(2);
EN_ENA;
LCD_WriteData(CHAR);
delay_ms(2);
EN_DIS;
}
//----------------------------------------------------------
// 函数名: LCD_WriteOneChar
// 功 能: 单片机向LCD1602指定的位置写入要显示的字符串
// 输 入: X_Pos: X座标
// Y_Pos: Y座标
// *Add: 要显示的字符串的起始地址
// Len: 字符串的长度
// 输 出: 无
//----------------------------------------------------------
void LCD_WriteOneString(u8 X_Pos, u8 Y_Pos, char *Add, u8 Len)
{
u8 num;
for(num = 0; num<Len; num++)
{
LCD_WriteOneChar((X_Pos+num), Y_Pos, *(Add+num));
delay_ms(2);
}
}
//----------------------------------------------------------
// 函数名: LCD1602Init
// 功 能: 单片机初始化LCD1602
// 输 入: 无
// 输 出: 无
//----------------------------------------------------------
void LCD1602Init(void)
{
LCD1602ControlPortInit();
DataPortCInit(); //LCD的数据端口分别接在PORTC和PORTB上
DataPortBInit();
delay_ms(2);
/*延时等待是必要的*/
LCD_WriteCommand(0x38);
delay_ms(2);
LCD_WriteCommand(0x38);
delay_ms(2);
LCD_WriteCommand(0x38);
delay_ms(2);
LCD_WriteCommand(0x08);
delay_ms(2);
LCD_WriteCommand(0x01);
delay_ms(2);
LCD_WriteCommand(0x06);
delay_ms(2);
LCD_WriteCommand(0x0c);
delay_ms(2);
}
/***************************** end *******************************************/> |
|