基于stm32单片机LCD1602显示屏的原理和驱动方法是啥啊?能解答一下吗?基于stm32单片机LCD1602显示屏的原理和驱动方法是啥啊?能解答一下吗
这东西搞了我半天,实在是太坑了,一开始写完代码初始化后lcd只亮没有显示任何东西,我就一直以为是代码问题,最后看到电路图
这里是有个滑动变阻,用来调节lcd显示的对比度,用螺丝刀扭动R22直到有显示为止
lcd1602.c:
#include "lcd1602.h"
#include "delay.h"
#include "sys.h"
void gpio_config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.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_Pin_8|GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void lcd_write_com(u8 com){
EN_CLR;
delay_us(1);
RS_CLR;
delay_us(1);
RW_CLR;
delay_us(10);
GPIOC->ODR = (GPIOC->ODR&0xFF00)|com;;
//GPIO_Write(GPIOC,com);
delay_us(400);
EN_SET;
delay_us(400);
EN_CLR;
delay_us(300);
}
void lcd_write_ascii(u8 ascii){
EN_CLR;
delay_us(1);
RS_SET;
delay_us(1);
RW_CLR;
delay_us(10);
GPIOC->ODR = (GPIOC->ODR&0xFF00)|ascii;
//GPIO_Write(GPIOC,ascii);
delay_us(300);
EN_SET;
delay_us(400);
EN_CLR;
delay_us(300);
}
void lcd_write_char(u8 x,u8 y,u8 data){
if(y==0){
lcd_write_com(0x80+x);
}
else{
lcd_write_com(0xc0+x);
}
lcd_write_ascii(data);
delay_us(500);
}
void lcd_write_string(u8 x,u8 y,u8* str){
if(y==0)
lcd_write_com(0x80+x);
else
lcd_write_com(0xc0+x);
while(*str){
lcd_write_ascii(*str);
str++;
delay_us(500);
}
}
void lcd_clear(){
lcd_write_com(0x01);
delay_ms(5);
}
void lcd_init(){
delay_ms(100);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x08);
delay_ms(10);
lcd_write_com(0x01);
delay_ms(10);
lcd_write_com(0x06);
delay_ms(10);
lcd_write_com(0x0c);
delay_ms(10);
}
lcd1602.h:
#ifndef __LCD1602_H
#define __LCD1602_H
#include "stm32f10x.h"
#define RS_SET GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define RS_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define RW_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define RW_SET GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define EN_CLR GPIO_ResetBits(GPIOB,GPIO_Pin_1)
#define EN_SET GPIO_SetBits(GPIOB,GPIO_Pin_1)
void lcd_write_char(u8 x,u8 y,u8 data);
void lcd_write_string(u8 x,u8 y,u8* str);
void lcd_init(void);
void gpio_config(void);
#endif
mian.c:
#include "delay.h"
#include "sys.h"
#include "hcsr04.h"
#include "lcd1602.h"
#include "usart.h"
u8 u1buffer[4]={0};
static void LCD_Disp(u16 u1);
static void user_init()
{
lcd_write_string(0,0,(u8*)"DIST= cm");
}
int main(){
u16 u1;
u16 distance=0.0;
user_init();
delay_init();
NVIC_Configuration();
uart_init(115200);
LCD_GPIO_Init();//lcd的引脚初始化一定要在lcd初始化之前,很重要
lcd_init();
Hcsr04Init();
while(1){
distance = Hcsr04GetLength();
u1=distance;
LCD_Disp(u1);
}
}
static void LCD_Disp(u16 u1)
{
u1buffer[0] = u1/1000;
u1buffer[1] = u1%1000/100;
u1buffer[2] = u1%100/10;
u1buffer[3] = u1%10;
lcd_write_char(6,0,u1buffer[0]+0X30);
lcd_write_char(7,0,u1buffer[1]+0X30);
lcd_write_char(8,0,u1buffer[2]+0X30);
lcd_write_char(9,0,u1buffer[3]+0X30);
}