最近想驱动一下LCD1602,照着手册说明写了程序,可是屏幕死活就是不显示啊!真心纠结了,求仙人帮助~~
下面是我的代码:
【lcd1602.c】
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "lcd1602.h"
void LCD1602_Init(void)
{
RCC->APB2ENR |= 1 << 3; //????PORTB?±??
GPIOB->CRL &= 0XFFFFF000; //PB0??PB1??PB2?è??????
GPIOB->CRL |= 0X00000333; //PB0??PB1??PB2???ì??????50MHz
GPIOB->CRH &= 0X00000000; //PB8~15?è??????
GPIOB->CRH |= 0X33333333; //PB8~15???ì??????50MHz
LCD1602_RS = 0;
LCD1602_E = 0;
GPIOB->BSRR = (0XFF << 8) & 0XFF00; //GPIOB[15:8]??????1??GPIOB[7:0]±?????±?
//?¨????BSRR[15:8]??1????BSRR[7:0]??0
//1111111100000000 & 1111111100000000 = 1111111100000000
LCD1602_WriteCommand(0X38); //??????????????
LCD1602_WriteCommand(0X0E); //??????±ê????±ê??????
LCD1602_WriteCommand(0X06); //?±????????×?·??ó?????·????+1??????±ê+1
LCD1602_WriteCommand(0X01); //????????
LCD1602_WriteCommand(0X80); //?è?????????·????
}
void LCD1602_WriteCommand(u8 cmd)
{
LCD1602_RS = 0;
GPIOB->BSRR = (cmd << 8) & 0XFF00; //GPIOB[15:8]??cmd??1??????1??GPIOB[7:0]±?????±?
//?¨????BSRR[15:8]??cmd??1??????1????BSRR[7:0]??0??????
//XXX00X0X00000000 & 1111111100000000 = XXX00X0X00000000
GPIOB->BRR = ((~cmd) << 8) & 0XFF00; //GPIOB[15:8]??cmd??0??????0??GPIOB[7:0]±?????±?
//?¨????BRR[15:8]??cmd??0??????1????BRR[7:0]??0??????
//000XX0X000000000 & 1111111100000000 = 000XX0X000000000
delay_ms(5);
LCD1602_E = 1;
delay_ms(5);
LCD1602_E = 0;
}
void LCD1602_WriteData(u8 data)
{
LCD1602_RS = 1;
GPIOB->BSRR = (data << 8) & 0XFF00;
GPIOB->BRR = ((~data) << 8) & 0XFF00;
delay_ms(5);
LCD1602_E = 1;
delay_ms(5);
LCD1602_E = 0;
}[/mw_shl_code]
【lcd1602.h】
[mw_shl_code=c,true]#ifndef __LCD1602_H
#define __LCD1602_H
#include "sys.h"
#define LCD1602_RS PBout(0) //PB0
#define LCD1602_RW PBout(1) //PB1
#define LCD1602_E PBout(2) //PB2
void LCD1602_Init(void);
void LCD1602_WriteCommand(u8 cmd);
void LCD1602_WriteData(u8 data);
#endif[/mw_shl_code]
【main.c】
[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "lcd1602.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(9); //?????±???è??
delay_init(72); //???±??????
uart_init(72, 9600); //?®??????????9600
LED_Init(); //??????LED
LCD1602_Init(); //??????LCD1602
while (1);
}[/mw_shl_code]
硬件连接如下:
RS——PB0
RW——PB1
E——PB2
D0~D8——PB8~PB15(按大小顺序对应连的)
VSS、VDD、V0、A、K——开发板5V输出电源
V0和电源之间还连了一个可调变阻器
下面是我的硬件连接图:
|