LCD12864(T6963)驱动程序

LCD12864(T6963)驱动程序
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 左右。但如果超过此值太多或说超过了液晶驱动电源的极限值的话应该考虑保护电路。

2. 常用负电源产生办法

1) 采用79 系列三端集成稳压器可产生-18v(7918) -24v(7924)等电源

2) 采用DC-DC 模块市场上常见的5D**系列型号可选择使用

3) 采用DC-DC 集成电路制作负电源如MAX749、 MAX680、 MC34063 等。

3. 液晶模块可选用带背光的型号大部分为LED 背光方式,供电为3.8~

4.3V 直流电源,严格限制5V 电源直接供电,否则不仅会增加您的功耗,更会增加损坏背光灯的可能性和缩短液晶模块的使用寿命。推荐电压如下:

当背光方式为LED04 即底背光时VLED<4.0V;

当背光方式为LED03 即边背光时VLED 4.1V。

五、T6963C 与MPU 的接口时序:

T6963C 与MPU 接口时序如图:

六、液晶显示模块指令系统

该类液晶模块的系统指令集其实就是T6963C 控制器的指令集。模块的初始化设置一般都由管脚设置完成,因此其指令系统将集中于显示功能的设置上。T6963C的指令可带一个或两个参数,或无参数。每条指令的执行都是先送入参数(如果有的话),再送入指令代码。每次操作之前,最好先进行状态字检测。

T6963C 的状态字如下所示:

由于状态位作用不一样,因此执行不同指令必须检测不同状态位。在MPU每一次读写指令和数据时,STA0 和STA1 要同时有效――处于"准备好"状态。

当MPU 读写数组时,判断STA2 或STA3 状态。

屏读、屏拷贝指令使用STA6。

STA5 和STA7 反映T6963C 内部运行状态。

T6963C指令系统的说明:

1、指针设置指令,格式如下:

D1,D2为第一和第二个参数,后一个字节为指令代码,根据N0,N1,N2的取值,该指令有三种含义(N0,N1,N2不能有两个同时为1)

(1)光标指针设置:D1表示光标在实际液晶屏上离左上角的横向距离(字符数),D2表示纵向距离(字符行)

(2) CGRAM偏置地填寄存器设置:设置了CGRAM在显示64KRAM内的高5位地址,CGRAM的实际地址为:

(3)地址指针设置:设置将要进行操作的显示缓冲区(RAM)的一个单元地址,D1、D2为该单元地址的低位和高位地址。

2、显示区域设置,指令格式为:

根据N1,N0的不同取值,该指令有四种指令功能形式:

文本区和图形区首地址为对应显示屏上左上角字符位或字节位,修改该地址可以产生卷动效果。D1,D2分别为该地址的低位和高位字节。

文本区宽度(字节数/行)设置和图形区宽度(字节数/行)设置用于调整一行显示所占显示RAM的字节数,从而确定显示屏与显示RAM单元的对应关系。

T6963C硬件设置的显示窗口宽度是指T6963C扫描驱动的有效列数。需说明的是当硬件设置6×8字体时,图形显示区单元的低6位有效,对应显示屏上6×1显示位。

3、显示方式设置,指令格式为:

N3:字符发生器选择位。

N3=1为外部字行发生器有效,此时内部字符发生器被屏蔽,字符代码全部提供给外部字符发生器使用,字符代码为00H-FFH。

N3=0为CGROM即内部字符发生器有效,由于CGROM字符代码为00H~7FH。因此选用80H~FFH字符代码时,将自动选择CGRAM。

N2~N0:合成显示方式控制位,其组合功能如下表:

当设置文本方式和图形方式无能打开时,上述合成显示方式设置才有效。其

中的文本特征方式是指将图形区改为文本特征区。该区大小与文本区相同,每个字节作为对应文本区的每个字符显示的特征,包括字符显示与不显示、字符闪烁及字符的“负向”显示。通过这种方式,T6963C可以控制每个字符的文本特征。文本特征区内,字符的文本特征码由一个字节的低四位组成,即:

d3:字符闪烁控制位,d3=1为闪烁,d3=0为不闪烁;

d2~d0的组合如下:

启用文本特征方式时可在原有图形区和文本区外用图形区域设置指令另开

一区作为文本特征区,以保持原图形区的数据。显示缓冲区可划分如下:

4、显示开关,指令格式如下:

N0:1/0,光标闪烁启用/禁止

N1:1/0,光标显示启用/禁止

N2:1/0,文本显示启用/禁止

N3:1/0,图形显示启用/禁止

5、光标形状选择,指令格式如下:

光标形状为8点(列) N行,N的值为0-7H

6、数据自动读、写方式设置:

该指令执行后,MPU可以连续地读、写显示缓冲区RAM的数据,每读、写一次,地址指针自动增1。自动读、写结束时,必须写入自动结束命令以使T6963C退出自动读、写状态,开始接受其它指令。

N1,N0组合功能如下:

7、数据一次读、写方式,指令格式如下:

D1为需要写的数据,读时无此数据。

8、屏读,指令格式为:

该指令将屏上地址指针处文本与图形合成后显示的一字节内容数据送到

T6963C的数据栈内,等待MPU读出。地址指针应在图形区内设置。

9、屏拷贝,指令格式为:

该指令将屏上当前地址指针(图形区内)处开始的一行合成显示内容拷贝到相对应的图形显示区的一组单元内,该指令不能用于文本特征方式下或双屏结构液晶显示器的应用上。

10、位操作:

该指令可将显示缓冲区某单元的某一位清零或置1,该单元地址当前地址指针提供。

N3=1置1,N3=0清零。

N2~N0:操作位,对应该单元的D0~D7位。

至此,T6963C的指令系统全部讲述完毕。

七、液晶显示模块与MCU的接口方法

一、直接访问方式

MPU可利用数据总线与控制信号直接采用I/O设备访问形式控制T6963C类液晶显示模块。接口电路以精电蓬远公司提供的演示板为例,如下图所示:

8031数据口P0口直接与液晶显示模块的数据口连接,由于T6963C接口适用于8080系列和Z80系列MPU,所以可以直接用8031的/RD、/WR作为液晶显示模块的读、写控制信号,液晶显示模块/RESET,/HALT挂在+5V上。/CE信号可由地址线译码产生。C/D信号由8031地址线A8提供,A8=1为指令口地址;A8=0为数据口地址。

指令通道地址C_ADD:8100H

数据通道地址D_ADD:8000H

二、间接控制方式

间接控制方式是MPU通过并行接口间接实现对液晶显示模块控制。根据液晶模块的需要,并行接口需要一个8位的并行接口和一个3位的并行口,由上图所示。8031的P1口作为数据总线。P3口中3位作为读、写及寄存器选择信号。由于并行接口只用于液晶显示模块,所以/CE信号接地就行了。MPU通过并行接口操纵液晶显示模块,要对其时序关系有一个清楚的了解,并在程序中应明确地反映出来。

八、LCD驱动程序的设计

以直接访问方式为例,说明LCD驱动程序的编制方法。

#include

#include

#include

#include

#include

#define ulong unsigned long

#define uint unsigned int

#define uchar unsigned char

#define TRUE 1

#define FALSE 0

#define HIGH 1

#define LOW 0

// T6963C 端口定义

#define LCMDW XBYTE[0x08100H] // 数据口

#define LCMCW XBYTE[0x08000H] // 命令口

// T6963C 命令定义

#define LCM_CUR_POS 0x21 // 光标位置设置

#define LCM_CGR_POS 0x22 // CGRAM偏置地址设置

#define LCM_ADD_POS 0x24 // 地址指针位置

#define LCM_TXT_STP 0x40 // 文本区首址

#define LCM_TXT_WID 0x41 // 文本区宽度

#define LCM_GRH_STP 0x42 // 图形区首址

#define LCM_GRH_WID 0x43 // 图形区宽度

#define LCM_MOD_OR 0x80 // 显示方式:逻辑"或"

#define LCM_MOD_XOR 0x81 // 显示方式:逻辑"异或"

#define LCM_MOD_AND 0x83 // 显示方式:逻辑"与"

#define LCM_MOD_TCH 0x84 // 显示方式:文本特征

#define LCM_DIS_SW 0x90 // 显示开关:D0=1/0:光标闪烁启用/禁用;

// D1=1/0:光标显示启用/禁用;

// D2=1/0:文本显示启用/禁用;

// D3=1/0:图形显示启用/禁用;

#define LCM_CUR_SHP 0xA0 //光标形状选择:0xA0-0xA7表示光标占的行数#define LCM_AUT_WR 0xB0 // 自动写设置

#define LCM_AUT_RD 0xB1 // 自动读设置

#define LCM_AUT_OVR 0xB2 // 自动读/写结束

#define LCM_INC_WR 0xC0 // 数据一次写,地址加1

#define LCM_INC_RD 0xC1 // 数据一次读,地址加1

#define LCM_DEC_WR 0xC2 // 数据一次写,地址减1

#define LCM_DEC_RD 0xC3 // 数据一次读,地址减1

#define LCM_NOC_WR 0xC4 // 数据一次写,地址不变

#define LCM_NOC_RD 0xC5 // 数据一次读,地址不变

#define LCM_SCN_RD 0xE0 // 屏读

#define LCM_SCN_CP 0xE8 // 屏拷贝

#define LCM_BIT_OP 0xF0 /* 位操作:D0-D2:定义D0-D7位;D3:1置位;0:清除*/

/* ----- 定义液晶屏内部RAM ------ */

#define LCM_T_BASE 0x00 // 文本区内存首地址

#define LCM_G_BASE 0x00 // 图形区内存首地址

#define LCM_BYTES_PER_ROW 16 // 定义屏幕文本宽度为16字节

// 绘图坐标限制

#define LCM_XMAX 128

#define LCM_XMIN 0

#define LCM_YMAX 64

#define LCM_YMIN 0

//判准备好子程序

uchar fnST01(void) // 状态位STA1,STA0判断(读写指令和读写数据){

uchar i;

for(i=10;i>0;i--)

{

if((LCMCW & 0x03) == 0x03)

break;

}

return i; // 若返回零,说明错误

}

uchar fnST2(void) // 状态位ST2判断(数据自动读状态)

{

uchar i;

for(i=10;i>0;i--)

{

if((LCMCW & 0x04) == 0x04)

break;

}

return i; // 若返回零,说明错误

}

uchar fnST3(void) // 状态位ST3判断(数据自动写状态){

uchar i;

for(i=10;i>0;i--)

{

if((LCMCW & 0x08) == 0x08)

break;

}

return i; // 若返回零,说明错误

}

uchar fnST6(void) // 状态位ST6判断(屏读/屏拷贝状态){

uchar i;

for(i=10;i>0;i--)

{

if((LCMCW & 0x40) == 0x40)

break;

}

return i; // 若返回零,说明错误}

uchar fnPR10(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令{

if(fnST01() == 0)

return 1;

LCMDW = uPar1;

if(fnST01() == 0)

return 2;

LCMDW = uPar2;

if(fnST01() == 0)

return 3;

LCMCW = uCmd;

return 0; // 返回0成功

}

uchar fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令

{

if(fnST01() == 0)

return 1;

LCMDW = uPar1;

if(fnST01() == 0)

return 2;

LCMCW = uCmd;

return 0; // 返回0成功

}

uchar fnPR12(uchar uCmd) // 写无参数的指令{

if(fnST01() == 0)

return 1;

LCMCW = uCmd;

return 0; // 返回0成功

}

uchar fnPR13(uchar uData) // 一次写数据{

if(fnST01() == 0)

return 1;

LCMDW = uData;

return 0; // 返回0成功uchar fnPR14(uchar uData) // 自动写数据{

if(fnST3() == 0)

return 1;

LCMDW = uData;

return 0; // 返回0成功

}

uchar fnPR2(void) // 一次读数据{

if(fnST01() == 0)

return 1;

return LCMDW;

}

//设置地址

void LCM_set_address(unit addr)

{ fnPR1(LCM_ADD_POS, addr & 0xFF, addr / 256); //0x24为设定地址命令}

//文本方式设置显示坐标

void LCM_xy(uchar x, uchar y)

{

uint addr;

addr = LCM_T_BASE + (y * LCM_BYTES_PER_ROW) + x;

LCM_set_address(addr); // 设置显示地址

}

//文本清屏

void LCM_clear_text(void)

{

uint i;

fnPR1(LCM_ADD_POS, LCM_T_BASE,0x00); // 置地址指针

fnPR12(LCM_AUT_WR); // 自动写

for(i=0;i<16*8*;i++)

{

fnST3();

fnPR14(0x00); // 写数据

}

fnPR12(LCM_AUT_OVR); // 自动写结束

fnPR1(LCM_ADD_POS, LCM_T_BASE,0x00); // 重置地址指针}

}

// 图形清屏

void LCM_clear_graph(void)

{

uint i;

fnPR1(LCM_ADD_POS, LCM_G_BASE,0x00); // 置地址指针

fnPR12(LCM_AUT_WR); // 自动写

for(i=0;i<16*8*8;i++)

{

fnST3();

fnPR14(0x00); // 写数据

}

fnPR12(LCM_AUT_OVR); // 自动写结束

fnPR1(LCM_ADD_POS, LCM_G_BASE,0x00); // 重置地址指针

}

//清全部32KB内存

void LCM_clear_ram(void)

{

uint i;

fnPR1(LCM_ADD_POS, 0x00,0x00); // 置地址指针

fnPR12(LCM_AUT_WR); // 自动写

for(i=0;i<8000;i++)

{

fnST3();

fnPR14(0x00); // 写数据

}

fnPR12(LCM_AUT_OVR); // 自动写结束

fnPR1(LCM_ADD_POS, 0x00,0x00); // 重置地址指针

}

// 初始化显存和显示模式

void LCM_init (void)

{

if(fnPR1(LCM_TXT_STP, LCM_T_BASE,0x00) != 0) // 文本显示区首地址return -1;

fnPR1(LCM_TXT_WID, LCM_BYTES_PER_ROW,0x00); // 文本显示区宽度fnPR1(LCM_GRH_STP, LCM_G_BASE,0x00); // 图形显示区首地址

fnPR1(LCM_GRH_WID, LCM_BYTES_PER_ROW,0x00); // 图形显示区宽度fnPR12(LCM_CUR_SHP | 0x07); // 光标形状

fnPR1(LCM_ADD_POS, 0x00,0x00); // 光标位置设置

fnPR12(LCM_MOD_OR); // 显示方式设置

fnPR12(LCM_DIS_SW | 0x0C); //显示设置为:图形开、文本开

// 注意:如果设置显示光标,需要设定光标的位置

return 0;

}

// 显示字符串RAM

void LCM_print_ram(uchar x,uchar y, uchar *string)

{

uchar i,c;

LCM_xy(x,y);

fnPR12(LCM_AUT_WR); // 自动写

for (i=0;string[i]!=0;i++)

{

c = string[i] - 0x20; // 转换ASCII码为屏幕内码

fnPR14(c); // 写数据

}

fnPR12(LCM_AUT_OVR); // 自动写结束

}

//声明函数

uchar fnST01(void) // 状态位STA1,STA0判断(读写指令和读写数据)

uchar fnST2(void) // 状态位ST2判断(数据自动读状态)

uchar fnST3(void) // 状态位ST3判断(数据自动写状态)

uchar fnST6(void) // 状态位ST6判断(屏读/屏拷贝状态)uchar fnPR10(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令

uchar fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令

uchar fnPR12(uchar uCmd) // 写无参数的指令

uchar fnPR13(uchar uData) // 一次写数据

uchar fnPR14(uchar uData) // 自动写数据

uchar fnPR2(void) // 一次读数据

void LCM_init(void); // 初始化显存和显示方式

void LCM_xy(uchar x, uchar y); // 设置显示坐标(文本模式)

void LCM_clear_text(void); // 文本清屏

void LCM_print_ram(uchar x,uchar y,char *string); // 显示字符串RAM

void LCM_set_address(unit addr); //设置地址

void LCM_clear_graph(void); // 图形清屏

void LCM_pixel(uchar column, uchar row, char show); //画、清点

void LCM_show(uchar * s,int start_line,int how_many_line); //指定数据组图

void LCM_line(int x1, int y1, int x2, int y2, uchar show); //画直线

void LCM_circle(int x, int y, int radius, uchar show); //画圆

void LCM_circle_half(int x, int y, int radius, uchar show);//画半圆

void LCM_box(int x1, int y1, int x2, int y2, uchar show); //画矩形

//画线段

void LCM_degree_line(int x, int y, int degree, int inner_radius, int outer_radius, uchar show);

//画线段包围线

LCD12864显示程序

;实验目的:熟悉12864LCD的使用 ;12864LCD带中文字库 ;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“0975”,公司传真“6”;硬件设置: ;关断所有拨码开关。 #include<> ;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC ;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择 #DEFINE RW PORTA,4 ;读/写选择 #DEFINE E PORTA,3 ;使能信号 #DEFINE PSB PORTA,2 ;并口/串口选择(H/L) #DEFINE RST PORTA,0 ;复位信号 ;----------------------------------------------- LCD_X EQU 30H ;页地址 LCD_Y EQU 31H ;Y地址 COUNT EQU 32H ;循环计数用 COUNT1 EQU 33H ;循环计数用 COUNT2 EQU 34H ;循环计数用 POINT EQU 35H ;查表偏移地址 POINT1 EQU 36H ;查表偏移地址 POINT2 EQU 37H ;查表偏移地址 TEMP EQU 38H ;临时寄存器 TEMP1 EQU 39H ;临时寄存器 ;----------------------------------------------- ORG 0000H ;复位地址 NOP ;ICD需要的空指令 GOTO MAIN ;跳转到主程序 ;**********************主程序************************ MAIN BANKSEL TRISA CLRF TRISA ;A口输出 CLRF TRISD ;D口输出 BANKSEL ADCON1 MOVLW 06H MOVWF ADCON1 ;A口全为数字口 CLRF STATUS

LCD12864显示程序

本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

LCD显示程序

本例程为通过用AT89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

基于STM32--LCD12864驱动程序

基于STM32--LCD12864驱动程序

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟

#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平 #define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平 #define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平 #define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平

12864液晶显示程序(图案+文字)

#include sbit LCD12864_RS = P2^0; //RS控制引脚 sbit LCD12864_RW = P2^1; //RW控制引脚 sbit LCD12864_EN = P2^2; //EN控制引脚 sbit LCD12864_PSB = P2^3; //模式选择引脚,ST7920控制器,1为8位并行接口,0为串行接口 #define LCDPORT P0//数据引脚 void LCD12864_Init(void); //LCD12864初始化函数 void LCD12864_WriteInfomation(unsigned char ucData,bit bComOrData); //向LCD12864写入数据,bComOrData为1时写入的是数据,0时写入的是命令 void LCD12864_CheckBusy(void);//忙检测函数 void LCD12864_DisplayImage(unsigned char code *ucImage); void Delay(unsigned int uiCount); unsigned char code ucPic1[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFB,0x63,0x07,0x34,0x00,0x14,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,

12864LCD显示倒计时程序

简介:第一行显示,距离系统爆炸时间 第二行显示,还剩 第三行显示,00时,00分,00秒 第四行显示,周林 按下旋钮开关,开始设定秒,秒编辑位闪动。左右旋转设定数值, 在按下开关,秒确定,设定分,分编辑位闪动左右调数值, 再按下,分确定,小时位闪动。左右转调小时,再按一下。时间确定,开始倒计时。到达定时时间后停止,并闪动。 #include #include /********************* 定义********************************/ #define LCD_data P0 //数据口 sbit LCD_RS = P2 ^ 0; //寄存器选择输入 sbit LCD_RW = P2 ^ 1; //液晶读/写控制 sbit LCD_EN = P2 ^ 2; //液晶使能控制 sbit LCD_PSB = P2 ^ 3; //串/并方式控制 sbit LCD_RST = P2 ^ 5; //液晶复位端口 sbit sset=P3^4;//设置按钮 sbit spk=P1^4; sbit sadd=P2^7; sbit sdel=P2^6;

signed char second=0,minute=0,hour=0,count=0,keycount=0; signed char key=0; unsigned char code DIS1[] = { "距离系统爆炸时间" }; unsigned char code DIS2[] = { "还剩:" }; unsigned char code DIS31[] = { "时" }; unsigned char code DIS32[] = { "分" }; unsigned char code DIS33[] = { "秒" };

LCD12864(串口)显示程序

#ifndef jh_f330 #define jh_f330 #include #endif typedef unsigned char uint8; typedef unsigned int uint16; /*************端口配置**************/ sbit LCD_CS = P0^4; //片选信号,低电平有效 sbit LCD_RST = P0^3; //复位信号,低电平有效 sbit LCD_A0 = P0^2; //数据、指令选择,H:数据、L:指令 sbit LCD_DAT = P1^0; //串行输入数据引脚 sbit LCD_CLK = P1^1; //串行时钟输入引脚 uint8 code word1[]= { 0x04,0x44,0x84,0x04,0xE4,0x1F,0x84,0x44,0xA4,0x3F,0xA4,0xA4,0x64,0x06,0x04,0x00, 0x20,0x10,0x09,0x04,0xFF,0x04,0x04,0x14,0x26,0x05,0x84,0xFF,0x04,0x06,0x04,0x00 }; /**********预定义数据*********/ #define LCD_X 128-1 //屏幕的X轴的物理宽度 #define LCD_Y 64-1 //屏幕的Y轴的物理宽度 /***********LCD指令集***************/ //LCD开关命令 #define LCD_ON() Wr_Com(0xaf) #define LCD_OFF() Wr_Com(0xae) //设置显示起始行 #define LCD_START_LINE 0x40 //起始行地址为,0x40+(0-63)//页地址设置 #define LCD_Page 0xb0 //页地址为:0xb0+(0-8) //列地址设置 #define LCD_Ad_H 0x10 //列高四位地址:0x10+() #define LCD_Ad_L 0x00 //列低四位地址:0x00+() //行列地址方向设置 #define ADC_Norm() Wr_Com(0xa0); #define ADC_Reve() Wr_Com(0xa1); #define Com_Norm() Wr_Com(0xc0); #define Com_Reve() Wr_Com(0xc8);

LCD12864串行显示程序

#include #include #define uchar unsigned char #define uint unsigned int sbit SCLK=P2^7; //时钟信号 E sbit CS=P2^6; //片选信号RS sbit SID=P2^5; //数据信号RW sbit PSB=P3^2; //串、并行选择信号uchar code dis1[]=" 2010"; uchar code dis2[]="Ψ00:00:00 Ψ"; uchar code dis3[]=" 26℃"; uchar code dis4[]="!!"; uchar code shu[]="0123456789"; uchar num,gw,sw,count; /*********延时函数,延时xms************/ void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } /********以串行口协议发送数据************/ void send_bit(uchar byte) { uchar x; for(x=0;x<8;x++) { if((byte<

delay(5); } /**********写串口指令*************/ void write_com(uchar com) { CS=1; //每次传数据前把CS端拉高 send_bit(0xf8); //写指令 send_bit(com&0xf0); //0xf0为1111 0000,送高四位 send_bit((com<<4)&0xf0); //0xf0为1111 0000,送低四位delay(10); CS=0; } /**********写串口数据*************/ void write_date(uchar date) { CS=1; //每次传数据前把CS端拉高 send_bit(0xfa); //写指令 send_bit(date&0xf0); //0xf0为1111 0000,送高四位 send_bit((date<<4)&0xf0); //0xf0为1111 0000,送低四位delay(10); CS=0; } /*********初始化函数****************/ /*********初始化液晶****************/ void init() { delay(100); write_com(0x30); //基本指令模式 delay(10); write_com(0x0c); //开显示,关游标,关反白 delay(10); write_com(0x01); //清屏 delay(100); /***显示初始化***/ /////* write_com(0x80); for(num=0;num<16;num++) {

lcd12864显示程序

/************************************************* 名称:LCD12864_ST7920并行测试程序 试验功能:测试基于ST7920控制芯片的LCD12864的显示 并行方式连接;晶振11.0592M 编写:https://www.360docs.net/doc/a712973413.html, *************************************************/ #include #include #include #define uchar unsigned char #define uint unsigned int //宏定义 /*****LCD接口定义*****/ sbit LCD_RS = P2^0; //1:输入数据;0:输入命令 sbit LCD_RW = P2^1; //1:读数据0:写数据 sbit LCD_EN = P2^2; //LCM使能端 sbit LCD_PSB = P2^3; //串并口选择1:并口模式; 0:串口模式; #define LCD_DATA P0 //LCD总线端口 /*****LCD功能初始化指令*****/ #define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H #define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置 #define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动) #define FUN_MODE 0x30 //工作模式:8位基本指令集 #define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白 #define DISPLAY_OFF 0x08 //显示关 #define CURSE_DIR 0x14 //游标向右移动:AC=AC+1 #define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH #define SET_DD_AC 0x80 /*****汉字地址表*****/ uchar code addr_tab[]={ //便于根据汉字坐标求出地址 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,//第四行汉字位置 }; /*****n(ms)延时子程序*****/ void delayms(uint t) //约延时n(ms) { uint i; while(t--) {

12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)

这个程序写得很好,自己也是看的别人写的很好的程序,但是它代码不够完整,注释不详细,经过自己的修改加以完善。另外我发现很多的测试代码都没有附上测试代码效果图,在本人的代码下面有自己拍的效果图,填补不足之处。 自己在找资料的过程中花掉很多的财富值,如果大家看得起该代码请评五分加以下载,在下感激不尽! /******************************************* 程序名称:12864液晶经典驱动程序(带中文字库) 功能:12864测试程序 修改作者:王程 修改时间:2014年2月5日23:22:32 ********************************************/ #include #define uchar unsigned char #define uint unsigned int // P0 为数据口 sbit LCD_RS=P2^0; //数据、命令选择端口 sbit LCD_RW=P2^1; //液晶读写控制 sbit LCD_EN=P2^2; //液晶使能控制 sbit PSB = P2^4; //模式选择1为并行0为串行 sbit RES = P2^5;//复位端口低电平复位,上电之前进行复位,为了稳定!unsigned char code DAT[] = "我爱我家"; //测试显示的汉字,下面的A为测试显示的英文 /******************************************* 函数名称:Delay_1ms (晶振为12M) 功能:延时约1ms的时间 参数:无 返回值:无 ********************************************/ void delay_1ms(uint x) { uint i,j; for(j = 0;j < x;j++) for(i=0;i<110;i++); } /******************************************* 函数名称:write_cmd 功能:向液晶中写控制命令 参数:cmd--控制命令 返回值:无 ********************************************/ void write_cmd(uchar cmd) {

基于51单片机的12864液晶显示程序

#include #define uchar unsigned char #define uint unsigned int uchar dis1[]="华南农业大学"; uchar dis2[]="工程学院"; uchar dis3[]="电子班"; uchar dis4[]="不会水的小兵"; sbit en=P3^4; sbit rs=P3^5; sbit rw=P3^6; sbit psb=P3^7; sbit dula=P2^6; sbit wela=P2^7; void delayms(uint xms) { uchar i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void write_com(uint com) //写命令{ rs=0; P0=com; delayms(5); en=1; delayms(5); en=0; } void write_dat(uchar dat) //写数据{ rs=1; P0=dat; delayms(5); en=1; delayms(5); en=0; } void init() //液晶初始化 { dula=0; wela=0;

psb=1; rw=0; write_com(0x30); write_com(0x0c); write_com(0x01); } void main() { int i; init(); write_com(0x81); for(i=0;i<12;i++) { write_dat(dis1[i]); delayms(5); } write_com(0x92); for(i=0;i<8;i++) { write_dat(dis2[i]); delayms(5); } write_com(0x8a); for(i=0;i<10;i++) { write_dat(dis3[i]); delayms(5); } write_com(0x99); for(i=0;i<12;i++) { write_dat(dis4[i]); delayms(5); } while(i); }

LCD12864显示程序(汇编)

;********************************************* ;Controller:ST7920 ;MCU:AT89C51 ,晶体频率:12MHz ;LCM:128*64 ;LCM型号:带中文字库的128X64-0402 ;LCM 接口:1:GND 2:VCC 3:V0 4.RS 5:RW 6:E 7--14:DB0-DB7 15:PSB 16:NC 17:RST 18:Vout ;********************************************** ;占用单元30H,31H,32H,33H,A,DPTR,R2,R4,R6,R7 ;功能:显示浙江工业职业技术 ; 学院电子协会欢迎 ; 您 ; RS EQU P2.4 ;RS=“H”,表示DB7——DB0为显示数据 ;RS=“L”,表示DB7——DB0为显示指令数据 RW EQU P2.5 ;R/W=“H”,E=“H”,数据被读到DB7——DB0 ;R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR E EQU P2.6 ;使能信号 PSB EQU P2.7 ;H:8位或4位并口方式,L:串口方式(见注释1) RST EQU P2.0 ;复位端,低电平有效 ;模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空 COM EQU 30H ;DD RAM 地址存放单元 DAT EQU 31H ;汉字代码数据存放单元 DAT1 EQU 32H ;汉字码址表低位存放单元 DAT2 EQU 33H ;汉字码址表高位存放单元 ;******************************以上是接口定义 ORG 0000H AJMP START ORG 0030H START: MOV SP,#60H LJMP DISP

LCD lgm12864 程序代码

LCD lgm12864 程序代码 /************************************** LCD:lgm12864, LCD control IC:KS0108 **************************************/ #define uchar unsigned char #define uint unsigned int #define DataPort P0 //LCD:D0-D7 sbit RS=P2^1; //Data or Instrument Select sbit RW=P2^2; //Write or Read sbit E=P2^3; // Enable single sbit CS1=P2^4; //Master chip enable sbit CS2=P2^5; sbit RST=P2^6; //Lcm reset /*数字数组*/ unsigned char code suzidot[160] ={ /*0 CHAR_30 */ 0x00,0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x0F,0x1F,0x30,0x20,0x30,0x1F,0x0F, /*1 CHAR_31 */ 0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x3F,0x20,0x20,0x00, /*2 CHAR_32 */ 0x00,0x70,0x78,0x08,0x08,0x88,0xF8,0x70,0x00,0x30,0x38,0x2C,0x26,0x23,0x31,0x30, /*3 CHAR_33 */ 0x00,0x30,0x38,0x88,0x88,0xC8,0x78,0x30,0x00,0x18,0x38,0x20,0x20,0x31,0x1F,0x0E, /*4 CHAR_34 */ 0x00,0x00,0xC0,0xE0,0x30,0xF8,0xF8,0x00,0x00,0x07,0x07,0x24,0x24,0x3F,0x3F,0x24, /*5 CHAR_35 */ 0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x19,0x39,0x21,0x20,0x31,0x1F,0x0E, /*6 CHAR_36 */ 0x00,0xE0,0xF0,0x98,0x88,0x98,0x18,0x00,0x00,0x0F,0x1F,0x31,0x20,0x31,0x1F,0x0E, /*7 CHAR_37 */

LCD12864液晶屏测试程序

/////LCD12864液晶屏测试程序(已通过)////// ////////液晶屏型号:HJ12864M-1////////// #include #define uchar unsigned char #define uint unsigned int //8bit数据接入IO口 #define Part P0 //P0接8位数据线 //控制数据端 sbit LCD_RS=P2^5; //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器 sbit LCD_RW=P2^6; //定义12864液晶RW端,读/写信号 H:读 L:写 sbit LCD_EN=P2^7; //定义12864液晶LCDEN端, 片选信号下降沿触发,锁存数据 sbit LCD_PSB=P3^2; //定义12864液晶PSB端, H:并行 L:串行 sbit LCD_RST=P3^4; //定义12864液晶RST端, H:不复位 L:复位uchar code dis1[]={"床前明月光"}; uchar code dis2[]={"疑是地上霜"}; uchar code dis3[]={"举头望明月"}; uchar code dis4[]={"低头思故乡"};

//毫秒延时函数 void delay(uint xms) { uint i,j; for(j=0;i

最新12864LCD菜单程序

最新12864LCD与4*4键盘人机交互界面源程序 0.95版 [ 2006-12-18 15:36:00 | By: ZZM@HAS ] 有朋友问我要源程序,这个源程序是我最近修改过的最新版本的12864与4*4 键盘的人机交互界面,我只给出关键交互界面菜单的源程序,至于12864和4*4键盘的驱动,相信大家都有了。 最新版本的使用反白表示选择行,增加了详细的注释。给需要的朋友一个参考。希望朋友们能写出更好的菜单程序。 //---------------------------------------- // 12864M四行多级菜单 // 文件名称12864menu1。c // 作者张子墨 // 版本 0.95 // 最后更新2006/12/16 //---------------------------------------- #i nclude #i nclude "12864Driver.c" #define MENULEVEL 7 //当前菜单表个数 #define OPTIONMETE 29 //当前选项个数,包括一个特别功能选项 //------------------------------------- // // 菜单结构定义 // //------------------------------------- struct Option{ unsigned char KeyLevel; //菜单选项所属菜单表号 unsigned char EnterIndex; //选项进入索引号 unsigned char CancelIndex; //选项退出索引号 unsigned char KeyWord[16]; //菜单选项文字描述数组 unsigned char WordMete; //菜单选项描述文字字节数 }; //------------------------------------- // // 具体菜单选项定义,定义一个结构数组 // 存储在编码区,节省内存RAM //

(完整版)基于stm32的LCD12864显示+16个矩阵键盘程序

#include "stm32f10x.h" #define read_busybit() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7 ) #define DATAOUT GPIOC->ODR// unsigned char table1[]={"65"}; unsigned char table2[]={"大学"} ; unsigned char table3[]={"学院"} ; unsigned char table4[]={"电子信息"} ; unsigned char table5[]={"姓名"} ; unsigned char hy5; unsigned char k=0; void delay(unsigned int x) { while(x--); } // 外设时钟使能 /*************************************************************************/ void RCC_Configuration(void) //在208页这里是引脚时钟配置 { /* 使能外设时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); } /****************************************************************************** * 全部用到1602的引脚将在在配置 ******************************************************************************* / void GPIO_Configuration(void) // 1602引脚配置

单片机LCD12864显示系统课程设计

目录 一、概述 (2) 二、系统总体方案及硬件设计 (2) 系统框图 (3) 单片机最小系统 (4) 显示电路 (6) 按键控制电路 (6) 三、系统软件设计 (9) 软件设计概述 (9) 汉字显示 (10) 上下移屏 (10) 左右移屏 (11) 四、课程设计体会 (13) 五、参考文献 (13) 六、附录 (14) 总电路图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 总程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

一、概述 随着社会的发展,趣来趣多的地方需要应用显示功能,各种数字显示仪器中的显示、广告牌、数码产品等,传统的数码管显示已经远远不能满足各行各业的需求。基于单片机的LCD显示是一种用单片机来控制的一种显示系统,它不仅能显示种各数字、字母、还能显示各种字体的汉字以及一些简单的图象,使用起来极为方便,只要通过对单片机写入一定的程序来控制LCD 的显示即可完成,根据程序的不同而产生不同不效果以满足各种不同需求。 本文围绕设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机AT89S51,采用的液晶显示控制器的芯片是SED1520,主要实现由按键控制的中文显示、图片显示、滚屏以及左右移动功能。同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程,并详细阐述了程序的各个模块。本系统是以单片机的C语言来进行软件设计,指令的执行速度快,可读性强。为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。使硬件在软件的控制下协调运作。其次阐述了部分程序的流程图和实现过程。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。最后对我所开发的用单片机实现LCD液晶显示器控制原理的设计思想和软、硬件调试作了详细的论述。 二、系统总体方案及硬件设计 系统框图

相关主题
相关文档
最新文档