LCD12864写字符串程序及其头文件

合集下载

ST7920控制器的lcd12864驱动程序头文件+6页+0[1].1M

ST7920控制器的lcd12864驱动程序头文件+6页+0[1].1M

P4=0x01;
}
/***************************************************************** (6)函数名称:ReadData12864() 读当前地址的DDRAM数据 *****************************************************************/ uchar ReadData12864(void) {
/***************************************************************
(5)函数名称:WriteData12864(uchar lcd_data)写数据
入口参数:lcd_data
返回参数:无
****************************************************************/
for(y=0;y<=31;y++) //注意:st7920用于lcd12864时,分上下两区,lcd_y依次从0到31,lcd_x从0到15
{
for(x=0;x<=7;x++)
{
GdramOff();
WriteCmd12864(0x80+y);
WriteCmd12864(0x80+x+i);
WriteData12864(0x00);
//接线说明
#define LCD_DATA
P5 //8 bit数据线 EN=P4^2 ,RW=P4^1 ,RS=P4^0
//初始化指令 #define CLEAR_LCD //#define AC_INIT //#define CURSE_ADD 体不动) #define FUN_MODE #define DISPLAY_ON #define DISPLAY_OFF //#define CURSE_DIR //#define SET_CG_AC //#define SET_DD_AC

LCD1602和LCD12864程序-并行与串行

LCD1602和LCD12864程序-并行与串行

LCD1602和LCD12864的函数库,包括并行与串行LCD1602基础函数#ifndef __LCD1602_JCK_C__#define __LCD1602_JCK_C__/************************************************** **** 六哥LCD1602基础函数库 **** ****************************************************///使用请注意定义引脚#include"yscx.c"/***************************************************************** LCD1602判忙函数******************************************************************/ void LCD1602_PM(void){unsigned char temp1;//状态信息(判断是否忙)LCD1602_SJ=0xFF;//记得在包含该头文件前,定义引脚LCD1602_RS=0; //记得在包含该头文件前,定义引脚LCD1602_RW=1; //记得在包含该头文件前,定义引脚LCD1602_E=1; //记得在包含该头文件前,定义引脚do{temp1 = LCD1602_SJ;//记得在包含该头文件前,定义引脚LCD1602_SJ=0xFF;}while(temp1&0x80);LCD1602_E=0;//记得在包含该头文件前,定义引脚YS_us(1); //}/*------------------------------------------------LCD1602写入命令函数------------------------------------------------*/void LCD1602_XZL(unsigned char ml){LCD1602_PM(); //忙则等待LCD1602_RS= 0; //记得在包含该头文件前,定义引脚LCD1602_RW= 0; //记得在包含该头文件前,定义引脚LCD1602_E = 1;//记得在包含该头文件前,定义引脚LCD1602_SJ=ml; //记得在包含该头文件前,定义引脚YS_us(1);//稍作延时给LCD反应的时间LCD1602_E = 0;//记得在包含该头文件前,定义引脚if(ml==0x01|ml==0x02) YS_ms(2);//清屏和地址归位大概需2ms时间处理 YS_us(35);//其他指令大概需35us/*------------------------------------------------LCD1602写入数据函数------------------------------------------------*/void LCD1602_XSJ(unsigned char sj){LCD1602_PM(); //忙则等待LCD1602_RS=1; //记得在包含该头文件前,定义引脚 LCD1602_RW=0; //记得在包含该头文件前,定义引脚 LCD1602_E= 1;//记得在包含该头文件前,定义引脚 LCD1602_SJ=sj; //记得在包含该头文件前,定义引脚 YS_us(1);//稍作延时给LCD反应的时间LCD1602_E= 0;//记得在包含该头文件前,定义引脚 }/*------------------------------------------------LCD1602初始化函数------------------------------------------------*/void LCD1602_CSH(void){LCD1602_XZL(0x38); /*显示模式设置*/LCD1602_XZL(0x08); /*显示光标移动设置*/LCD1602_XZL(0x01); /*显示开及光标设置*/LCD1602_XZL(0X06);LCD1602_XZL(0X0c);}#endifLCD1602显示函数#ifndef __LCD1602_XSK_C__#define __LCD1602_XSK_C__/******************************************************* **************** 六哥LCD1602显示函数库 **************** *********************************************************/#include"yscx.C"#include"LCD1602_JCK_cx.C"//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表unsigned char codeascll1602[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43, 0x44,0x45,0x46};/*********************************************************************LCD1602数制显示(十或十六)*******************************************************************sj:需要显示的数据ml:显示地址设定xsfs:显示方式,进制和小数点的判断依据,*/void LCD1602_SZXS(signed long sj,unsigned char xsfs,ml)///wei为1输出十六进制,否则输出十进制{unsigned long xc; //显示缓存unsigned char a;bit xsd,fs,bf=0;xsd=0;fs=0;LCD1602_XZL(0x04);//设置光标向左移LCD1602_XZL(ml);if(xsfs>10){a=16; //输出十六进制LCD1602_XSJ(0x48);//显示Hxsfs=0;} //else{a=10; //否则输出十进制if(xsfs!=0) xsd=1;//显示小数点使能if(sj<0){sj=~sj+1;fs=1;} //显示负号使能}xc=sj;if(xc!=0) //显示数据不为0;则显示{while(xsd) //判是否需要显示小数{if(xc!=0) //是否还需要计算{ml=xc%a;if(bf|ml!=0) //小数部分为0不需要显示{LCD1602_XSJ(ascll1602[ml]); //取数的ascll码并显示bf=1; //小数部分不为0标志,小数部分数字有效}xc/=a; //取剩下的数}else if(bf) LCD1602_XSJ(0x30);//判是否需要补0else; //小数部分无效,不需要补0xsfs--;if(xsfs==0) //小数点位数减一{xsd=0; //小数计算部分结束标志if(bf) LCD1602_XSJ(0x2e); //小数部分存在有效数字则显示小数点 }}}////////////整数显示部分////////////////////////////////////////////do{LCD1602_XSJ(ascll1602[xc%a]); //取数的ascll码并显示xc/=a;}while(xc!=0);if(fs) LCD1602_XSJ(0x2d);//判是否需要显示负号LCD1602_XZL(0x06);//还原光标移动方向}/********************************LCD1602LCD1602字符显示程序*********************************/void LCD1602_ZFXS(unsigned char *SJ,t,ml)/*h:行,SJ:字符串指针,t:间隔时间*/ {LCD1602_XZL(ml); //写指令while(*SJ)//是否显示完{LCD1602_XSJ(*SJ);//写数据SJ++; //取下一个字符YS_ms(t); //延时}#endifLCD12864基础函数—并行#ifndef __LCD12864_JCK_C__#define __LCD12864_JCK_C__/************************************************ ** **** 六哥LCD12864基础函数库 **** ****************************************************/ //使用请注意定义引脚#include"yscx.c"/********************测忙碌**********************/ //测忙碌子程序//RS=0,RW=1,E=H,D0-D7=状态字/************************************************/ void LCD12864_PM(void)unsigned char temp1;//状态信息(判断是否忙)LCD12864_RS=0; // 记得在包含该头文件前,定义引脚LCD12864_RW=1; // 记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚do{temp1 = LCD12864_SJ;//记得在包含该头文件前,定义引脚 LCD12864_SJ=0xFF;}while(temp1&0x80);LCD12864_E=0; //记得在包含该头文件前,定义引脚YS_us(1); //}/********************写命令**********************/ //写命令子程序///************************************************/ void LCD12864_XZL(unsigned char ml)/*写命令*/{LCD12864_PM();LCD12864_RS=0; //记得在包含该头文件前,定义引脚LCD12864_RW=0; //记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚LCD12864_SJ=ml;//记得在包含该头文件前,定义引脚YS_us(0);//稍作延时给LCD反应的时间LCD12864_E=0; //记得在包含该头文件前,定义引脚if(ml==0x01|ml==0x02) YS_ms(3);//清屏和地址归位大概需3ms时间处理YS_us(50);//其他指令大概需50us}/********************写数据**********************///写数据子程序///************************************************/void LCD12864_XSJ(unsigned char sj){LCD12864_PM();LCD12864_RS=1; //记得在包含该头文件前,定义引脚LCD12864_RW=0; //记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚LCD12864_SJ=sj;//记得在包含该头文件前,定义引脚YS_us(0);//稍作延时给LCD反应的时间LCD12864_E=0; //记得在包含该头文件前,定义引脚}/********************初始化**********************///复位、通讯方式选择/************************************************/void LCD12864_CSH(void){P26=1; //通讯方式为并口PSB=1,在设计电路时就把PSB端焊好,节省I/O //LCD12864_XZL(0x34); //34H--扩充指令操作LCD12864_XZL(0x30); //功能设置,一次送8位数据,基本指令集LCD12864_XZL(0x0C); //0000,1100 整体显示,游标off,游标位置offLCD12864_XZL(0x01); //0000,0001 清DDRAMLCD12864_XZL(0x02); //0000,0010 DDRAM地址归位LCD12864_XZL(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器ACLCD12864_XZL(0x06);}#endifLCD12864基础函数—串行#ifndef __LCD12864_JCK_CX_C__#define __LCD12864_JCK_CX_C__/************************************************** **** 六哥LCD12864基础函数库 **** 串行 ****************************************************///使用请注意定义引脚#include"yscx.c"/*******************串行通信*********************分别发送三个字节,11111AB0,DDDD0000,SSSS000,A:即表示并行的RW,1为读,0为写B:即表示并行的RS,1为数据,0为指令D:即表示并行的高四位数据S:即表示并行的低四位数据注:串行要把PSB端为低电平*************************************************/void LCD12864_CXTX(unsigned char fs,sj){unsigned char i;LCD12864_E=0;//时钟SCLKLCD12864_RS=1;///CS片选do ////LCD判忙============={for(i=0;i<8;i++){YS_us(1);//MCU与LCD速率匹配if(i<6) LCD12864_RW=1;//读LCD数据,前6位为1;后两位为0 else LCD12864_RW=0;//命令格式11111100B,0xfcYS_us(1);//MCU与LCD速率匹配LCD12864_E=1;//时钟SCLKYS_us(1);//MCU与LCD速率匹配LCD12864_E=0;//时钟SCLK}YS_us(5);//给LCD反应的时间LCD12864_E=1;//时钟SCLKYS_us(1); //给LCD反应的时间}while(LCD12864_RW);//判忙只需要取最高位,而不管后面7位LCD12864_E=0;//时钟SCLKLCD12864_RS=0;///CS片选YS_us(1);//给LCD反应的时间LCD12864_RS=1;///CS片选for(i=0;i<24;i++)//、、、、送3字节{LCD12864_RW=fs&0x80;//数据SIDfs<<=1;YS_us(1); //MCU与LCD速率匹配LCD12864_E=1; //时钟SCLKYS_us(1); //MCU与LCD速率匹配if(i==7) fs=sj&0xf0; //取数据高四位if(i==15) fs=sj<<4; //取数据低四位LCD12864_E=0; //时钟SCLKYS_us(1); //MCU与LCD速率匹配}LCD12864_RS=0;///CS片选LCD12864_E=1;//恢复高电平不影响其他用途LCD12864_RW=1;//恢复高电平不影响其他用途}/********************写命令**********************/void LCD12864_XZL(unsigned char ml)/*写命令*/{LCD12864_CXTX(0xf8,ml);//命令格式11111000B,0xf8if(ml==0x01|ml==0x02) YS_ms(4);//清屏和地址归位大概需4ms时间处理YS_us(50);//其他指令大概需50us}/********************写数据**********************/void LCD12864_XSJ(unsigned char sj){LCD12864_CXTX(0xfa,sj);//命令格式11111010B,0xfa}/********************初始化**********************///复位、通讯方式选择/************************************************/void LCD12864_CSH(void){P26=0; //通讯方式为串行通信PSB=0,在设计电路时就把PSB端焊好,节省I/O//LCD12864_XZL(0x34);//34H--扩充指令操作LCD12864_XZL(0x30); //功能设置,一次送8位数据,基本指令集LCD12864_XZL(0x0C); //0000,1100 整体显示,游标off,游标位置offLCD12864_XZL(0x01); //0000,0001 清DDRAMLCD12864_XZL(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器ACLCD12864_XZL(0x06);}#endifLCD12864显示函数#ifndef __LCD12864_XSK_C__#define __LCD12864_XSK_C__/******************************************************* **************** 六哥LCD12864显示函数库 **************** *********************************************************///使用请注意定义引脚#include"LCD12864_JCK_cx.C"//包含基础库//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表unsigned char codeascll12864[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x4 3,0x44,0x45,0x46};/***************************************************************LCD12864设置显示地址函数***************************************************************************/unsigned char LCD12864_SZDZ(unsigned char x,y)//{switch(y){case 0:x|=0x80;break;case 1:x|=0x90;break;case 2:x|=0x88;break;case 3:x|=0x98;break;default:;}return(x);}/***************************************************************LCD12864数制显示函数******************************************************************************sj:需要显示的数据,取值范围:十进制:-2147483648-2147483647,十六进制:0H-7FFFFFFFHxsfs:显示方式,进制和小数点的判断依据,x:显示列,取值范围0-7y:显示行,取值范围0-3*/void LCD12864_SZXS(signed long sj,unsigned char xsfs,x,y) {unsigned long xc; //显示缓存unsigned char d[13];bit xsd,fs,bf=0;xsd=0;fs=0;LCD12864_XZL(0x04);//设置光标左移LCD12864_XZL(LCD12864_SZDZ(x,y));//写入显示地址y=0;if(xsfs>10){x=16; //输出十六进制d[y]=0x48; //十六进制显示Hy++;} //else{if(sj<0) //十进制正负数判断{sj=~sj+1;fs=1;} //负号显示使能if(xsfs!=0) xsd=1;//小数点显示使能x=10;} //xc=sj;if(xc!=0) //显示数据不为0;则显示{while(xsd) //判是否需要显示小数{if(xc!=0) //是否还需要计算{sj=xc%x;if(bf|sj!=0) //小数部分为0不需要显示{d[y]=ascll12864[xc%x];y++; //取数的ascll码并显示bf=1; //小数部分不为0标志,小数部分数字有效 }xc/=x; //取剩下的数}else if(bf){d[y]=0x30; //判是否需要补0y++;}else; //小数部分无效,不需要补0xsfs--;if(xsfs==0) //小数点位数减一{xsd=0; //小数计算部分结束标志if(bf){d[y]=0x2e; //小数部分存在有效数字则显示小数点y++;}}}}do{d[y]=ascll12864[xc%x]; //取数的ascll码y++;xc/=x;}while(xc!=0);if(fs){d[y]=0x2d; //取负号ascll码y++;}if(y&&0x01) //如果显示的位数为奇数{d[y]=0x20; //显示一个空格y++;}x=y;y=1;///////////////显示数据//////////////do{LCD12864_XSJ(d[y]);//显示一个地址的前一个字符 y--;LCD12864_XSJ(d[y]);//显示一个地址的后一个字符 y+=3; //跳到下一个要显示的两个字符 }while(y<x); //判断是否显示完毕LCD12864_XZL(0x06);//设置光标右移}/***************************************************** **********LCD12864字符显示函数************************ ****************************************************** *zfc:需要显示的字符串指针,字符数不得超过64个x:显示列,取值范围0-7y:显示行,取值范围0-3*/void LCD12864_ZFXS(unsigned char *zfc,x,y){unsigned char k1,k2,k3;k3=x*2;k1=16-k3;k2=32-k3;k3=48-k3;switch(y) //设置显示地址x和换行标志y{case 0:x|=0x80;y=0;break;case 1:x|=0x90;y=16;break;case 2:x|=0x88;y=32;break;case 3:x|=0x98;y=48;break;default:;}LCD12864_XZL(x);//写显示地址while(*zfc){if(y==k1) LCD12864_XZL(0X90);//换行判断else if(y==k2) LCD12864_XZL(0X88);//换行判断 else if(y==k3) LCD12864_XZL(0X98);//换行判断 else;LCD12864_XSJ(*zfc);//写显示数据y++;/////////////判中文字符/////////if(*zfc>0x7f) zfc++;else{zfc++;if(*zfc>0x7f && y&0x01){LCD12864_XSJ(0x20);y++;}}}}#endif延时函数#ifndef __yscx_C__#define __yscx_C__#include<intrins.h>/*晶振频率33Mhz的stc15系列1T单片机适用*//************************************************** x*us延时函数精度极高,几乎可以忽略延时误差***************************************************/ void YS_us(unsigned char t){for( ;t>0;t--){_nop_();//16*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//16*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//16*nop}_nop_();//12*nop_nop_();_nop_();_nop_();_nop_();_nop_();//12*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12*nop}/*--------------------------------------------------- x*1ms延时函数----------------------------------------------------*/ void YS_ms(unsigned char t){for( ;t>0;t--){YS_us(250);YS_us(250);YS_us(250);YS_us(249);}}#endif(注:文档可能无法思考全面,请浏览后下载,供参考。

LCD12864并行头文件

LCD12864并行头文件
/***************************************************************
lcd12864par头文件
LCD12864并口操作函数声明
作者:天道酬勤,2012、2、14整理
修改:2012、2、15
添加条件编译命令
#define __NUMASC__ //显示数字需要的宏定义
#ifndef __LCD12864PAR_H__
#define __LCD12864PAR_H__
#include <REGX52.H>
#include <math.h>
#include "mytypedef.h"
#include "delay.h"
//普中开发板
//#define io12864 P0
//LCD字符串处理函数
extern void Dis12864Str (u8 addr,u8 *str);
//LCD整形数据显示函数 (2012、8、10修改添加)
extern void Dis12864int2 (u8 addr,u8 int2);
extern void Dis12864int4 (u8 addr,u16 int4);
extern void Dis12864float_2_2 (u8 addr,float f_dat,u8 space);
extern void Dis12864float2_3 (u8 addr,float f_dat);
extern void Dis12864float3_1_ (u8 addr,float f_dat,u8 space);

lcd12864程序

lcd12864程序

//用户版//描述: LCD12864液晶显示模块,对于芯片KS0108(HD61202)驱动程序.//编写:微控设计网 DC版主日期:2007.9.//编译环境:IAR EW430 V3.42A//验证平台: MC430F14+开发板 V1.0//声明:此程序只供微控用户使用.在未得到DC版主的许可请勿将资料外公开和用于商业用途.//******************************************************************* ***********#include "lcd12864.h"extern unsigned char ASCII86[][6];//******************************************************************* ***********//LCD12864函数声明void Lcd12864delay(); //延时void CheckState(); //忙状态检查void WriteByte(unsigned char dat); //写显示数据void SEdCommandToLCD(unsigned char command); //向LCD发送命令void SetLine(unsigned char line); //设定行地址(页)--X 0-7void SetColumn(unsigned char column); //设定列地址--Y 0-63void SetOnOff(unsigned char onoff); //开关显示void SetStartLine(unsigned char startline); //设定显示开始行--XXvoid ClearScreE(unsigned char screE); //清屏void SelectScreE(unsigned char screE); //选择屏幕unsigned char ReadByte(); //读显示数据//显示8*6字符串void ShowString86(unsigned char lin,unsigned char column, unsigned char *string); //反显一个8*6字块void ReverseShow86(unsigned char lin,unsigned char column);//反显某行某几个字符void ReverseLinChar(unsigned char lin,unsigned char startcolumn,unsigned char ShowQuantity);void InitLCD(void); //初始化LCD//******************************************************************* ***********//初级函数列表//******************************************************************* ***********//延时void Lcd12864delay(){unsigned int i=500;while(i--) {;}}void LcdDelay(){unsigned int i=2;while(i--) {;}}//******************************************************************* ***********//忙状态检查(已整理)void CheckState(){MCU_BUS_DIR_IN; //设置BUS口为输入LVC4254_5Vto3V; //LVC4254数据方向为5V往3VRS0;RW1;E1;while(BUSIN & busy) _NOP(); //等待LCD_DB7为0E0; //重设E=0MCU_BUS_DIR_OUT; //设置BUS口为输出LVC4254_3Vto5V; //LVC4254数据方向为3V往5V}//******************************************************************* ***********//写显示数据(已整理)//dat:显示数据void WriteByte(unsigned char dat){CheckState(); //忙状态检查RS1;RW0;BUSOUT = dat; //写向数据口E1;LcdDelay();E0;}//******************************************************************* ***********//向LCD发送命令(已整理)//command :命令void SEdCommandToLCD(unsigned char command){CheckState(); //忙状态检查RS0;RW0;BUSOUT = command; //写入E1;LcdDelay();E0;}//******************************************************************* ***********//清屏(已整理)//screE:1-左屏,2-右//每个屏的显示RAM共64行,分8页,每页8行(一行对相一个字节)void ClearScreE(unsigned char screE){unsigned char i,j;SelectScreE(screE); //选择指定屏for(i=0;i<8;i++) //共8页(每页8行*64列){ SetLine(i); //选择某一页for(j=0;j<64;j++) //每一页全送0x00为清屏{WriteByte(0x00); //一个数据对应8行,8*64=1页,64*8页}}}//******************************************************************* ***********//开关显示(已整理)//onoff=1开,onoff=0为关//当DB0=1时LCD显示RAM中的内容DB0=0时关闭显示void SetOnOff(unsigned char onoff){onoff=0x3e | onoff; //0011 111xSEdCommandToLCD(onoff); //发命令到LCD}//******************************************************************* ***********//选择屏幕(已整理)//screE: 0-全屏,1-左屏,2-右屏void SelectScreE(unsigned char screE){ //MSC-G12864DYSY-2N:选中高电平switch(screE){ case 0: //开全屏CS1_1;_NOP();CS2_1;_NOP();break;case 1: //开左屏CS1_0;_NOP();CS2_1; //关右屏_NOP();break;case 2:CS1_1;//关左屏_NOP();CS2_0;//开右屏_NOP();break;}}//******************************************************************* ***********//设定行地址(页,也就是字行)--X 0-7(已整理)void SetLine(unsigned char line){line=line & 0x07; //保证在 0<=line<=7line=line|0xb8; //1011 1xxx,SEdCommandToLCD(line); //设定指定页}//******************************************************************* ***********//设定列地址--Y 0-63(已整理)void SetColumn(unsigned char column){column=column &0x3f; //0=<column<=63column=column | 0x40; //01xx xxxxSEdCommandToLCD(column); //指定列}//******************************************************************* ***********//设定显示开始行--XX(已整理)//0--63void SetStartLine(unsigned char startline){startline=startline & 0x07; //保证 0<=startline<8startline=startline|0xc0; //1100 0000(显示起始行ROW设置指令)SEdCommandToLCD(startline); //指定行}//******************************************************************* ***********//初始化LCD (已整理)void InitLCD(void){LVC4254_DIR0; //MCU对LVC4254 DIR控制端IO方向设为0LVC4254_3Vto5V; //LVC4254方向为3V转5V,DIR=0MCU_BUS_DIR_OUT; //MCU总线方向为输出LCDCTL_RSRWE_DIR; //MCU对LCD 控制组端IO方向设为LCDCTL_CS1CS2_DIR; //Lcd12864delay();SelectScreE(0); //选择屏SetOnOff(0); //关显示ClearScreE(1); //清屏1ClearScreE(2); //清屏2SelectScreE(0);SetOnOff(1); //开显示SelectScreE(0);SetColumn(0); //开始列:0SetStartLine(0); //开始行:0ClearScreE(0);}//******************************************************************* ***********//读显示数据(已整理)unsigned char ReadByte(void){unsigned int i;unsigned char dat;CheckState();RS1;RW1;MCU_BUS_DIR_IN; //设置BUS口为输入LVC4254_5Vto3V;E1;for(i=0;i<10;i++); //这个延时是不同MCU速度而不同dat=BUSIN; //读入,(原文件是没有此句的)E0;MCU_BUS_DIR_OUT; //设置BUS口为输出LVC4254_3Vto5V;return(dat);}//******************************************************************* ***********//显示8*6点阵,如显ASCII86[][6],字符(已整理)//旋转90度:字模被竖着切分//lin:字行(0-7), column: 字列(0-31)//address : 字模区首地址由Microcontrol dc 编写void Show86(unsigned char lin,unsigned char column, unsigned char *address){unsigned char i,j=0;if(column>31) //列地址大于31返回{return;}//第0-9个字列else if(column<=9){SelectScreE(1);SetLine(lin);SetColumn((column<<3)-(column<<1)); //计算列地址,以6为倍数.每6列显示一个字符.for(i=0;i<6;i++)WriteByte(address[i]);}//第10个字列else if(column==10){ j=(column<<3)-(column<<1);if(j<=63) //第10个字列的前4列{ SelectScreE(1);SetLine(lin);SetColumn(j);for(i=0;i<4;i++){ WriteByte(address[i]);j++;}}if(j>=64){ SelectScreE(2); //第10个字列的后2列j=j-64;SetLine(lin);SetColumn(j);for(i=4;i<6;i++) //在12864中第10个字列的最后两个字节{WriteByte(address[i]);}}}//第11-20个字列else if(10<column&&column<21){ column=column-11;SelectScreE(2);SetLine(lin);SetColumn((column<<3)-(column<<1)+2);for(i=0;i<6;i++)WriteByte(address[i]);}//第21个字列else if(column==21) //第21个字列{ j=(column<<3)-(column<<1);if(j<128) //第21个字列的前2列{ SelectScreE(2);SetLine(lin);SetColumn(j);for(i=0;i<2;i++){ WriteByte(address[i]);j++;}}if(j>=128){j=j-128;SelectScreE(3); //第21个字列的后4列 SetLine(lin);SetColumn(j);for(i=0;i<4;i++){ WriteByte(address[i]);}}}//第22-31个字列/* else{ column=column-22;SelectScreE(3);SetLine(lin);SetColumn((column<<3)-(column<<1)+4);for(i=0;i<6;i++)WriteByte(address[i]);}*/}//******************************************************************* ***********//显示8*6字符串此字体下对应的点阵为:宽x高=8x6 (已整理)//!!!只能显示在一行上即: 串长+column <=31 column(为6的字列,左屏前4列和右屏后4列不用作显示,两屏共19字列)//旋转90度:字模被竖着切分//lin:字行(0-8), column: 字列(0-31)// *string :指向字符串的首址.void ShowString86(unsigned char lin,unsigned char column, unsigned char *string) { unsigned char ch;unsigned char i=0;for(i=0;string[i]!='\0';i++){if(i+column >20) //保证字符不会起过可显示长度.break;ch=string[i]-0x20; //将ASC字符从32-127位置移到0-96位置,以对应ASC86.C中位置Show86(lin,i+column,ASCII86[ch]);}}//******************************************************************* ***********//反显一个8*6字块只适合LCD19264屏,芯片KS0108(HD61202)//lin:行(0-8), column: 列(0-31)void ReverseShow86(unsigned char lin,unsigned char column){ unsigned char i,j=0;unsigned char tab[6];if(column>31) //列地址大于31返回{return;}//第0-9个字列if(column<=9){ SelectScreE(1); //如果列数(0-9),则写在第一屏上(左屏)SetColumn((column<<3)-(column<<1)); //计算列地址,以6为倍数.每6列显示一个字符.SetLine(lin); //设置行//tab[0]=(ReadByte()); //空读!!!!! ,进行读操作前,必须空读一次for(i=0;i<6;i++) //读6个字节回来tab[i]=~(ReadByte());SetColumn((column<<3)-(column<<1)); //设回初始列for(i=0;i<6;i++) //写回来字节WriteByte(tab[i]);}//第10个字列else if(column==10){ j=(column<<3)-(column<<1); //暂存列值if(j<=63) //是否为第10个字列的前4列{SelectScreE(1); //前4列显示在左屏SetColumn(j);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<4;i++) //读4个字节回来{tab[i]=~ReadByte();j++; }SetColumn((column<<3)-(column<<1));for(i=0;i<4;i++) //写回来字节WriteByte(tab[i]);}if(j>=64){ column=column-10; //为第10个字列的后2列 SelectScreE(2); //显示在中屏SetColumn(column);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<2;i++) //读6个字节回来{tab[i]=~ReadByte();j++;}SetColumn((column<<3)-(column<<1));for(i=0;i<2;i++) //写回来字节WriteByte(tab[i]);}}//第11-20个字列else if(10<column&&column<21){ SelectScreE(2); //显示在中屏column=column-11; //如果列数(11-20),则写在第一屏上(中屏)SetColumn((column<<3)-(column<<1)+2); //计算列地址,以6为倍数SetLine(lin);//tab[0]=ReadByte(); //空读!!!!! ,进行读操作前,必须空读一次for(i=0;i<6;i++) //读6个字节回来tab[i]=~ReadByte();SetColumn((column<<3)-(column<<1)+2);for(i=0;i<6;i++) //写回来字节WriteByte(tab[i]);}//第21个字列 --对于192*64屏else if(column==21){ j=(column<<3)-(column<<1);if(j<=127){SelectScreE(2);SetColumn(j);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<2;i++) //读6个字节回来{tab[i]=~ReadByte();j++; }SetLine(lin);SetColumn((column<<3)-(column<<1));for(i=0;i<2;i++)WriteByte(tab[i]);}if(j>=128){ column=column-21; //计算字列SelectScreE(3); //显示右屏SetColumn(column);SetLine(lin);//tab[0]=ReadByte(); //空读!!!!!for(i=0;i<4;i++) //读6个字节回来 {tab[i]=~ReadByte();j++;}SetLine(lin);SetColumn((column<<3)-(column<<1));for(i=0;i<4;i++)WriteByte(tab[i]);}}/* //第22-31个字列--对于192*64屏else if(21<column&&column<=31){ SelectScreE(3);column=column-22;SetColumn((column<<3)-(column<<1)+4);SetLine(lin);tab[0]=ReadByte();for(i=0;i<6;i++)tab[i]=~ReadByte();SetLine(lin);SetColumn((column<<3)-(column<<1)+4);for(i=0;i<6;i++)WriteByte(tab[i]);}*/}//******************************************************************* ***********//反显某行某几个字符 LCD19264//lin:行(0-7), column: 列(0-15)void ReverseLinChar(unsigned char lin,unsigned char startcolumn,unsigned char ShowQuantity){ unsigned char i;for(i=0;i<ShowQuantity;i++){if(startcolumn+i>21) //列地址大于21返回return;ReverseShow86(lin,startcolumn+i);}}//******************************************************************* ***********。

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。

LCD12864程序文档

LCD12864程序文档

LCD12864串口显示使用详解LCD12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。

每个显示点对应一位二进制数,1表示亮,0表示灭。

存储这些点阵信息的RAM称为显示数据存储器,要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。

LCD12864控制芯片:ST7920A 带中文字库MCU:STM32F103源程序下载地址:/detail/wylloong/8538839根据串行连接时序图所示,串行数据传送共分三个字节完成:第一字节:串口控制指令——格式 11111ABC 其中,A为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD;B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令;C固定为0第二字节:(并行)8位数据的高4位——格式 DDDD0000第三字节:(并行)8位数据的低4位——格式 0000DDDD,发送时将低四位移至发送数据的高四位,即DDDD0000方能正确。

绘图RAM(GDRAM):绘图显示RAM提供128*8个字节的记忆空间,在更改绘图RAM时,先连续写入水平与垂直的坐标值,再写入两个字节的数据到绘图RAM,而地址计数器(AC)会自动加1;在写入绘图RAM的期间,绘图显示必须关闭。

整个写入绘图RAM的步骤如下:1、关闭绘图显示功能。

2、先将水平的位元组坐标(X)写入绘图RAM地址,再将垂直的坐标(Y)写入绘图RAM地址;将D15——D8写入到RAM中;将D7——D0写入到RAM 中;3、打开绘图显示功能。

带中文字库的128X64显示模块时应注意以下几点:①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

②显示ASCII字符过程与显示中文字符过程相同。

不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

LCD12864写字符串程序及其头文件

LCD12864写字符串程序及其头文件
write_data(0xD5);// D5C5 D4F6 B9F0
delay(2);
write_data(0xC5);//八根线并行传输的原因,为此需要每八个字节进行传输
delay(2);
write_data(0xD4);
delay(2);
write_data(0xF6);
delay(2);
write_data(0xB9);
delay(3);
write_com(0x0C); //显示开/关光标
delay(5);
write_com(0x01); //清除LCD的显示,即清屏指令
delay(5);
}
/********************************************
光标定位函数,X显示列,Y显示行
***********************************************/
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define RS_0 PORTC&=~(1<<PC0) //数据指令选择端高电平数据低电平指令
#define RS_1 PORTC|=(1<<PC0)
#define RW_0 PORTC&=~(1<<PC1) //并口时,读写选择端,低电平写;串口时数据输入端
void LCD_init()
{
write_com(0x01);
delay(5) ; //清屏指令
PSB_1; //并口数据传输模式
RST_0; //低电平复位

lcd12864带字库经典程序

lcd12864带字库经典程序
ListLength++;
X++;
Delay5Ms();
}
}
}
/***********短延时********************************************************/
voidDelay5Ms(void)
{
unsignedintTempCyc= 5552;
while(TempCyc--);
WriteDataLCD(DData);
}
/***********按指定位置显示一串字符*****************************************/
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)
voidWriteDataLCD(unsignedcharWDLCD)
{
ReadStatusLCD();//检测忙
LCD_RS= 1;
LCD_RW= 0;
LCD_Data=WDLCD;
LCD_E= 1;
LCD_E= 1;
LCD_E= 0;
}
/***********写指令********************************************************/
sbitLCD_RS=P1^0;
sbitLCD_RW=P1^1;
sbitLCD_E=P1^2;
sbitPSB=P1^6;//PSB脚为-12系列的串、并通讯功能切换,使用位并行接口,PSB=1
/********宏定义***********************************************************/

LCD12864-串行传输程序

LCD12864-串行传输程序
(卷动位置或RAM地址选择)*/
//********************************************************************************************************
SCLK = 0; //下降沿读走数据
NOP();
}
}
/*读出一个字节 该字节高四位是第一个字节temp1高四位,低四位是temp2的高四位*/
static uchar read_byte()
{
uchar i,temp1,temp2;
}while(sbuff&0x80);
}
/*向LCD12864写入一个指令或者数据*/
void write_12864_byte(bit C_D,uchar date)
{
check_busy(); //读忙
CS = 1; //使能液晶
NOP();
if(SID) //如果数据是1 则最低位置一
temp1++;
NOP();
SCLK= 0;
NOP();
}
for(i=0;i<8;i++) //第二个字节中是读取数据的低四位
write_12864_byte(0,0x01);//0000 0001 清零 将DDRAM填满“20H”(空格)代码,并且设定DDRAM的地址计数器(AC)为00H;
// 更新设置进入设定点将I/D设为1,游标右移AC加1。
{
uchar i;
CS=0;
SID=0;
SCLK=0;
RST=0;
for(i=250;i>0;i--); //液晶复位延时一下

并行12864头文件

并行12864头文件

/***本程序为LCD12864并行事例程序,12864并行的头文件也在末尾附上***/ /***接口为msp430,51单片机只要稍加修改即可***//***内有显示数字、汉字、画数学函数图、显示字模点阵等操作***//***made by糖coffee@uestc***/#include<msp430xG46x.h>#include"lcd12864_p.h"#include"math.h"/***main.c***/void main(void){WDTCTL=WDTPW+WDTHOLD;Initial_LCD();ClearLCD();DrawL(0,0,127,63,1);for(unsigned int i=0;i<127;i++){unsigned int y=(unsigned int)((1+sin(i/10.0))*31.0);unsigned int x=(unsigned int)((1+cos(i/10.0))*31.0);;DrawP(i,y,1);DrawP(i,x,1);DrawP(x,y,1);//LCD_DrawP(x,y,0);Set_cursor(1,3);PutsLCD("正弦曲线");}while(1);}附12864头文件/******lcd12864并行程序******//*-----------------------------------------------Headfile:LCD12864Device Pin:1-VSS2-VDD3-V04-RS5-R/W6-E7-14DB0-DB7------------------------------------------------*/#ifndef__lcd12864_p#define__lcd12864_p/********************宏定义********************/#define DataDIR P3DIR#define DataOUT P3OUT#define DataIN P3IN#define LCD_RS BIT1#define LCD_RW BIT3#define LCD_E BIT5#define LCD_DIR P2DIR#define LCD_CTRL P2OUT#define LCD_RS_Set_high LCD_CTRL|=LCD_RS#define LCD_RS_Set_low LCD_CTRL&=~LCD_RS#define LCD_RW_Set_high LCD_CTRL|=LCD_RW#define LCD_RW_Set_low LCD_CTRL&=~LCD_RW#define LCD_E_Set_high LCD_CTRL|=LCD_E#define LCD_E_Set_low LCD_CTRL&=~LCD_E/********************常用子函数********************/ unsigned char lcd_buffer[128][64];int ABS(int x){return(x>0?x:-x);}/*void LCD_Update(unsigned char X,unsigned char Y){if(X>=127||Y>=63)return;ReadOldH=lcd_buffer[X+1][Y];ReadOldL=lcd_buffer[X][Y];Y>>=3;LCD_WriteCMD(0x34);LCD_WriteCMD(0x36);Tier=X>>4;Tier_bit=X&0x0f;if(Y<32){Row=Y;}else{Row=Y-32;Tier+=8;}//P1.3pullupLCD_WriteCMD(Row+0x80);LCD_WriteCMD(Tier+0x80);LCD_WriteDAT(ReadOldH);LCD_WriteDAT(ReadOldL);LCD_WriteCMD(0x30);}*//*******************************************函数名称:delay功能:用于消抖的延时参数:无返回值:无********************************************/void Delayus(unsigned char t){while(t--);}void Delay5ms(void){for(unsigned int i=5000;i;i--);}/****************************************************函数名称:LCD_WaitForEnable功能:等待12864液晶完成内部操作参数说明:无返回值:无****************************************************/ void LCD_WaitForEnable(){unsigned char busy;LCD_RS_Set_low;LCD_RW_Set_high;DataDIR=0x00;do{LCD_E_Set_high;_NOP();busy=DataIN;LCD_E_Set_low;}while(busy&0x80);DataDIR=0xff;}/****************************************************函数名称:LCD_WriteCMD(unsigned char cmd,unsigned char check)功能:向12864液晶写入指令参数:cmd--待写指令check--是否判忙的标志,1:判忙,0:判忙返回值:无****************************************************/void LCD_WriteCMD(unsigned char cmd){LCD_WaitForEnable();//检测忙信号LCD_RS_Set_low;LCD_RW_Set_low;_NOP();DataOUT=cmd;_NOP();LCD_E_Set_high;_NOP();LCD_E_Set_low;}/****************************************************函数名称:LCD_WriteDAT(unsigned char data)功能:向1602液晶显示的当前地址写入显示数据参数:data--显示的字符数据(ASCII码,或以''界定)返回值;无****************************************************/ void LCD_WriteDAT(unsigned char data){LCD_WaitForEnable();//等待液晶不忙LCD_RS_Set_high;LCD_RW_Set_low;_NOP();DataOUT=data;//将显示数据写入数据端口_NOP();LCD_E_Set_high;//产生使能脉冲信号_NOP();LCD_E_Set_low;}/****************************************************函数名称:initial_lcd功能:12864液晶复位参数说明:无返回值:无****************************************************/void Initial_LCD(void){LCD_DIR|=(LCD_RS+LCD_RW+LCD_E);//控制线端口设置为输出DataDIR=0xff;//数据线端口设置为输出Delay5ms();LCD_WriteCMD(0x30);//基本指令集Delay5ms();LCD_WriteCMD(0x01);//清屏,地址00HDelay5ms();LCD_WriteCMD(0x06);//光标的移动方向Delay5ms();LCD_WriteCMD(0x0c);//开显示,关游标Delay5ms();}/****************************************************函数名称:LCD_SetCursor(unsigned char x,unsigned char y)功能:向液晶发送显示坐标参数说明:x--列坐标y--行坐标返回值:无****************************************************/void Set_cursor(unsigned char CurY,unsigned char CurX){switch(CurY){case0:LCD_WriteCMD(0x80+CurX);break;//写入第一行CurX列的地址case1:LCD_WriteCMD(0x90+CurX);break;//写入第二行CurX列的地址case2:LCD_WriteCMD(0x88+CurX);break;//写入第三行CurX列的地址case3:LCD_WriteCMD(0x98+CurX);break;//写入第四行CurX列的地址default:break;}}/****************************************************函数名称:PutcLCD(unsigned char data)功能:向12864液晶写字符参数说明:x,y--坐标Data--数据返回值:无****************************************************/void PutcLCD(unsigned char data){LCD_WriteDAT(data);}void PutDig(unsigned char num){LCD_WriteDAT(num+0x30);}/*****************************************************************函数名称:PutArray(unsigned char*data,unsigned char length,unsigned char address)函数功能:在LCD上显示一个数组(显示一串字符的前length个)输入变量:unsigned char dataunsigned char lengthunsigned char address调用函数:Write_Data()*****************************************************************/ void PutArray(unsigned char*data,unsigned char length,unsigned char address){unsigned char i;if(address!=0)//判断是否改变当前位置{//如果cAddr不为零,则改变按cAddr改变当前位置LCD_WriteDAT(address);//send the beginning address}for(i=0;i<length;i++){LCD_WriteDAT(data[i]);}}/************************************************函数名称:PutInt(unsigned int num)函数功能:显示十进制数输入变量:unsigned int num输出变量:无调用函数:************************************************/void PutInt(unsigned int num){unsigned int snum;unsigned char temp[12]={0},temp1[12]={0}; unsigned char i=0,n=0;snum=num;if(snum==0){temp[0]='0';i++;}while(num!=0){temp[i]=num%10+0x30;num=num/10;i++;}n=i;for(i=0;i<n;i++)temp1[i]=temp[n-1-i];PutArray(temp1,n,0);}/***********************************************函数名称:PutsLCD()功能描述:LCD写入RAM字符串输入:字符指针Str输出:无***********************************************/ void PutsLCD(unsigned char*Str){while(*Str!='\0')//字符串还没有结束{LCD_WriteDAT(*Str);Str++;}}void ClearLCD()//CLR_GDRAM{unsigned char x,y;for(y=0;y<64;y++)for(x=0;x<16;x++){LCD_WriteCMD(0x34);LCD_WriteCMD(y+0x80);//行地址LCD_WriteCMD(x+0x80);//列地址LCD_WriteCMD(0x30);LCD_WriteDAT(0x00);LCD_WriteDAT(0x00);}}unsigned char ReadByte(){unsigned char byReturnValue;LCD_WaitForEnable();DataDIR=0x00;LCD_RW_Set_high;LCD_E_Set_low;LCD_RS_Set_high;_NOP();_NOP();LCD_E_Set_high;byReturnValue=DataIN;LCD_E_Set_low;DataDIR=0xff;return byReturnValue;}//******************************************************************* //函数名称:PutHex(unsigned char HEX_Val)//功能描述:LCD写入十六进制数//输入变量:unsigned char HEX_Val//******************************************************************* void PutHex(unsigned char data){unsigned char temp;LCD_WriteDAT('0');LCD_WriteDAT('x');//使前两位是0xtemp=data>>4;if(temp>9)temp+=0x37;/*0-9的BCD码为X+0X30*/else temp+=0x30;/*A-F的BCD码为X+0X37*/LCD_WriteDAT(temp);temp=data&0x0F;if(temp>9)temp+=0x37;else temp+=0x30;LCD_WriteDAT(temp);}//******************************************************************* //函数名称:DrawP(unsigned char X,unsigned char Y,unsigned char Color)//功能描述:LCD打点//输入变量:X-横坐标,Y-纵坐标,Color-0擦除1点亮2取反//******************************************************************* void DrawP(unsigned char X,unsigned char Y,unsigned char Color){unsigned char Row,Tier,Tier_bit;unsigned char ReadOldH,ReadOldL;LCD_WriteCMD(0x34);LCD_WriteCMD(0x36);Tier=X>>4;Tier_bit=X&0x0f;if(Y<32){Row=Y;}else{Row=Y-32;Tier+=8;}LCD_WriteCMD(Row+0x80);//垂直(列)地址LCD_WriteCMD(Tier+0x80);//水平(行)地址ReadByte();ReadOldH=ReadByte();ReadOldL=ReadByte();LCD_WriteCMD(Row+0x80);LCD_WriteCMD(Tier+0x80);if(Tier_bit<8){switch(Color){case0:ReadOldH&=(~(0x01<<(7-Tier_bit)));break;case1:ReadOldH|=(0x01<<(7-Tier_bit));break;case2:ReadOldH^=(0x01<<(7-Tier_bit));break;default:break;}}else{switch(Color){case0:ReadOldL&=(~(0x01<<(15-Tier_bit)));break;case1:ReadOldL|=(0x01<<(15-Tier_bit));break;case2:ReadOldL^=(0x01<<(15-Tier_bit));break;default:break;}}LCD_WriteDAT(ReadOldH);LCD_WriteDAT(ReadOldL);LCD_WriteCMD(0x30);}//******************************************************************* //函数名称:DrawLX(unsigned char X0,unsigned char X1,unsigned char Y,unsigned char Color)//功能描述:LCD画水平线//输入变量:(X0,Y)-起点,(X1,Y)-终点,Color-0擦除1点亮2取反//******************************************************************* void DrawLX(unsigned char X0,unsigned char X1,unsigned char Y,unsigned char Color){unsigned char Temp;if(X0>X1){Temp=X1;X1=X0;X0=Temp;}for(;X0<=X1;X0++)DrawP(X0,Y,Color);}//******************************************************************* //函数名称:DrawLY(char X,unsigned char Y0,unsigned char Y1,unsigned char Color) //功能描述:LCD画垂直线//输入变量:(X,Y0)-起点,(X,Y1)-终点,Color-0擦除1点亮2取反//******************************************************************* void DrawLY(unsigned char X,unsigned char Y0,unsigned char Y1,unsigned char Color){unsigned char Temp;if(Y0>Y1){Temp=Y1;Y1=Y0;Y0=Temp;}for(;Y0<=Y1;Y0++)DrawP(X,Y0,Color);}//******************************************************************* //函数名称:DrawLX(unsigned char X0,unsigned char X1,unsigned char Y,unsigned char Color)//功能描述:LCD画水平线//输入变量:(StartX,StartY)-起点,(EndX,EndY)-终点,Color-0擦除1点亮2取反//******************************************************************* void DrawL(unsigned char StartX,unsigned char StartY,unsigned char EndX, unsigned char EndY,unsigned char Color){int t,distance;/*根据屏幕大小改变变量类型(如改为int型)*/int x=0,y=0,delta_x,delta_y;char incx,incy;delta_x=EndX-StartX;delta_y=EndY-StartY;if(delta_x>0){incx=1;}else if(delta_x==0){DrawLY(StartX,StartY,EndY,Color);return;}else{incx=-1;}if(delta_y>0){incy=1;}else if(delta_y==0){DrawLX(StartX,EndX,StartY,Color);return;}else{incy=-1;}delta_x=ABS(delta_x);delta_y=ABS(delta_y);if(delta_x>delta_y){distance=delta_x;}else{distance=delta_y;}(文档由爱奇艺播放器官方下载/分享,使用爱奇艺看电影速度更快,并支持自动更新自身内海量的高清电影视频。

LCD12864使用手册

LCD12864使用手册

文件型号LCD12864文件类型服务文件版本 1.0图形点阵液晶显示模块使用手册LCD12864一.概述HEM12864I是一种图形点阵液晶显示器。

它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了128(列)×64(行)的全点阵液晶显示。

此显示器采用了COB的软封装方式,通过导电橡胶和压框连接LCD,使其寿命长,连接可靠。

二.特性1.工作电压为+5V±10% ,可自带驱动LCD所需的负电压。

2.全屏幕点阵,点阵数为128(列)×64(行),可显示8(/行)×4(行)个(16×16点阵)汉字,也可完成图形,字符的显示。

3.与CPU接口采用5条位控制总线和8位并行数据总线输入输出,适配M6800系列时序。

4.内部有显示数据锁存器。

5.简单的操作指令,显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令。

三.外形尺寸1.外形尺寸图2.主要外形尺寸项目标 准 尺 寸 单 位模 块 体 积 54.0×50.0×6.5mm定 位 尺 寸 49.0×45.0mm视 域43.5×29.0 mm行 列 点 阵 数 128×64dots点 距 离 0.32×0.39mm点 大 小0.28×0.35mm四.硬件说明1.引脚特性2.引脚号引脚名称 级 别 引脚功能描述1 VSS0V电源地2 VDD +5V 电源电压3 VLCD 0~-10V LCD驱动负电压,要求VDD-VLCD=13V4 RS H/L 寄存器选择信号5 R/W H/L 读/写操作选择信号6 E H/L 使能信号7 DB08 DB19 DB210 DB3H/L八位三态并行数据总线11 DB412 DB513 DB614 DB715 CS1 H/L 片选信号,当CS1=H时,液晶左半屏显示16 CS2 H/L 片选信号,当CS2=H时,液晶右半屏显示17 /RES H/L 复位信号,低有效18 VEE -10V 输出-10V的负电压(单电源供电)19 BLA+5V 背光电源20 BLK 0V 背光电源2.原理简图3.主要各部分详解99999991)显示数据RAM(DDRAM)DDRAM(64×8×8 bits)是存储图形显示数据的。

LCD12864显示程序(成功版)

LCD12864显示程序(成功版)

#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char//--定时使用的IO口--//#define DATA_PORT P0sbit LCD12864_CS = P3^2;sbit LCD12864_RSET = P3^3;sbit LCD12864_RS = P2^6;sbit LCD12864_RW = P2^7;sbit LCD12864_RD = P2^5;//--定义全局函数--//void LcdSt7565_WriteCmd(cmd);void LcdSt7565_WriteData(dat);void Lcd12864_Init();void Lcd12864_ClearScreen(void);void Lcd12864_Write16CnCHAR(uchar x, uchar y,uchar k);void Delay10ms(unsigned int c);unsigned char code table[40][32]={/*-- 文字: 。

--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x24,0x18,0x00,0x00,/*-- 文字: 都--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x06,0xDA,0x22,0x02,0xFE,0x20,0x26,0x28,0x34,0x24,0x7F,0xA4,0x24,0x24,0x20, 0x00,0x07,0x08,0x10,0x08,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x02,0x04,/*-- 文字: 皇--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7C,0x54,0x54,0x54,0x54,0x55,0x56,0x54,0x7C,0x00,0x00,0x00, 0x00,0x40,0x41,0x49,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,/*-- 文字: 满--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x24,0x24,0x2F,0xE4,0x24,0x24,0xE4,0x2F,0x24,0x24,0x00,0x8C,0x02,0x60,0x10, 0x00,0x7F,0x91,0x49,0x07,0x09,0x19,0x07,0x09,0x11,0xFF,0x00,0x01,0x7E,0x04,0x04,/*-- 文字: 柳--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x04,0x04,0xFC,0x00,0xF8,0x02,0x04,0xFC,0x10,0x90,0xFF,0xD0,0x10,0x10, 0x00,0x07,0x08,0x04,0xFF,0x00,0x0F,0x32,0x44,0x8F,0x01,0x00,0xFF,0x00,0x03,0x04,/*-- 文字: 烟--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0xFE,0x08,0x10,0xFF,0x00,0x70,0x80, 0x00,0xFF,0x40,0x4C,0x42,0x41,0x46,0x48,0x50,0xFF,0x10,0x08,0x07,0x18,0x60,0x80,/*-- 文字: 胜--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x10,0x10,0x10,0xFF,0x10,0x10,0x3C,0x40,0x00,0xFE,0x22,0x22,0xFE,0x00, 0x00,0x40,0x42,0x42,0x42,0x7F,0x42,0x42,0x42,0x40,0x00,0xFF,0x82,0x02,0x7F,0x80,/*-- 文字: 绝--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xE0,0x2C,0x34,0xE4,0x24,0x27,0xE8,0x10,0x20,0x10,0x63,0xAC,0x30,0x20, 0x00,0x70,0x43,0x42,0x42,0x43,0x42,0x42,0x3F,0x00,0x00,0x12,0x12,0x22,0x67,0x22,/*-- 文字: ,--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x58,0x00,0x00,/*-- 文字: 处--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x20,0x10,0xFF,0x00,0x00,0xF8,0x08,0x08,0x9F,0x60,0x80,0x00, 0x00,0x40,0x41,0x40,0x40,0x40,0x5F,0x40,0x20,0x20,0x13,0x0C,0x13,0x20,0x40,0x81,/*-- 文字: 好--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x86,0x8A,0x92,0xE2,0x82,0x82,0x80,0x00,0xF0,0x10,0x1F,0xF0,0x10,0x10, 0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x00,0x61,0x16,0x08,0x15,0x22,0x40,/*-- 文字: 春--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x44,0x54,0x54,0xD4,0x54,0x54,0x5F,0x74,0x54,0xD4,0x54,0x54,0x44,0x40, 0x00,0x04,0x04,0x02,0x01,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x01,0x02,0x04,0x04,/*-- 文字: 年--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x04,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0xC7,0x18,0x20,0x00, 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,/*-- 文字: 一--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 是--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00, 0x00,0x81,0x81,0x89,0x89,0x89,0x89,0x89,0xFF,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,/*-- 文字: 最--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x55,0xD5,0x55,0x55,0x5F,0xC0,0x40,0x40, 0x00,0x80,0x80,0x43,0x2D,0x11,0x29,0x47,0x90,0xFF,0x15,0x15,0x25,0x3F,0x60,0x20,/*-- 文字: 。

lcd12864c语言编程详解

lcd12864c语言编程详解

12864系列点阵型液晶显示模块使用说明书一、OCM12864液晶显示模块概述1.OCM12864液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。

采用KS0107控制IC。

2.外观尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)78×70×10mm(ocm12864-3),3.视域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),64×44mm(ocm12864-3)4.重量:大约g补充说明:外观尺寸可根据用户的要求进行适度调整。

二、最大工作范围1、逻辑工作电压(Vcc):4.5~5.5V2、电源地(GND):0V3、LCD驱动电压(Vee):0~-10V4、输入电压:Vee~Vdd5、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温)6、保存温度(Tstg):-10~65℃三、电气特性(测试条件 Ta=25,Vdd=5.0+/-0.25V)1、输入高电平(Vih):3.5Vmin2、输入低电平(Vil):0.55Vmax3、输出高电平(Voh):3.75Vmin4、输出低电平(Vol):1.0Vmax5、工作电流:2.0mAmax四、接口说明12864-3A接口说明表五、指令描述1、显示开/关设置CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:设置屏幕显示开/关。

DB0=H,开显示;DB0=L,关显示。

不影响显示RAM(DD RAM)中的内容。

2、设置显示起始行CODE:R/W D/I DB7 DB6 DB5 DB4 DB3 DB2DB1 DB0功能:执行该命令后,所设置的行将显示在屏幕的第一行。

LCD12864显示程序(汇编语言)

LCD12864显示程序(汇编语言)

;实验目的:熟悉12864LCD的使用;12864LCD带中文字库;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“5”,公司传真“6”;硬件设置:;关断所有拨码开关。

#include<p16f877a.inc>;__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择#DEFINE RW PORTA,4 ;读/写选择#DEFINE E PORTA,3 ;使能信号#DEFINE PSB PORTA,2 ;并口/串口选择(H/L)#DEFINE RST PORTA,0 ;复位信号;-----------------------------------------------LCD_X EQU 30H ;页地址LCD_Y EQU 31H ;Y地址COUNT EQU 32H ;循环计数用COUNT1 EQU 33H ;循环计数用COUNT2 EQU 34H ;循环计数用POINT EQU 35H ;查表偏移地址POINT1 EQU 36H ;查表偏移地址POINT2 EQU 37H ;查表偏移地址TEMP EQU 38H ;临时寄存器TEMP1 EQU 39H ;临时寄存器;-----------------------------------------------ORG 0000H ;复位地址NOP ;ICD需要的空指令GOTO MAIN ;跳转到主程序;**********************主程序************************MAINBANKSEL TRISACLRF TRISA ;A口输出CLRF TRISD ;D口输出BANKSEL ADCON1MOVLW 06HMOVWF ADCON1 ;A口全为数字口CLRF STATUSBCF RST ;复位LCDCALL DELAY ;延时一段时间BSF RST ;清除复位信号NOPBSF PSB ;并口通讯;**************************初始化**********************MOVLW 30H ;基本指令操作CALL SEND_IMOVLW 01H ;清除显示CALL SEND_IMOVLW 06H ;指定在写入或读取时,光标的移动方向 CALL SEND_IMOVLW 0CH ;开显示,关光标,不闪烁CALL SEND_I;***********************显示汉字************************HAN_WR2CALL CLEAR_P ;清屏HAN_WR2A ;“深圳乾龙盛电子”MOVLW LOW(TAB1A)MOVWF POINTMOVLW HIGH(TAB1A)MOVWF POINT1 ;获取表格的首地址MOVLW 0eH ;数数据字节个数(7个汉字共14字节) MOVWF COUNTMOVLW 81H ;页地址CALL SEND_ICALL QUSHUHAN_WR2B ;“。

lcd12864头文件

lcd12864头文件

/***************糖coffee@uestc*****************/#ifndef __LCD12864#define __LCD12864#define LCD_CS BIT0#define LCD_SID BIT2#define LCD_CLK BIT4#define LCD_EN P3DIR#define LCD_CTRL P3OUT#define LCD_CS_Set_high LCD_CTRL |= LCD_CS#define LCD_CS_Set_low LCD_CTRL &= ~LCD_CS#define LCD_SID_Set_high LCD_CTRL |= LCD_SID#define LCD_SID_Set_low LCD_CTRL &= ~LCD_SID#define LCD_CLK_Set_high LCD_CTRL |= LCD_CLK#define LCD_CLK_Set_low LCD_CTRL &= ~LCD_CLK#define LCD_delay 1voidWrite_Data(unsigned char byte ,unsigned char reffer);voidSend_Byte(unsigned char byte);voidClearLCD(void);voidPut_Array(unsigned char *data , unsigned char length ,unsigned char address); /*************延时**********************/void Delay(unsigned char time) //主时钟1微秒延时{unsignedinti;i=0x08*time;for(; i; i--);}/************************************************//函数名称:Initial_LCD(void)//函数功能:启动初始化************************************************/voidInitial_LCD(void){LCD_EN |= LCD_CS + LCD_SID + LCD_CLK;Write_Data (0x30,0); //基本指令集Delay(LCD_delay);Write_Data(0x30,0);Write_Data(0x0C,0);Delay(LCD_delay);Write_Data(0x01,0); //清屏Delay(LCD_delay);Write_Data(0x06,0);Delay(LCD_delay);}/**************************************************************** *函数名称:Write_Data(unsigned char byte,unsigned char reffer)*函数功能:发送指令或数据reffer数据 1指令0*输入变量:unsigned char byteunsigned char byte****************************************************************/ voidWrite_Data(unsigned char byte ,unsigned char reffer){unsigned char temp,stemp;temp = byte;LCD_CS_Set_high;LCD_CLK_Set_low;if(reffer==1)Send_Byte(0xFA);elseSend_Byte(0xF8); //发送第一个字节stemp = (temp & 0xF0);Send_Byte(stemp);stemp = temp <<4;Send_Byte(stemp);LCD_CS_Set_low;}/**********************************************************函数名称:Send_Byte(unsigned char byte)*函数功能:发送一字节数据*输入变量:unsigned char byte*********************************************************/ voidSend_Byte(unsigned char byte){unsigned char temp,i;temp = byte;for(i=0;i<8;i++) //send 8 times{if (temp&0x80) //send the highestLCD_SID_Set_high;elseLCD_SID_Set_low;temp = (temp<<1);LCD_CLK_Set_low;LCD_CLK_Set_high;Delay(LCD_delay);}}/******************************************************************** ****************函数名称:Put_Array( unsigned char data, unsigned char length,unsigned char address )*函数功能: 在LCD上显示一个数组*输入变量:unsigned char dataunsigned char lengthunsigned char address********************************************************************* **************/voidPut_Array(unsigned char *data , unsigned char length ,unsigned char address) {if(address!=0){Write_Data(address,0);}for (unsigned char i=0;i<length;i++){Write_Data(data[i],1);}}/*************************************************函数名称:ClearLCD(void)*函数功能:清屏***************************************************/voidClearLCD(void){Write_Data(0x01,0);}/******************************************************************** ****函数名称: Set_cursor*功能描述: 设置光标的位置为CurY行,CurX列*输入: CurX=position(0:7) CurY=line(0:3)********************************************************************* **/voidSet_cursor(unsigned char CurY, unsigned char CurX){switch(CurY){case 0: Write_Data(0x80+CurX,0);break; // 写入第一行CurX列的地址case 1: Write_Data(0x90+CurX,0);break; // 写入第二行CurX列的地址case 2: Write_Data(0x88+CurX,0);break; // 写入第三行CurX列的地址case 3: Write_Data(0x98+CurX,0);break; // 写入第四行CurX列的地址default: break;}}/*************************************************函数名称:PutInt(unsigned intnum)*函数功能:显示十进制数************************************************/voidPutInt(unsigned intnum){unsignedintsnum;unsigned char temp[12]={0}, temp1[12] ={0};unsigned char i = 0,n = 0 ;snum = num;if(snum ==0 ){temp[0] = '0';i++ ;}while(num!=0){temp[i] = num%10+0x30;num = num/10;i++ ;}n = i;for(i=0;i<n; i++)temp1[i] = temp[n-1-i];Put_Array(temp1,n,0);}voidPutDig(unsigned char num){unsigned char snum;snum = num + 0x30;Write_Data(snum,1);;}/************************************************* 函数名称: PutcLCD()** 功能描述: LCD写char** 输入: LCD_Char***********************************************/ voidPutcLCD( unsigned char LCD_Char ){Write_Data(LCD_Char,1);}/************************************************* 函数名称: PutsLCD()** 功能描述: LCD写入RAM字符串** 输入: 字符指针Str***********************************************/ voidPutsLCD(const char *Str){intStr_Temp;Str_Temp=*Str; // Str_Temp所赋的值是Str所指向的字符while(Str_Temp!=0x00) // 字符串还没有结束{Write_Data(Str_Temp,1);Str++;Str_Temp=*Str;}}/*************************************函数名:ClrRam(void)函数功能:清整个GDRAM空间*************************************/voidClrRam(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){Write_Data(0x34,0);Write_Data(y+0x80,0); //行地址Write_Data(x+0x80,0); //列地址Write_Data(0x30,0);Write_Data(0x00,1);Write_Data(0x00,1);}}/***************************************************函数名:ShowAll函数说明:显示一幅128*64的图画传入参数:图形指针*img,可以用字模软件提取****************************************************/ voidShowAll(unsigned char *pPicture){unsigned char i,j,k;Write_Data(0x36,0);for(i=0;i<2;i++) //分上下两屏写{for(j=0;j<32;j++) //行{Write_Data(0x80+j,0); //写X坐标(第几行上写)if(i==0) //写Y坐标,判断哪一屏Write_Data(0x80,0);elseWrite_Data(0x88,0);for(k=0;k<16;k++) //写一整行数据(16个字节,合八个字符)Write_Data(*pPicture++,1);}}//Write_Data(0x36,0);}#endif。

12864应用程序加头文件

12864应用程序加头文件

这个程序是在普中开发板应用的,如果你制作的硬件I/O口不对应的话请在宏定义里面修改。

#include"reg52.h"#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define lcd_data P0 //数据口sbit lcd_rs = P2^6; //寄存器选择输入sbit lcd_rw = P2^5; //液晶读写sbit lcd_en = P2^7; //液晶使能输入sbit lcd_psb = P3^2; //液晶串并口sbit lcd_rst = P3^4; //液晶复位uchar code img[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xF0,0x00,0x00,0x0F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xFE,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xFF,0xC0,0x00,0x3F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xFF,0xF0,0x00,0x7F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xFF,0xFE,0x00,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0xFF,0xFF,0xC1,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xFF,0xFF,0xF3,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };/*-- 调入了一幅图像:C:\Documents and Settings\Owner\桌面\ji.bmp --*//*-- 宽度x高度=128x64 --*//*void delaynop(){_nop_();_nop_();_nop_();_nop_();}*/void Delay200ms() //@11.0592MHz{unsigned char i, j, k;_nop_();i = 2;j = 103;k = 147;do{do{while (--k);} while (--j);} while (--i);}void delay(int z){int i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}bit lcd_busy() //检查LCD忙状态lcd_busy为1时,忙,等待。

LCD12864显示程序

LCD12864显示程序

本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。

/**********************************************************程序说明:LCD12864显示主程序程序调试员:莫剑辉调试时间:2010-6-7**********************************************************/#include<reg52.h>#include"12864.c"void main(){Ini_Lcd(); //液晶初始化子程序Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序while(1);}这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。

/**********************************************************程序说明:LCD12864显示头文件程序调试员:莫剑辉调试时间:2010-6-7**********************************************************///#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DATA P2 //数据输出端0~7sbit RS=P0^0; //LCD12864 RS端sbit RW=P0^1; //LCD12864 RW端sbit E =P0^2; //LCD12864 E 端sbit PSB =P0^3;/*********************************************延时子程序*********************************************/void Delay_1ms(uint x){uint j,i;for(j=0;j<x;j++){for(i=0;i<120;i++); //延时X乘以120}}/*********************************************LCD12864液晶测忙子程序(读状态)*********************************************/void Busy(){uchar busy;do{E = 0; //0为关闭使能端,1为打开使能端RS = 0; //1为指令,0为数据RW = 1; //1为读,0为写Delay_1ms(20); //延时20乘以120时间E = 1; //0为关闭使能端,1为打开使能端busy=P1; //读取P2状态Delay_1ms(20); //延时20乘以120时间E = 0; //0为关闭使能端,1为打开使能端}while(busy&0x80); //判断BUSY位是否工作:1为内部在工作,0为正常状态}/*********************************************LCD12864液晶数据写入子程序*********************************************/void Write_Data(uchar k){Busy(); //测忙E =1; //0为关闭使能端,1为打开使能端RS=1; //1为指令,0为数据RW=0; //1为读,0为写DA TA=k; //输入数据K到DA TADelay_1ms(20); //延时20乘以120时间E =0; //0为关闭使能端,1为打开使能端Delay_1ms(20); //延时20乘以120时间}/*********************************************LCD12864液晶命令写入子程序*********************************************/void Write_Cmd(uchar cmd){Busy(); //测忙E=1; //0为关闭使能端,1为打开使能端RS=0; //1为指令,0为数据RW=0; //1为读,0为写DA TA=cmd; //输入命令cmd到DATADelay_1ms(20); //延时20乘以120时间E=0; //0为关闭使能端,1为打开使能端Delay_1ms(20); //延时20乘以120时间}/*********************************************LCD12864液晶数据显示子程序*********************************************/void Disp(uchar y,uchar x,uchar i,uchar *z){uchar Address;if(y==1){Address=0x80+x;} //Y判断第几行,X判断第几列,0x80为液晶行初始地址if(y==2){Address=0x90+x;}if(y==3){Address=0x88+x;}if(y==4){Address=0x98+x;}Write_Cmd(Address); //写入地址命令到LCD12864while(i) //写入显示数据的大小{Write_Data(*(z++)); //写入显示数据到LCD12864i--;}}/*********************************************LCD12864液晶初始化子程序*********************************************/void Ini_Lcd(void){PSB=1;Delay_1ms(20);Write_Cmd(0x30); //基本指令集Delay_1ms(20);Write_Cmd(0x02); // 地址归位Delay_1ms(20);Write_Cmd(0x0c); //整体显示打开,游标关闭Delay_1ms(20);Write_Cmd(0x06); //游标右移Delay_1ms(20);Write_Cmd(0x80); //设定显示的起始地址Delay_1ms(20);Write_Cmd(0x01); //清除显示}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**************************************
端口初始化
**************************************/
void port_init()
{
DDRA=0XFF;
PORTA=0XFF;
DDRC=0XFF;
PORTC=0XFF;
}
/******************************************
void LocateXY(uchar x,uchar y)
{
if(y==0)
{write_com(0x80+x);} //0
else if(y==1)
{write_com(0x90+x);} //1
else if(y==2)
{write_com(0x88+x);} //2
else if(y==3)
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define RS_0 PORTC&=~(1<<PC0) //数据指令选择端高电平数据低电平指令
#define RS_1 PORTC|=(1<<PC0)
#define RW_0 PORTC&=~(1<<PC1) //并口时,读写选择端,低电平写;串口时数据输入端
/************************源自*****2012年5月19日
调试成功
编辑环境:ICCAVR
功能:用LCD12864显示汉字
********************************/
#include<iom16v.h>
#include<macros.h>
#include"LCD_12864.c"
write_data(0xD5);// D5C5 D4F6 B9F0
delay(2);
write_data(0xC5);//八根线并行传输的原因,为此需要每八个字节进行传输
delay(2);
write_data(0xD4);
delay(2);
write_data(0xF6);
delay(2);
write_data(0xB9);
void LCD_init()
{
write_com(0x01);
delay(5) ; //清屏指令
PSB_1; //并口数据传输模式
RST_0; //低电平复位
delay(3);
RST_1; //
delay(3);
write_com(0x34); //扩充指令操作
delay(5);
write_com(0x30); //基本指令操作
delay(200);
write_string(0,1,"I Love微电子!");
delay(200);
write_string(0,2,"Working Hard !");
delay(200);
//write_string(0,3,"I Love English!");
//write_string(0,3,"做电子设计大赛!");//包含了汉字字符串中有汉字输入方式
delay(3);
write_com(0x0C); //显示开/关光标
delay(5);
write_com(0x01); //清除LCD的显示,即清屏指令
delay(5);
}
/********************************************
光标定位函数,X显示列,Y显示行
***********************************************/
}
LCD12864驱动文件
/**************************************
2012.5.18
2012.5.19调试成功
功能:驱动12864液晶显示
并口数据传输
*****************************************/
#include<iom16v.h>
{
RS_0;
RW_0;
EN_0;
Dataport=com;
delay(2);
EN_1;
delay(2);
EN_0;
}
/******************************************
写数据函数规定写数据的流程
*******************************************/
主函数
*******************************************/
void main()
{
uchar i;
port_init();
delay(100);//
port_init();//
LCD_init();
write_string(0,0,"zheng Zunggui");
{write_com(0x98+x);} //3
}
/*************************************************
显示屏字符串写入函数,X表示列,Y表示行
************************************************/
void write_string(uchar x,uchar y,uchar *s)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1140;j++);
}
}
/****************************************
写指令函数规定写指令操作
*****************************************/
void write_com(uchar com) //command
{
LocateXY(x,y);
while(*s)
{
write_data(*s);
s++;
}
}
#define PSB_1 PORTC|=(1<<PC3)
#define RST_0 PORTC&=~(1<<PC4) //复位信号,电平有效
#define RST_1 PORTC|=(1<<PC4)
#define Dataport PORTA //数据端口为A口
void delay(uint ms) //系统延时函数
void write_data(uchar data) //data
{
RS_1;
RW_0;
EN_0;
Dataport=data;
delay(2);
EN_1;
delay(2);
EN_0;
}
/**********************************************
LCD初始化函数
************************************************/
delay(2);
write_data(0xF0);
delay(2);
/*********
{
uint k;
for(k=0;k<2;i++)
{
write_com(0x98);
delay(2);
write_data(0xB1B0);//这种输入不正确
delay(200);
}
}
****************/
#define RW_1 PORTC|=(1<<PC1)
#define EN_0 PORTC&=~(1<<PC2) //并口时,读写使能;串口时,串行时钟
#define EN_1 PORTC|=(1<<PC2)
#define PSB_0 PORTC&=~(1<<PC3) //并口串口选择端,高电平为并口
/**************************************
此为单独操作汉字字符的方法
****************************************/
LocateXY(1,3);//单独写汉字时,要一个字节一个字节写入,分开地址不重合
//先高字节后低字节与ASCCII不冲突
相关文档
最新文档