本帖最后由 杉侠 于 2017-4-5 13:57 编辑
在使用STM32F7阿波罗的开发板写LCD1602的时候,出现上电跑程序后所有点阵都显示,从屏的正面看不出有字输出,但是侧一点就看的出来程序里的字母已经显示,这是什么问题,时序上有问题吗?
下面是代码:
#ifndef _LCD1602_H
#define _LCD1602_H
#include "sys.h"
#define lcd1602_RS(n) (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_8,GPIO_PIN_RESET))
#define lcd1602_RW(n) (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET))
#define lcd1602_EN(n) (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_RESET))
#define lcd_d7_in() {GPIOE->MODER&=~(11<<28);GPIOE->MODER|=0<<29;}
#define lcd_d7_out() {GPIOE->MODER&=~(11<<28);GPIOE->MODER|=1<<28;}
#define lcd_d7_read (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14))
void LCD1602_Init(void);
void LCD1602_cmd(u8 cmd);
u8 LCD1602_bz(void);
void LCD1602_DATAOUT(u8 data);
void LCD1602_pos(u8 pos);
void display(u8 addr,u8 data);
#endif
LCD1602驱动
#include "lcd1602.h"
#include "delay.h"
#include "sys.h"
void LCD1602_Init(void) //LCD1602初始化函数
{
GPIO_InitTypeDef GPIO_Initure; //定义GPIO结构体变量名
__HAL_RCC_GPIOD_CLK_ENABLE(); //开启PD口的时钟
__HAL_RCC_GPIOE_CLK_ENABLE(); //开启PE口的时钟
GPIO_Initure.Pin=GPIO_PIN_8| //控制脚RS
GPIO_PIN_9| //控制脚RW
GPIO_PIN_10; //控制脚EN
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //设置为推挽输出模式
GPIO_Initure.Pull=GPIO_PULLUP; //设置为上拉模式
GPIO_Initure.Speed=GPIO_SPEED_FAST; //设置速度为50M
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_7| //数据位D0
GPIO_PIN_8| //数据位D1
GPIO_PIN_9| //数据位D2
GPIO_PIN_10| //数据位D3
GPIO_PIN_11| //数据位D4
GPIO_PIN_12| //数据位D5
GPIO_PIN_13| //数据位D6
GPIO_PIN_14; //数据位D7
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //设置为推挽输出模式
GPIO_Initure.Pull=GPIO_PULLUP; //设置为上拉模式
GPIO_Initure.Speed=GPIO_SPEED_FAST; //设置速度为50MHZ
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
LCD1602_cmd(0x38); //设置显示模式16X2,5X7点阵,8位数据接口
LCD1602_cmd(0x0c); //开显示
LCD1602_cmd(0x06); //读写一个字符后指针加1
LCD1602_cmd(0x01); //显示清屏
}
void LCD1602_cmd(u8 cmd) //写入指令函数
{
while(LCD1602_bz())
;
lcd_d7_out();
lcd1602_RS(0);
lcd1602_RW(0);
lcd1602_EN(0);
GPIOE->ODR&=~(0xff<<7);
GPIOE->ODR|=cmd<<7;
lcd1602_EN(1);
lcd1602_EN(0);
}
void LCD1602_DATAOUT(u8 data) //写入数据函数
{
while(LCD1602_bz())
;
lcd_d7_out();
lcd1602_RS(1);
lcd1602_RW(0);
lcd1602_EN(0);
GPIOE->ODR&=~(0xff<<7);
GPIOE->ODR|=data<<7;
lcd1602_EN(1);
lcd1602_EN(0);
}
u8 LCD1602_bz(void) //读取忙信号
{
u8 BUSY;
lcd1602_RS(0);
lcd1602_RW(1);
lcd1602_EN(1);
lcd_d7_in();
BUSY=lcd_d7_read;
return BUSY;
}
void LCD1602_pos(u8 pos) //写入地址
{
LCD1602_cmd(pos|0x80);
}
main函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd1602.h"
u8 dis[]={"abcdefg"};
int main(void)
{
u8 i;
u8 *temp;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
LCD1602_Init();
while(1)
{
temp=&dis[0];
LCD1602_cmd(0x01);
delay_ms(1);
LCD1602_pos(0x00);
for(i=0;i<8;i++)
{
LCD1602_DATAOUT(*temp);
temp++;
delay_ms(500);
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>