LCD12864写字符串程序及其头文件
ST7920控制器的lcd12864驱动程序头文件+6页+0[1].1M
![ST7920控制器的lcd12864驱动程序头文件+6页+0[1].1M](https://img.taocdn.com/s3/m/5fb6941155270722192ef7bf.png)
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基础函数#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并行头文件

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液晶显示模块,对于芯片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串行显示文件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点阵液晶显示模块(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写字符串程序及其头文件

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带字库经典程序

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
/********宏定义***********************************************************/
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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不冲突