12864串口时序及反白例程

合集下载

12864液晶屏使用手册

12864液晶屏使用手册

12864液晶屏手册一、液晶显示模块概述12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵,16*8=128,16*4=64,一行只能写8个汉字,4行;)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

主要技术参数和显示特性:电源:VDD ~+5V(内置升压电路,无需负压);显示内容:128列×64行(128表示点数)显示颜色:黄绿显示角度:6:00钟直视LCD类型:STN与MCU接口:8位或4位并行/3位串行配置LED背光多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等二、外形尺寸1.外形尺寸图2.主要外形尺寸项目标准尺寸单位模块体积××mm二、模块引脚说明逻辑工作电压(VDD):~电源地(GND):0V工作温度(Ta):0~60℃(常温) / -20~75℃(宽温)三、接口时序模块有并行和串行两种连接方法(时序如下):8位并行连接时序图MPU写资料到模块MPU从模块读出资料2、串行连接时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,(一般在输入每天指令前加个delay)那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。

LCD12864-并口调试分享

LCD12864-并口调试分享

12864并口调试一、查技术手册得读时序图和指令表如下1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF 标志时BF 需为0,方可接受新的指令;如果在送出一个指令前并不检查BF 标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

2、“ RE”为基本指令集与扩充指令集的选择控制位元,当变更“ RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“ RE”位元。

由上,读程序如下:二、查技术手册得写时序图和指令表如下由上,写程序如下:三、LCD初始化由数据手册,以上写指令注释:Wr_Command(0x30,0); //执行基本指令集动作Wr_Command(0x0C,1); //开显示及光标设置Wr_Command(0x01,1); //显示清屏Wr_Command(0x06,1); //显示光标移动设置四、GPIO并行输出数据在STM32操作一个IO口有下面四种方式:1、位带操作#define busy PAin(11)2、寄存器操作#define busy ((GPIOA->IDR)&(1<<11)?1:0)3、标准库函数操作#define busy GPIO_SetBits(GPIOA, GPIO_Pin_11) 4、HAL库操作#define busy HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11)根据包装线硬件原理图,LCD部分IO口分配如下:可见,IO分配是比较杂乱的,先对各GPIO进行初始化。

本例采用寄存器方式开发,GPIO 数据输出程序如下:总结下来,寄存器操作有以下特点:“与1相‘&’、与0相‘|’、不影响原值”例:#define LED0 (1<<10)#define LED0_SET(x) GPIOB->ODR=(GPIOB->ODR&~LED0)|(x ? LED0:0) ‘GPIOB->ODR&~LED0’ 把第10位”&0清0”;把其余位“与1相&,不影响原值”。

12864中文字库液晶模块使用说明书

12864中文字库液晶模块使用说明书

12864中文字库液晶模块使用说明书第 1 页共16 页一、12864液晶显示模块概述1. 12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。

具有多种功能:光标显示、画面移位、睡眠模式等。

2. 外观尺寸:93×70mm(4X8C), 84×44mm(2X8C),110×65mm(2x8 C _2), 116×39mm(2X10),180×65mm(4X16A)3. 视域尺寸:73×39mm(4X8C), 78×25mm(2x8 C _2), 70×20mm(2X8C),85×20mm(2X10), 132×39mm(4X16A),补充说明:外观尺寸可根据用户的要求进行适度调整。

二、模块引脚说明1)表—1:(128X32)、(160X32)模块引脚说明引脚名称 方向 说明 引脚名称方向 说明1 VSS - GND(0V) 11 DB4 I/O 数据42 VDD - Supply Voltage For Logic (+5v) 12 DB5 I/O 数据53 VO - Supply Voltage For LCD (悬空)13 DB6 I/O 数据64 RS(CS) H/L H: Data L: Instruction Code 14 DB7 I/O 数据75 R/W(STD) H/L H: Read L: Write15 PSB H/L 16032此脚为:RESET脚 6 E(SCLK) H,H/L Enable Signal7 DB0 I/O 数据0 16 /RST H/L 16032此脚为空8 DB1 I/O 数据1 17 LEDK - 16032此脚为A9 DB2 I/O 数据2 18 LEDA - 16032此脚为K10 DB3 I/O 数据3 注:以上K为负,A为正4)表—4:(256X64)引脚说明引脚名称 方向 说明引脚名称 方向 说明 1 FG - FRAME GROUND 11 DB0 I/O 数据0 2 VSS - GND(0V)12 DB1 I/O 数据1 3 VDD - Supply Voltage For Logic (+5v) 13 DB2 I/O 数据2 4 NC - 空脚14 DB3 I/O 数据3 5 R/W H/L H: Read L: Write 15 DB4 I/O 数据4 6 E1 H,H/L Enable Signal1 16 DB5 I/O 数据5 7 E2 H,H/L Enable Signal217 DB6 I/O 数据6 8 RS H/L H: Data L: Instruction Code 18 DB7 I/O 数据7 9 NC - 空脚19 NC - 空脚 10 /RST H/L Reset Signal 低电平有效 20 NC - 空脚注 K背光源负极(LED-OV)A背光源正极(LED+5V)三、12864液晶硬件接口1、逻辑工作电压(VDD):4.5~5.5V2、电源地(GND):0V3、LCD 驱动电压(V0):0~-10V4、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温) 保存温度(Tstg):-10~65℃(常温)5、电气特性见附图1 外部连接图(参考附图2)模块有并行和串行两种连接方法(时序如下): 1、8位并行连接时序图MPU 写资料到模块RSR/WEMPU从模块读出资料RSR/WE2、串行连接时序图CS C LS T3、AC电气特性(TA=25℃ VCC=5V)condition Min. Typ. Max. UnitSYMBOL Characteristics Testfrequency Rf=39KΩ480 540 600 KHz Fosc OSCTIME UNIT PARAMETER SYMBOL MESUREFOR WRITE MODE(WRITING DATA FROM MPU TO ST7920)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDSW 1,000 nsData hold time TH 20 nsEnable pulsewidth TPW 1,500 nsEnable rise/fall time TR,TF 25 nsFOR READ MODE(READING DATA FROM ST7920 TO MPU)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDDR 1,000 nsData hold time TH 20 ns Enable pulsewidth TPW 1,500 ns Enable rise/fall time TR,TF 25 ns四、用户指令集指令表—2:(RE=1:扩充指令集)指令码指令RS RW DB7 DB6 DB5DB4 DB3 DB2DB1DB0说明执行时间(540KHZ )待命模式 0 0 0 0 0 0 0 0 0 1将DDRAM 填满“20H ”,并且设定DDRAM 的地址计数器(AC )到“00H ” 72us卷动地址或IRAM 地址选择 0 0 0 0 0 0 0 0 1 SR SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM 地址72us反白选择 0 0 0 0 0 0 0 1 R1 R0选择4行中的任一行作反白显示,并可决定反白与否 72us 睡眠模式0 0 0 0 0 0 1 SL X XSL=1:脱离睡眠模式 SL=0:进入睡眠模式72us扩充功能设定0 0 0 0 1 1 X1REG 0RE=1:扩充指令集动作RE=0:基本指令集动作G=1 :绘图显示ONG=0 :绘图显示OFF72us设定IRAM地址或卷动地址0 0 0 1 AC5AC4 AC3 AC2AC1AC0SR=1:AC5—AC0为垂直卷动地址SR=0:AC3—AC0为ICON IRAM地址72us设定绘图RAM地址0 0 1 AC6 AC5AC4 AC3 AC2AC1AC0设定CGRAM地址到地址计数器(AC)72us备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

51单片机 12864液晶显示并口和串口连接程序

51单片机  12864液晶显示并口和串口连接程序
sent(DATA&0XF0); //先写高位后写低位
sent((DATA&0X0F)<<4); //低位
}
void AUTO(uchar *add)
{
uchar cnt=0;
while(*(add+cnt)!='\0')
{
writLCD(1,*(add+cnt));
cnt++;
}
}
void wirtthings(uchar lines,uchar *add)//writ data to which line
else
RW=0;
delay(10);
SCK=1;
DATA=DATA<<1;
}
}
void writLCD(bit flag,uchar DATA) //writ COM or data in address
{
if(flag)
sent(0xfa);//1写数据
else
sent(0xf8);//0写指令
//writLCD(0,0x01);
wirtthings(4,"什么,only You!");
//writLCD(0,0x01);
wirtthings(1,"联系方式:");
//writLCD(0,0x01);
wirtthings(2,"QQ:452658536");
delay(100);
writLCD(0,0x01);
}
}
void delay(uchar i)
{
uchar j;
while(i--)

12864ZW说明书

12864ZW说明书
功能:设定光标移动方向并指定整体显示是否移动。 I/D=1 光标右移,AC自动加1; I/D=0 光标左移,AC自动减1。 S=1 且DDRAM为写状态:整体显示移动,方向由I/D决定(I/D=1左移, I/D=0右移) S=0 或DDRAM 为读状态:整体显示不移动.
4) 显示状态开/关:
功能:D=1: 整体显示ON ; D=0: 整体显示OFF。 C=1: 光标显示ON ; C=0: 光标显示OFF。 B=1: 光标位置反白且闪烁 ; B=0: 光标位置不反白闪烁。
5) 光标或显示移位控制:
功能:S/C:光标左/右移动,AC减/加1。 R/L:整体显示左/右移动,光标跟随移动,AC值不变。
6) 功能设定:
功能:DL=1: 8-BIT 控制指令集动作; RE=0: 基本指令集动作。
7) 设定CGRAM地址:
12864ZW 使用说明书
液晶显示器使用手册
目录
(一)概述 (二)外形尺寸 (三)模块外部接口 (四)时序说明 (五)指令集说明 (六)显示步骤 (七)初始化时序 (八)应用举例
一、概述 12864ZW是一种图形点阵液晶显示器,它主要由行驱动器/列驱
动器及128X64全点阵液晶显示器组成,可完成图形显示,也可以显 示8X4个(16X16点阵汉字,与外部CPU接口可采用串行或并行方式 控制。 二、外形尺寸图
项目 LCM 尺寸(长×宽×厚)
可视区域(长×宽) 点间距(长×宽) 点尺寸(长×宽 逻辑工作电压(Vdd LCD 驱动电压(Vdd-V0) 工作温度(Ta) 储存温度(Tsto) 工作电流(背光除外)
参考值 93.0×70.0×13.5
72.0×40.0 0.52×0.52 0.48×0.48 +5.0V 或+3.3V(出厂时设定+5.0V) +3.0 ~ +5.0V 0 ~ +50℃(常温)/ -20 ~ +70℃(宽温) -10 ~ +60℃(常温)/ -30 ~ +80℃(宽温) 3.0mA(max)

12864串口测试程序

12864串口测试程序

#include <reg51.h>#include <intrins.h>typedef unsigned char u8;typedef unsigned int u16;typedef unsigned long u32;#define uchar unsigned char#define uint unsigned int#define nop _nop_()#define xtal 11.0592 //11.0592M//==========================================================//函数声明void Delay(uint ms); //延时子程序sfr INT_CLKO = 0x8F;sfr WDT_CONTR = 0xC1; //看门狗sfr P4 = 0xC0;sfr P5 = 0xC8;sfr P6 = 0xE8;sfr P7 = 0xF8;sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain sfr P0M1 = 0x93;sfr P0M0 = 0x94;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xB1;sfr P3M0 = 0xB2;sfr P4M1 = 0xB3;sfr P4M0 = 0xB4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M1 = 0xE1;sfr P7M0 = 0xE2;sfr P1ASF = 0x9D; //只写,模拟输入(AD或LVD)选择sfr ADC_CONTR = 0xBC; //带AD系列sfr AUXR = 0x8E;sbit CS= P4^3; //CS=RSsbit SID = P3^6; //RW=SIDsbit SCLK =P3^4; //E=SCLK//==========================================================/********** 12864LCD引脚定义**********//* sbit CS = P4^3; //4脚--VCC, 片选高电平有效单片LCD使用时可固定高电平RS P4.3 CS = P3^5;sbit SID = P3^6; //5脚,数据WR(SID) P4.5 SID = P3^6;sbit SCLK = P3^4; //6脚,时钟E(CLK) P4.6 SCLK = P3^4;sbit PSB = P3^7; //15脚--GND,低电平时表示用串口驱动,可固定低电平//sbit RESET = P2^5; //LCD复位,LCD模块自带复位电路。

stm32f103zet6串行驱动12864

stm32f103zet6串行驱动12864

精心整理12864串行stm32f103zet6战舰V3学习版在资料最下面有工程文件,直接烧录就可以使用。

希望大家尊重我的劳动成果,下载下来。

每个语句注释,在工程文件中都有。

12864相关驱动在key.c和Key.h中经我验证,可以用stm32引脚控制12864如上图为12864串口时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD以上是说明书给的出的,个人理解从图上可以看出串行传输时需要用到CS,SCLK,SID三根信号线,但是由于CS是高电平有效,所以也可以把CS长接高电平,那样就只需要两根线就OK了,当然当使用12864串行模式时,PSB 引脚必须接低电平,复位RST引脚可以悬空不接,因为12864内部有上电复位电路。

所以电路图如下图所示一定要查资料,看下PSB引脚是否和VCC连接在一起,我在育松上买的QC12864B,液晶屏幕,太垃圾了,资料上都没有说明串行该怎么修改,结果调试时候发现,PSB引脚电平不对,后来一查,PSB引脚和VCC连接在一起了,所以一定要确保引脚电平正确。

串行数据传送共分三个字节完成:——理解就是传输一个字节需要三个字节来确定。

第一个字节:11111ABC11111000单片机写控制指令给LCD11111010单片机写数据给LCD第三个字节:00001111由于数据是传输是以一个字节8bits为单位,所以下面贴出传输一个字节的函数实现voidWrite_Bits(u8bits){u8i,Temp_Data;for(i=0;i<8;i++){Temp_Data=bits<<i;if((Temp_Data&0x80)==0){Reset_SID;Reset_SCLK;Set_SCLK;}else{Set_SID;Reset_SCLK;Set_SCLK;}}}Temp_Data = W_bits<<i ;//把数据依次左移对于这个语句有点迷茫,知道是左移,有点疑惑,赶紧去百度,木有找到我心中的疑问,就去翻C语言书(一本好的C语言书是多重要,我用的是CPrimerPlus),第500页,有这样一句话,该操作产生一个新的位置,但是不改变其运算对象。

msp430串口通信带12864头文件

msp430串口通信带12864头文件

/******************************************************程序功能:PC通过串口调试精灵向MCU发送数据,MCU将其在1602 液晶上显示-------------------------------------------------------通信格式:N.8.1, 9600------------------------------------------------------测试说明:打开串口调试助手,正确设置通信格式,向从PC机上向学习板发送数据,观察液晶上显示的字符。

******************************************************/#include <msp430.h>#include "12864.h"#include"delay.h"void InitUART(void);void PutString(uchar *ptr);uchar table1[]={"波特率:9600"};uchar table2[]={"接收到的数据为:"};uchar table[]={"0123456789"};uchar buffer[100]={0};uchar i=0,K=0;/***************主函数************/void main( void ){/*下面六行程序关闭所有的IO口*/uchar *tishi = "sennd data to MCU, and they will be displayed on 12864!";WDTCTL = WDTPW + WDTHOLD; //关狗InitUART(); //初始化UARTinit(); //初始化LCDPutString(tishi);_EINT();Disp_HZ(0x80,table1,6);Disp_HZ(0x90,table2,8);/* while(1){// LPM1;Disp_HZ(0x80,table1,6);Disp_HZ(0x90,table2,8);}*/}/*******************************************函数名称:PutSting功能:向PC机发送字符串参数:ptr--指向发送字符串的指针返回值:无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){while (!(IFG1 & UTXIFG0)); // TX缓存空闲?发送完毕UTXIFG0置1,IFG1=0X80TXBUF0 = *ptr++; // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n';}/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){UCTL0 |= SWRST;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDP3DIR|=BIT4;ME1 |= URXE0 + UTXE0; // Enable USART0 T/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKU0BR0 = 0x03; // 32k/9600 - 3.41U0BR1 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // 使能USART0的接收中断}/*******************************************函数名称:UART0_RXISR功能:UART0的接收中断服务函数,在这里唤醒CPU,使它退出低功耗模式参数:无返回值:无********************************************/#pragma vector = UART0RX_VECTOR__interrupt void UART0_RXISR(void){i++;if(i==32){i=0;write_cmd(0x01); //清除显示Disp_HZ(0x80,table1,6);Disp_HZ(0x90,table2,8);} //退出低功耗模式buffer[i]=RXBUF0;if(i<=15){write_cmd(0x88);for(K=0;K<=i;K++)write_data(buffer[K]);}else{write_cmd(0x88);for(K=0;K<=15;K++)write_data(buffer[K]);write_cmd(0x98);for(K=16;K<=i;K++)write_data(buffer[K]);}}/*******************************************函数名称:PutChar功能:向PC机发送一个字符对应的ASCII码参数:zifu--发送的字符返回值:无********************************************/void PutChar(uchar zifu){while (!(IFG1 & UTXIFG0));if(zifu > 9) //发送键值1~16对应的ASCII码{TXBUF0 = 0x30 + zifu/10;while (!(IFG1 & UTXIFG0));TXBUF0 = 0x30 + zifu%10;}else{TXBUF0 = 0x30 + zifu;}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; //发送回车字符}12864头文件#ifndef __CRY12864_H__#define __CRY12864_H__#include"delay.h"extern const unsigned char shuzi_table[];#define Busy 0x80#define Lcd_dataIn P6DIR=0x00 //数据口方向设置为输入#define lcd_dataout P6DIR=0XFF#define mcu2lcd_data P6OUT#define lcd2mcu_data P6IN#define lcd_cmdout P3DIR|=0X07#define rs_h P3OUT|=BIT0#define rs_l P3OUT&=~BIT0#define rw_h P3OUT|=BIT1#define rw_l P3OUT&=~BIT1#define en_h P3OUT|=BIT2#define en_l P3OUT&=~BIT2/*void ifbusy() //读忙状态{uchar lCdtemp = 0;while(1){ LCD_DataIn;rs_l;rw_h;en_h;_NOP();lcdtemp = LCD2MCU_Data;en_l;if((lCdtemp&Busy)==0)break;}}*/void write_cmd(uchar cmd){//ifbusy();rs_l;rw_l;//lcd_dataout;mcu2lcd_data=cmd;delayms(5);en_h;delayms(5);en_l;}void write_data(uchar dat){//ifbusy();rs_h;mcu2lcd_data=dat;delayms(5);en_h;delayms(5);en_l;}/******************************************* 函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/ /*void Ini_Lcd(void){LcD_cMDOut; //液晶控制端口设置为输出// Delay_Nms(500);write_cmd(0x30); //基本指令集Delay_1ms();write_cmd(0x02); // 地址归位Delay_1ms();write_cmd(0x0c); //整体显示打开,游标关闭Delay_1ms();write_cmd(0x01); //清除显示Delay_1ms();write_cmd(0x06); //游标右移Delay_1ms();write_cmd(0x80); //设定显示的起始地址}*/void init(){lcd_dataout;lcd_cmdout;en_l;write_cmd(0x30);write_cmd(0x0c);write_cmd(0x01);}void initina2(void) //LcD显示图片(扩展)初始化程序{write_cmd(0x36); //Extended Function Set RE=1: extended instructiondelayms(1); //大于100uS的延时程序write_cmd(0x36); //Extended Function Set:RE=1: extended instruction setdelayms(1); ////大于37uS的延时程序write_cmd(0x3E); //EXFUNcTION(DL=8BITS,RE=1,G=1)delayms(1); //大于100uS的延时程序write_cmd(0x01); //cLEAR ScREENdelayms(1); //大于100uS的延时程序}/*******************************************函数名称:clear_GDRAM功能:清除液晶GDRAM中的随机数据参数:无返回值:无********************************************/void clear_GDRAM(void){uchar i,j,k;write_cmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){write_cmd(i++);write_cmd(0x80);for(k = 0;k < 16;k++){write_data(0x00);}}i = 0x80;for(j = 0;j < 32;j++){write_cmd(i++);write_cmd(0x88);for(k = 0;k < 16;k++){write_data(0x00);}}write_cmd(0x30); //回到基本指令集}/******************************************* 函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/ void Disp_HZ(uchar addr,const uchar * pt,uchar num) {uchar i;write_cmd(addr);for(i = 0;i < (num*2);i++){write_data(*(pt++));delayms(1);}}/******************************************* 函数名称: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); //清屏,只能清除DDRAMwrite_cmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){write_cmd(Yaddr++); //Y地址write_cmd(Xaddr); //X地址write_data(dp[k++]);write_data(dp[k++]);}write_cmd(0x36); //打开绘图显示// write_cmd(0x30); //回到基本指令集模式}/*******************************************函数名称:DisplayGraphic功能:在整个液晶屏幕上画图参数:无返回值:无********************************************/void DisplayGraphic(const uchar *adder){int i,j;//*******显示上半屏内容设置for(i=0;i<32;i++) //{write_cmd(0x80 + i); //SET 垂直地址VERTIcAL ADDwrite_cmd(0x80); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{write_cmd((0x80 + i)); //SET 垂直地址VERTIcAL ADDwrite_cmd(0x88); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}write_cmd(0x36); //打开绘图显示}/*在显示时DDAM和GDRAM是同时显示的,也就是它们的显示结果是叠加在一起的//SM12864液晶基本指令集控制命令测试////1.设定DDRAM地址命令write_cmd(0x90); //设定DDRAM地址,因为此时DDRAM地址已经溢出//2.显示状态命令write_cmd(0x08); //整体显示关,游标关,游标位置关write_cmd(0x0c); //整体显示开,游标关,游标位置关write_cmd(0x0e); //整体显示开,游标开,游标位置关write_cmd(0x0f); //整体显示开,游标开,游标位置开//3.位址归位write_cmd(0x02); //位址归位,游标回到原点write_cmd(0x84); //将DDRAM地址设为0x88,游标在此闪烁//4.点设定指令//(以下四个命令是控制写入字符以后光标及整屏显示的移动)write_cmd(0x07); //光标右移整体显示左移write_Data(0x20); //写入两个空格write_Data(0x20);write_cmd(0x05); //光标左移整体显示右移write_Data(0x20); //写入两个空格write_Data(0x20);write_cmd(0x06); //光标右移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);write_cmd(0x04); //光标左移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);//5.游标和显示移位控制//(以下四个命令无需写入显示数据,直接控制光标和整屏显示的移动)write_cmd(0x10); //光标左移write_cmd(0x14); //光标右移write_cmd(0x18); //整体显示左移,光标跟随write_cmd(0x1c); //整体显示右移,光标跟随write_cmd(0x0c); //关闭光标//6.进入扩展功能模式命令write_cmd(0x34); //打开扩展功能模式,绘图显示关闭//7.反白命令write_cmd(0x04); //同时反白1、3行write_cmd(0x04); //再次反白1、3行,相当于关闭1、3行反白write_cmd(0x05); //同时反白2、4行write_cmd(0x05); //再次反白2、4行,相当于关闭2、4行反白//8.睡眠模式命令write_cmd(0x08); //进入睡眠模式write_cmd(0x0c); //退出睡眠模式//9.待命模式命令write_cmd(0x01); //进入待命模式//10.打开GDRAM显示write_cmd(0x36); //打开扩展功能模式,打开绘图显示Draw_TX(0x80,0x84,laba); //设置16*16大小图形clear_GDRAM(); //清除上电复位后RAM中的随机数值Draw_TX(0x80,0x84,laba); //重新显示设置16*16大小图形//11.关闭GDRAM显示write_cmd(0x34); //打开扩展功能模式,关闭绘图显示//12.设定基本指令集write_cmd(0x30); //回到基本指令集//13.清除显示命令*/#endif。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD
1.原理图
2.引脚定义描述
VSS:液晶显示地(GND)。
VDD:液晶显示电源(+5V)。
CS:片选,使能信号,该引脚为高读写才能成功。
SID:数据信号。
SCLK:同步时钟信号,上升沿有效。
PSB:并口/串口选择信号。高电平定义为并口,低电平定义为串口通信。
/RST:复位信号,低电平有效。
LEDA:背光电源正。
{
uchar i,j;
Send_Cmd(0x36); ////扩展指令集,允许绘图
for(i=0;i<32;i++)
{
Send_Cmd(0x80+i); //先设置垂直地址
Send_Cmd(0x80); //再设置水平位置
for(j=0;j<16;j++)
{
Send_Dat(0x00);
}
}
for(i=0;i<32;i++)
{
Send_Cmd(0x80+i);
Send_Cmd(0x88);
for(j=0;j<16;j++)
{
Send_Dat(0x00);
}
}
}
/*******************************************************************
函数名称:convertChar
}
其实我们还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。其理论支持在于:在ST7920中,字符显示的CGRAM和图形的GGRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。
具体来说:假如某个点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。假如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。
所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地方的绘图!这样一来可以实现任何地方、任意大小的反白显示,反而比原指令中的单行反白的功能更好更强大。
例程如下:
//在反白之前先清绘图存储区GDRAM,将绘图存储区的参数全设为不反白0x00.
void Disp_black()
halfLineCnt = 32;
}
else if (CX ห้องสมุดไป่ตู้= 2)
{
CX = 0x88;
halfLineCnt = 16;
}
else if (CX == 3)
{
CX = 0x88;
halfLineCnt = 32;
}
lcdPosX = CX + CY;
for (; halfLineCnt != 0; halfLineCnt--)
{
uchar halfLineCnt, basicBlock,lcdPosX,lcdPosY;
if(f==1)
Disp_black(); //清绘图区
lcdPosY = 0x80;
if (CX == 0)
{
CX = 0x80;
halfLineCnt = 16;
}
else if (CX == 1)
{
CX = 0x80;
功能:控制液晶任意位置反白
参数:CX--行位置;CY--列位置;width--显示字符宽度;
YN--1反白;0不反白;f--1清绘图;0不清绘图
********************************************************************/
void convertChar (uchar CX,uchar CY,uchar width,uchar YN,uchar f)
第一个字节:启始字节,格式11111ABC
A传输方向位RW,H表示LCD->MCU,L表示MCU->LCD
B数据类型位RS,H表示显示数据,L表示控制指令
C固定为0
第二个字节:(并行)8位数据的高4位,格式D7~D40000
第三个字节:(并行)8位数据的低4位,格式0000D3~D0
因为串行通信的数据是以位为单位进行传输,所以只要在每位数据的传输过程中适当的添加一段延时基本上就能保证数据收发成功。
{
if (halfLineCnt > 16)
{
Send_Dat(0x00);
}
else
{
if(YN==1) Send_Dat(0xff);
else Send_Dat(0x00);
}
}
lcdPosY++;
}
Send_Cmd(0x36); //扩展指令集,允许绘图
Send_Cmd(0x30); //基本指令集
LEDK:背光电源负。
3.通信协议
当PSB接低电位时,将进入串行传输模式。主要用到CS、SCLK、SID三根线来实现:
CS为片选使能
SCLK为同步时钟信号,以SCLK上升沿接收1BIT
SID为传输的数据
从一个完整的串行传输流程来看,一开始先传输启始字节,根据定义启始字节前五位为“同步位”字符串(五个连续的“1”),此时传输计数将被重置并且串行传输将被同步,再跟随的两个位字符串(第六、第七位)分别指定传输方向位(RW)及寄存器选择位(RS),最后第八位则为“0”。再接收到包含同步位及RW和RS资料的启始字节后,每一个八位的指令(数据)将被分为两个字节发送接收:高4位(DB7~DB4)的数据将会被放在第一个字节的LSB部分,而低4位(DB3~DB0)的数据会被放在第二个字节的LSB部分,至于相关的另四位则以“0”填充。
{
basicBlock = width;
Send_Cmd(0x34); //扩展指令集,禁止绘图
Send_Cmd(lcdPosY); //先设置垂直地址
Send_Cmd(lcdPosX); //再设置水平位置
Send_Cmd(0x30); //基本指令集
for (;basicBlock != 0; basicBlock--)
4.关于反白
从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。但是ST7920控制器的128×64点阵液晶其实原理上等同256×32点阵,第三行对应的DDRAM地址紧接第一行;第四行对应的DDRAM地址紧接第二行。所以128×64点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,第三行必然也反白显示;第二行反白,第四行也必然反白。
相关文档
最新文档