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);
}
1602我记得有隐藏位置吧,虚拟的位置,需要平移过来才能显示到屏幕上