//lcd1602.h
#include "./lcd1602/lcd1602.h"
#include "./sys/sys.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);//打开时钟
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA)
//dataIO GPIOA4~11 初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructure);
// RS RW E IO初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void LCD1602_Wait_Ready(void)
{
int16_t sta;//u16 sta;
DATAOUT(0xff00);
LCD_RS_Clr();
LCD_RW_Set();
do
{
LCD_EN_Set();
SysTick_Delay_ms(5); //延时5ms,非常重要
sta = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);//读取状态字
LCD_EN_Clr();
}while(sta & 0x8000); //bit15等于1表示忙,重复检测到其为0停止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LCD1602_Write_Cmd(u16 cmd)
{
LCD1602_Wait_Ready();
LCD_RS_Clr();
LCD_RW_Clr();
DATAOUT(cmd);
LCD_EN_Set();
LCD_EN_Clr();
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LCD1602_Write_Dat(u16 dat)
{
LCD1602_Wait_Ready();
LCD_RS_Set();
LCD_RW_Clr();
DATAOUT(dat);
LCD_EN_Set();
LCD_EN_Clr();
}
/* 清屏 */
void LCD1602_ClearScreen(void)
{
LCD1602_Write_Cmd(0x0100); //显示清零,数据指针清零
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LCD1602_Set_Cursor(u8 x, u8 y)
{
u16 addr;
if (y == 0)
addr = 0x0000 + (x<<8); //<<
else
addr = 0x4000 + (x<<8);
LCD1602_Write_Cmd(addr | 0x8000);
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
{
LCD1602_Set_Cursor(x, y);
while(*str != '\0')
{
LCD1602_Write_Dat(*str++);
}
}
/* 初始化1602液晶 */
void LCD1602_Init(void)
{
LCD1602_Write_Cmd(0x3800); //16*2显示,5*7点阵,8位数据口
LCD1602_Write_Cmd(0x3800); //16*2显示,5*7点阵,8位数据口
LCD1602_Write_Cmd(0x0c00); //开显示,光标关闭
LCD1602_Write_Cmd(0x0600); //文字不动,地址自动+1
LCD1602_Write_Cmd(0x0100); //清屏
}
//LCD1602.H
#ifndef _LCD1602_H
#define _LCD1602_H
#include &quot;stm32f10x.h&quot;
#define LCD_DATA_PORT GPIOB //1602指令/数据 引脚
#define LCD_RS_Set() GPIO_SetBits(GPIOA, GPIO_Pin_8)
#define LCD_RS_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_8)
//1602液晶读写引脚
#define LCD_RW_Set() GPIO_SetBits(GPIOA, GPIO_Pin_9)
#define LCD_RW_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_9)
//1602液晶使能引脚
#define LCD_EN_Set() GPIO_SetBits(GPIOA, GPIO_Pin_10)
#define LCD_EN_Clr() GPIO_ResetBits(GPIOA, GPIO_Pin_10)
//1602液晶数据端口
#define DATAOUT(x) GPIO_Write(LCD_DATA_PORT, x)
void GPIO_Configuration(void);
void LCD1602_Wait_Ready(void);
void LCD1602_Write_Cmd(u16 cmd);
void LCD1602_Write_Dat(u16 dat);
void LCD1602_ClearScreen(void);
void LCD1602_Set_Cursor(u8 x, u8 y);
void LCD1602_Show_Str(u8 x, u8 y, u8 *str);
void LCD1602_Init(void);
#endif
上面程序显示不了数据,求 告知哪里有问题 |