找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3073|回复: 8
打印 上一主题 下一主题
收起左侧

关于STM32驱动LCD1602引脚不连续的问题

[复制链接]
跳转到指定楼层
楼主
ID:428871 发表于 2020-4-26 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设计电路图时,将LCD1602的D0-D3接在了PC8-PC11,将D4-D7接在了PB4-PB7上,要怎么样驱动LCD呢?麻烦各位大佬给点指点,我初学STM32,最好是给点程序。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-4-26 21:10 | 只看该作者
了解一下C语言位域(位段)概念,可以解决这个问题
回复

使用道具 举报

板凳
ID:726709 发表于 2020-4-26 21:40 | 只看该作者
#include "bsp-lcd1602.h"
void LCD1602_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
GPIO_InitTypeDef LCD1602_GPIOStruct;
LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
LCD1602_GPIOStruct.GPIO_Pin =  LCD1602_E | LCD1602_RS | LCD1602_RW ;
GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
LCD1602_GPIOStruct.GPIO_Pin =   DB0 |  DB1 | DB2 |DB3 |  DB4 | DB5|
                 DB6 |  DB7 ;     //设置为开漏输出
GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
}
void LCD1602_WaitReady(void) //检测忙状态
{
uint8_t sta;
GPIOB->ODR =0x00FF;
RSO(0);
RWO(1);
EO(1);
SysTick_Delay_Us(1);
do{
  sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
  EO(0);
}while(sta);
}
void LCD1602_WriteCmd(uint8_t cmd) //写指令
{
LCD1602_WaitReady();
RSO(0);
RWO(0);
EO(0);
SysTick_Delay_Us(1);
EO(1);
LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
EO(0);
SysTick_Delay_Us(400);
}
void LCD1602_WriteDat(uint8_t dat) //写数据
{
LCD1602_WaitReady();
RSO(1);
RWO(0);
SysTick_Delay_Us(30);
EO(1);
LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
EO(0);
SysTick_Delay_Us(400);
}
void LCD1602_SetCursor(uint8_t x, uint8_t y)
{
    uint8_t addr;
   
    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;  //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址从0x40起始
    LCD1602_WriteCmd(addr|0x80);  //设置RAM地址
}
void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
{
    LCD1602_SetCursor(x, y); //设置起始地址
    while (len--)         //连续写入len个字符数据
    {
        LCD1602_WriteDat(*str++);
    }
}


void LCD1602_Init(void)
{
   LCD1602_GPIO_Config();   //开启GPIO口
    LCD1602_WriteCmd(0X38);  //16*2显示,5*7点阵,8位数据接口
    LCD1602_WriteCmd(0x0C);  //显示器开,光标关闭
    LCD1602_WriteCmd(0x06);  //文字不动,地址自动+1
    LCD1602_WriteCmd(0x01);  //清屏
}

#ifndef _BSP_LCD1602_H
#define _BSP_LCD1602_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_SysTick.h"
#define LCD1602_CLK  RCC_APB2Periph_GPIOB  
#define LCD1602_GPIO_PORT   GPIOB
#define LCD1602_E    GPIO_Pin_10              //定义使能引脚
#define LCD1602_RW   GPIO_Pin_11             //定义读写引脚
#define LCD1602_RS   GPIO_Pin_12             //定义数据、命名引脚

#define EO(X)         X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_E)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_E))
#define RWO(X)        X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RW)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RW))
#define RSO(X)        X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RS)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RS))
//只能是某个GPIO口的低八位
#define DB0     GPIO_Pin_0
#define DB1     GPIO_Pin_1
#define DB2     GPIO_Pin_2
#define DB3     GPIO_Pin_3
#define DB4     GPIO_Pin_4
#define DB5     GPIO_Pin_5
#define DB6     GPIO_Pin_6
#define DB7     GPIO_Pin_7
void LCD1602_Init(void);  //初始化LCD602;
void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str,uint8_t len);



#endif //_BSP_LCD1602_H


这是.c和.h文件对应I/O口改一下就可以了
回复

使用道具 举报

地板
ID:282850 发表于 2020-4-27 00:30 | 只看该作者
非要用并口吗?1602极小的数据量,串口轻松搞定。1602本身就不是好的显示。12864或乾12832比1602好的多。我的1602试验完就丢一边了。
楼上说的正解,就是取前4、后4位,再相或的方法。
回复

使用道具 举报

5#
ID:732506 发表于 2020-4-27 03:18 | 只看该作者
可以4位写入,只用D4-D7就可以了。
回复

使用道具 举报

6#
ID:328014 发表于 2020-4-27 14:56 | 只看该作者
回复

使用道具 举报

7#
ID:739441 发表于 2020-4-27 16:43 | 只看该作者
段位操作,可以找个例程参考一下,直接用人家的代码先驱动起来再说,先亮起来再说,然后再看代码
回复

使用道具 举报

8#
ID:446064 发表于 2020-5-5 16:51 | 只看该作者
JFSN 发表于 2020-4-26 21:40
#include "bsp-lcd1602.h"
void LCD1602_GPIO_Config(void)
{

为什么我按照你的改了之后乱码显示
回复

使用道具 举报

9#
ID:152816 发表于 2022-12-10 16:22 | 只看该作者
JFSN 发表于 2020-4-26 21:40
#include "bsp-lcd1602.h"
void LCD1602_GPIO_Config(void)
{

你这个是连续引脚,别人问的是不连续引脚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表