12864串行传输,所有功能函数(包括绘图)

合集下载

12864液晶串行驱动函数

12864液晶串行驱动函数
12864 液晶串行驱动函数
#include <reg52.h> #include <intrins.h> #include <stdio.h> #include <math.h> #define uchar unsigned char #define uint unsigned int sbit CS = P2^4; sbit SCK = P2^6; sbit SID = P2^5; sbit RST =P2^3; sbit PSB= P2^1; sbit key=P3^0; uchar code 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, };
********************** * 函数名称 :WriteCommand ********************************************************************* *********************/ void WriteCommand(uchar Cbyte ) { CS = 1; CheckBusy(); SendByte(0xf8); //11111,RW(0),RS(0),0 SendByte(0xf0&Cbyte); //高四位 SendByte(0xf0&Cbyte<<4);//低四位(先执行<<) CS = 0; } /******************************************************************** ********************** * 函数名称 :WriteData ********************************************************************* *********************/ void WriteData(uchar Dbyte ) { CS = 1; CheckBusy(); SendByte(0xfa); //11111,RW(0),RS(1),0 SendByte(0xf0&Dbyte); //高四位 SendByte(0xf0&Dbyte<<4);//低四位(先执行<<) CS = 0; } /******************************************************************** ********************** * 函数名称 :ReadData ********************************************************************* *********************/ uchar ReadData( void ) { CheckBusy(); SendByte(0xfe); //11111,RW(1),RS(1),0 return ReceiveByte(); } /***************************************** Fucntion: delay10US(char x) Description: delay for 10 us Parameter: x Author: kassey@ Date: July,7th,2005

lcd12864中文资料汇总(12864引脚说明及功能

lcd12864中文资料汇总(12864引脚说明及功能

lcd12864中文资料汇总(12864引脚说明及功能lcd12864简介带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。

利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字。

也可完成图形显示。

低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

lcd12864基本特性参数(1)低电源电压(VDD:+3.0--+5.5V)(2)显示分辨率:128×64点(3)内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)(4)内置128个16×8点阵字符(5)2MHZ时钟频率(6)显示方式:STN、半透、正显(7)驱动方式:1/32DUTY,1/5BIAS(8)视角方向:6点(9)背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10(10)通讯方式:串行、并口可选(11)内置DC-DC转换电路,无需外加负压(12)无需片选信号,简化软件设计(13)工作温度:0℃-+55℃,存储温度:-20℃-+60℃lcd12864引脚图及功能1VSS-模块的电源地2VDD-模块的电源正端3V0-LCD驱动电压输入端4RS(CS)H/L并行的指令/数据选择信号;串行的片选信号5R/W(SID)H/L并行的读写选择信号;串行的数据口6E(CLK)H/L并行的使能信号;串行的同步时钟7DB0H/L数据08DB1H/L数据19DB2H/L数据210DB3H/L数据311DB4H/L数据412DB5H/L数据513DB6H/L数据614DB7H/L数据715PSBH/L并/串行接口选择:H-并行;L-串行16NC空脚17/RETH/L复位低电平有效18NC空脚19LED_A(LED+5V)背光源正极20LED_K(LED-OV)背光源和负极控制器接口信号说明1、RS,R/W的配合选择决定控制界面的4种模式:2、E信号●忙标志:BFBF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据。

12864液晶 串行口传输进行图象显示程序-C语言

12864液晶 串行口传输进行图象显示程序-C语言

12864液晶串行口传输进行图象显示程序-C语言#include <reg52.h>#define uint unsigned int#define uchar unsigned char#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1sbit std = P2^1;sbit sclk = P2^2;uchar code tab1[]={"本系列中文模块内""任意位置反白显示""置二级字库,可在""使用更方便更灵活"};uchar code tab32[]={/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0, 0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0, 0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60, 0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30, 0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90, 0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90, 0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0, 0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uchar code tab5[]={/*-- 调入了一幅图像:F:\梁\画图\COCK.bmp --*//*-- 宽度x高度=128x64 --*/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, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x04, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x01, 0xC2, 0x01, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7C, 0x00, 0x79, 0x80, 0x00, 0x00, 0x80, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x78, 0x01, 0xBC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x80, 0x00, 0x00, 0x01, 0xFC, 0x03, 0x31, 0x0C, 0x01, 0x1C, 0x0D, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x80, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x01, 0x04, 0x13, 0x18, 0x18, 0xC0, 0x00, 0x00, 0x7C, 0x40, 0x80, 0x00, 0x00, 0x38, 0x00, 0x06, 0x01, 0x06, 0x12, 0x18, 0x10, 0x45, 0xC0, 0x0F, 0xC0, 0x40, 0x80, 0x00, 0x01, 0xE8, 0x00, 0x04, 0x01, 0x02, 0x12, 0x30, 0x20, 0xC7, 0x38, 0x00, 0x00, 0x40, 0x80, 0x00, 0x1E, 0x04, 0x00, 0x06, 0x01, 0x02, 0x12, 0x30, 0xE0, 0x86, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x10, 0x04, 0x00, 0x03, 0x01, 0x02, 0x32, 0x50, 0x7F, 0x8C, 0x00, 0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x04, 0x00, 0x01, 0xC1, 0x06, 0x23, 0xD8, 0x40, 0x0C, 0x00, 0x00, 0x00, 0x60, 0x40, 0x00, 0x01, 0x04, 0x00, 0x00, 0x63, 0x0C, 0x20, 0x08, 0x40, 0x18, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x01, 0x04, 0x70, 0x00, 0x22, 0x10, 0x60, 0x00, 0x30, 0x18, 0x00, 0x00, 0x01, 0xC0, 0x40, 0x40, 0x01, 0x07, 0xC0, 0x00, 0x23, 0xE0, 0x00, 0x00, 0x0F, 0x18, 0x00, 0x00, 0x06, 0x40, 0x40, 0x80, 0x01, 0x04, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x40, 0x61, 0x80, 0x01, 0x04, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x40, 0x21, 0x00, 0x01, 0x04, 0x00, 0x07, 0x82, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x40, 0x23, 0x00, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x40, 0x26, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x04, 0x40, 0x14, 0x00, 0x07, 0x86, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x40, 0x18, 0x00, 0x04, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x38, 0x10, 0x18, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0xE8, 0x20, 0x30, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x8C, 0x20, 0x60, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x70, 0x00, 0x08, 0x01, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x0F, 0x80, 0x08, 0x01, 0x39, 0xF3, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x70, 0x10, 0x01, 0x6F, 0x16, 0x14, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x01, 0xCC, 0x14, 0x34, 0x66, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x24, 0xF8, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x67, 0xB0, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 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, 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, 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 (uint us) //delay time{while(us--);}//**************************************//**************************************void delay1 (uint ms){uint i,j;for(i=0;i<ms;i++)for(j=0;j<15;j++)delay(1);}//**************************************/*---------------------------------------*///我发现在读指令码的时候,程序先调用了6位的低电平,然再在1调用了10位的指令码。

LCM12864ZS系列液晶模块使用手册及例程

LCM12864ZS系列液晶模块使用手册及例程
void SPI_Low(void)//低速模式
{
setbit(SPCR,SPE);//SPI使能
setbit(SPCR,MSTR); //SPI主机
setbit(SPCR,SPR1); //SCK=fosc/128
setbit(SPCR,SPR0);
clrbit(SPSR,SPI2X);
//setbit(SPCR,CPOL); //模式2,空闲时高电平
#define CS_DDR DDRB
#define CS_PORT PORTB
#define CS_BIT 0
#define SCK_DDR DDRB
#define SCK_PORT PORTB
#define SCK_BIT 1
#define MOSI_DDR DDRB
#define MOSI_PORT PORTB
LCM12864-05
将箭头所指的晶振的一个脚对地短接,再接通电源,进入模块测试功能,正常时会显示不同点阵的字符
//液晶模块测试程序
//MCU:ATmega128
//晶振:11.0592
//编译器:IARAVR 5.3
#include <iom128.h>
#define testbit(var, bit) ((var)&(1<<(bit))) //测试位
0002---12*24字体
0003---16*32字体
b3~b0:字符颜色选择
0000---白色
0001---黑色
0x82
汉字设置
void FontHZ(unsigned char data)
Data取值:
b7~b4:字符大小选择
0000---16*16字体

带字库12864超详细扩展操作,写自定义字符,画图,画直线,画圆,读取数据等操作

带字库12864超详细扩展操作,写自定义字符,画图,画直线,画圆,读取数据等操作

在此指出,这一篇文章出至网络上zhaoshan413之手,感谢他的无私贡献,让大家轻松玩转带字库12864!~~[p=30, 2, left]之前说学完12864字库液晶后和大家交流一下心得,一直没有时间,今天整理一下发上来,希望对想学习的朋友能有点帮助…首先说明一点,本人也是初学者,自感水平不高,若有不足及不对之处,望情指正…以下以并行口传输为例,别的还不会,呵呵![/p][p=30, 2, left]先传一下ST7920的芯片说明书:[/p][p=30, 2, left]/bbs/redirect.php?tid=7676&goto=lastpo st#lastpost[/p][p=30, 2, left]ST7920(字库)12864.pdf(2010-12-01 10:46:58, Size: 1.65 MB, Downloads: 1689)[/p][p=30, 2, left]一、首先说一下关于驱动函数的书写,这些是液晶显示的基础一般包括四个函数:1、写命令函数;2、写数据函数;3、读状态函数;4、读数据函数;这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。

另外关于读状态函数,其实也就是用于判忙操作,我看郭天祥的书里面是这样说的:原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。

因此,读状态函数也可以不写,只用简短的延时函数替换即可。

1、写操作的编写:首先看一下时序图[/p][p=30, 2, left]时序.JPG[/p][p=30, 2, left]由图可见操作很简单:1>RS=1(写数据操作);或者RS=0(写命令操作);2>RW=0;//指明为写操作3>E=1;4>DB=data;//data为你要写入的命令或数据值5>E=0;[/p][p=30, 2, left]以下是我的驱动函数,仅供参考:[/p][p=30, 2, left]CODE:/********************************液晶端口定义**************************/#define lcd_data P0 //数据口sbit RS = P2^4; //选择寄存器(并行) 0:指令寄存器1:数据寄存器;sbit RW = P2^5; //读写控制脚(并行) 0:写入 1:读出sbit E = P2^6; //读写数据启始脚(并行)sbit PSB = P2^1; //串并方式选择引脚,0为串行模式,1为8/4位数据口模式sbit RST = P2^3; //复位引脚//******************************************************* *//延时函数//******************************************************* *void delay(unsigned int k){unsigned int i;unsigned char j;for(i=0;i<k;i++){for(j=0;j<10;j++);}}//******************************************************* *//延时1ms函数//******************************************************* *void delay_ms(unsigned int k)//延时0.994us,晶振12M{unsigned int x,y;for(x=k;x>0;x--)for(y=121;y>0;y--);}//******************************************************* *//写命令函数//******************************************************* *void LcdWcom(unsigned char WCom){delay(1);RS=0; //指明操作对象为指令寄存器RW=0; //指明为写操作E=1;lcd_data=WCom; //将命令写入总线E=0;}//******************************************************* *//写数据函数//******************************************************* *void LcdWdata(unsigned char WData){delay(1);RS=1; //指明操作对象为数据寄存器RW=0; //指明为写操作E=1;lcd_data=WData; //将数据写入总线E=0;}[/p][p=30, 2, left]二、初始化操作[/p][p=30, 2, left]以8位并行操作为例,操作流程图如下:[/p][p=30, 2, left]初始化.JPG[/p][p=30, 2, left]初始化操作如下:[/p][p=30, 2, left]1>芯片上电;[/p][p=30, 2, left]2>延时40ms以上;[/p][p=30, 2, left]3>复位操作:RST出现一个上升沿(RST=1;RST=0;RST=1;);[/p][p=30, 2, left]4>功能设定;[/p][p=30, 2, left]5>延时100us以上;[/p][p=30, 2, left]6>再次进行功能设定;[/p][p=30, 2, left]7>延时37us;[/p][p=30, 2, left]8>显示开关控制;[/p][p=30, 2, left]9>延时100us 以上;[/p][p=30, 2, left]10>清除显示;[/p][p=30, 2, left]11>延时10ms以上;[/p][p=30, 2, left]12>进入点设置;[/p][p=30, 2, left]13>初始化结束;[/p][p=30, 2, left]这里我遇到了一个小问题,我的液晶按照这个顺序进行初始化结果不正确,无法显示,最后我把调整了一下就可以了,调整后的顺序为:清除显示进入点设置显示开关控制,不知道是什么原因,知道的告诉我一声…[/p][p=30, 2, left]CODE://******************************************************* *//显示初始化函数//******************************************************* *void Display_Init(void){delay_ms(45); //延时45msPSB=1; //8位并行口//复位操作RST=1;delay(1);RST=0;delay(1);RST=1;delay(1);//功能设定LcdWcom(0x30); //设置为8位并行口,基本指令集delay(10);LcdWcom(0x30); //再次设置为8位并行口,基本指令集delay(5);// //显示开关控制// LcdWcom(0x0c); //游标显示关,正常显示,整体显示开// delay(10);//清除显示LcdWcom(0x01);delay_ms(12); //延时12ms//进入点设置LcdWcom(0x06); //设置为游标右移,DDRAM位地址加1,画面不移动delay(5);LcdWcom(0x0C); //开显示}[/p][p=30, 2, left]三、显示基本的字符和汉字[/p][p=30, 2, left]1、要想显示汉字或字符,首先要确定显示的位置,看看芯片说明书上关于屏幕地址的分配:[/p][p=30, 2, left]DDRAM位址.JPG[/p][p=30, 2, left]由于此液晶为128*64,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。

12864函数总结

12864函数总结

一.初始化函数!/**********************************1.初始化函数!//**********************************void init(){writecmd(0x30);delayms(1);writecmd(0x30);delayms(1);writecmd(0x0c);delayms(1);writecmd(0x01);delayms(1);writecmd(0x06);delayms(1);}2.初始化LCDvoid init(){write_com(0x30); //基本指令, 扩充指令为34Hwrite_com(0x0c); //显示开, 关光标write_com(0x01); //清屏delaym(10);}二.判忙函数1.检测LCD是否处于忙状态, 若忙返回1, 空闲返回0bit checkBusy(){bit busy;RS = 0;RW = 1;E = 1;delayu();busy = (bit)(LCD_DATA&0x80);E = 0;return busy ;}2.等待LCD到空闲void wait(){while(checkBusy());}三.数据读写函数1.写命令void write_com(uchar cmd){wait();RS = 0;RW = 0;E = 0;LCD_DATA = cmd;delayu();E = 1;E = 0;}2.写数据void write_data(uchar dat){wait();RS = 1;RW = 0;E = 0;LCD_DATA = dat;delayu();E = 1;E = 0;}3.读数据uchar read_data(void){uchar dsp_data;wait();LCD_DATA=0xFF;RS = 1;RW = 1;E=0;E=1;delayu();dsp_data=LCD_DATA;E = 0;return(dsp_data);}四.填充液晶DDRAM全为空格//***********************************//填充液晶DDRAM全为空格//**********************************void clrram_lcd (void){wr_i_lcd(0x30);wr_i_lcd(0x01);}五.指定要显示字符的坐标//********************************//指定要显示字符的坐标//*******************************void gotoxy(unsigned char y, unsigned char x){if(y==1)writecmd(0x80|x);if(y==2)writecmd(0x90|x);if(y==3)writecmd((0x80|x)+8);if(y==4)writecmd((0x90|x)+8);}六.液晶显示字符串程序/**********************************//液晶显示字符串程序//**********************************void print(uchar *str){while(*str!='\0'){writedate(*str);str++;}}七.指定要显示字符的坐标和字!或字节!/**********************************//指定要显示字符的坐标和字!或字节!//**********************************void disoneword( uchar x,uchar y,uint word) //此word如disoneword(2,0,0xb5a5); 0xb5a5为一个“单”字!!{uchar ah,al;if(x==0)ah=0x80;else if(x==1)ah=0x90;else if(x==2)ah=0x88;else ah=0x98;al=ah+y;writecmd(al);writedate((word&0xff00)>>8);writedate(word&0xff);}/**********************************//指定要显示字符的坐标和字!或字节!222222//**********************************void write_sfm(uchar x,uchar y,uchar shu) //shu经处理后见函数!!!!{uchar d1,d2,add,ah;d1=shu/10;d2=shu%10;if(x==0)ah=0x80;else if(x==1)ah=0x90;else if(x==2)ah=0x88;else ah=0x98;add=ah+y; //相当于ah+alwritecmd(add);writedate( d1+'0');writedate( d2+'0');}八.控制液晶显示汉字/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/void Disp_HZ(uchar addr,const uchar * pt,uchar num){uchar i;writecmd(addr);for(i = 0;i < (num*2);i++)writedata(*(pt++));}1.显示一个16*16大小的图形/*******************************************函数名称: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); //回到基本指令集模式}#include<LCD12864_12.h>void delayu(){_nop_();}//延时a * 1msvoid delaym(uint a){uint i, j;for(i = a; i > 0; i--)for(j = 110; j > 0; j--);}//初始化LCDvoid init(){write_com(0x30); //基本指令, 扩充指令为34Hwrite_com(0x0c); //显示开, 关光标write_com(0x01); //清屏delaym(10);}void setPosition(uchar x, uchar y){uchar p;switch(y%4){case 0: p = 0x80; break; //第一行开始地址case 1: p = 0x90; break; //第二行case 2: p = 0x88; break; //第三行case 3: p = 0x98; break; //第四行}p += x;write_com(p);}void writestring(uchar * str){uchar i = 0;while(str[i] != '\0'){write_data(str[i++]);}}void lcd_DisplayImage(unsigned char *str){unsigned char i;unsigned char j;unsigned char k;unsigned char bGDRAMAddrX = 0x80; //GDRAM水平地址unsigned char bGDRAMAddrY = 0x80; //GDRAM垂直地址for(i = 0; i < 2; i++) // 在绘图GDRAM中写满屏图片数据{for(j = 0; j < 32; j++){for(k = 0; k < 8; k++){write_com(0x34);write_com(bGDRAMAddrY + j);//垂直地址write_com(bGDRAMAddrX + k);//水平地址write_com(0x30);write_data(*str++);write_data(*str++);}}bGDRAMAddrX = 0x88;}write_com(0x36);write_com(0x30);}2.任意坐标写汉字void write_sfm(uchar x,uchar y,uchar date){uchar shi,ge;shi=date/10;ge=date%10;switch(y){case 0:{write_com(0x80+x);write_data(0x30+shi);write_data(0x30+ge);}break;case 1:{write_com(0x90+x);write_data(0x30+shi);write_data(0x30+ge);}break;case 2:{write_com(0x88+x);write_data(0x30+shi);write_data(0x30+ge);}break;case 3:{write_com(0x98+x);write_data(0x30+shi);write_data(0x30+ge);}break;}}3.点显示子程序//*************点显示子程序************************//*** 0<=x<=127表示横坐标,0<=y<=63表示纵坐标colour=0表示删除点colour=1表示现实点void lcd_DisplayDot(uchar x,uchar y,uchar colour){uchar i,j,l,h,h1,l1;unsigned char bGDRAMAddrX = 0x80; //GDRAM水平地址unsigned char bGDRAMAddrY = 0x80;if(y>31){y-=32;bGDRAMAddrX = 0x88;}i=x/16;j=15-(x%16);k=k<<j;l=0xff&k;h=0xff&(k>>8);write_com(0x34);write_com(bGDRAMAddrY + y);//垂直地址write_com(bGDRAMAddrX + i);//水平地址write_com(0x30);read_data();h1=read_data();l1=read_data();write_com(0x34);write_com(bGDRAMAddrY + y);//垂直地址write_com(bGDRAMAddrX + i);//水平地址write_com(0x30);if(colour==0){write_data((~h)&h1);write_data((~l)|l1);}else{write_data(h|h1);write_data(l|l1);}write_com(0x36);write_com(0x30);}4.画横直线void lcd_DisplayHLine(unsigned char x0, unsigned char x1, unsigned char y, unsigned char color) {unsigned char bak;if(x0>x1) // 对x0、x1大小进行排列,以便画图{x1 = x0;x0 = bak;}do{lcd_DisplayDot(x0, y, color); // 从左到右逐点显示,描出垂直线x0++;}while(x1>=x0);}5.画纵直线void lcd_DisplayRLine(unsigned char x, unsigned char y0, unsigned char y1, unsigned char color) {unsigned char bak;if(y0>y1) // 对y0、y1大小进行排列,以便画图{bak = y1;y1 = y0;y0 = bak;}do{lcd_DisplayDot(x, y0, color); // 从上到下逐点显示,描出垂直线y0++;}while(y1>=y0);}6.画任意一直线void lcd_DisplayLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color){unsigned char bak;char dx; // 直线x轴差值变量char dy; // 直线y轴差值变量char dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向char dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向char dx_x2; // dx*2值变量,用于加快运算速度char dy_x2; // dy*2值变量,用于加快运算速度char di; // 决策变量dx = x1-x0; // 求取两点之间的差值dy = y1-y0;if(x0==x1) //判断是否为垂直线{lcd_DisplayRLine(x0,y0,y1,color); //画垂直线return;}if(y0==y1) //判断是否为水平线{lcd_DisplayHLine(x0,x1,y0,color); //画水平线return;}dx = x1-x0; // 求取两点之间的差值dy = y1-y0;/* 判断增长方向,或是否为水平线、垂直线、点*/ if(dx>0) // 判断x轴方向{dx_sym = 1; // dx>0,设置dx_sym=1}else{if(dx<0){dx_sym = -1; // dx<0,设置dx_sym=-1 }else{// dx==0,画垂直线,或一点lcd_DisplayRLine(x0, y0, y1, color);return;}}if(dy>0) // 判断y轴方向{dy_sym = 1; // dy>0,设置dy_sym=1}else{if(dy<0){dy_sym = -1; // dy<0,设置dy_sym=-1 }else{// dy==0,画水平线,或一点lcd_DisplayHLine(x0, y0, x1, color);return;}}/* 将dx、dy取绝对值*/dx = dx_sym * dx;dy = dy_sym * dy;/* 计算2倍的dx及dy值*/dx_x2 = dx*2;dy_x2 = dy*2;/* 使用Bresenham法进行画直线*/if(dx>=dy) // 对于dx>=dy,则使用x轴为基准{di = dy_x2 - dx;while(x0!=x1){lcd_DisplayDot(x0, y0, color);x0 += dx_sym;if(di<0){di += dy_x2; // 计算出下一步的决策值}else{di += dy_x2 - dx_x2;y0 += dy_sym;}}lcd_DisplayDot(x0, y0, color); // 显示最后一点}else // 对于dx<dy,则使用y轴为基准{di = dx_x2 - dy;while(y0!=y1){lcd_DisplayDot(x0, y0, color);y0 += dy_sym;if(di<0){di += dx_x2;}else{di += dx_x2 - dy_x2;x0 += dx_sym;}}lcd_DisplayDot(x0, y0, color); // 显示最后一点}}7.填充矩形函数void lcd_DisplayRectangleFill(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char color){unsigned char i;if(x0>x1) // 若x0>x1,则x0与x1交换{i = x0;x0 = x1;x1 = i;}if(y0>y1) // 若y0>y1,则y0与y1交换{i = y0;y0 = y1;y1 = i;}//判断是否只是直线if(y0==y1){lcd_DisplayHLine(x0,x1,y0,color);return;}if(x0==x1){lcd_DisplayRLine(x0,y0,y1,color);return;}while(y0<=y1){lcd_DisplayHLine(x0,x1,y0,color); // 当前画水平线y0++; // 下一行}}8.画圆函数void lcd_DisplayCircle(unsigned char x0,unsigned char y0,unsigned char r,unsigned char color) {char a,b;char di;if(r>31 ||r==0) return; //参数过滤,次液晶显示的最大圆半径为31a=0;b=r;di=3-2*r; //判断下个点位置的标志while(a<=b){lcd_DisplayDot(x0-b,y0-a,color); //3lcd_DisplayDot(x0+b,y0-a,color); //0lcd_DisplayDot(x0-a,y0+b,color); //1lcd_DisplayDot(x0-b,y0-a,color); //7lcd_DisplayDot(x0-a,y0-b,color); //2lcd_DisplayDot(x0+b,y0+a,color); //4lcd_DisplayDot(x0+a,y0-b,color); //5lcd_DisplayDot(x0+a,y0+b,color); //6lcd_DisplayDot(x0-b,y0+a,color);a++;/***使用Bresenham算法画圆**/if(di<0)di +=4*a+6;else{di +=10+4*(a-b);b--;}lcd_DisplayDot(x0+a,y0+b,color);}}。

12864中文图形点阵液晶显示模块使用说明书

12864中文图形点阵液晶显示模块使用说明书

72us
读出 RAM
的值
1 1 D7
D6
D5
D4
D3
D2
D1
D0
从 内 部 RAM 读 取 数 据 (DDRAM/CGRAM/GDRAM)
72us
指令表 2:(RE=1:扩充指令集)
指令
指令码
RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
说明
执行 时间 (540K HZ)
功能:设定 CGRAM 地址到地址计数器(AC),需确定扩充指令中 SR=0(卷动地址或 RAM 地址选择)
地址
设定 CGRAM 地址到地址计数器(AC)
1 AC5 AC4 AC3 AC2 AC1 AC0 需确定扩充指令中 SR=0(卷动地址或 72us RAM 地址选择)
设定 DDRAM 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 设定 DDRAM 地址到地址计数器(AC) 72us
I/O
DB5
I/O
DB6
I/O
DB7
I/O
PSB
I
NC
-
/RST
I
VEE
-
LED+
-
LED-
-
说明
电源地
逻辑电源正(+5V)
LCD 对比度调节电压
并行模式时选择数据或指令
H: 数据 L: 指令
串行模式时选择模块与否
H: 选择 L: 不选择
并行模式时控制读写
H: 读
L: 写
串行模式时输入数据
并行模式时使能端
L
L
L
H
DL
X
RE
X

LCD12864串行显示文件

LCD12864串行显示文件

LCD12864串行显示文件1、LCD12864.c文件//===================================== ==========================#include "LCD12864.h"#include/**** 串行控制 *****************/sbit RS = P1^0;sbit RW = P1^1;sbit EN = P1^2;/*-----LCD12864相关声明---------*/#define com_byte 0#define dat_byte 1uchar lcdPosX, lcdPosY; //X,Y坐标uchar halfScr, halfLineCnt, basicBlock; //半屏,半屏行数,N*8块/************************************************************** 函数名称:void LCD12864_Delay_Ms (uchar ms)函数功能: LCD12864延时函数**************************************************************/ void LCD12864_Delay_Ms (uchar ms){uchar i;while (--ms){for (i = 0; i < 125; i++);}/************************************************************** 函数名称:void LCD12864_Write_Byte(uchar byte)函数功能: 写字节**************************************************************/ void LCD12864_Write_Byte(uchar byte){uchar i;for(i = 0; i < 8; i++){EN = 0;byte <<= 1;RW = CY;EN = 1;}}/************************************************************** 函数名称:uchar LCD12864_Read_Byte(void)函数功能: 读字节*************************************************************** /uchar LCD12864_Read_Byte(void){uchar i,temp1,temp2;temp1 = 0;temp2 = 0;for(i = 0; i < 8; i++)temp1 = temp1 << 1;EN = 0;EN = 1;EN = 0;if(RW) temp1++;}for(i=0;i<8;i++){temp2=temp2<<1;EN = 0;EN = 1;EN = 0;if(RW) temp2++;}return ((0xf0 & temp1) + (0x0f & temp2));}/************************************************************** 函数名称:void LCD12864_Is_Busy( void )函数功能: 检测忙函数**************************************************************/ void LCD12864_Is_Busy( void ){doLCD12864_Write_Byte(0xfc); //11111,RW(1),RS(0),0while(0x80 & LCD12864_Read_Byte());}/**************************************************************函数名称:void LCD12864_Write(bit dat_byte_com_byte,uchar byt)函数功能: 写入函数*************************************************************** /void LCD12864_Write(bit dat_byte_com_byte, uchar byt){uchar temp;if(dat_byte_com_byte == 0) //为零,写入指令temp = 0xf8; //11111,RS(0),RW(0),0else //否则,写入数据temp = 0xfa; //11111,RS(1),RW(0),0RS = 1;LCD12864_Is_Busy();LCD12864_Write_Byte(temp);LCD12864_Write_Byte(byt & 0xf0); //写入高四位LCD12864_Write_Byte(byt << 4); //写入低四位RS = 0;}/************************************************************** 函数名称:void LCD12864_Clear_Display (void)函数功能: LCD12864 显示清屏*************************************************************** /void LCD12864_Clear_Display (void){LCD12864_Write(com_byte,0x01);}/**************************************************************函数名称:void LCD12864_Write_Position (void)函数功能: LCD12864 显示位置*************************************************************** /void LCD12864_Write_Position (void){LCD12864_Write(com_byte,0x34);LCD12864_Write(com_byte,lcdPosY);LCD12864_Write(com_byte,lcdPosX);LCD12864_Write(com_byte,0x30);}/************************************************************** 函数名称:void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls)函数功能: LCD12864 显示一张图片*************************************************************** /void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls) {lcdPosX = 0x80;halfScr = 2;for (; halfScr != 0; halfScr--){lcdPosY = 0x80;halfLineCnt = 32;for (; halfLineCnt != 0; halfLineCnt--){basicBlock = 16;LCD12864_Write_Position();for (; basicBlock != 0; basicBlock--){if (bmpCls == 0){LCD12864_Write(dat_byte, *bmp++);}else if (bmpCls == 1){LCD12864_Write(dat_byte, 0x00);}}lcdPosY++;}lcdPosX = 0x88;}LCD12864_Write(com_byte, 0x36);LCD12864_Write(com_byte, 0x30);}/************************************************************** 函数名称:void convertChar (uchar CX, CY, width)* 字符反白显示* 输入参数:CX=要反白字符的行(0-3)* CY=要反白字符的列(0-7)* width=要反白字符的长度(1-16)函数功能: 转换成字符*************************************************************** /void convertChar (uchar CX, CY, width){LCD12864_DisplayPhoto(0,1);lcdPosY = 0x80;if (CX == 0){CX = 0x80;halfLineCnt = 16;}else if (CX == 1){CX = 0x80;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--){basicBlock = width;LCD12864_Write_Position();for (; basicBlock != 0; basicBlock--){if (halfLineCnt > 16){LCD12864_Write(dat_byte, 0x00);}else{LCD12864_Write(dat_byte, 0xff);}}lcdPosY++;}LCD12864_Write(com_byte, 0x36);LCD12864_Write(com_byte, 0x30);}/************************************************************** 函数名称:void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg)函数功能: LCD12864 显示字符串/void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg){if (X == 0){X = 0x80;}else if (X == 1){X = 0x90;}else if (X == 2){X = 0x88;}else if (X == 3){X = 0x98;}Y = X + Y;LCD12864_Write(com_byte, Y);while (*msg){LCD12864_Write(dat_byte, *msg++);LCD12864_Delay_Ms(speed);}}函数名称:void init_12864(void)函数功能:初始化12864*************************************************************** /void init_12864(void){LCD12864_Write(com_byte, 0x30); //基本指令功能.LCD12864_Write(com_byte, 0x0c); //显示打开,关光标,反白关.LCD12864_Write(com_byte, 0x01); //清屏指令.LCD12864_Write(com_byte, 0x06); //AC自动加一LCD12864_Write(com_byte, 0x80);}2、LCD12864.h文件//===================================== ==========================#ifndef __LCD12864_H__#define __LCD12864_H__#define uchar unsigned char#define uint unsigned int/************************************************************** 函数名称:void LCD12864_Write(bit dat_byte_com_byte,uchar byt)函数功能: 写入函数*************************************************************** /void LCD12864_Write(bit dat_byte_com_byte, uchar byt);/************************************************************** 函数名称:void LCD12864_Clear_Display (void)函数功能: LCD12864 显示清屏*************************************************************** /void LCD12864_Clear_Display (void);/************************************************************** 函数名称:void LCD12864_Write_Position (void)函数功能: LCD12864 显示位置*************************************************************** /void LCD12864_Write_Position (void);/************************************************************** 函数名称:void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls)函数功能: LCD12864 显示一张图片*************************************************************** /void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls);/************************************************************** 函数名称:void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg)函数功能: LCD12864 显示字符串*************************************************************** /void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg);/************************************************************** 函数名称:void init_12864(void)函数功能:初始化12864*************************************************************** /void init_12864(void);#endif。

ST7920驱动(串行)

ST7920驱动(串行)
while(0x80&Receive_Byte());
}
/*********************************************************
函数名: Write_LCD_Command()
返回值:无
功 能: 写命令到LCD
*********************************************************/
}
}
temp1=0xf0&temp1;
temp2=0x0f&temp2;
value=temp1+temp2;
return value ;
}
/*********************************************************
********************************************/
void Disp_HZ(u8 X,const u8 * pt,u8 num)
{
u8 i,addr;
if (X==0) {addr=0x80;}
else if (X==1) {addr=0x90;}
delay_ms(5);
// Write_LCD_Command(0x34); // 扩充指令
// Write_LCD_Command(0x36); // 打开绘图指令
Draw_Clear(); // 清屏
//Draw_Update();
}
/*********************************************************

12864串行方式使用体会

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汉字和图片的显示

12864汉字和图片的显示课程设计报告书设计题目:12864汉字和图片的显示课程名称:单片机快速入门系部:电子信息系专业:应用电子技术班级:电子0901姓名:组长:学号:成绩:2011年6月16日目录任务安排 (3)一、项目介绍 (3)1.1 设计内容 (3)1.2 设计要求 (3)1.3 系统主要功能 (4)二、硬件设计 (4)2.1 原理电路图 (4)2.2主要元件功能说明 (5)三、系统软件设计 (10)3.1 分析论证 (10)3.2 程序流程图 (12)3.3 源程序清单 (13)四、个人心得 (19)五、结束语 (20)六、参考文献 (21)七、12864汉字和图片的显示原理图 (21)任务安排一、项目介绍1.1 设计内容利用单片机和12864液晶显示屏通过按键功能实现汉字和图片的显示1.2 设计要求(1)在12864上第一次显示汉字“安徽财贸职业学院大学城翡翠路900/doc/dd174fd133d4b14e852468a7.ht ml ”(2)在12864上第二次显示汉字“单片机实训周6月11日星期六”(3)第三次显示图片:服装,帽子,鞋,皮包等(4)第四次显示汉字:“这就是我们小组的设计方案谢谢欣赏”1.3系统主要功能:12864LCD指令系统及时序该类液晶显示模块(表1-1)控制信号控制代码指令名称R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 显示开关0 0 0 0 1 1 1 1 1 1/0 起始行设置0 0 1 1 X X X X X X 页设置0 0 1 0 1 1 1 X X X 列地址设置0 0 0 1 X X X X X X 读状态 1 0 BUSY 0 ON/OFF RST 0 0 0 0 写数据0 1 写数据读数据 1 1 读数据二、硬件设计2.1 原理电路图12864显示屏(图2-1a)独立按键原理图(图2-1b)2.2主要元件功能说明1)12864显示屏内部功能器件及相关功能如下指令寄存器(IR): IR是用于寄存指令码,与数据寄存器数据相对应。

12864并行通信演示

12864并行通信演示

并行通信模式的演示程序:1./*****************************************************************2.程序:12864并行通信演示实例3.制作:风沙星辰4.日期:2009年07月30日5.功能:12864并行通信各项功能演示6.备注:AT89S52 11.0592M ST7920液晶驱动7.****************************************************************/8.9.10.#include <reg52.h> // 包含头文件11.#include <intrins.h>12.13.#define uchar unsigned char //简化整型,字符型变量书写14.#define uint unsigned int15.16.char code hang1[] = {"锄禾日当午"}; // 显示字符定义17.char code hang2[] = {"汗滴禾下土"};18.char code hang3[] = {"谁知盘中餐"};19.char code hang4[] = {"粒粒皆辛苦"};20.21.#define LCD_data P0 // 引脚定义22.sbit LCD_RS = P1^0;23.sbit LCD_RW = P1^1;24.sbit LCD_EN = P1^2;25.sbit LCD_PSB = P1^3;26.27.//图片代码圣诞快乐 128*3228.uchar code Photo1[][16] ={29.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,30.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,31.0x00,0x3F,0xF0,0x70,0x0F,0xF8,0x00,0x00,0x0F,0x01,0xE0,0x00,0x00,0xFC,0x00,0x00,32.0x00,0xFF,0xFC,0xFC,0x0F,0xFC,0x81,0xF0,0x0F,0x81,0xF0,0x00,0xE0,0xFC,0x1C,0x00,33.0x03,0xFF,0xFF,0xFE,0x07,0xEF,0xC1,0xF8,0x07,0x81,0xF0,0x01,0xF3,0xFF,0x1F,0x00,34.0x03,0xE3,0xDF,0xCE,0x03,0xCF,0xE3,0xF0,0x03,0xC0,0xFF,0x01,0xF3,0xFF,0xFF,0x00,35.0x01,0xDF,0xDF,0xCE,0x07,0x9F,0x67,0xE0,0x03,0xC0,0xFF,0x80,0xFB,0xFF,0xFF,0x00,36.0x00,0xFF,0xDF,0x9F,0x0F,0x9F,0x7F,0xC0,0x03,0xC0,0xFF,0xC0,0xFB,0xFF,0xFF,0x00,37.0x00,0xCF,0xDC,0x1F,0x0F,0xFE,0xFF,0xC0,0x1F,0xE3,0xFF,0xC0,0x73,0xC7,0xFC,0x00,38.0x00,0xFF,0xFC,0x3F,0x0F,0xF8,0xE3,0xC0,0x1F,0xF7,0xF3,0xE0,0xF7,0x9F,0xF0,0x00,39.0x00,0xF3,0xFF,0xFE,0x03,0xF9,0xE9,0xDC,0x1F,0xFB,0xF3,0xC1,0xCF,0xFF,0xFC,0x00,40.0x00,0xC7,0xFF,0xFF,0x07,0xF3,0xCD,0xFC,0x1F,0xFB,0xF7,0xC1,0xDF,0xFF,0xFE,0x00,41.0x01,0xFF,0xDF,0xFF,0x0F,0x87,0xCD,0xF8,0x1F,0xBD,0xFF,0xC1,0xFF,0x8F,0xFF,0x00,42.0x01,0xFF,0xCF,0x8C,0x03,0xFF,0xED,0xF8,0x3F,0xBD,0xFF,0xC1,0xFF,0xFF,0xFF,0x00,43.0x01,0xFB,0xC7,0xFC,0x03,0xFF,0xFD,0xE0,0x3F,0xBF,0xFF,0xC0,0xFB,0xFF,0xCF,0x00,44.0x00,0xE3,0xFF,0xFE,0x0F,0xFF,0x7D,0xC0,0x3F,0xBF,0xFF,0xE0,0x79,0xFC,0x0F,0x00,45.0x00,0x1F,0xFF,0xFE,0x0F,0x0E,0x7D,0xC0,0x3F,0x9F,0xFF,0xE0,0x30,0xFF,0xFE,0x00,46.0x00,0xFF,0xFC,0x3E,0x07,0x60,0x7D,0xF0,0x37,0x9F,0xF8,0xE0,0x3F,0xFF,0xFF,0x00,47.0x00,0xFD,0xFF,0xF0,0x05,0xF7,0xFF,0xF8,0x37,0x8F,0xFC,0x01,0xFF,0xFF,0xFF,0x80,48.0x00,0x01,0xFF,0xFC,0x0F,0xFF,0xF7,0xF8,0x07,0x83,0xFF,0x01,0xFF,0xFF,0xFF,0x80,49.0x00,0xFF,0xFF,0xFC,0x0F,0xFC,0xF1,0xF8,0x07,0x87,0xFF,0x80,0xFF,0xFE,0x7F,0x00,50.0x00,0xFF,0xF8,0x3C,0x0F,0xBD,0xFC,0x00,0x07,0x87,0xDF,0x80,0x7C,0xFC,0x7C,0x00,51.0x00,0x71,0xFF,0xE0,0x0F,0x3F,0xFF,0x80,0x07,0x8F,0xCF,0xC0,0xFC,0xFC,0x7E,0x00,52.0x00,0xC1,0xFF,0xFC,0x0E,0x3F,0xFF,0xF8,0x07,0x8F,0x87,0xC0,0xFF,0xFC,0x3E,0x00,53.0x00,0xDF,0xFF,0xFE,0x0F,0xFF,0xDF,0xF8,0x07,0x9F,0x83,0xC0,0xFF,0xFC,0x3E,0x00,54.0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xCF,0xF8,0x07,0x9F,0x03,0xC0,0xFB,0xFC,0x3E,0x00,55.0x00,0xFF,0xC0,0x1E,0x03,0xF1,0x01,0xF0,0x03,0x8E,0x01,0x80,0x00,0x7C,0x1C,0x00,56.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,57.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,58.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,59.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,60.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};61.62.//图片代码新年进步 128*3263.uchar code Photo2[][16] ={64.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,65.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,66.0x00,0xFF,0xC3,0xF0,0x01,0xFC,0x00,0x00,0x3C,0x00,0xF8,0x00,0x01,0xF8,0x3C,0x00,67.0x00,0xFF,0xE3,0xF8,0x01,0xFE,0x00,0x00,0x3E,0x1C,0xFC,0x00,0x31,0xFC,0xFE,0x00,68.0x00,0x7F,0xF1,0xFC,0x01,0xFE,0x3F,0xE0,0x3F,0x3F,0xFF,0x80,0x7C,0xFF,0xFE,0x00,69.0x00,0xFF,0xF1,0xFC,0x03,0xFF,0xFF,0xF0,0x3F,0x1F,0x7F,0xC0,0x7C,0xFF,0xFE,0x00,70.0x01,0xFF,0xCF,0xFC,0x07,0x8F,0xFF,0xF8,0x0F,0xBE,0xFF,0xC0,0x3E,0xFF,0xFE,0x00,71.0x01,0xFF,0xDF,0xF8,0x0F,0x3F,0xFF,0xF8,0x0F,0xF1,0xFF,0xC0,0x1E,0xFE,0x00,0x00,72.0x01,0x3B,0xFC,0x00,0x0F,0xFF,0xFC,0x00,0x1F,0x3F,0xFC,0x00,0x3E,0xFF,0xFE,0x00,73.0x03,0xB3,0xFC,0x3C,0x0F,0xFF,0xF8,0x00,0x3E,0x3F,0xFF,0x80,0xFE,0xFF,0xFF,0x00,74.0x03,0xFF,0xDE,0xFE,0x07,0xF1,0xFF,0xF0,0x3F,0x3F,0x7F,0xC1,0xFF,0xFF,0xFF,0x00,75.0x01,0xFF,0xFF,0xFF,0x01,0xC3,0xFF,0xF0,0x3F,0xBC,0xFF,0xC1,0xBF,0xFF,0xFF,0x00,76.0x00,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xF8,0x3F,0xBF,0xFC,0x01,0xFF,0xFF,0x3F,0x00,77.0x01,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xF0,0x1F,0xBF,0xFF,0x80,0xFF,0xFC,0x00,0x00,78.0x03,0xFC,0x1F,0xFC,0x07,0xFF,0xFC,0x20,0x3C,0x3C,0x7F,0xC0,0x7C,0xFC,0x0C,0x00,79.0x01,0xFF,0xDF,0x7C,0x03,0xFF,0xFC,0x00,0x38,0x3F,0xFF,0xC0,0x1C,0xFE,0x1E,0x00,80.0x00,0x3F,0xFE,0x7C,0x01,0xFD,0xFC,0x00,0x3F,0xBF,0xFC,0x00,0x3E,0x7E,0x3E,0x00,81.0x00,0xFF,0xFE,0x7C,0x03,0xFD,0xFF,0xE0,0x3F,0xFF,0xFF,0x00,0x3E,0x7E,0x3E,0x00,82.0x03,0xFF,0xFE,0x7C,0x0F,0xFF,0xFF,0xF8,0x1F,0xFC,0xFF,0xC0,0xFE,0xFE,0xFE,0x00,83.0x03,0xFE,0xDE,0x7C,0x0F,0x3F,0xFF,0xF8,0x0F,0xBF,0xFF,0xC0,0xFF,0xFF,0xFC,0x00,84.0x01,0xDE,0xDE,0x7C,0x0F,0xFF,0xFF,0xF8,0x1F,0x3F,0xFF,0xC0,0xFF,0xFF,0xF8,0x00,85.0x01,0xDE,0xFF,0x7C,0x0F,0xFF,0xFF,0xF8,0x1E,0x7F,0xF0,0x00,0x78,0xFF,0xF0,0x00,86.0x01,0xFE,0xFF,0xFC,0x03,0xFF,0xFC,0x00,0x3C,0xFF,0xFF,0xC0,0x83,0xFF,0xE0,0x00,87.0x01,0xFE,0xFF,0xFC,0x00,0xF0,0xFC,0x00,0x3C,0xFF,0xFF,0xE0,0xFF,0xFF,0xC0,0x00,88.0x03,0xFE,0xFF,0xFC,0x00,0x00,0xFC,0x00,0x1F,0xFF,0xFF,0xE0,0x7F,0xFE,0x00,0x00,89.0x01,0xFF,0x7F,0xFC,0x00,0x00,0xFC,0x00,0x1F,0xFF,0xFF,0xC0,0x3F,0xFC,0x00,0x00,90.0x00,0x0E,0x0C,0x7C,0x00,0x00,0x78,0x00,0x07,0x80,0xFF,0x80,0x0F,0xC0,0x00,0x00,91.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,92.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,93.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,94.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,95.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};96.97.98.void delay_ms(uint ms) // 延时函数 1ms99.{100.uint i,j;101.for(j=0;j<=ms;j++)102.{103.for(i=0;i<=120;i++)104.{}105.}106.}107.108.void delay4us() // 延时函数4Us109.{110._nop_();111._nop_();112._nop_();113._nop_();114.}115.116.void lcd_checkBusy(void) //检测忙标志117.{118.uchar busy;119.do{120.LCD_EN = 0;121.LCD_RS = 0;122.LCD_RW = 1;123.delay4us();124.LCD_EN = 1; //在使能端的一个上升沿读取LCD数据125.busy = P0;126.delay4us();127.LCD_EN = 0;128.}129.while(busy&0x80); //判断最高位是否为0,为0则处于空闲状态130.}131.132.void lcd_wcmd(uchar cmd) //写指令133.{134.lcd_checkBusy(); //检测忙碌状态135.LCD_RS = 0; //RS至低,指令操作136.LCD_RW = 0; //RW至低,写操作137.LCD_EN = 0;138.delay4us();139.P0 = cmd; //指令数据140.delay4us();141.LCD_EN = 1; //给使能端一个上升沿保存数据142.delay4us();143.LCD_EN = 0;144.}145.146.void lcd_wdat(uchar dat) //写数据147.{148.lcd_checkBusy(); //检测忙碌状态149.LCD_RS = 1; //RS至高,数据操作150.LCD_RW = 0;151.LCD_EN = 0;152.P0 = dat; //给LCD要显示的数据153.delay4us();154.LCD_EN = 1; //给使能端一个上升沿保存数据155.delay4us();156.LCD_EN = 0;157.}158.159.void lcd_init() //初始化LCD160.{161.LCD_PSB = 1; //选择并行模式162.lcd_wcmd(0x30); //初级指令集163.delay_ms(5);164.lcd_wcmd(0x0C); //开显示165.delay_ms(5);166.lcd_wcmd(0x01); //清屏167.delay_ms(5);168.}169.170.171.void drawphoto(uchar bmp[][16]) //绘图172.{173.uchar i,j,k;174.175.lcd_wcmd(0x34); //打开高级指令集,关绘图176.177.for(i=0;i<16;i++) //显示上半部分图片178.{179.lcd_wcmd(0x90+i); //输入Y轴坐标180.lcd_wcmd(0x80); //输入下轴坐标181.for(j=0;j<16;j++)182.lcd_wdat(bmp[j]); //写入数据183.delay_ms(1);184.185.}186.187.for(i=0,k=16;i<16,k<32;i++,k++) //显示下半部分图片188.{189.lcd_wcmd(0x80+i); //输入Y轴坐标190.lcd_wcmd(0x88); //输入X轴坐标191.for(j=0;j<16;j++)192.lcd_wdat(bmp[k][j]); //向LCD写入数据193.delay_ms(1);194.}195.lcd_wcmd(0x36); //打开绘图功能,显示所绘图片196.}197.198.void Clear_GDRAM(void) // 清屏,清除GDRAM中的数据,及向GDRAM中全写0199.{200.uchar i,j,k;201.202.lcd_wcmd(0x34); //打开扩展指令集203.i = 0x80;204.for(j = 0;j < 32;j++)205.{206.lcd_wcmd(i++);207.lcd_wcmd(0x80);208.for(k = 0;k < 16;k++)209.{210.lcd_wdat(0x00);211.}212.}213.i = 0x80;214.for(j = 0;j < 32;j++)215.{216.lcd_wcmd(i++);217.lcd_wcmd(0x88);218.for(k = 0;k < 16;k++)219.{220.lcd_wdat(0x00);221.}222.}223.lcd_wcmd(0x30); //回到基本指令集224.}225.226.void main() // 主函数227.{228.uchar i;229.LCD_PSB=1; // 选择显示模式为串行通信模式230.lcd_init(); //初始化液晶,清屏DDRAM231.lcd_wcmd(0x81); //写入要显示字符的地址232.for(i=0;i<10;i++)233.{234.lcd_wdat(hang1); //写入显示字符235.delay_ms(300);236.}237.lcd_wdat(0x2c); //显示“,”。

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串行使用说明

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高电平可正常驱动。

12864液晶屏资料总结

12864液晶屏资料总结

12864液晶屏资料总结一、概述JM12864M-2汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16*16点阵)、128个字符(8*16点阵)及64X256点阵显示RAM(GDRAM)。

外观尺寸:93×70×12.5mm 视域尺寸:73×39mm二、引脚三、时序图1、写资料2、读出资料四、指令集表一:最常用的指令(单独列出,包含于表二)五、电路图完整电路图见PCB文件,此处忽略程序存储器部分。

用P1口和液晶屏的数据口相连。

也可以用P0口,但是使用P0口要加上拉电阻,增加了电路的复杂性。

液晶屏的3口为驱动电压的输入端,此处用20K的可调电阻调整3口的电压值。

电路连接完成并通电后,旋转可调电阻的旋钮,直至屏上在没有任何程序驱动时,可以清晰显示一个个小方格为止。

六、厂家提供的程序及其说明/****************************************液晶型号:JM12864M-2(字库)驱动芯片:ST7920MCU:AT89C51*****************************************|P2.0---RS |P1===DB0~DB7|P2.1---R/W|P2.2---E|P2.3---PSB*****************************************/#include <at89x51.h>#include <intrins.h>sbit Ldi = P2^0;sbit Lrw = P2^1;sbit Le = P2^2;sbit Lpsb = P2^3;#define Ldata P1unsigned char code group[] ={略};unsigned char code Photo1[32][16] ={略};unsigned char code Photo2[32][16] ={略};/*********************************************************************************************/ /*函数名:Delay100us () */ /*函数功能:延时*/ /*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void Delay100us(){unsigned char temp;for(temp=0; temp<255; temp++);}/*********************************************************************************************//*函数名:DelayMs () */ /*函数功能:延时*/ /*参数:num */ /*返回值:无*/ /*********************************************************************************************/ void DelayMs(unsigned int num){while(num--){unsigned char temp;for(temp=0; temp<125; temp++);}}/*********************************************************************************************/ /*函数名:Busy () *//*函数功能:查忙*//*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void Busy(){Ldi=0;Lrw=1;while(1){Le=1;if(Ldata<0x80)break; //说明:见指令集中“读取状态字”,判断是否BUSYLe=0;}Le=0;}/*********************************************************************************************/ /*函数名:Whitecommand()*/ /*函数功能:写指令*/ /*参数:com */ /*返回值:无*/ /*********************************************************************************************/ void Whitecommand(unsigned char com){Busy();Ldi = 0;Lrw = 0;Le = 1;Ldata = com; //RS、R/W为0,这种状态下可设置行、列地址和页面地址Le = 0;}/*********************************************************************************************/ /*函数名:Whitedata()*/ /*函数功能:写数据*/ /*参数:dat */ /*返回值:无*/ /*********************************************************************************************/ void Whitedata(unsigned char dat){Busy();Ldi = 1;Lrw = 0;Le = 1;Ldata = dat; // RS为1、R/W为0,见指令集中“写显示数据”Le = 0;}/*********************************************************************************************/ /*函数名:Init (void) */ /*函数功能:LCD初始化操作*/ /*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void Init(){Lpsb = 1;Delay100us();Whitecommand(0x30); //基本指令集动作Delay100us();Whitecommand(0x0c); //整体显示开Delay100us();Whitecommand(0x01); //清楚显示,清屏Delay100us();Whitecommand(0x06); //}/*********************************************************************************************/ /*函数名:Whiteword (void) */ /*函数功能:写汉字*/ /*参数:无*//*返回值:无*/ /*********************************************************************************************/ void Whiteword(){unsigned char temp = 0;Whitecommand(0x80);for(;temp<64;){Whitedata(group[temp++]);_nop_();}}/*********************************************************************************************/ /*函数名:WhitePhoto */ /*函数功能:画图*/ /*参数:unsigned char page, unsigned char Photo[32][16] */ /*返回值:无*/ /*********************************************************************************************/ void WhitePhoto(unsigned char page,unsigned char Photo[32][16]){unsigned char row,line;for(line=0; line<32; line++){Whitecommand(0x80|line); //行地址设置Whitecommand(0x80|page); //页面地址设置for(row=0; row<16; row++){Whitedata(Photo[line][row]);}}}/*********************************************************************************************/ /*函数名:main()*/ /*函数功能:主函数*/ /*参数:无*/ /*返回值:无*/ /*********************************************************************************************/ void main(){DelayMs(400);Init(); //初始化do{Whitecommand(0x30); //基本指令集Delay100us();Whitecommand(0x01); //清除显示Delay100us();Whiteword(); //显示字段DelayMs(2000);Whitecommand(0x01); //清除显示Delay100us();Whitecommand(0x32); //选择基本指令集中的动作,绘图显示关Delay100us();Whitecommand(0x36); //选择扩充指令集中的动作,绘图显示开Delay100us();WhitePhoto(0, Photo1); //显示图片WhitePhoto(8, Photo2);DelayMs(2000);}while(1);}七、自编的程序及说明#include <reg51.h>#include <intrins.h>sbit Ldi = P3^0;sbit Lrw = P3^1;sbit Le = P3^2;#define Ldata P1int a;code char STR1[]= "东南大学SEU";code char STR2[]= "机械工程学院ME";code char STR3[]= "机械电子系";code char STR4[]= "张荔050154";void Delay100us(){unsigned char temp;for(temp=0; temp<255; temp++);}void DelayMs(unsigned int num){while(num--){unsigned char temp;for(temp=0; temp<125; temp++);}}void Busy(){Ldi=0;Lrw=1;while(1){Le=1;a=Ldata;if(Ldata<0x80)break;Le=0;}Le=0;}void Whitecommand(unsigned char com) {Busy();Ldi = 0;Lrw = 0;Le = 1;Ldata = com;Le = 0;}void Whitedata(unsigned char dat){Busy();Ldi = 1;Lrw = 0;Le = 1;Ldata = dat;Le = 0;}void Init(){Delay100us();Whitecommand(0x30);Delay100us();Whitecommand(0x0c);Delay100us();Whitecommand(0x01);Delay100us();Whitecommand(0x06);}void Whiteword(unsigned char *ptr,unsigned char line) {unsigned char i,l;l=0;switch (line){case 1:Whitecommand(0x80);break;case 2:Whitecommand(0x90);break;case 3:Whitecommand(0x88);break;case 4:Whitecommand(0x98);}while ((ptr[l])!='\0'){l++;}for (i=0;i<l;i++){Whitedata(ptr[i]);_nop_();}}void main(){Ldata=0;DelayMs(400);Init();do{Whitecommand(0x30);Delay100us();Whitecommand(0x01);Delay100us();Whiteword(STR1,1);Whiteword(STR2,2);Whiteword(STR3,3);Whiteword(STR4,4);DelayMs(2000);}while(1);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SET_LCD_PORT_DDR();
delay_ms(1);
CLE_Screen();
Write_Command(RE_ADDR);//显示地址归位
Write_Command(BASIC);//选择基本指令集
Write_Command(DISPLYAY_ON);//开显示
Write_Command(CURSOR_OFF);//光标关
}
//清屏
void CLE_Screen(void)
{
Write_Command(CLR_SCREEN);
delay_ms(7);
}
//
//向12864发送一个字节的数据
void Write_One_Date(unsigned char date)
{
unsigned char i;
case 3:
{
addr=y+0x98;
break;
}
}
Write_Command(addr);//写地址到显示屏
Write_one_char(dat);//写数据
}
//从指定的位置开始显示汉字或字符
void Lcd_puts_any(unsigned char x,unsigned char y, char *p)
{Miro_GDRAM[i][j]=0;}
}
//将指定的坐标的点点亮
//
/*
void Draw_Point(unsigned char x,unsigned char y)
{
char l_r,point=0,X_dat=0,Y_dat=0;
char buffer_x;
Y_dat=point|=(1<<(7-l_r));//由于是先发送的Y的地址
X_dat=0;
}
else//右部分
{
X_dat=point|=(1<<(15-l_r));
Y_dat=0;
}
}
Write_one_char(Y_dat);//写入这个横行中的那个点被点亮
void DRPIC_ready(void)
{
Write_Command(DRPIC_OFF);//选择扩充指令集,关闭绘图
Write_Command(LCD_Y);
Write_Command(LCD_X);
Write_Command(BASIC);//使用基本指令集
}
else
{
x=x/16+0x88;
y=31-y+0x80;
}
LCD_X=x;//0x81;
LCD_Y=y;//0x9f;
DRPIC_ready();
l_r=buffer_x%16;//判断左右哪个部分被点亮
{
if(l_r<7)//左部分
{
DRPIC_ready();
Write_one_char(0xff);
Write_one_char(0xff);
}
Write_Command(DRPIC_ON);
Write_Command(BASIC);
}
//清除GDRAM和Miro_GDRAM里的数据
//显示忙检测
Ckeck_busy(void)
{
char j;
CS_SET;
Write_One_Date(0xfc);
j=Read_Two_Date();
return(j);
CS_CLE;
}
*/
//写入绘图地址到lcd,先写的是Y坐标
buffer_x=x%128;
if(x/128>=1)
{
x=x-127;
Lcd_clean();
}
if(y>31)//竖直方向上Y属于上半部分
{
x=x/16+0x80;//计算x的区域,地址
y=63-y+0x80;//计算属于水平方向上的哪个行,地址
{
char addr,i;
switch(x)
{
case 0:
{addr=y+0x80;
break;
}
case 1:
{
addr=y+0x90;
break;
}
case 2:
{
addr=y+0x88;
}
//用于检测液晶屏是否有坏点
void Lcd_check(void)
{
char x,y;
for(x=0;x<16;x++)
for(y=0;y<32;y++)
{
LCD_Y=y+0x80; //行地址
LCD_X=x+0x80; //列地址
break;
}
case 3:
{
addr=y+0x98;
break;
}
}
Write_Command(addr);
while(*p!='\0')//'\0'字符串结束标志
{
Write_one_char(*p);
p++;
uchar i;
for(i=0;i<=x1-x0;i++){ Draw_Point(x0+i,y0); Draw_Point(x0+i,y1); }
Write_One_Date(dat<<4);
CS_CLE;
delay_us(90);
}
//在指定的位置显示一个字母
void Lcd_putsachar(unsigned char x,unsigned char y,char dat)
{
char addr;
switch(x)//计算显示的位置
void Lcd_clean(void)
{
char x,y;
char i,j;
for(x=0;x<16;x++)
for(y=0;y<32;y++)
{
LCD_Y=y+0x80; //行地址
LCD_X=x+0x80; //列地址
char buffer_x1,buffer_y1,buffer_x,buffer_y,buffer_x2,buffer_y2;
buffer_x2=buffer_x=buffer_x1=x;//缓存要写入的x与y
buffer_y2=buffer_y=buffer_y1=y;//
//写入绘图缓存
//CS_SET();
Write_One_Date(0xfc);//
p1=Read_One_Date();
p2=Read_One_Date();
for(i=0;i<8;i++)
{
s1+=*p1;
s2+=*p2;
p1++;
p2++;
}
return s1;
}
/* 不好使
}
}
//从LCD读取一个字节数据
char *Read_One_Date(void)
{
char i,*p;
char dat[30];
SET_READ_MODLE();//读数据模式
SCLK_CLE;
delay_us(1);
for(i=0;i<8;i++)
{
delay_us(1);
SCLK_CLE;
delay_us(1);
date=date<<1;//高位先发
}
}
//发送命令
void Write_Command(unsigned char CMD)
{
CS_SET;
Write_One_Date(0xf8);//命令控制字
Write_One_Date(CMD&0xf0);//高位先发
if(y<31)
{
y=31-y;
x=16+x/8;
buffer_x=7-buffer_x%8;
Miro_GDRAM[x][y]|=(1<<buffer_x);
}
else
{
y=62-y;
x=x/8;
buffer_x=7-buffer_x%8;
SCLK_CLE;//时钟总线拉低
delay_us(1);
for(i=0;i<8;i++)//把数据送到线上去
{
if(date&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
#include"delay.h"
#include"display.h"
#define uchar unsigned char
static char Miro_GDRAM[32][32];
char LCD_X,LCD_Y;
//清屏
void LCD_init(void)
相关文档
最新文档