OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3528|回复: 5

带字库的串口LCD换到PA口就不会显示了

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-8-26
在线时间
14 小时
发表于 2020-9-22 16:44:07 | 显示全部楼层 |阅读模式
5金钱
带字库的LCD,之前LCD四线接PD,字库IC接PE就能正常显示,把他们换到PA就不行了,求大神解答
(为了以后使用方便我写的HAL库LCD驱动,包括IO口配置初始化,时钟初始化)

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-8-26
在线时间
14 小时
 楼主| 发表于 2020-9-22 16:44:08 | 显示全部楼层
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-8-26
在线时间
14 小时
 楼主| 发表于 2020-9-22 20:55:06 | 显示全部楼层
本帖最后由 18530179198 于 2020-9-23 08:30 编辑

lcd驱动.h文件
#ifndef __LCD19264_H
#define __LCD19264_H

//========移植的时候,根据所选芯片引入相应的头文件==========
#include "stm32f1xx_hal.h"
#include "main.h"

#define uchar unsigned  char
#define uint  unsigned  int
#define ulong unsigned  long


//LCD串口引脚(IC:ST7525-G4)
#define LCD_CS_GPIO                          GPIOA
#define LCD_CS_GPIO_PIN                      GPIO_PIN_8    //对应液晶屏的接口“CS1”(即:片选)        
#define LCD_RS_GPIO                          GPIOA
#define LCD_RS_GPIO_PIN                      GPIO_PIN_9     //对应液晶屏的接口“RS”(即:指令/数据寄存器选择)
#define LCD_SCLK_GPIO                        GPIOA
#define LCD_SCLK_GPIO_PIN                    GPIO_PIN_11    //对应液晶屏的接口“SCLK”(即:串行时钟输入)
#define LCD_SDA_GPIO                        GPIOA
#define LCD_SDA_GPIO_PIN                    GPIO_PIN_10      //对应液晶屏的接口“SDA”(即:串行数据输入)
//字库串口引脚(IC:JLX-GB2312)
#define ROM_IN_GPIO       GPIOB
#define ROM_IN_GPIO_PIN         GPIO_PIN_3     //PB11对应字库IC接口“Rom_IN”(也即:字库IC的SI,串行数据输入)
#define ROM_OUT_GPIO      GPIOB
#define ROM_OUT_GPIO_PIN        GPIO_PIN_4     //PB10对应字库IC接口“Rom_OUT”(也即:字库IC的SO ,串行数据输出)由单片机读取IC数据
#define ROM_SCK_GPIO      GPIOB
#define ROM_SCK_GPIO_PIN        GPIO_PIN_5    // PB2对应字库IC接口“Rom_SCK”(也即:字库IC的SCK,串行时钟)
#define ROM_CS_GPIO       GPIOB
#define ROM_CS_GPIO_PIN         GPIO_PIN_6     // PB1对应字库IC接口“Rom_CS”(也即:字库IC的CS#,片选)



/*LCD引脚定义*/
//CS
#define LCD_CS_Clr()  HAL_GPIO_WritePin(LCD_CS_GPIO, LCD_CS_GPIO_PIN, GPIO_PIN_RESET)
#define LCD_CS_Set()  HAL_GPIO_WritePin(LCD_CS_GPIO, LCD_CS_GPIO_PIN, GPIO_PIN_SET)

//RES
#define LCD_RST_Clr() //NOT USE复位与单片机复位共用
#define LCD_RST_Set() //NOT USE

//DC
#define LCD_RS_Clr() HAL_GPIO_WritePin(LCD_RS_GPIO, LCD_RS_GPIO_PIN, GPIO_PIN_RESET)
#define LCD_RS_Set() HAL_GPIO_WritePin(LCD_RS_GPIO, LCD_RS_GPIO_PIN, GPIO_PIN_SET)

//SCLK,D0
#define LCD_SCLK_Clr() HAL_GPIO_WritePin(LCD_SCLK_GPIO, LCD_SCLK_GPIO_PIN, GPIO_PIN_RESET)
#define LCD_SCLK_Set() HAL_GPIO_WritePin(LCD_SCLK_GPIO, LCD_SCLK_GPIO_PIN, GPIO_PIN_SET)

//SDIN,D1
#define LCD_SDA_Clr() HAL_GPIO_WritePin(LCD_SDA_GPIO, LCD_SDA_GPIO_PIN, GPIO_PIN_RESET)
#define LCD_SDA_Set() HAL_GPIO_WritePin(LCD_SDA_GPIO, LCD_SDA_GPIO_PIN, GPIO_PIN_SET)

/*字库引脚定义*/
//ROM_IN
#define ROM_IN_Clr() HAL_GPIO_WritePin(ROM_IN_GPIO, ROM_IN_GPIO_PIN, GPIO_PIN_RESET)
#define ROM_IN_Set() HAL_GPIO_WritePin(ROM_IN_GPIO, ROM_IN_GPIO_PIN, GPIO_PIN_SET)

//ROM_OUT
#define ROM_OUT HAL_GPIO_ReadPin(ROM_OUT_GPIO, ROM_OUT_GPIO_PIN)

//ROM_SCK
#define ROM_SCK_Clr() HAL_GPIO_WritePin(ROM_SCK_GPIO, ROM_SCK_GPIO_PIN, GPIO_PIN_RESET)
#define ROM_SCK_Set() HAL_GPIO_WritePin(ROM_SCK_GPIO, ROM_SCK_GPIO_PIN, GPIO_PIN_SET)

//ROM_CS
#define ROM_CS_Clr() HAL_GPIO_WritePin(ROM_CS_GPIO, ROM_CS_GPIO_PIN, GPIO_PIN_RESET)
#define ROM_CS_Set() HAL_GPIO_WritePin(ROM_CS_GPIO, ROM_CS_GPIO_PIN, GPIO_PIN_SET)







LCD驱动.C 文件
#include <stdio.h>
#include "lcd19264.h"
#include "lcd19264_BMP.h"
#include "lcd19264_FONT.h"
#include "stm32f1xx_hal.h"



//写指令到LCD模块
void transfer_command_lcd(uint8_t data1)   
{
        char i;
        LCD_CS_Clr ();
        LCD_RS_Clr ();
        for(i=0;i<8;i++)
        {
                LCD_SCLK_Clr ();
                if(data1&0x80) LCD_SDA_Set ();
                else LCD_SDA_Clr ();
                LCD_SCLK_Set ();
                data1=data1<<=1;
        }

        LCD_CS_Set ();
}

//写数据到LCD模块
void transfer_data_lcd(uint8_t data1)
{
          char i;

          LCD_CS_Clr ();
          LCD_RS_Set ();
        for(i=0;i<8;i++)
        {
                LCD_SCLK_Clr ();
                if(data1&0x80) LCD_SDA_Set ();
                else LCD_SDA_Clr ();
                LCD_SCLK_Set ();
                data1=data1<<=1;
        }
        LCD_CS_Set ();
}
//lcd和字库IC初始化
void initial_lcd(void)
{  
    GPIO_InitTypeDef GPIO_InitStruct;        
          __HAL_RCC_GPIOA_CLK_ENABLE();
        
  //LCD_CS
          GPIO_InitStruct.Pin = LCD_CS_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
          GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(LCD_CS_GPIO, &GPIO_InitStruct);
          HAL_GPIO_WritePin(LCD_CS_GPIO,  LCD_CS_GPIO_PIN,   GPIO_PIN_SET);
        
        //LCD_RS
          GPIO_InitStruct.Pin = LCD_RS_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
          GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
    HAL_GPIO_WritePin(LCD_RS_GPIO,  LCD_RS_GPIO_PIN,   GPIO_PIN_SET);
        
        //LCD_SCLK
          GPIO_InitStruct.Pin = LCD_SCLK_GPIO_PIN;
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
          GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LCD_SCLK_GPIO, &GPIO_InitStruct);
    HAL_GPIO_WritePin(LCD_SCLK_GPIO,LCD_SCLK_GPIO_PIN, GPIO_PIN_SET);
               
        //LCD_SDA
          GPIO_InitStruct.Pin = LCD_SDA_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
          GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LCD_SDA_GPIO, &GPIO_InitStruct);
    HAL_GPIO_WritePin(LCD_SDA_GPIO, LCD_SDA_GPIO_PIN,  GPIO_PIN_SET);
        //ROM_IN
          GPIO_InitStruct.Pin = ROM_IN_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(ROM_IN_GPIO, &GPIO_InitStruct);
    HAL_GPIO_WritePin(ROM_IN_GPIO,  ROM_IN_GPIO_PIN,   GPIO_PIN_RESET);
        //ROM_OUT
          GPIO_InitStruct.Pin = ROM_OUT_GPIO_PIN;
    GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    HAL_GPIO_Init(ROM_OUT_GPIO, &GPIO_InitStruct);
    HAL_GPIO_ReadPin(ROM_OUT_GPIO, ROM_OUT_GPIO_PIN);
  //ROM_SCK
    GPIO_InitStruct.Pin = ROM_SCK_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(ROM_SCK_GPIO, &GPIO_InitStruct);
    HAL_GPIO_WritePin(ROM_SCK_GPIO, ROM_SCK_GPIO_PIN,  GPIO_PIN_RESET);
  //ROM_CS
    GPIO_InitStruct.Pin = ROM_CS_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(ROM_CS_GPIO, &GPIO_InitStruct);
    HAL_GPIO_WritePin(ROM_CS_GPIO,  ROM_CS_GPIO_PIN,   GPIO_PIN_RESET);

        //开机复位,挂在单片机复位上,需要单片机控制复位需在.h中添加
        //LCD_RST_Clr();
        //delay_ms(50);
        //LCD_RST_Set();
        //delay_ms(100);

        transfer_command_lcd(0xe2);                            //软复位
        HAL_Delay (10);
        transfer_command_lcd(0x2f);                     //打开内部升压
        HAL_Delay(50);
        transfer_command_lcd(0xa0);                     //
        transfer_command_lcd(0x81);                     //微调对比度
        transfer_command_lcd(0x65);                     //微调对比度的值,可设置范围0x00~0xFF
        transfer_command_lcd(0xeb);                     //1/9偏压比(bias)
        transfer_command_lcd(0xc4);                     //行列扫描顺序:从上到下
        transfer_command_lcd(0xaf);                     //开显示        
}

void lcd_address(uint8_t page,uint8_t column)
{
        column=column-1;                                                                          //我们平常所说的第1列,在LCD驱动IC里是第0列。所以在这里减去1.
        page=page-1;
        transfer_command_lcd(0xb0+page);                                   //设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页,所以在这里减去1
        transfer_command_lcd(((column>>4)&0x0f)+0x10);        //设置列地址的高4位
        transfer_command_lcd(column&0x0f);                                      //设置列地址的低4位
}

//全屏清屏
void clear_screen(void)
{
        unsigned char i,j;
         for(i=0;i<9;i++)
        {
                lcd_address(1+i,1);
                for(j=0;j<192;j++)
                {
                        transfer_data_lcd(0x00);
                }
        }
}
//显示192x64的图片
void display_graphic_192x64(const uint8_t *dp)
{
        uint8_t i,j;
         for(i=0;i<8;i++)
        {
                lcd_address(i+1,1);
                for(j=0;j<192;j++)
                {
                        transfer_data_lcd(*dp);
                        dp++;
                }
        }
}

//显示128x64的图片
void display_graphic_128x64(const uint8_t *dp)
{
        uint8_t i,j;
         for(i=0;i<8;i++)
        {
                lcd_address(i+1,1);
                for(j=0;j<128;j++)
                {
                        transfer_data_lcd(*dp);
                        dp++;
                }
        }
}
//显示64x64的图片
void display_graphic_64x64(uint8_t page,uint8_t *dp)
{
                uint8_t i,j;
        for(j=0;j<8;j++)
        {
                lcd_address(page+j,1);
                for (i=0;i<64;i++)
                {        
                        transfer_data_lcd(*dp);                       //写数据到LCD,每写完一个8位的数据后列地址自动加1
                        dp++;
                }
        }
}
//显示64x32的图片
void display_graphic_64x32(uint8_t page,uint8_t column,uint8_t *dp)
{
        uint8_t i,j;
        for(j=0;j<4;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<64;i++)
                {        
                        transfer_data_lcd(*dp);                       //写数据到LCD,每写完一个8位的数据后列地址自动加1
                        dp++;
                }
        }
}

//显示32x32点阵图像、汉字、生僻字或其他图标
void display_graphic_32x32(uint8_t page,uint8_t column,uint8_t *dp)
{
        uint8_t i,j;
        for(j=0;j<4;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<32;i++)
                {        
                        transfer_data_lcd(*dp);                       //写数据到LCD,每写完一个8位的数据后列地址自动加1
                        dp++;
                }
        }
}
//显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t *dp)
{
        uint8_t i,j;
        for(j=0;j<2;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<16;i++)
                {        
                        transfer_data_lcd(*dp);                       //写数据到LCD,每写完一个8位的数据后列地址自动加1
                        dp++;
                }
        }
}

//显示8x16点阵图像、ASCII, 或8x16点阵的自造字符、其他图标
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp)
{
        uint8_t i,j;
        for(j=0;j<2;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<8;i++)
                {        
                        transfer_data_lcd(*dp);                                        //写数据到LCD,每写完一个8位的数据后列地址自动加1
                        dp++;
                }
        }
}

//显示5x7点阵图像、ASCII, 或5x7点阵的自造字符、其他图标
void display_graphic_5x7(uint8_t page,uint8_t column,uint8_t *dp)
{
        uint8_t i,j;
        for(j=0;j<1;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<8;i++)
                {        
                        transfer_data_lcd(*dp);                                        //写数据到LCD,每写完一个8位的数据后列地址自动加1
                        dp++;
                }
        }
}

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-9-23 02:38:45 | 显示全部楼层
先读ID。。。
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-8-26
在线时间
14 小时
 楼主| 发表于 2020-9-23 07:02:17 来自手机 | 显示全部楼层
正点原子 发表于 2020-9-23 02:38
先读ID。。。

跟这个没关系,之前就能用,就换了GPIO口,就不会显示了,串口LCD不是任意GPIO口都可以的吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-9-24 01:42:25 | 显示全部楼层
18530179198 发表于 2020-9-23 07:02
跟这个没关系,之前就能用,就换了GPIO口,就不会显示了,串口LCD不是任意GPIO口都可以的吗

换了IO不能用很正常啊,你配置不对,接线不对,大把问题导致不能用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 10:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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