LCD12864的驱动
51单片机LCD_12864驱动

LCD_RST=0; //复位
delay(1); //延时
LCD_RST=1; //复位置高
delay(10);
}
/*********************************************************
* *
* 清屏函数 *
/* */
/* LCD初始化设定 */
/* */
* *
*********************************************************/
void LCD_ClearScreen()
{
LCD_wcmd(0x34); //扩充指令操作
lcd_delay(5);
LCD_wcmd(0x30); //基本指令操作
lcd_delay(5);
LCD_wcmd(0x01); //清屏
lcd_delay(5);
}
/*******************************************************************/
LCD_wcmd(0x30); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100); //大于100uS的延时程序
LCD_wcmd(0x30); //Function Set
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
lcd_delay(3);
LCD12864驱动源代码

Transfer_command(0xa0); /*列扫描顺序:从左到右*/
Transfer_command(0xaf); /*开显示*/
clear_screen();
}
//===============clear all dot martrics=============
Transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高4 位
Transfer_command(column&0x0f); //设置列地址的低4 位
}
/*=========延时=====================*/
void Delay(int i)
{
char i;
CS_0(); //CS_PIN=0
RS_0(); //CS_PIN=0
for(i=0;i<8;i++)
{
SCLK_0();
if(data1&0x80) DIN_1();
else DIN_0();
SCLK_1();
data1=data1<<=1;
void Initial_Lcd()
{
RST_0(); //reset=0
P2DIR |=RST_PIN | SPI_MOSI_PIN| SPI_CLK_PIN|RS_PIN|CS_PIN ;
Delay(50);
RST_1(); //reset=1
Delay(50);
{
CS_0(); //CS_PIN=0
LCD12864的驱动

LCD12864驱动LCD12864在市面上主要分为两种,一种是采用st7920控制器的,它一般带有中文字库字模,价格略高一点。
另一种是采用KS0108控制器,它只是点阵模式,不带字库。
很可惜,我的这块就是KS0108控制器不带汉字库的,不过不打算用它专门显示文本,也就无所谓了。
LCD12864模块的20个引脚定义如下:1。
Vss 逻辑电源地2。
VDD 逻辑电源正5v3。
V0 LCD驱动电压4。
RS 数据/指令选择:高电平为数据,低电平为指令5。
R/W 读/写选择:高电平为读数据,低电平为写数据6。
E 读写使能,高电平有效,下降沿锁定数据7。
DB0 数据输入输出引脚8。
DB1 数据输入输出引脚9。
DB2 数据输入输出引脚10。
DB3 数据输入输出引脚11。
DB4 数据输入输出引脚12。
DB5 数据输入输出引脚13。
DB6 数据输入输出引脚14。
DB7 数据输入输出引脚15。
CS1 片选择号,低电平时选择前64列16。
CS2 片选择号,低电平时选择后64列17。
RET 复位信号,低电平有效。
18。
VEE 输出-15v电源给V0提供驱动电源19。
A 背光电源LED正极20。
K 背光电源LED负极具体电路图如下:制做如下:接口说明:装上12864具体的电路还是两个电阻。
一个背光限流电阻。
一个液晶驱动电压调节电阻。
背光电阻还是任何时候在19、20脚与电源之间串上个100欧电位器接上电源。
调节电位器到合适亮度。
具体值最好是到调试完程序能够正常显示后再将阻值确定换成固定电阻。
液晶驱动电压的调整在数据线、电源线接好的前提下是在Vee(-15v)和地之间接一个电位器。
中间接V0,通过调节电位器来调节V0上的电压。
当V0上为-15V时为全暗(液晶显示为全黑)。
当V0为0V 时为全亮。
调节电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。
待屏幕显示正常后,进行对比度的细调,然后测量这两边的阻值在地和V0之间、V0和Vee之间换成两个固定电阻焊上就好了。
LCD12864(T6963)驱动程序

液晶显示模块的应用一、结构特点内藏T6963C 的液晶显示模块上已经实现了T6963C 与行、列驱动器及显示缓冲区RAM 的接口,同时也已用硬件设置了液晶屏的结构(单双屏、数据传输方式、显示窗口长度、宽度等等。
我们常用的液晶显示模块一般都是单屏结构,因此我们这里只讨论单屏结构的液晶显示模块。
内藏T6963C 的单屏结构点阵图形液晶显示模块的方框图如下:二、T6963C 的特点(1) T6963C 是点阵式液晶图形显示控制器它能直接与8 位微处理器接口;(2) T6963C 的字符字体可由硬件或软件设置,其字体有4 种5X8 、6X8、7X8、8X8;(3) T6963C 的占空比可从1/16 到1/128;(4) T6963C 可以图形方式、文本方式及图形和文本合成方式进行显示,以及文本方式下的特征显示,还可以实现图形拷贝操作等等;(5) T6963C 具有内部字符发生器CGROM,共有128 个字符。
T6963C 可管理64K显示缓冲区及字符发生器CGRAM,并允许MPU 随时访问显示缓冲区,甚至可以进行位操作。
三、该类液晶模块的管脚定义见下表:说明:对于单电源模块,标志为V0/POFF。
当该管脚为高或悬空时,内部DC/DC功能开启;为低时,内部DC/DC 功能关闭。
该功能可用作屏幕保护和休眠方式。
如果用其直接替代双电源模块,该管脚直接悬空即可。
四、液晶显示模块的供电说明1. 如果您所选用的液晶模块是双电源(VDD/V0)供电的就需要提供一个负电压(液晶驱动电压V0/VEE),用以调节对比度,接在液晶模块的V0 引脚上。
因为液晶材料的物理特性,液晶的对比度会随着温度的变化而相应变化,所以,您加的负电压值应该随温度作相应的调整,大致是温度变化10°C 电压变化1伏左右。
为满足这一要求您要选择较大值的负电源,然后做一个温度补偿电路,或者安排一个电位器调整负电压值。
例如对于QH12864T-HT-LED04,当室温(VDD=5V)时,V0=-10.5V,如果要用到-20°C,液晶驱动电压将要变到V0=-14.5V,再考虑到负载消耗所以您提供的负电源应该为-16V 左右。
lcd12864 绘图功能实现驱动

} i = 0x80; for(j = 0;j < 32;j++) { Write_Cmd(i++); Write_Cmd(0x88); for(k = 0;k < 16;k++) { Write_Data(*ptr++); } } Write_Cmd(0x36); Write_Cmd(0x30); //打开绘图显示 //回到基本指令集
} /******************************************* 函数名称:Draw_TX 功 能:显示一个 16*16 大小的图形 参 数:Yaddr--Y 地址 Xaddr--X 地址 dp--指向图形数据存放地址的指针 返回值 :无 ********************************************/ void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) { uchar j; uchar k=0; Write_Cmd(0x01); //清屏,只能清除 DDRAM Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示 for(j=0;j<16;j++) { Write_Cmd(Yaddr++); //Y 地址 Write_Cmd(Xaddr); //X 地址
本文作者:林子木 本人学历有blog/item/48bff5dbb38e452332fa1ce4.html 的补充,是基于 430 的实现,很简单的可以移植到 51 上去
如果想具体的实现,请先看上面网址的文章
} /******************************************* 函数名称:Delay_Nms 功 能:延时 N 个 1ms 的时间 参 数:n--延时长度 返回值 :无 ********************************************/ void Delay_Nms(uint n) { uint i; for(i = n;i > 0;i--) Delay_1ms();
LCD12864驱动程序(带字库的)

{
while(buf--);
}*/
/***********忙检测********************/
void Busy()
{
DataPort=0xFF;
RS=0;
RW=1;
while (1)
{
E =1;
if (P0^7==0) break;
}
E=0;
}
void main(void)
{
TMOD=0x01; ///选择定时器模式
TR0=1; //开中断,并允许T0中断
ET0=1;
EA=1; //总开关
Init_LCቤተ መጻሕፍቲ ባይዱ();
Clear_LCD();
while(1);
}
void t0(void) interrupt 1 using 0
{
//delay(100);
/*void Line_Num(uchar k)
{
//uint l;
if(k>=128&&k<=135)l=1;
if(k>135&&k<=143) l=3;
if(k>143&&k<=151) l=2;
if(k>151&&k<=159) l=4;
}*/
/*******************逐行显示***************************************/
void Write_Data(uchar Data)
{
Busy();
RS=1;
RW=0;
液晶12864的驱动(带注释)

//写主函数的时候直接调用以下部分子函数就行了#include<reg51.h>#include"intrins.h"#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;sbit lcd_en=P2^7;sbit lcd_psb=P3^2; //串/并方式控制sbit lcd_rst=P3^7; //液晶复位端口void delay_ms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=120;j>0;j--);}void delay_nop(){_nop_();_nop_();_nop_();_nop_();}/* 以下是lcd忙碌检查函数,result为1时,忙;* result为0时,闲;可写指令与数据。
*/bit lcd_busy(){bit result;lcd_rs=0;lcd_rw=1;lcd_en=1;delay_nop();result=(bit)(P0&0x80);lcd_en=0;return(result);}/**** 以下是写指令函数**** */void lcd_wcmd(uchar cmd){while(lcd_busy());lcd_rs=0;lcd_rw=0;lcd_en=0;_nop_();_nop_();P0=cmd;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下是写数据函数**** */void lcd_wdat(uchar dat){while(lcd_busy());lcd_rs=1;lcd_rw=0;lcd_en=0;P0=dat;delay_nop();lcd_en=1;delay_nop();lcd_en=0;}/**** 以下lcd初始化函数**** */void lcd_init(){lcd_psb=1;lcd_rst=0;delay_ms(3);lcd_rst=1;delay_ms(3);lcd_wcmd(0x34);delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0c); //显示开,关光标delay_ms(5);lcd_wcmd(0x01); //清楚lcd显示的内容delay_ms(5);}/**** 以下是lcd清屏函数**** */void lcd_clr(){lcd_wcmd(0x01);delay_ms(5);}/* 以下是设定显示位置函数* 变量X表示行,Y表示列**/void lcd_pos(uchar x,uchar y){uchar pos;if(x==1) {x=0x80;}else if(x==2) {x=0x90;}else if(x==3) {x=0x88;}else if(x==4) {x=0x98;}pos=x+y;lcd_wcmd(pos);}/* 以下是设定显示位置函数* 变量i表闪烁次数*/void flash(uint i){delay_ms(1000);for(;i>0;i--){lcd_wcmd(0x08); //关闭显示delay_ms(500);lcd_wcmd(0x0c); //开显示delay_ms(500);}}。
LCD12864液晶驱动编程指南

二、显示图片
显示图片和显示汉字的原理是一样的, 只不过是大小的问题! 现在我们就以一张 128*64 分辨率的图片进行取模。 取模图片:
现在我们主要看一下显isplay_BMP(uchar a[][64])//显示图形的左边部分 { uchar i,j; for(j=0;j<8;j++) { SelectScreen(1); Set_page(j); Set_column(0); for(i=0;i<64;i++) //显示左屏 { write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据 } SelectScreen(2); Set_page(j); Set_column(0); for(i=0;i<64;i++) //显示右屏 { write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据 } } } 取出图片的数据是二维数组形式!注意,液晶是先显示左半屏,再显示右半屏, 但 是取数组中的元素是逐个往下取出的, 所以是对于一个半屏而言, 每隔一行取数组中的元素, 而隔去的那一行是另一个半屏要取的数据!这一点一定要注意。 还有一点要补充的就是,这个取模软件只能识别 BMP 和 ICO 格式的单色图片,如果我 们选择的图片不是 128*64 大小的话, 可以通过软件将其改成 128*64 大小的, 如果我们直接 用软件取模的话,显示的会是乱码,解决办法是我们可以通过 windows 自带的画图工具, 什么也不做修改,将大小设置好的图片另存为 BMP 单色文件就行了,然后再用取模软件取 模就 OK 了,=^_^ = !算了,给大家截个图
LCD_databusrite_LCD_command(column);//列位置 } void SetOnOff(uchar onoff) //显示开关 函数:0x3E 是关显示,0x3F 是开显示 { onoff=0x3e|onoff; //0011 111x,onoff 只能为 0 或者 1 write_LCD_command(onoff); } void SelectScreen(uchar screen) //选屏 { switch(screen) { case 0: CS1=0;CS2=0;break; //全屏 case 1: CS1=0;CS2=1;break;//左半屏 case 2: CS1=1;CS2=0;break;//右半屏 default:break; } } void ClearScreen(uchar screen) { uchar i,j; SelectScreen(screen); for(i=0;i<8;i++)//控制页数 0-7,共 8 页 { Set_page(i); Set_column(0); for(j=0;j<64;j++) //控制列数 0-63,共 64 列 { write_LCD_data(0x00); //写入 0,地址指针自加 1 } } } void InitLCD() { Read_busy(); SelectScreen(0); SetOnOff(0); //关显示 SelectScreen(0); SetOnOff(1); //开显示 SelectScreen(0); //LCD 的初始化 } void main() { InitLCD(); ClearScreen(0); Set_line(0); Display(1,0,2*16,huan);//欢 Display(1,0,3*16,ying);//迎 Display(2,0,0*16,fang);//访 Display(2,0,1*16,wen);//问 Display(1,2,0*16,da);//大 Display(1,2,1*16,hai);//海 Display(1,2,2*16,xiang);//橡 Display(1,2,3*16,shu);//树 Display(2,2,0*16,bai);//百 Display(2,2,1*16,du);//度 Display(2,2,2*16,kong);//空 Display(2,2,3*16,jian);//间 While(1); } //初始化 //清屏 //显示开始行 } //清屏 据输出 { write_LCD_data(p[i+16]); //汉字的下半部分 上半部分 } Set_page(page+1); //写下半页 Set_column(column); for(i=0;i<16;i++) //控制列 //控制 16 列的数 } void Display(uchar ss,uchar page,uchar column,uchar *p) { uchar i; SelectScreen(ss); Set_page(page); for(i=0;i<16;i++) 的数据输出 { write_LCD_data(p[i]); //汉字的 //写上半页 //控制 16 列 Set_column(column); //控制列 //显示汉字 ClearScreen(0);//清屏 Set_line(0); //开始行:0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
& 0x80)后就一直读不到 0 了,陷入死循环。当用 while(0) 时反而能正常工作,不知道有没有人能解释
E = 0;
_nop_();
}
/********************************************************/
/*根据设定的坐标数据,定位 LCM 上的下一个操作单元位置 */
下面对上图的指作解释: 1.显示开关控制(DISPLAY ON/OFF)
D=1:开显示(DISPLAY ON) 意即显示器可以进行各种显示操作 D=0:关显示(DISPLAY OFF) 意即不能对显示器进行各种显示操作 2.设置显示起始行(DISPLAY START LINE)
前面在 Z 地址计数器一节已经描述了显示起始行是由 Z 地址计数器控制的。A5~A0 6 位地址自动送入 Z 地址计 数器,起始行的地址可以是 0~63 的任意一行。 例如: 选择 A5~A0 是 62,则起始行与 DDRAM 行的对应关系如下: DDRAM 行:62 63 0 1 2 3 ·················28 29 屏幕显示行: 1 2 3 4 5 6················· 31 32 3.设置页地址(SET PAGE “X ADDRESS”)
case 0x40:
{BusyR();break;}/*右区 */
}
x = Col&0x3F|0x40;
/* col.and.0x3f.or.Set Y Address*/
y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */
CheckBusy();
/* waitting for enable */
//使能 //左片选 //右片选 //页 地址 //列 地址 //一幅图 //12×12 阵点字模 //5×7 阵点字模
/********************函数定义*******************/
void BusyL(void);
//左屏检测忙
void BusyR(void);
//右屏检测忙
LCD12864 模块的 20 个引脚定义如下:
1。Vss
逻辑电源地
2。VDD 逻辑电源正 5v
3。V0 LCD 驱动电压
4。RS 数据/指令选择:高电平为数据,低电平为指令
5。R/W 读/写选择:高电平为读数据,低电平为写数据
6。E 读写使能,高电平有效,下降沿锁定数据
7。DB0 数据输入输出引脚
}
void CheckBusy(void)
{
RS = 0;
//指令
RW = 1;
DataPort= 0xFF;
//输出 0xff 以便读取正确
E = 1;
_nop_();
while(0); //DataPort & 0x80); //Status Read Bit7 = BUSY 这地方有点问题,用了 while(//DataPort
2.读操作时序
时序参数表:
又帖了这么多指令呀时序图什么的,看了就头晕。我也和你一样不爱看这些枯燥的东西。 下面实际写些程序让屏幕亮起来。 运行:
不要走开哦!我会不断补全的。。。 7.自制单片机之七……LCD12864 的驱动之源代码 今天将 LCD12864 的源代码发上来。
//LCD12864
E = 0;
_nop_();
}
/***************************/
/*写指令
*/
/***************************/
6.写显示数据(WRITE DISPLAY DATE)
D7~D0 为显示数据,此指令把 D7~D0 写入相应的 DDRAM 单元,Y 地址指针自动加 1。 7.读显示数据(READ DISPLAY DATE)
此指令把 DDRAM 的内容 D7~D0 读到数据总线 DB7~DB0,Y 地址指针自动加 1。 再帖一下接口时序图 1.写操作时序
8。DB1 数据输入输出引脚
9。DB2 数据输入输出引脚
10。DB3 数据输入输出引脚
11。DB4 数据输入输出引脚
12。DB5 数据输入输出引脚
13。DB6 数据输入输出引脚
14。DB7 数据输入输出引脚
15。CS1 片选择号,低电平时选择前 64 列
16。CS2 片选择号,低电平时选择后 64 列
void WriteCommandR( uchar CommandByte ); //向右屏写入指令
uchar ReadData( void );
//读数据
void WriteData( uchar DataByte ); //写数据
void LcmClear( void );
//清屏
void LcmInit( void );
6. 自制单片机之六……LCD12864 的驱动
LCD12864 的驱动 LCD12864 在市面上主要分为两种,一种是采用 st7920 控制器的,它一般带有中文字库字模,价格略高一点。另一种是 采用 KS0108 控制器,它只是点阵模式,不带字库。很可惜,我的这块就是 KS0108 控制器不带汉字库的,不过不打算 用它专门显示文本,也就无所谓了。
//初始化
void LcmPutBMP( uc图
void LcmReverseBMP( void );
//将整屏反显
void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个 12×12 汉字
uchar * uchartostr(unsigned char unm);
/********************************************************/
void Locatexy(void)
{
uchar x,y;
switch (Col&0xc0)
/* col.and.0xC0
*/
{
/*条件分支执行
*/
case 0:
{BusyL();break;}/*左区 */
所谓页地址就是 DDRAM 的行地址,8 行为一页,模块共 64 行即 8 页,A2~A0 表示 0~7 页。读写数据对地址没有影 响,页地址由本指令或 RST 信号改变复位后页地址为 0。页地址与 DDRAM 的对应关系见 DDRAM 地址表。 4.设置 Y 地址(SET Y ADDRESS)
此指令的作用是将 A5~A0 送入 Y 地址计数器,作为 DDRAM 的 Y 地址指针。在对 DDRA M 进行读写操作后,Y 地址指 针自动加 1,指向下一个 DDRAM 单元。
//将值转成字符串
void LcmPutAsc( uchar asc ); //显示一个 5×7 的 ASC 字符
void LcmPutstr( uchar row,uchar y,uchar * str );
//在设定位置显示字符串
void LcmPutpoint( uchar ro,uchar lie,uchar colour ); //在设定位置显示一个点
5.读状态(STATUS READ)
当 R/W=1 D/I=0 时,在 E 信号为“H”的作用下,状态分别输出到数据总线(DB7~DB0)的相应位。
BF:
前面已叙述过(见 BF 标志位一节)。
ON/OFF: 表示 DFF 触发器的状态(见 DFF 触发器一节)。
RST:
RST=1 表示内部正在初始化,此时组件不接受任何指令和数据。
//**********************************************************
//连线表: CPU=89C51 SysClock=12MHz
*
//RS=P1.0 R/W=P1.1 E=P1.2 CS1=P1.3 CS2=P1.4 *
//DB0-DB7=P0.0-P0.7
17。RET 复位信号,低电平有效。
18。VEE 输出-15v 电源给 V0 提供驱动电源
19。A 背光电源 LED 正极
20。K 背光电源 LED 负极
具体电路图如下:
制做如下: 接口说明: 装上 12864
具体的电路还是两个电阻。一个背光限流电阻。一个液晶驱动电压调节电阻。背光电阻还是任何时候在 19、20 脚与电 源之间串上个 100 欧电位器接上电源。调节电位器到合适亮度。具体值最好是到调试完程序能够正常显示后再将阻值 确定换成固定电阻。液晶驱动电压的调整在数据线、电源线接好的前提下是在 Vee(-15v)和地之间接一个电位器。中间 接 V0,通过调节电位器来调节 V0 上的电压。当 V0 上为-15V 时为全暗(液晶显示为全黑)。当 V0 为 0V 时为全亮。调节 电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。待屏幕显示正常后,进行对比度的细调,然后测量这两边 的阻值在地和 V0 之间、V0 和 Vee 之间换成两个固定电阻焊上就好了。注意在 V0 的电压是在一个很小的范围有效。我 的就是在-2.2——-2.5 这个范围。仔细调节 V0 和地之间的电阻使 V0 上的电压在 2.3V。
sbit RS =P2^0;
//数据指令
sbit RW =P2^1;
//读写
sbit E =P2^2; sbit CSL =P2^3; sbit CSR =P2^4; uchar Page; uchar Col; uchar code BMP1[]; uchar code HZK_12[]; uchar code ASC_5x7[]; uchar str[4];
/***************************/