分享一篇基于STM32F103驱动LCD12864的代码(串行驱动,亲测可用)
说明一下:PSB管脚可以直接接地,CS可以直接接VCC,可以省出2个管脚
另外想要移植到51的话只需要更改一下管脚控制、定义和注意延时时间即可
代码如下(.c文件):
#include "lcd12864.h"
//字符显示RAM(随机存储器)地址(简单理解就是显示屏上字符显示的位置)
uint8_t LCD12864_DDRAM_ADDR[4][8]=
{
{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87}, //第一行
{0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97}, //第二行
{0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}, //第三行
{0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F} //第四行
};
void LCD12864_Init()
{
//SID、SCLK端口初始化
GPIO_InitTypeDef GPIO_InitStructure;
CS_H;
PSB_L;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//LCD12864初始化基本流程
delay_ms(50); //等待液晶自检(延时>40ms)
LCD12864_Write(WRITE_CMD,0x30);//功能设定:选择基本指令集 ,选择8bit数据流
delay_us(200); //延时>137us
LCD12864_Write(WRITE_CMD,0x0C);//开显示
delay_us(200); //延时>100us
LCD12864_Write(WRITE_CMD,0x01);//清除显示,并且设定地址指针为00H
delay_ms(20); //延时>10ms
LCD12864_Write(WRITE_CMD,0x06);//每次地址自动+1,初始化完成
}
void LCD12864_Send_Byte(char byte)//将一字节数据送到数据总线
{
uint8_t i;
for(i = 0; i < 8; i++)
{
SCLK_L; //时钟线置低
if(byte & (0x80 >> i))//将所需要发送的byte一位一位的设置并发送
{
SID_H;
}
else
{
SID_L;
}
SCLK_H; //装载数据
}
}
void LCD12864_Write(uint8_t Mode,uint8_t CMDorDAT)
{
delay_ms(1); //每次写入数据或指令间隔大于1ms 便可不用写忙状态检测
LCD12864_Send_Byte(Mode); //写指令还是显示数据
LCD12864_Send_Byte(0xF0 & CMDorDAT); //写高四位(写入的数据的高四位)
LCD12864_Send_Byte(0xF0 & (CMDorDAT << 4)); //写低四位 (写入的数据的低四位)
}
void LCD12864_Clear()
{
LCD12864_Write(WRITE_CMD, 0x01); //清屏指令
delay_ms(2); //延时以待液晶稳定【至少1.6ms】
}
void LCD12864_Display_Words(uint8_t x, uint8_t y, char *str) //显示函数(x是行,y是列)
{
LCD12864_Write(WRITE_CMD, LCD12864_DDRAM_ADDR[x][y]); //设置显示位置
while(*str!='\0')
{
LCD12864_Write(WRITE_DAT, *str++);
}
}
/*************
写入图片需要的步骤
1.切换到扩充指令
2.关闭绘图显示功能
3.将垂直的坐标(Y)和水平位元组坐标(X)写入CGRAM地址(先Y后X)
4.将图片的字节数据写入RAM中(先将高位D15-D8写入再写D7-D0)
5.打开绘图显示功能
6.切换回基本指令
**************/
void LCD_Display_Picture(uint8_t *img)
{
uint8_t x,y,i;
LCD12864_Write(WRITE_CMD,0x34); //切换到扩充指令
LCD12864_Write(WRITE_CMD,0x34); //关闭图形显示
for(i = 0; i < 1; i++) //上下屏写入
{
for(y=0;y<32;y++) //垂直Y写32次
{
for(x=0;x<8;x++) //横向X写8次
{
LCD12864_Write(WRITE_CMD,0x80 + y) ; //行地址
LCD12864_Write(WRITE_CMD,0x80 + x+i); //列地址
LCD12864_Write(WRITE_DAT,*img ++) ; //写高位字节数据 D15-D8
LCD12864_Write(WRITE_DAT,*img ++) ; //写低位字节数据 D7-D0
}
}
}
LCD12864_Write(WRITE_CMD,0x36);//打开图形显示
LCD12864_Write(WRITE_CMD,0x30);//切换回基本指令
}
(.h文件代码)
#ifndef __LCD12864_H
#define __LCD12864_H
#include "sys.h"
#include "delay.h"
//PA0接SID,PA1接SCLK,CS接VCC(一直选通),PSB接GND(串行传输方式),RST接VCC(低电平复位),BLA接VCC,BLK接GND
#define SID_H GPIO_SetBits(GPIOB,GPIO_Pin_3)
#define SID_L GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define SCLK_H GPIO_SetBits(GPIOB,GPIO_Pin_4)
#define SCLK_L GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define CS_H GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define CS_L GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define PSB_H GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define PSB_L GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define WRITE_CMD 0xF8 //写命令
#define WRITE_DAT 0xFA //写数据
void LCD12864_Init(void) ;//初始化LCD
void LCD12864_Clear(void) ;//清屏
void LCD12864_Send_Byte(char byte);//Byte发送函数
void LCD12864_Write(uint8_t Select,uint8_t CMDorDAT) ; //MCU向LCD写数据或者命令
void LCD12864_Display_Words(uint8_t x, uint8_t y, char *str);//字符(汉字)显示函数
void LCD12864_Display_Picture(uint8_t *img) ;//图片显示函数
#endif
|