初级会员

- 积分
- 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++;
}
}
}
|
|