LCD12864液晶显示屏
屏幕介绍
① 可显示四行字符,每行可显示8个汉字或者16个数字和字母;
②可串行通信和并行通信;
③ 串口接口管脚信号
通信方法
(一)八位并行通信方法
(二)串行通信方法
用户指令集
一般常用的指令有:
扩充功能设定指令集(当需要自定义图案,可以把绘图模式打开)
清除显示指令(这个指令只能清除DDRAM里的数据,不能清除绘图模式GDRAM的数据)
显示状态指令(打开后才能显示数据)
进入点设定指令(具体操作看说明一般为0x06)
注意:在切换指令集写入数据时,会导致闪屏现象,因此不要在程序中频繁的切换指令集
驱动程序
12864带字库驱动程序
LcdWrods_Printf()类似prinf使用方法,用起来超级方便!
#include <stdio.h>
#include <stdarg.h>
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据
void SendByte(uint8_t byte)
{
uint8_t i;
for(i = 0;i < 8;i++)
{
if((byte << i) & 0x80) //0x80(1000 0000) 只会保留最高位
{
SID = 1; // 引脚输出高电平,代表发送1
}
else
{
SID = 0; // 引脚输出低电平,代表发送0
}
/*或
SID = (Dbyte << i) & 0x80;
上面那样为了方便理解
*/
SCLK = 0; //时钟线置低 允许SID变化
Delay_us(5); //延时使数据写入
SCLK = 1; //拉高时钟,让从机读SID
}
}
void Lcd_WriteData(uint8_t Dat )
{
Delay_ms(1);
SendByte(WRITE_DAT); //11111,RW(0),RS(1),0
SendByte(0xf0&Dat); //高四位
SendByte(Dat<<4); //低四位(先执行<<)
}
int fputc(int ch, FILE *f)
{
Lcd_WriteData(ch); //将printf的底层重定向到自己的发送字节函数
return ch;
}
void Display_Words(uint8_t x,uint8_t y,char *str)
{
Lcd_WriteCmd(LCD_addr[x][y]); //写初始光标位置
while(*str>0)
{
Lcd_WriteData(*str); //写数据
str++;
}
}
void LcdWrods_Printf(int row, int col, char *format, ...)
{
char String[100]; //定义字符数组
va_list arg; //定义可变参数列表数据类型的变量arg
va_start(arg, format); //从format开始,接收参数列表到arg变量
vsprintf(String, format, arg); //使用vsprintf打印格式化字符串和参数列表到字符数组中
va_end(arg); //结束变量arg
Display_Words(row,col,String); //串口发送字符数组(字符串)
}
12864绘图模式驱动程序
#define WRITE_CMD 0xF8//写命令
#define WRITE_DAT 0xFA//写数据
void Lcd_WriteCmd(uint8_t Cmd )
{
Delay_ms(1); //由于我们没有写LCD正忙的检测,所以直接延时1ms,使每次写入数据或指令间隔大于1ms 便可不用写忙状态检测
SendByte(WRITE_CMD); //11111,RW(0),RS(0),0
SendByte(0xf0&Cmd); //高四位
SendByte(Cmd<<4); //低四位(先执行<<)
}
void Lcd_WriteData(uint8_t Dat )
{
Delay_ms(1);
SendByte(WRITE_DAT); //11111,RW(0),RS(1),0
SendByte(0xf0&Dat); //高四位
SendByte(Dat<<4); //低四位(先执行<<)
}
void LCD_Display_Picture(const uint8_t *img,uint8_t num)
{
uint8_t x,y,i;
for(i = 0; i < 1; i++) //上下屏写入
{
for(y=0;y<32;y++) //垂直Y写32次
{
for(x=0;x<1;x++) //横向X写1次
{
Lcd_WriteCmd(0x80 + y); //行地址
Lcd_WriteCmd(0x80+num + x+i); //列地址
Lcd_WriteData(*img ++); //写高位字节数据 D15-D8
Lcd_WriteData(*img ++); //写低位字节数据 D7-D0
}
}
}
}