基于stm32单片机LCD1602显示屏的原理和驱动方法是啥啊?

基于stm32单片机LCD1602显示屏的原理和驱动方法是啥啊?能解答一下吗?基于stm32单片机LCD1602显示屏的原理和驱动方法是啥啊?能解答一下吗

  • 你可以参考下这篇文章:STM32驱动LCD1602程序(调试已成功)
  • 除此之外, 这篇博客: 基于STM32F103的超声波测距,LCD1602显示中的 2.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);
    
    }