找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4407|回復(fù): 10
收起左側(cè)

關(guān)于STM32驅(qū)動(dòng)LCD1602引腳不連續(xù)的問(wèn)題

[復(fù)制鏈接]
ID:428871 發(fā)表于 2020-4-26 16:26 | 顯示全部樓層 |閱讀模式
設(shè)計(jì)電路圖時(shí),將LCD1602的D0-D3接在了PC8-PC11,將D4-D7接在了PB4-PB7上,要怎么樣驅(qū)動(dòng)LCD呢?麻煩各位大佬給點(diǎn)指點(diǎn),我初學(xué)STM32,最好是給點(diǎn)程序。
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2020-4-26 21:10 | 顯示全部樓層
了解一下C語(yǔ)言位域(位段)概念,可以解決這個(gè)問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:726709 發(fā)表于 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 ;     //設(shè)置為開(kāi)漏輸出
GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
}
void LCD1602_WaitReady(void) //檢測(cè)忙狀態(tài)
{
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) //寫(xiě)指令
{
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) //寫(xiě)數(shù)據(jù)
{
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)  //由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址
        addr = 0x00 + x;  //第一行字符地址從0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址從0x40起始
    LCD1602_WriteCmd(addr|0x80);  //設(shè)置RAM地址
}
void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
{
    LCD1602_SetCursor(x, y); //設(shè)置起始地址
    while (len--)         //連續(xù)寫(xiě)入len個(gè)字符數(shù)據(jù)
    {
        LCD1602_WriteDat(*str++);
    }
}


void LCD1602_Init(void)
{
   LCD1602_GPIO_Config();   //開(kāi)啟GPIO口
    LCD1602_WriteCmd(0X38);  //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
    LCD1602_WriteCmd(0x0C);  //顯示器開(kāi),光標(biāo)關(guān)閉
    LCD1602_WriteCmd(0x06);  //文字不動(dòng),地址自動(dòng)+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             //定義讀寫(xiě)引腳
#define LCD1602_RS   GPIO_Pin_12             //定義數(shù)據(jù)、命名引腳

#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))
//只能是某個(gè)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文件對(duì)應(yīng)I/O口改一下就可以了
回復(fù)

使用道具 舉報(bào)

ID:282850 發(fā)表于 2020-4-27 00:30 | 顯示全部樓層
非要用并口嗎?1602極小的數(shù)據(jù)量,串口輕松搞定。1602本身就不是好的顯示。12864或乾12832比1602好的多。我的1602試驗(yàn)完就丟一邊了。
樓上說(shuō)的正解,就是取前4、后4位,再相或的方法。
回復(fù)

使用道具 舉報(bào)

ID:732506 發(fā)表于 2020-4-27 03:18 | 顯示全部樓層
可以4位寫(xiě)入,只用D4-D7就可以了。
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2020-4-27 14:56 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

ID:739441 發(fā)表于 2020-4-27 16:43 | 顯示全部樓層
段位操作,可以找個(gè)例程參考一下,直接用人家的代碼先驅(qū)動(dòng)起來(lái)再說(shuō),先亮起來(lái)再說(shuō),然后再看代碼
回復(fù)

使用道具 舉報(bào)

ID:446064 發(fā)表于 2020-5-5 16:51 | 顯示全部樓層
JFSN 發(fā)表于 2020-4-26 21:40
#include "bsp-lcd1602.h"
void LCD1602_GPIO_Config(void)
{

為什么我按照你的改了之后亂碼顯示
回復(fù)

使用道具 舉報(bào)

ID:152816 發(fā)表于 2022-12-10 16:22 | 顯示全部樓層
JFSN 發(fā)表于 2020-4-26 21:40
#include "bsp-lcd1602.h"
void LCD1602_GPIO_Config(void)
{

你這個(gè)是連續(xù)引腳,別人問(wèn)的是不連續(xù)引腳
回復(fù)

使用道具 舉報(bào)

ID:53813 發(fā)表于 2024-12-19 08:52 | 顯示全部樓層
翻老帖,網(wǎng)上這類解答真少,好不容易找打一個(gè),沒(méi)明確答案~
回復(fù)

使用道具 舉報(bào)

ID:517951 發(fā)表于 2024-12-23 08:01 | 顯示全部樓層
單片機(jī)可以用iicPCF8547T芯片驅(qū)動(dòng)1602, 可以節(jié)省IO端口, 詳見(jiàn)  http://www.torrancerestoration.com/bbs/dpj-177486-1.html
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表