LCD12864
简介
12864LCD液晶显示模块是一款4位/8位并行、2线或3线接口方式,内部含有国际一级、二级简体中文字库的图形点阵液晶模块。显示分辨率为12864,内置8198个1616点汉字,和128个16*8点ASCII字符集。
功能引脚图
串口通讯需要使用的引脚
- CS片选信号 (如果只有一款屏,可以将CS直接接到VCC上,实现两线通讯。)
- SID数据传输引脚
- CLK时钟
- PSB(低电平表示串行通讯,串口通讯时可以直接接地。)
- VSS、VDD电源脚
原理图
工作电压:5V
驱动电压:0-7V
逻辑电平:2.7-5.5V
工作温度:0-55°C
串行时序图
- 在操作液晶屏前,将CS片选信号拉高。
- SID前8位是控制字符,1-5位固定为1。
RW为0时,表示写操作。RS为1时,表示写数据,RS为0时,表示写指令。
因此写指令CMD固定为0xF8,写数据DAT固定为0xFA。 - 发送数据分为两组,将发送的8位数据截取成两段,第一段发送给1byte的高4位,第二段发送给2byte的高4位。
基本指令说明
-
功能设定
本设计使用(0x30),表示8位MPU控制,选择基本指令集。
-
显示开关设置
本设计使用(0x0C),表示设定显示开,关闭光标,正常显示。
-
进入设定点
本设计使用(0x06),表示显示数据的读写时,设定游标方向右移,DDRAM地址计数器加1。
-
清楚显示
本设计使用(0x01),表示清除显示。
-
设定DDRAM地址
本设计使用(0x80),表示设置启动位置到地址计数器。
128x64点阵原理上等同于256x32点阵,第三行对应的DDRAM地址紧接着第一行,第四行对应的DDRAM地址紧接着第二行。在使用反白功能时,第一行反白,第三行必然反白。
6. 屏幕与DDRAM地址的对应关系
代码配置
lcd12864.h
#ifndef __LCD12864_H
#define __LCD12864_H
#include "stm32f10x.h"
#include "Delay.h"
#define CS GPIO_Pin_0
#define SID GPIO_Pin_1
#define CLK GPIO_Pin_2
#define PSB GPIO_Pin_3
#define CMD_PROT GPIOC
#define CS_HIGH GPIO_SetBits(CMD_PROT,CS)
#define CS_LOW GPIO_ResetBits(CMD_PROT,CS)
#define SID_HIGH GPIO_SetBits(CMD_PROT,SID)
#define SID_LOW GPIO_ResetBits(CMD_PROT,SID)
#define CLK_HIGH GPIO_SetBits(CMD_PROT,CLK)
#define CLK_LOW GPIO_ResetBits(CMD_PROT,CLK)
#define PSB_HIGH GPIO_SetBits(CMD_PROT,PSB)
#define PSB_LOW GPIO_ResetBits(CMD_PROT,PSB)
#define CMD 0xF8
#define DAT 0xFA
typedef struct{
uint8_t com;
uint8_t num;
uint8_t *dat;
}LCD_InitTypeDef;
void LCD12864_UserConfig(void);
void LCD12864_Write_Init(void);
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data);
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure);
void LCD12864_Write_Number(uint8_t com,uint8_t num);
void LCD12864_Open(void);
void LCD12864_Shut(void);
#endif
lcd12864.c
#include "lcd12864.h"
void LCD12864_UserConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = CS|SID|CLK|PSB;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(CMD_PROT,&GPIO_InitStructure);
}
void LCD12864_Write_Byte(uint8_t data)
{
uint8_t WBi;
CS_HIGH;
for(WBi=0;WBi<8;WBi++)
{
(data<<WBi&0x80)?SID_HIGH:SID_LOW;
CLK_LOW;
CLK_HIGH;
}
CS_LOW;
}
void LCD12864_Write_CMD_Data(uint8_t cmd,uint8_t data)
{
LCD12864_Write_Byte(cmd);
LCD12864_Write_Byte(data&0xf0);
LCD12864_Write_Byte((data<<4)&0xf0);
Delay_ms(2);
}
void LCD12864_Write_Init(void)
{
PSB_LOW;
LCD12864_Write_CMD_Data(CMD,0x30);
LCD12864_Write_CMD_Data(CMD,0x06);
LCD12864_Write_CMD_Data(CMD,0x0C);
LCD12864_Write_CMD_Data(CMD,0x01);
LCD12864_Write_CMD_Data(CMD,0x80);
}
void LCD12864_Open(void)
{
LCD12864_Write_CMD_Data(CMD,0x0C);
}
void LCD12864_Shut(void)
{
LCD12864_Write_CMD_Data(CMD,0x08);
}
void LCD12864_Write_Word(LCD_InitTypeDef LCD_InitStructure)
{
uint8_t LWWi;
LCD12864_Write_CMD_Data(CMD,LCD_InitStructure.com);
for(LWWi=0;LWWi<LCD_InitStructure.num;LWWi++)
{
LCD12864_Write_CMD_Data(DAT,*LCD_InitStructure.dat++);
Delay_ms(200);
}
}
void LCD12864_Write_Number(uint8_t com,uint8_t num)
{
const uint8_t number[] = {"0123456789"};
LCD12864_Write_CMD_Data(CMD,com);
LCD12864_Write_CMD_Data(DAT,number[num/1000]);
LCD12864_Write_CMD_Data(DAT,number[num%1000/100]);
LCD12864_Write_CMD_Data(DAT,number[num%100/10]);
LCD12864_Write_CMD_Data(DAT,number[num%100%10]);
}
main.c
#include "stm32f10x.h"
#include "lcd12864.h"
#include "Delay.h"
LCD_InitTypeDef LCD_InitStructure;
int main(void)
{
LCD12864_UserConfig();
LCD12864_Write_Init();
LCD_InitStructure.com = 0x80;
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"桃之夭夭灼灼其华";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.com = 0x90;
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"之子于归宜其室家";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.com = 0x88;
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"桃之夭夭有蕡其实";
LCD12864_Write_Word(LCD_InitStructure);
LCD_InitStructure.com = 0x98;
LCD_InitStructure.num =16;
LCD_InitStructure.dat = (u8*)&"之子于归宜其家室";
LCD12864_Write_Word(LCD_InitStructure);
Delay_ms(500);
LCD12864_Write_CMD_Data(CMD,0x01);
while(1)
{
uint8_t i;
for(i=0;i<200;i++)
{
LCD12864_Write_Number(0x90,i);
Delay_ms(200);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)