我写的stm32F103的驱动LCD1602的程序为什么没有显示呀
这个是我写的程序,没有显示,刚刚开始学的LCD和stm32,不知道缺少和写错了哪部分,有大佬帮忙看一下嘛
头文件:
#ifndef _LCD_H_
#define _LCD_H_
#include "stm32f10x.h"
///通过定义位带操作控制RS RW EN
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x40010C0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010C08
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
//------------------------
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define RS PBout(3)
#define RW PBout(4)
#define EN PBout(5)
void LCD_Init(void);
void LCD_Write_cmd(u8 cmd);
void LCD_Write_dat(u8 dat);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
#endif /*_LCD_H_*/
LCD1602.c文件
-------------------------------------------------
#include "LCD.h"
#include "stm32f10x.h"
#include "delay.h"
//发送命令
void LCD_Write_cmd(u8 cmd)//写入命令
{
RS = 0;
RW = 0;
EN = 0;
EN = 1;
// GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA) & 0xff00) | cmd);//该函数一般用来往一次性一个GPIO的多个端口设置
GPIO_Write(GPIOA, 0X00FF&cmd);//GPIOA的第八位用来作为8位数据口
delay_ms(5);
EN = 0;
}
//发送数据
void LCD_Write_dat(u8 dat)//写入数据
{
RS = 1;
RW = 0;
EN = 0;
EN = 1;
// GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA) & 0xff00) | dat);//该函数一般用来往一次性一个GPIO的多个端口设置
GPIO_Write(GPIOA, 0X00FF&dat);//GPIOA的第八位用来作为8位数据口
delay_ms(5);
EN = 0;
}
void LCD_Init()
{
GPIO_InitTypeDef GPIO_Initlcd;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_Initlcd.GPIO_Mode=GPIO_Mode_Out_PP; //设置工作模式
GPIO_Initlcd.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ; //选定引脚
GPIO_Initlcd.GPIO_Speed=GPIO_Speed_50MHz; //选择工作频率
GPIO_Init(GPIOA,&GPIO_Initlcd); //控制寄存器写入
GPIO_Initlcd.GPIO_Mode=GPIO_Mode_Out_PP; //设置工作模式
GPIO_Initlcd.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; //选定引脚 rs rw en
GPIO_Initlcd.GPIO_Speed=GPIO_Speed_50MHz; //选择工作频率
GPIO_Init(GPIOB,&GPIO_Initlcd);
delay_ms(5);
LCD_Write_cmd(0x01); //清屏
delay_ms(5);
LCD_Write_cmd(0x02); //光标归位
delay_ms(5);
LCD_Write_cmd(0x06); //设置输入模式
delay_ms(5);
LCD_Write_cmd(0x0C); //显示设置
delay_ms(5);
LCD_Write_cmd(0x38); //功能设置
delay_ms(5);
}
--------------------------
main.c文件
#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"
#include "LCD.h"
int main(void)
{
char h[]={"LCD1602 test"};
uint8_t i;
LCD_Init();//LCD1602初始化函数
while(1)
{
LCD_Write_cmd(0x80+0X01);//第一行的地址
for(i=0;i<12;i++)
{
LCD_Write_dat(h[i]);
delay_ms(5);
}
}
}