液晶12864串口通信(很好的实例,验证通过)
12864液晶屏幕使用说明及程序
12864使用说明一、串/并接口1.1 串口接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。
1.2 并行接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。
二、模块主要硬件构成说明控制器接口信号说明:2.1、RS,R/W的配合选择决定控制界面的4种模式:2.2、E信号●忙标志BFBF 标志提供内部工作情况.BF=1 表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0 时, 模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF 读到DB7 总线,从而检验模块之工作状态.●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192 个此触发器是用于模块屏幕显示开和关的控制。
DFF=1 为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。
DFF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。
●显示数据RAM(DDRAM)模块内部显示数据 RAM 提供 64×2 个位元组的空间,最多可控制 4 行 16 字(64 个字)的中文字型显示,当写入显示数据 RAM 时,可分别显示 CGROM 与CGRAM 的字型;此模块可显示三种字型,分别是半角英、数字型(16*8)、CGRAM 字型及 CGROM 的中文字型。
三种字型的选择,由在 DDRAM 中写入的编码选择,在0000H—0006H 的编码中(其代码分别是0000、0002、0004、0006 共4 个)将选择 CGRAM 的自定义字型,02H—7FH 的编码中将选择半角英数字的字型,至于A1 以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。
12864液晶串行_PIC
LCD_sendbyte(x);
delay10us(5); //串行不支持读操作,不可检测忙操作,这里用延时wait time>72us替代
//初始化操作按照不同的液晶模块初始化步骤操作
void LCD_init(void)
{
delayms(3); //wait time>40ms
LCD_write_cmd(0x30); //选择基本指令集
delay10us(6); //wait time>100us
uchar i;
for(i=0;i<8;i++)
{
_LATC2=0; //拉低时钟,等待发送数据(上升沿发送)
_LATD9=((byte&0x80)==0x80); //取x将要发送的位
_LATC2=1; //发送数据1位
//软件模拟仿真,Debugger/select tool/stop watch调出秒表。
//---------------------------------------------------------------------------
//#define SCLK _LATC2; //串行时钟输入
//#define RST _LATC13 //复位
//----------函数声明------------
void delays();
void delayms();
void delay10us();
/**********************************************************************
12864LCD串行操作C程序
12864LCD串行控制C程序下面是一个最简单的12864液晶串行控制程序,没什么花样,只是想帮助大家学习掌握控制一个串行的12864液晶的基本原理。
无论是12864的并行操作还是串行操作,12864液晶与12232液晶的操作时序几乎完全一样,打家学习的时候可以参考一下12232的时序图(方便理解),郭天祥的《51单片机C语言教程》156页中就讲到了12232液晶的使用例程。
一、时序图1、12232时序图2、12864时序图二、液晶引脚对应图三、12864液晶与单片机接口(程序中PSB没接,RST接高电平,NC悬空)四、程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit CS=P2^6;//片选信号线,接12864的RS端sbit SID=P2^5;//串行数据线,接12864的RW端sbit SCLK=P2^7;//串行时钟信号线,接12864的EN端//uchar a;uchar code word[]={"我好喜欢你啊"};//12864LCD显示内容//函数声明void lcd_init();//声明液晶初始化函数void write_com(uchar com);//声明'写入命令控制字节'函数void write_date(uchar dat);//声明'写入数据控制字节'函数void delayms(uint x);//声明延时函数//液晶初始化函数void lcd_init(){delayms(10);write_com(0x30);//基本指令操作write_com(0x0c); //显示开,关光标write_com(0x10);//设置地址计数器AC为00H,并将游标移到开头原点位置write_com(0x06);//游标及显示右移一位write_com(0x01);//清除液晶显示内容}//向12864写入命令函数/* 串行数据由三个字节构成,第一个为命令控制字节,第二个为由命令字节高四位低四位补零构成的字节,第三个为由命令字节低四位左移四位低四位补零后构成的字节*/void write_com(uchar com){uchar i;uchar i_data;i_data=0xf8;//0xf8是命令控制字节,它比表示写入的内容com是一个命令CS=1;//写入之前令片选信号CS为1(这是时序要求的)SCLK=0;//写入之前令时钟信号CLK为1(这也是时序要求的)for(i=0;i<8;i++)//写入命令控制字节{SID=(bit)(i_data&0x80);SCLK=1;SCLK=0;i_data=i_data<<1;}i_data=com;i_data&=0xf0;for(i=0;i<8;i++)//写入命令的高四位{SID=(bit)(i_data&0x80);//取得命令的最高位给液晶串行总线SCLK=1;SCLK=0; //每写一位SCLK都要有一个下降沿(时序要求)i_data=i_data<<1; //命令字节左移一位(取命令的次高位给液晶串行总线)}i_data=com;i_data<<=4;//命令字节左移4位,即把低四位移到高四位for(i=0;i<8;i++)//写入命令的低四位{SID=(bit)(i_data&0x80);//取得命令字节移位后的最高位给液晶串行总线SCLK=1;SCLK=0;i_data=i_data<<1; //移位后命令字节左移一位(每一次移位前的次高位给液晶串行总线)}CS=0; //写入命令控制字节后令片选信号CS为0delayms(10);}//向12864写入数据函数void write_date(uchar dat){uchar i;//第三个为由数据低四位左移四位后低四位补零构成的字节uchar i_data;i_data=0xfa;//(数据控制字节为0xfa)CS=1;SCLK=0;for(i=0;i<8;i++)//写入数据控制字节{SID=(bit)(i_data&0x80);//取得数据控制字节的最高位给液晶串行总线SCLK=1;SCLK=0;//每写一位SCLK都要有一个下降沿(时序要求)i_data=i_data<<1;//数据控制字节左移一位(取命令控制字节的次高位给液晶串行总线)}i_data=dat;i_data&=0xf0;//取数据字节的高四位for(i=0;i<8;i++)//写入数据的高四位{SID=(bit)(i_data&0x80);//(以下跟写入命令函数的注释同理)SCLK=1;SCLK=0;i_data=i_data<<1;}i_data=dat;i_data<<=4;for(i=0;i<8;i++)//写入数据的低四位{SID=(bit)(i_data&0x80);SCLK=1;SCLK=0;i_data=i_data<<1;}CS=0;delayms(10);}//延时函数void delayms(uint x) //延时x ms{uint i,j;for(j=x;j>0;j--)for(i=110;i>0;i--);}//主函数void main(){uchar b; //定义计算写入显示内容数量的变量lcd_init(); //初始化液晶write_com(0x90); //写入显示位置for(b=0;b<12;b++) //b要12是因为要显示6个中文{write_date(word[b]); //写入要显示的内容}while(1);}。
LCD液晶显示模块12864应用笔记(串行方式)
data++;
}
}
2
DisplayC_LCD ( 0x93, “
”, 4 );
-3-
2. void DisplayD_LCD ( unsigned char addr,
unsigned char data1, unsigned char data2 ) { SendCMD_LCD( addr ); SendDAT_LCD( data1 ); SendDAT_LCD( data2 ); } 2 DisplayD_LCD ( 0x93, 0xB9, 0xE3 );
case 0: SendDAT_LCD( ‘0’ );
case 1: SendDAT_LCD( ‘0’ );
……
case 14: SendDAT_LCD( ‘E’ );
case 15: SendDAT_LCD( ‘F’ );
default: SendDAT_LCD( ‘R’ );
}
}
2
5
SendCMD_LCD( 0x93 );
//
unsigned char *data,
//
unsigned char num )
//
{
unsigned char n;
SendCMD_LCD( addr );
for ( n=0; n<num; n++){
SendDAT_LCD( data );
//
data++;
SendDAT_LCD( data );
-2-
1.
SendCMD_LCD
void SendCMD_LCD(unsigned char dat){
SendByte_LCD( 0xf8 );
51单片机 12864液晶显示并口和串口连接程序
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--)
串行方式使用12864的proteus仿真实例
程序如下:
/*取模方式:行列式逆向阴码*/
/*参数A0=0时表示发命令A0=1时表示发送示数据*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_SI=P3^0;//clock input同步时钟输入端
LCD_write(0x04|(0x0f&column_f),0); //设定列地址低4位为0
for(j=0;j<column_sum;j++)
{
LCD_write(BMP[d_where],1);
d_where++;
}
}
}
//------------------------------------------------------------------------------
sbit LCD_SCL=P3^1;//data input/output串行数据输入、输出端
sbit LCD_A0=P3^2;//选择命令还是数据
sbit LCD_RST=P3^3;//复位
sbit LCD_CS=P3^4;//片选
uchar code BMP[]=
{0xFB,0xDB,0xBB,0x7B,0x9B,0x63,0xBF,0xCF,0xF0,0x37,0xF7,0xF7,0xD7,0xE7,0xFF,0xFF,
LCD写函数
void LCD_write(数据或者命令,A0选择)
****************************************************************/
12864液晶显示串行程序(英飞凌xc824)
12864液晶显示串行程序(英飞凌xc824)
先说说我的调试初衷前一阵看实验室的兄弟姐妹们都闲的无聊,就有人DIY 了,有人个BF 做电子时钟,一个液晶30 多,一个12C887 20 多,板子加器件还有单片机算下来少说也有70 大洋。
感觉实在不划算,但是对液晶还是
蛮感兴趣的,一方面熟悉一下串行设备,一方面为以后做准备,毕竟液晶显示
操作起来要比LED 简单,而且能实时显示,到什么时候都能用上。
所以,这
次液晶屏的调试,我就想搜集一些常用的程序,适当的修改,让液晶屏达到拿
来就能用上的目的。
先说说我这次调试的液晶屏,12864,带子库的,蓝色屏幕。
就是这张图了
单片机我选的是英飞凌xc824,新出的哦。
不是有啥特殊偏好,手头就有这个,就先用这个吧,主要是我对这个最小系统板上的触摸按键比较感兴趣。
当
然了,它也有缺点,内存太小,连一个12864 的图片都装不下。
:Q 闲话少说,先从最基本的数据手册开始吧
中显液晶12864.pdf
这是中文资料,因为这种东西已经被使用的多的不能再多了,而且厂家众多,但是有细微差别,比如串行和并行,有的是焊点切换的,有的是软件切换的。
我这个是后者。
刚接线的时候还出了个笑话,太相信实物和datasheet 和对应的了,结果屏幕的背光接反了,幸好没烧。
硬件方面,我选串行是因为它用线少,我很懒的。
:) P1.0 口对应CS,P1.1 口对应SID,P1.2 口对应CLK.
参考时序在datasheet 上写的很清楚有这个当指导思想,照着写程序吧.动手之。
12864串行方式使用体会
12864使用心得论文一、硬件连接1.1 12864引脚示意图1.2 本次实验中12864与MCU的连接示意图/****************晶振为11.0592**********************/sbit PSB = P1^0; //并1/串0选择//串行接法sbit CS = P1^3; //串片选sbit DS = P1^2; //串数据口sbit SCK = P1^1; //串时钟信号/*//并行接法sbit RS = P1^3; //数据/命令选择端sbit RW = P1^2; //读写选择端sbit E = P1^1; //使能信号端#define DataIO P0 //并行数据口*/二、底层基本程序(串行方式)2.1 基本写字节程序//写一个字节(以SCK上升沿接收一个位)void sendbyte(uint8 zdata){uint16 i;for(i=0; i<8; i++){if((zdata << i) & 0x80){DS = 1;}else {DS = 0;}SCK = 0;SCK = 1;}}2.2 写命令程序(若晶振频率>11.0592,则需加延时处理)//写命令void writeCmd(uint8 cmdcode){CS = 1;sendbyte(0xf8);sendbyte(cmdcode & 0xf0);sendbyte((cmdcode << 4) & 0xf0);// delayMs(1); //若晶振频率>11.0592,则需延时}2.3 写数据程序(若晶振频率>11.0592,则需加延时处理)//写数据void writeData(uint8 dispdata){CS = 1;sendbyte(0xfa);sendbyte(dispdata & 0xf0);sendbyte((dispdata << 4) & 0xf0);// delayMs(1); //若晶振频率>11.0592,则需延时}2.4 通用软件毫秒延时程序//延时程序void delayMs(uint16 xms){uint16 i,j;for (i=0;i<=xms;i++)for (j=0;j<=123;j++);}三、文本显示3.1 LCD12864初始化//LCD12864初始化void LCD12864Init(){PSB = 0; //串行writeCmd(0x30); //基本指令模式writeCmd(0x04); //游标右移一位writeCmd(0x0c); //显示开,关光标writeCmd(0x01); //清除LCD的内容(仅字符模式) }模块控制芯片提供两套控制命令,基本指令和扩充指令如下:指令表1:(RE=0:基本指令)指令表2:(RE=1:扩充指令)3.2 LCD12864字符串的显示//写字符串函数,参数line第1/2行beSpace字符前面的空格数pString指针uint8 write12864String(uint8 line,uint8 beSpace,char *pString){uint8 i=0;uint8 sLength = strlen(pString); //字符串长度if (pString == NULL) //空字符串return -1;writeCmd(0x30); //基本指令模式//设置写在的位置if (line == 1){writeCmd(0x80 + beSpace); //写在第一行的位置}else if (line == 2){writeCmd(0x90 + beSpace); //写在第二行的位置}else if (line == 3){writeCmd(0x88 + beSpace); //写在第三行的位置}else if (line == 4){writeCmd(0x98 + beSpace); //写在第四行的位置}else{return -1;}//写数据for (i=0;i< sLength;i++){writeData ( *pString );pString ++;}return 0;}12864每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。
12864并行通信演示实例
论坛推广任务第一期(有奖哦)[单片机资源] 12864资料及ST7920驱动器说明(附带原创演示程序—有详细的讲解)相关搜索: 演示, 驱动器, 程序, 资料, 讲解12864作为最常用的单片机输出设备,其内置强大的图形显示功能。
下面是本人收集12864的说明和12864最常用的驱动器ST7920(兼容ST7921)的说明,以及本人编写的最简单的12864两种数据传输模式的演示程序,供大家分享(见附件)。
并行通信模式的演示程序:/*****************************************************************程序:12864并行通信演示实例制作:风沙星辰日期:2009年07月30日功能:12864并行通信各项功能演示备注:A T89S52 11.0592M ST7920液晶驱动****************************************************************/#include <reg52.h> // 包含头文件#include <intrins.h>#define uchar unsigned char //简化整型,字符型变量书写#define uint unsigned intchar code hang1[] = {"锄禾日当午"}; // 显示字符定义char code hang2[] = {"汗滴禾下土"};char code hang3[] = {"谁知盘中餐"};char code hang4[] = {"粒粒皆辛苦"};#define LCD_data P0 // 引脚定义sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_EN = P1^2;sbit LCD_PSB = P1^3;//图片代码圣诞快乐128*32uchar code Photo1[][16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x70,0x0F,0xF8,0x00,0x00,0x0F,0x01,0xE0,0x00,0x00,0xFC,0x00,0x00,0x00,0xFF,0xFC,0xFC,0x0F,0xFC,0x81,0xF0,0x0F,0x81,0xF0,0x00,0xE0,0xFC,0x1C,0x00, 0x03,0xFF,0xFF,0xFE,0x07,0xEF,0xC1,0xF8,0x07,0x81,0xF0,0x01,0xF3,0xFF,0x1F,0x00, 0x03,0xE3,0xDF,0xCE,0x03,0xCF,0xE3,0xF0,0x03,0xC0,0xFF,0x01,0xF3,0xFF,0xFF,0x00, 0x01,0xDF,0xDF,0xCE,0x07,0x9F,0x67,0xE0,0x03,0xC0,0xFF,0x80,0xFB,0xFF,0xFF,0x00, 0x00,0xFF,0xDF,0x9F,0x0F,0x9F,0x7F,0xC0,0x03,0xC0,0xFF,0xC0,0xFB,0xFF,0xFF,0x00, 0x00,0xCF,0xDC,0x1F,0x0F,0xFE,0xFF,0xC0,0x1F,0xE3,0xFF,0xC0,0x73,0xC7,0xFC,0x00, 0x00,0xFF,0xFC,0x3F,0x0F,0xF8,0xE3,0xC0,0x1F,0xF7,0xF3,0xE0,0xF7,0x9F,0xF0,0x00, 0x00,0xF3,0xFF,0xFE,0x03,0xF9,0xE9,0xDC,0x1F,0xFB,0xF3,0xC1,0xCF,0xFF,0xFC,0x00, 0x00,0xC7,0xFF,0xFF,0x07,0xF3,0xCD,0xFC,0x1F,0xFB,0xF7,0xC1,0xDF,0xFF,0xFE,0x00,0x01,0xFF,0xDF,0xFF,0x0F,0x87,0xCD,0xF8,0x1F,0xBD,0xFF,0xC1,0xFF,0x8F,0xFF,0x00, 0x01,0xFF,0xCF,0x8C,0x03,0xFF,0xED,0xF8,0x3F,0xBD,0xFF,0xC1,0xFF,0xFF,0xFF,0x00, 0x01,0xFB,0xC7,0xFC,0x03,0xFF,0xFD,0xE0,0x3F,0xBF,0xFF,0xC0,0xFB,0xFF,0xCF,0x00, 0x00,0xE3,0xFF,0xFE,0x0F,0xFF,0x7D,0xC0,0x3F,0xBF,0xFF,0xE0,0x79,0xFC,0x0F,0x00, 0x00,0x1F,0xFF,0xFE,0x0F,0x0E,0x7D,0xC0,0x3F,0x9F,0xFF,0xE0,0x30,0xFF,0xFE,0x00, 0x00,0xFF,0xFC,0x3E,0x07,0x60,0x7D,0xF0,0x37,0x9F,0xF8,0xE0,0x3F,0xFF,0xFF,0x00, 0x00,0xFD,0xFF,0xF0,0x05,0xF7,0xFF,0xF8,0x37,0x8F,0xFC,0x01,0xFF,0xFF,0xFF,0x80, 0x00,0x01,0xFF,0xFC,0x0F,0xFF,0xF7,0xF8,0x07,0x83,0xFF,0x01,0xFF,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0xFC,0x0F,0xFC,0xF1,0xF8,0x07,0x87,0xFF,0x80,0xFF,0xFE,0x7F,0x00, 0x00,0xFF,0xF8,0x3C,0x0F,0xBD,0xFC,0x00,0x07,0x87,0xDF,0x80,0x7C,0xFC,0x7C,0x00, 0x00,0x71,0xFF,0xE0,0x0F,0x3F,0xFF,0x80,0x07,0x8F,0xCF,0xC0,0xFC,0xFC,0x7E,0x00, 0x00,0xC1,0xFF,0xFC,0x0E,0x3F,0xFF,0xF8,0x07,0x8F,0x87,0xC0,0xFF,0xFC,0x3E,0x00, 0x00,0xDF,0xFF,0xFE,0x0F,0xFF,0xDF,0xF8,0x07,0x9F,0x83,0xC0,0xFF,0xFC,0x3E,0x00, 0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xCF,0xF8,0x07,0x9F,0x03,0xC0,0xFB,0xFC,0x3E,0x00, 0x00,0xFF,0xC0,0x1E,0x03,0xF1,0x01,0xF0,0x03,0x8E,0x01,0x80,0x00,0x7C,0x1C,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//图片代码新年进步128*32uchar code Photo2[][16] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC3,0xF0,0x01,0xFC,0x00,0x00,0x3C,0x00,0xF8,0x00,0x01,0xF8,0x3C,0x00, 0x00,0xFF,0xE3,0xF8,0x01,0xFE,0x00,0x00,0x3E,0x1C,0xFC,0x00,0x31,0xFC,0xFE,0x00, 0x00,0x7F,0xF1,0xFC,0x01,0xFE,0x3F,0xE0,0x3F,0x3F,0xFF,0x80,0x7C,0xFF,0xFE,0x00, 0x00,0xFF,0xF1,0xFC,0x03,0xFF,0xFF,0xF0,0x3F,0x1F,0x7F,0xC0,0x7C,0xFF,0xFE,0x00, 0x01,0xFF,0xCF,0xFC,0x07,0x8F,0xFF,0xF8,0x0F,0xBE,0xFF,0xC0,0x3E,0xFF,0xFE,0x00, 0x01,0xFF,0xDF,0xF8,0x0F,0x3F,0xFF,0xF8,0x0F,0xF1,0xFF,0xC0,0x1E,0xFE,0x00,0x00, 0x01,0x3B,0xFC,0x00,0x0F,0xFF,0xFC,0x00,0x1F,0x3F,0xFC,0x00,0x3E,0xFF,0xFE,0x00, 0x03,0xB3,0xFC,0x3C,0x0F,0xFF,0xF8,0x00,0x3E,0x3F,0xFF,0x80,0xFE,0xFF,0xFF,0x00, 0x03,0xFF,0xDE,0xFE,0x07,0xF1,0xFF,0xF0,0x3F,0x3F,0x7F,0xC1,0xFF,0xFF,0xFF,0x00, 0x01,0xFF,0xFF,0xFF,0x01,0xC3,0xFF,0xF0,0x3F,0xBC,0xFF,0xC1,0xBF,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xF8,0x3F,0xBF,0xFC,0x01,0xFF,0xFF,0x3F,0x00,0x01,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xF0,0x1F,0xBF,0xFF,0x80,0xFF,0xFC,0x00,0x00, 0x03,0xFC,0x1F,0xFC,0x07,0xFF,0xFC,0x20,0x3C,0x3C,0x7F,0xC0,0x7C,0xFC,0x0C,0x00, 0x01,0xFF,0xDF,0x7C,0x03,0xFF,0xFC,0x00,0x38,0x3F,0xFF,0xC0,0x1C,0xFE,0x1E,0x00, 0x00,0x3F,0xFE,0x7C,0x01,0xFD,0xFC,0x00,0x3F,0xBF,0xFC,0x00,0x3E,0x7E,0x3E,0x00, 0x00,0xFF,0xFE,0x7C,0x03,0xFD,0xFF,0xE0,0x3F,0xFF,0xFF,0x00,0x3E,0x7E,0x3E,0x00, 0x03,0xFF,0xFE,0x7C,0x0F,0xFF,0xFF,0xF8,0x1F,0xFC,0xFF,0xC0,0xFE,0xFE,0xFE,0x00, 0x03,0xFE,0xDE,0x7C,0x0F,0x3F,0xFF,0xF8,0x0F,0xBF,0xFF,0xC0,0xFF,0xFF,0xFC,0x00, 0x01,0xDE,0xDE,0x7C,0x0F,0xFF,0xFF,0xF8,0x1F,0x3F,0xFF,0xC0,0xFF,0xFF,0xF8,0x00,0x01,0xDE,0xFF,0x7C,0x0F,0xFF,0xFF,0xF8,0x1E,0x7F,0xF0,0x00,0x78,0xFF,0xF0,0x00, 0x01,0xFE,0xFF,0xFC,0x03,0xFF,0xFC,0x00,0x3C,0xFF,0xFF,0xC0,0x83,0xFF,0xE0,0x00, 0x01,0xFE,0xFF,0xFC,0x00,0xF0,0xFC,0x00,0x3C,0xFF,0xFF,0xE0,0xFF,0xFF,0xC0,0x00, 0x03,0xFE,0xFF,0xFC,0x00,0x00,0xFC,0x00,0x1F,0xFF,0xFF,0xE0,0x7F,0xFE,0x00,0x00, 0x01,0xFF,0x7F,0xFC,0x00,0x00,0xFC,0x00,0x1F,0xFF,0xFF,0xC0,0x3F,0xFC,0x00,0x00, 0x00,0x0E,0x0C,0x7C,0x00,0x00,0x78,0x00,0x07,0x80,0xFF,0x80,0x0F,0xC0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};void delay_ms(uint ms) // 延时函数1ms{uint i,j;for(j=0;j<=ms;j++){for(i=0;i<=120;i++){}}}void delay4us() // 延时函数4Us{_nop_();_nop_();_nop_();_nop_();}void lcd_checkBusy(void) //检测忙标志{uchar busy;do{LCD_EN = 0;LCD_RS = 0;LCD_RW = 1;delay4us();LCD_EN = 1; //在使能端的一个上升沿读取LCD数据busy = P0;delay4us();LCD_EN = 0;}while(busy&0x80); //判断最高位是否为0,为0则处于空闲状态}void lcd_wcmd(uchar cmd) //写指令{lcd_checkBusy(); //检测忙碌状态LCD_RS = 0; //RS至低,指令操作LCD_RW = 0; //RW至低,写操作LCD_EN = 0;delay4us();P0 = cmd; //指令数据delay4us();LCD_EN = 1; //给使能端一个上升沿保存数据delay4us();LCD_EN = 0;}void lcd_wdat(uchar dat) //写数据{lcd_checkBusy(); //检测忙碌状态LCD_RS = 1; //RS至高,数据操作LCD_RW = 0;LCD_EN = 0;P0 = dat; //给LCD要显示的数据delay4us();LCD_EN = 1; //给使能端一个上升沿保存数据delay4us();LCD_EN = 0;}void lcd_init() //初始化LCD{LCD_PSB = 1; //选择并行模式lcd_wcmd(0x30); //初级指令集delay_ms(5);lcd_wcmd(0x0C); //开显示delay_ms(5);lcd_wcmd(0x01); //清屏delay_ms(5);}void drawphoto(uchar bmp[][16]) //绘图{uchar i,j,k;lcd_wcmd(0x34); //打开高级指令集,关绘图for(i=0;i<16;i++) //显示上半部分图片{lcd_wcmd(0x90+i); //输入Y轴坐标lcd_wcmd(0x80); //输入下轴坐标for(j=0;j<16;j++)lcd_wdat(bmp[j]); //写入数据delay_ms(1);}for(i=0,k=16;i<16,k<32;i++,k++) //显示下半部分图片{lcd_wcmd(0x80+i); //输入Y轴坐标lcd_wcmd(0x88); //输入X轴坐标for(j=0;j<16;j++)lcd_wdat(bmp[k][j]); //向LCD写入数据delay_ms(1);}lcd_wcmd(0x36); //打开绘图功能,显示所绘图片}void Clear_GDRAM(void) // 清屏,清除GDRAM中的数据,及向GDRAM中全写0 {uchar i,j,k;lcd_wcmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){lcd_wcmd(i++);lcd_wcmd(0x80);for(k = 0;k < 16;k++){lcd_wdat(0x00);}}i = 0x80;for(j = 0;j < 32;j++){lcd_wcmd(i++);for(k = 0;k < 16;k++){lcd_wdat(0x00);}}lcd_wcmd(0x30); //回到基本指令集}void main() // 主函数{uchar i;LCD_PSB=1; // 选择显示模式为串行通信模式lcd_init(); //初始化液晶,清屏DDRAMlcd_wcmd(0x81); //写入要显示字符的地址for(i=0;i<10;i++){lcd_wdat(hang1); //写入显示字符delay_ms(300);}lcd_wdat(0x2c); //显示“,”。
单片机与LCD12864之间的串口通讯
单片机与LCD12864之间的串口通讯/************************************************************** * 文件名:128_64.h* 功能:实现单片机与LCD12864之间的串口通讯* 说明:引脚接线:CS接PA0脚SID接PA1脚SCLK接PA2脚,PSB脚接地**************************************************************/ #ifndef _12864_H#define _12864_H#include#include#include#define CS _PA0#define SID _PA1#define SCLK _PA2#define uchar unsigned char#define uint unsigned intvoid delay_us(uint t); //函数功能:16M晶振,延时t微秒void delay_ms(uint t); //函数功能:16M晶振,延时t毫秒void Sendbyte(uchar byte); //函数功能:发送1字节uchar Receivebyte(void); //函数功能:串口接收一个字节//仅在读取数据的时候用到//而读出的数据是一次只能读出4bit的void Checkbusy( void ); //函数功能:检测忙void Writecommand(uchar data); //函数功能:写命令void Writedata(uchar data); //函数功能:发送数据void Locate_x_y(uchar x,uchar y);//函数功能:光标定位x行y 列void Write_string(uchar *s); //函数功能:写入中文串void Display_x_y_symbol(uchar x,uchar y,uint data);//函数功能:以字码的形式录void Display_x_y_data(uchar x,uchar y,uchar *data);//函数功能:光标定位x行y列写入中文串void LcmClearTXT(); //文本区清RAM函数void Init_12864(void); //函数功能:液晶初始化//自动换行编码表unsigned char AC_TABLE[]={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, //第四行汉字位置};/************************************************************** * 函数名称:delay_us()* 函数功能:16M晶振,延时t微秒* 入口参数:t 延时t微秒* 出口参数:无**************************************************************/ void delay_us(uint t){uint i,j;for(i=t;i>0;i--)for(j=2;j>0;j--);}/************************************************************** * 函数名称:delay_ms()* 函数功能:16M晶振,延时t毫秒* 入口参数:t 延时t毫秒* 出口参数:无void delay_ms(uint t){uint i,j;for(i=t;i>0;i--)for(j=2800;j>0;j--);}/************************************************************** * 函数名称:Sendbyte()* 函数功能:发送1字节* 入口参数:data 要写入的数据* 出口参数:无**************************************************************/ void Sendbyte(uchar data){uchar i=0;SCLK;delay_us(8); //针对高频晶振for(i=0;i<8;i++){if(data&0x80)SID=1;elseSID=0;SCLK=1;delay_us(8); //针对高频晶振data<<=1;SCLK=0;delay_us(8); //针对高频晶振}}* 函数名称:Receivebyte()* 函数功能:串口接收一个字节,仅在读取数据的时候用到,一次只能读出4bit的数据* 入口参数:无* 出口参数:(0xf0&temp1)+(0x0f&temp2)**************************************************************/ uchar Receivebyte(void){uchar i,temp1,temp2;temp1=temp2=0;for(i=0;i<8;i++){temp1=temp1<<1;SCLK = 0;SCLK = 1;SCLK = 0;if(SID) temp1++;}for(i=0;i<8;i++){temp2=temp2<<1;SCLK = 0;SCLK = 1;SCLK = 0;if(SID) temp2++;}return ((0xf0&temp1)+(0x0f&temp2));}/************************************************************** * 函数名称:Checkbusy()* 函数功能:液晶检测忙* 入口参数:无* 出口参数:无**************************************************************/ void Checkbusy( void ){do Sendbyte(0xfc); //11111,RW(1),RS(0),0 while(0x80&Receivebyte()); //BF(.7)=1 Busy}/************************************************************** * 函数名称:Writecommand()* 函数功能:发送的是控制指令(数据从LCD到MCU)* 入口参数:data 要写入的命令* 出口参数:无**************************************************************/ void Writecommand(uchar data){CS=1;Checkbusy();Sendbyte(0xf8); //表示发送的是控制命令Sendbyte(data&0xf0);Sendbyte((data&0x0f)<<4);CS=0;}/************************************************************** * 函数名称:Writedata()* 函数功能:向液晶写入数据* 入口参数:data 向液晶写入数据* 出口参数:无**************************************************************/void Writedata(uchar data){CS=1;Checkbusy();Sendbyte(0xfa); //表示发送的是数据Sendbyte(data&0xf0);Sendbyte((data&0x0f)<<4);CS=0;/************************************************************** * 函数名称:Locate_x_y()* 函数功能:光标定位x行y列* 入口参数:X,Y x行y列* 出口参数:无**************************************************************/ void Locate_x_y(uchar x,uchar y){uchar addr=0x80;Writecommand(0x80);switch(x){case 0: addr = 0x80 + y; break;case 1:addr=0x90+y;break;case 2:addr=0x88+y;break;case 3:addr=0x98+y;break;default:break;}Writecommand(addr);}/************************************************************** * 函数名称:Display_x_y_symbol()* 函数功能:以字码的形式写入一个中文* 入口参数:X,Y,data X行地址,Y列地址,data是字码* 出口参数:无**************************************************************/ void Display_x_y_symbol(uchar x,uchar y,uint data){uchar i,j;Locate_x_y(x,y);j=(uchar)(data);i=(uchar)(data>>8);Writedata(i);Writedata(j);}/************************************************************** * 函数名称:Write_string()* 函数功能:写入串数据* 入口参数:*s* 出口参数:无**************************************************************/ void Write_string(uchar *s)for(;*s!='\0';s++){Writedata(*s);}}/************************************************************** * 函数名称:Display_x_y_data()* 函数功能:光标定位x行y列写入字符串,自动换行* 入口参数:X,Y,data* 出口参数:无**************************************************************/void Display_x_y_data(uchar x,uchar y,uchar *data){Writecommand(AC_TABLE[8*x+y]);for(;*data!='\0';data++){if(y==16) //判断换行换行后重写地址{ //若不判断,则自动从第一行到第三行y=0;x++;if (x==4) x=0;Writecommand(AC_TABLE[8*x+y]);}Writedata(*data);y++;}}/************************************************************** * 函数名称:LcmClearTXT()* 函数功能:清文本区RAM数据* 入口参数:无* 出口参数:无**************************************************************/ void LcmClearTXT(){uchar i;Writecommand(0x30); //8BitMCU,基本指令集合Writecommand(0x80); //AC归起始位for(i=0;i<64;i++)Writedata(0x20); //地址归位}/************************************************************** * 函数名称:Init_12864()* 函数功能:初始化12864* 入口参数:无* 出口参数:无**************************************************************/ void Init_12864(void){delay_ms(50); //用延时代替读忙,以避免死机Writecommand(0x30); //8BitMCU,基本指令集合Writecommand(0x03); //AC归0,不改变DDRAM内容Writecommand(0x0C); //显示ON,游标OFF,游标位反白OFF Writecommand(0x01); //清屏,AC归0Writecommand(0x06); //写入时,游标右移动}#endif。
学习笔记:12864液晶模块的详细使用
学习笔记:12864液晶模块的详细使用备注:这篇文章是对12864操作的具体介绍,仅限刚接触12864的新手,大神请拍砖,文章写的较散,建议先参考12864手册及控制驱动器ST7920英文手册有个初步理解之后再阅读该篇文章,将会有更深的认识。
强烈建议阅读ST7920英文手册,细节内容里面有详细介绍,中文的12864也是从中译过来的。
本文分三个步骤介绍12864的内部资源原理,指令集详细讲解,以及应用例子。
对12864的所有操作概括起来有4种:1)、读忙状态(同时读出指针地址内容),初始化之后每次对12864的读写均要进行忙检测。
2)、写命令:所有的命令可以查看指令表,后续讲解指令的详细用法。
写地址也是写指令。
3)、写数据:操作对象有DDRAM、CGRAM、GDRAM。
4)、读数据:操作对象也是DDRAM、CGRAM、GDRAM。
对12864的学习首相要了解其内部资源,知道了它里面有哪些东西,你就可以更加方便的使用它。
先介绍几个英文的名字:DDRAM:(Data Display Ram),数据显示RAM,往里面写啥,屏幕就会显示啥。
CGROM:(Character Generation ROM),字符发生ROM。
里面存储了中文汉字的字模,也称作中文字库,编码方式有GB2312(中文简体)和BIG5(中文繁体)。
笔者使用的是育松电子的QC12864B,讲解以此为例。
CGRAM:(Character Generation RAM),字符发生RAM,,12864内部提供了64×2B的CGRAM,可用于用户自定义4个16×16字符,每个字符占用32个字节。
GDRAM:(Graphic Display RAM):图形显示RAM,这一块区域用于绘图,往里面写啥,屏幕就会显示啥,它与DDRAM的区别在于,往DDRAM中写的数据是字符的编码,字符的显示先是在CGROM中找到字模,然后映射到屏幕上,而往GDRAM中写的数据时图形的点阵信息,每个点用1bit来保存其显示与否。
12864串口时序及反白例程
LCD12864 (ST7920)串行通信1-原理图2.引脚定义描述VSS:液晶显示地(GND)。
VDD:液晶显示电源(+5V)。
CS:片选,使能信号,该引脚为高读写才能成功。
SID:数据信号。
SCLK:同步时钟信号,上升沿有效。
PSB:并「1/串II选择信号。
高电平定义为并I】,低电平定义为串「I通信。
/RST:复位信号,低电平有效。
LEDA:背光电源正。
LEDK:背光电源负。
3・通信协议1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24当PSB接低电位时,将进入串行传输模式。
主要用到CS、SCLK、SID三根线来实现: CS为片选使能SCLK为同步时钟信号,以SCLK上升沿接收1 BITSID为传输的数据从一个完整的串行传输流程来看,一开始先传输启始字节,根据定义启始字节前五位为“同步位”字符串(五个连续的“1”),此时传输计数将被重置并且串行传输将被同步, 再跟随的两个位字符串(第六、第七位)分别指定传输方向位(RW)及寄存器选择位(RS),最后第八位则为“0”。
再接收到包含同步位及RW和RS资料的启始字节后,每一个八位的指令(数据)将被分为两个字节发送接收:高4位(DE7〜DB4)的数据将会被放在第一个字节的LSB部分,而低4位(DB3〜DB0)的数据会被放在第二个字节的LSB部分,至于相关的另四位则以“0”填充。
第一个字节:启始字节,格式Uli 1ABCA传输方向位RW, H表示LCD->MCU, L表示MCU->LCDB数据类型位RS, H表示显示数据,L表示控制指令C固定为0第二个字节:(并行)8位数据的高4位,格式D7~D4 0000第三个字节:(并行)8位数据的低4位,格式0000D3~D0 因为串行通信的数据是以位为单位进行传输,所以只要在每位数据的传输过程中适当的添加一段延时基本上就能保证数据收发成功。
12864串口通信编程程序实例
lcd_dis_code(0x88,5,lcd5);
lcd_dis_code(0x8c,5,lcd6);
lcd_dis_code(0x98,5,lcd7);
STMotorINT(); //步进电机脉冲初始化函数
//
Start_ADval=ReadCount();
//
ZLtemp=Start_ADval;
wddelay1(); if (io==1) {
ttemp = 1; count = 2; while(io && count++); } else ttemp = 0; data_byte<<=1; data_byte|=ttemp; } return (data_byte); }
void read_io()//开始信号,读数据并校验 {
/**********************DHT11模块**********************/ uchar receive_byte()//接收一个字节 {
uchar i,ttemp; for(i=0;i<8; i++) {
count = 2; while((!io) && count++)//等待50us低电平结束,并防止死循环 ttemp = 0; wddelay1(); wddelay1();
write_data(ZLtemp/100%10+0x30); write_data(ZLtemp/10%10+0x30); write_data(ZLtemp%10+0x30); write_data(0x67); ZLtemp=0;
} }
void lcd_pos(unsigned char X,unsigned char Y) {
12864串口程序
4.串口程序5.6.PSB接低时,串口模式被选择。
在该模式下,只用两根线(SID与SCLK)来完成数据传输。
当同时使用多颗ST7920时,CS线被配合使用,CS 是高有效。
ST7920 的他不时钟SCLK 有独立的操作时序,当多个连续的指令需要被送入时,指令执行时间需要被考虑。
必须等待上一个指令执行完毕才送入下一个指令,因为ST7920内部没有传送/接收缓冲区一个完整的串行传输周期由一下部分组首先送入启动字节,送入5 个连续的“数被重置,并且串行传输被同步。
紧接的两是写)和传输性质(RS,确定是命令寄存器一个“0” 。
送完启动字节之后,可以送入指令或是者代码是以字节为单位的,每个字节的内容字节来处理:高四位放在第一个字节的高四无关位都补“0” 。
请参照第四章串行通讯时示例程序如下:;*************************************;CONTROLLER:ST7920(串行接口);128×64点阵;EDITOR: JACK;CRYSTAL:12MHz;CS=P3.0 SID=P3.1 SCLK=P3.2;**************************************CS EQU P3.0 ;H=DA TA,L=COM SID EQU P3.1 ;H=READ,L=WRITESCLK EQU P3.2 ;COM EQU 30H ;控制字暂存单元DAT EQU 31H ;显示数据暂存单元CODER EQU 32H ;字符代码暂存单元ADDR EQU 33H ;地址暂存单元ORG 0000HAJMP MAINORG 0030HMAIN:MOV SP,#60HLCALL DEL_40MSLCALL INIMOV ADDR,#80HMOV DPTR,#WEL_1LCALL W_LINEMOV ADDR,#90HMOV DPTR,#WEL_2LCALL W_LINEMOV ADDR,#88HMOV DPTR,#WEL_3LCALL W_LINEMOV ADDR,#98HMOV DPTR,#WEL_4LCALL W_LINELCALL DEL_1500MSMOV ADDR,#80HMOV DPTR,#WEL_5LCALL W_LINEMOV ADDR,#90HMOV DPTR,#WEL_6LCALL W_LINEMOV ADDR,#88HMOV DPTR,#WEL_7LCALL W_LINEMOV ADDR,#98HMOV DPTR,#WEL_8LCALL W_LINELCALL DEL_1500MSMOV ADDR,#80H ;MOV DPTR,#HZ_1 ;LCALL W_LINEMOV ADDR,#90H ;MOV DPTR,#HZ_2 ;LCALL W_LINEMOV ADDR,#88H ;MOV DPTR,#HZ_3 ;LCALL W_LINEMOV ADDR,#98H ;MOV DPTR,#HZ_4 ;LCALL W_LINELCALL DEL_1500MS ;延时后显示下一页MOV ADDR,#80H ;MOV DPTR,#HZ_5 ;LCALL W_LINEMOV ADDR,#90H ;MOV DPTR,#HZ_6 ;LCALL W_LINEMOV ADDR,#88H ;MOV DPTR,#HZ_7 ;LCALL W_LINEMOV ADDR,#98H ;MOV DPTR,#HZ_8 ;LCALL DEL_1500MSLJMP MAININI:MOV COM,#30H ;功能设定,基本指令LCALL WCOMMOV COM,#30H ;基本指令,8-bit模式,基本指令LCALL WCOMMOV COM,#0CH ;显示开,游标关,反白关LCALL WCOMMOV COM,#01H ;清除显示LCALL WCOMMOV COM,#06H ;进入设定点,游标7右移,画面不移动LCALL WCOMRETW_LINE:MOV COM,ADDRLCALL WCOMMOV R4,#16 ;连续写入8个中文或者16个西文字符W_L1:MOV A,#00HMOVC A,@A+DPTRMOV CODER,ALCALL WCODEINC DPTRDJNZ R4,W_L1RETWCOM:LCALL STWCMOV A,COMLCALL W4_D ;送入高四位指令LCALL W4_0 ;连续送入四个0LCALL W4_D ;送入高四位指令LCALL W4_0 ;连续送入四个0CLR CSLCALL DEL_2MSRETWCODE:LCALL STWDMOV A,CODERLCALL W4_0LCALL W4_DLCALL W4_0CLR CSLCALL DEL_2MSRETSTWC:SETB CSSETB SIDMOV R3,#5 ;连续送入5个"1",起始STWC1:SETB SCLKCLR SCLKDJNZ R3,STWC1CLR SIDMOV R3,#3STWC2:SETB SCLK ;RW=0,RS=0,第八位"0"CLR SCLKDJNZ R3,STWC2RETSTWD:SETB CSSETB SIDMOV R3,#5 ;连续送入5个"1",起始STWD1:SETB SCLKCLR SCLKDJNZ R3,STWD1CLR SID ;RW=0SETB SCLKCLR SCLKSETB SID ;RS=1SETB SCLKCLR SCLKCLR SID ;第八位"0"SETB SCLKCLR SCLKRETW4_D:MOV R3,#4W4_D1:RLC AMOV SID,CSETB SCLKCLR SCLKDJNZ R3,W4_D1RETW4_0:MOV R3,#4W4_01:CLR SIDSETB SCLKCLR SCLKDJNZ R3,W4_01RETDEL_2MS:MOV R0,#2D1:MOV R1,#200D2:NOPNOPNOPDJNZ R1,D2DJNZ R0,D1RETDEL_40MS:MOV R2,#20D3:LCALL DEL_2MSDJNZ R2,D3RETDEL_200MS:MOV R2,#100 D4:LCALL DEL_2MSDJNZ R2,D4RETDEL_500MS:MOV R2,#250D5:LCALL DEL_2MSDJNZ R2,D5RETDEL_1500MS:LCALL DEL_500MSLCALL DEL_500MSLCALL DEL_500MSRETWEL_1:DB "WWW.Y AB_" WEL_2:DB "欢迎使用亚斌液晶"WEL_3:DB "086-755-28072527"WEL_4:DB "支持图形和文本显"WEL_5:DB "示,可显示8X4 行" WEL_6:DB "共32 个中文,内带" WEL_7:DB "标准中文字库,内"WEL_8:DB "含8192个中文字型"HZ_1:DB " 桃夭"HZ_2:DB "诗经·国风·周南"HZ_3:DB "桃之夭夭灼灼其华"HZ_4:DB "之子于归宜其室家"HZ_5:DB "桃之夭夭有蕡其实"HZ_6: DB "之子于归宜其家室" HZ_7:DB "桃之夭夭其叶蓁蓁"HZ_8:DB "之子于归宜其家人"END。
12864串行使用说明
LCM128645ZK使用说明
1.综述
LCM128645ZK为带中文字库图形点阵液晶显示模块。
其液晶屏幕为128*64,可显示四行,每行可显示8个汉字。
其背光为蓝色,字符为白色中文液晶显示模块LCM128645ZK的字型ROM内含8192个16*16点中文字型和128个16*8半宽的字母符号字型;另外绘图显示画面提供一个64*256点的绘图区域GDRAM;而且内含CGRAM提供4组软件可编程的16*16点阵造字功能。
通过
2.电气特性
3.引脚定义:
4.硬件电路的连接
3.1串并行工作方式的选择
串并行工作方式的选择通过改接模块背面短路电阻来完成。
当PSB脚接低电位(模块背面S/P的短路电阻在“S”侧),模块将进入串行模式;在串行模式下将使用二条传输线作串行资料的传送,主控制系统将配合传输同步时钟(SCLK)与接收串行数据线(SID),来完成串行传输的动作。
不可在不改接短路电阻的情况下将此引脚直接引线改接低电平。
短路电阻位置如图所示:
3.2外部硬件电路(串行工作方式)
串行工作电路如下图所示:并行传输的RS信号作为片选CS信号直接接高电平,读写选择R/W作为串行数据输入SID,读写使能信号作为串行输入时钟信号。
VO与VOUT引脚跨接10K电位器以调节液晶对比度。
RST复位信号可悬空。
背光电源阳极A需接+5V。
数据输入端3.3V高电平可正常驱动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(sid) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
clk = 0;
}
}
void send_dat(U8 dat)
{
U8 i;
for(i=0;i<8;i++)
{
clk=0;
dat<<=1;
sid=CY;
clk=1;
}
}
U8 get_byte()
}
{
U8 i,temp1=0,temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
clk = 0;
clk = 1;
send_dat((cmd&0x0f)<<4); //
}
void write_char(U8 dat)
{
check_busy();
send_dat(0xfa);//rw=0;rs=1
send_dat(dat&0xf0);
send_dat((dat&0x0f)<<4);
/* 液晶12864并口通信要8根数据线,en,rw,rs和电源正负线,要连一大堆线,用起来很不爽,学会用串口通信成了必然。下面是12864的串口通信传输数据,连电源线一起总共才需要4根线,多爽!(记住:一定要把PSB接低电平,把RS接高电平) */
#include<reg52.h>
#define U8 unsigned char
{
do
{
send_dat(0xfc);
}
while(get_byte()&0x80);
}
void send_cmd(U8 cmd)
{
check_busy();
send_dat(0xf8); //
send_dat(cmd&0xf0); //
lcd_pos(3,4);
write_char('c');
write_char('d');
lcd_wstr(4,0,"*****!!!--*****");
delayms(2000);
lcd_clear();
}
if(5==i)i--;
if(i==4)send_data(0x30);//数据装完,准备发送
for(j=i;j<5;j++)
{
send_data(d[j]|0x30);//取得的数字加上0x30也即得到该数字的ASCII码,再将该数字发送去显示
lcd_wstr(1,0,"床前明月光");
lcd_wstr(2,1,"疑是地上霜");
lcd_wstr(3,1,"举头望明月");
lcd_wstr(4,1,"低头思故乡");
delayms(2000);
}
clk = 1;
clk = 0;
if(sid) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2)))
{
lcd_clear();
lcd_wstr(1,0,"桂林电子科技大学");
lcd_wstr(2,1,"机电工程学院");
lcd_pos(3,0);
write_char('a');
write_char('b');
default:break;
}
}
void lcd_wstr(U8 y_add , U8 x_add , U8 *str) //
{
U8 i;
lcd_pos(y_add , x_add);
for(i=0;str[i]!='\0';i++)
#define U16 unsigned int
sbit clk=P3^0;
sbit sid=P3^1;
void delayms(U16 ms)
{
U16 i;
for(;ms>0;ms--)
{
for(i=124;i>0;i--);
send_cmd(0x02);//0000,0010 DDRAM地址归位
send_cmd(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器A
}
main()
{
P0=0xff;
lcd_init();
while(1)
case 2:
send_cmd(0X90|x_add);break;
case 3:
send_cmd(0X88|x_add);break;
case 4:
send_cmd(0X98|x_add);break;
d[4]=figer%10;
d[3]=figer%100/10;
d[2]=figer%1000/100;
d[1]=figer%10000/1000;
d[0]=figer/10000;
for(i=0;i<5;i++)
{
if(d[i]!=0)break;
}
}
void lcd_init() //
{
delayms(1);
send_cmd(0x30);
send_cmd(0x0C);//0000,1100 整体显示,游标off,游标位置off
send_cmd(0x01);//0000,0001 清DDRAM
{
write_char(str[i]);
}
}
void write_figer(uchar y_add , uchar x_add , uint figer)//在任何位置写数字
{
uchar d[5],i,j;
lcd_pos(y_add , x_add);
}
void lcd_clear() //清除显示
{
send_cmd(0x01);
}
void lcd_pos(U8 y_add , U8 x_add)
{
switch(y_add)
{
case 1:
send_cmd(0X80|x_add);break;