芯片是STM32,程序编译没有错误,但是下到板子里面去之后液晶没有任何显示
#include<stm32f4xx.h>static__IOuint32_tTimingDelay;voidRCC_Configuration(void);voidDe...
#include<stm32f4xx.h>
static __IO uint32_t TimingDelay;
void RCC_Configuration(void);
void Delay(__IO uint32_t nTime);
#define Line1 0x80 //液晶第一行
#define Line2 0x90 //液晶第二行
#define Line3 0x88 //液晶第三行
#define Line4 0x98 //液晶第四行
#define LCD_IO GPIOB //我用的是 B.12 B.13 B.14 D.15 C.7
#define CS GPIO_Pin_12
#define RW GPIO_Pin_13
#define CLK GPIO_Pin_14
#define PSB GPIO_Pin_15 //GPIOD15
#define RST GPIO_Pin_7 //GPIOC7
#define SET(n) GPIO_SetBits(GPIOB,n) //将对应管脚输出高电平
#define RESET(n) GPIO_ResetBits(GPIOB,n) //输出低电平
#define CMD (uint32_t)0xf8000000 //串行 写入的是命令要先写入0xf8
#define DATE (uint32_t)0xfa000000 // 串行 写入数据要先写入0xfa
void RCC_Configuration(void) //推挽输出模式 ,管脚配置,不多解释,库函数有
{
SystemInit();
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =CS|RW|CLK;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_IO, &GPIO_InitStructure);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin =PSB;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin =RST;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void LCD_Write(uint32_t cmd,uint8_t ddata) //LCD 写函数
{
uint32_t temp=cmd;
uint32_t i;
RESET(CS); //片选拉低
temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);
Delay(5);
SET(CS); //片选拉高,开始传输数据
for(i=0;i<24;i++)
{
if(temp&0x80000000)SET(RW); //取出最高位,如果是1,那么RW就写1
else RESET(RW); //如果是0 RW就写0
SET(CS); //向液晶写数据 是在下降沿写入的
Delay(2); //稍作延时
RESET(CS); //拉低产生下降沿,写入数据
temp=temp<<1; //左移一位 ,写入下一位
}
RESET(CS); //拉低片选,写入数据完毕
}
void Display(uint8_t addr,uint8_t *hz)
{
LCD_Write(CMD,addr);
Delay(3);
while(*hz!='\0')
{
LCD_Write(DATE,*hz);
hz++;
Delay(3);
}
}
void LCD_init() //液晶初始化
{
RESET(CS); //拉低片选
GPIO_ResetBits(GPIOD,GPIO_Pin_15); //PSB拉低,表示是串行,拉高则是并行
GPIO_ResetBits(GPIOC,GPIO_Pin_7); //拉低RST
Delay(100);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
Delay(40);
LCD_Write(CMD,0x30); //8位数据传输
Delay(40);
LCD_Write(CMD,0x0c); //显示开,游标开
Delay(40);
LCD_Write(CMD,0x01); //清屏
Delay(40);
LCD_Write(CMD,0x06); //进入点设定 AC+1
Delay(40);
} 展开
static __IO uint32_t TimingDelay;
void RCC_Configuration(void);
void Delay(__IO uint32_t nTime);
#define Line1 0x80 //液晶第一行
#define Line2 0x90 //液晶第二行
#define Line3 0x88 //液晶第三行
#define Line4 0x98 //液晶第四行
#define LCD_IO GPIOB //我用的是 B.12 B.13 B.14 D.15 C.7
#define CS GPIO_Pin_12
#define RW GPIO_Pin_13
#define CLK GPIO_Pin_14
#define PSB GPIO_Pin_15 //GPIOD15
#define RST GPIO_Pin_7 //GPIOC7
#define SET(n) GPIO_SetBits(GPIOB,n) //将对应管脚输出高电平
#define RESET(n) GPIO_ResetBits(GPIOB,n) //输出低电平
#define CMD (uint32_t)0xf8000000 //串行 写入的是命令要先写入0xf8
#define DATE (uint32_t)0xfa000000 // 串行 写入数据要先写入0xfa
void RCC_Configuration(void) //推挽输出模式 ,管脚配置,不多解释,库函数有
{
SystemInit();
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =CS|RW|CLK;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LCD_IO, &GPIO_InitStructure);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin =PSB;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin =RST;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void LCD_Write(uint32_t cmd,uint8_t ddata) //LCD 写函数
{
uint32_t temp=cmd;
uint32_t i;
RESET(CS); //片选拉低
temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);
Delay(5);
SET(CS); //片选拉高,开始传输数据
for(i=0;i<24;i++)
{
if(temp&0x80000000)SET(RW); //取出最高位,如果是1,那么RW就写1
else RESET(RW); //如果是0 RW就写0
SET(CS); //向液晶写数据 是在下降沿写入的
Delay(2); //稍作延时
RESET(CS); //拉低产生下降沿,写入数据
temp=temp<<1; //左移一位 ,写入下一位
}
RESET(CS); //拉低片选,写入数据完毕
}
void Display(uint8_t addr,uint8_t *hz)
{
LCD_Write(CMD,addr);
Delay(3);
while(*hz!='\0')
{
LCD_Write(DATE,*hz);
hz++;
Delay(3);
}
}
void LCD_init() //液晶初始化
{
RESET(CS); //拉低片选
GPIO_ResetBits(GPIOD,GPIO_Pin_15); //PSB拉低,表示是串行,拉高则是并行
GPIO_ResetBits(GPIOC,GPIO_Pin_7); //拉低RST
Delay(100);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
Delay(40);
LCD_Write(CMD,0x30); //8位数据传输
Delay(40);
LCD_Write(CMD,0x0c); //显示开,游标开
Delay(40);
LCD_Write(CMD,0x01); //清屏
Delay(40);
LCD_Write(CMD,0x06); //进入点设定 AC+1
Delay(40);
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询