stm32显示lcd1602,第一排0x80,总不能完全显示。求安排

lcd1602第二行显示完全,只有第一行有问题。延时5ms时16个字符第一行显示8个字符,延时500ms时16个字符第一行显示15个字符.

led.h
#ifndef __OLED_H
#define __OLED_H                   
#include "sys.h"
#include "stdlib.h"      
#define uchar unsigned char 
#define uint unsigned int 

#define OLED_MODE     1 
                                      
//---------------------------OLED端口定义--------------------------

/*
#define OLED_EN  PBout(8)     //oe/rst///e
#define OLED_RW  PBout(9)          //rrst/rw////rw
#define OLED_RS  PGout(10)    //sda   /rd/////rs
*/
//PC0~7,作为数据线
 
#define      OLED_RS0           GPIOB->BRR  = GPIO_Pin_10//0x00000004 //低电平  PB.15
#define      OLED_RW0           GPIOB->BRR  = GPIO_Pin_9//0x00000010 //低电平  PB.14
#define      OLED_EN0           GPIOB->BRR  = GPIO_Pin_8//0x00000040 //低电平  PB.13
                             
//============================端口位设置/清除寄存器=========================================//
#define      OLED_RS1           GPIOB->BSRR = GPIO_Pin_10//0x00000004 //高电平  PB.15
#define      OLED_RW1           GPIOB->BSRR = GPIO_Pin_9//0x00000010 //高电平  PB.14
#define      OLED_EN1           GPIOB->BSRR = GPIO_Pin_8 //0x00000040 //高电平  PB.13
 




#define      lcd_data_port              GPIOA->ODR

void init_1602(void);
void write_data(uchar date);
void write_com(uchar com);
void delay(uint q);
void GPIO_InitStructReadtempCmd(void);


#endif  
     
lcd.c
#include "oled.h"



void delay(uint q)
{
    uint x,y;
    for(x=q;x>0;x--)
       for(y=110;y>0;y--);
}

void GPIO_InitStructReadtempCmd(void)
{
  GPIO_InitTypeDef    GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA,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_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //GPIO A  0-7
    GPIO_Init(GPIOA, &GPIO_InitStructure);            
 //GPIO_SetBits(GPIOA,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_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_Init(GPIOB, &GPIO_InitStructure);                //GPIO B 8 9 10
    //GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8);
}

/***********************lcd1602写命令函数************************/
void write_com(unsigned char com)
{

    OLED_RS0;//rs
    lcd_data_port=com;
    delay(8);
    OLED_EN1;
    delay(8);
    OLED_EN0;
}

/***********************lcd1602写数据函数************************/
void write_data(unsigned char date)
{    
 OLED_RS1;//rs
    lcd_data_port=date;
    delay(8);
    OLED_EN1;
    delay(8);
    OLED_EN0;    
}

/***********************lcd1602初始化设置************************/
void init_1602()     //lcd1602初始化设置
{
    OLED_EN0;
    OLED_RS0;
    OLED_RW0;
    write_com(0x38);    
    
    write_com(0x0c);
    
    write_com(0x06);
    
    write_com(0x01);
    
}


main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "oled.h"
#include <stdio.h>
#include "usart.h"

unsigned int i,j;
unsigned char temp_table[]={"YL:2 WD:30 SD:16"};
unsigned char temp_set_table[]={"YL:2 WD:30 SD:16"}; 



int main()
{
      delay_init();
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      GPIO_InitStructReadtempCmd();    //GPIO端口配置初始化
      init_1602();        
       write_com(0x80);
      for(i=0;i<16;i++)
    {
        write_data(temp_table[i]);
        delay(500);
    } 
    
                
      write_com(0x80+0x40); 
   for(i=0;i<16;i++)
    {
        write_data(temp_set_table[i]);
        delay(5);
    } 
                
      while(1);
}


img

img

1602我记得有隐藏位置吧,虚拟的位置,需要平移过来才能显示到屏幕上