1、12864 液晶驱动程序*-文件名 12864.c功能 128X64驱动程序版本 2.0作者 最后修改时间 2003年5月12日=*/ i nclude absacc.hi nclude intrins.h/自定义库 在C:comp51UserLib文件夹中i nclude .incASCII816.h /标准ASCII库i nclude .incHZTable.h /汉字点阵库(自做)i nclude .incMenu.h /菜单库(自做)/ LCD128*64 数据线#define LCD12864DataPort P1/ LCD128*64 I/O 信号管脚sbit di =P31; /
2、 数据指令 选择sbit rw =P33; / 读写 选择sbit en =P32; / 读写使能sbit cs1 =P34; / 片选1,低有效(前64列)sbit cs2 =P35; / 片选2,低有效(后64列)sbit reset=P07; / 复位/*-*/* *函数列表*/开关显示void SetOnOff(unsigned char onoff)/选择屏幕/screen: 0-全屏,1-左屏,2-右void SelectScreen(unsigned char screen)/清屏/screen: 0-全屏,1-左屏,2-右void ClearScreen(unsigned ch
3、ar screen)/显示8*8点阵/旋转90度:字模被竖着切分/lin:行(0-7), column: 列(0-15)/address : 字模区首地址void Show88(unsigned char lin,unsigned char column,unsigned int address)/显示8*16字符/旋转90度:字模被竖着切分/lin:行(0-3), column: 列(0-15)/character:字符代码(标准ASCII码)void ShowChar(unsigned char lin,unsigned char column,unsigned char characte
4、r)/显示8*16字符串/!只能显示在一行上即: 串长+column =15/旋转90度:字模被竖着切分/lin:行(0-3), column: 列(0-15)/address : 字模区首地址void ShowString(unsigned char lin,unsigned char column, unsigned char *string)/显示一个汉字/旋转90度:字模被竖着切分/lin:行(0-3), column: 列(0-15)/hzcode: 汉字代码(自定义的)void ShowHZ(unsigned char lin,unsigned char column,unsign
5、ed int hzcode)/显示图片/旋转90度 :字模被竖着切分/startline :开始行/startcolumn:开始列/linechar :图片行点除8(图片以8*8点阵为单位)/columnchar :图片列点除8(图片以8*8点阵为单位)/address : 字模区首地址void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)/!问题大户/显示一行汉字/lin:行/
6、lineheadaddr: 此行汉字代码区首地址void ShowLine(unsigned char lin,unsigned int lineheadaddr)/显示一屏汉字/pageheadaddr:此屏汉字代码地址区首地址void ShowPage(unsigned int pageheadaddr)/反显一个8*8字块/lin:行(0-3), column: 列(0-7)void ReverseShow88(unsigned char lin,unsigned char column)/反显一个字符/lin:行(0-4), column: 列(0-15)void ReverseSho
7、wChar(unsigned char lin,unsigned char column)/反显一个汉字/lin:行(0-3), column: 列(0-7)ReverseShowHZ(unsigned char lin,unsigned char column)/反显一行汉字/lin:行ReverseShow(unsigned char lin)/初始化LCDvoid InitLCD()*函数列表结束* */*-*/*-基本函数源程序-*/延时Lcd12864delay()unsigned int i=500;while(i-) ;/*-*/状态检查void CheckState()unsi
8、gned char dat;di=0;rw=1;doLCD12864DataPort=0xff;en=1; dat=LCD12864DataPort; en=0;dat=0x90 & dat; /仅当第4,7位为0时才可操作while(!(dat=0x00);/*-*/写显示数据/dat:显示数据void WriteByte(unsigned char dat)CheckState();di=1; rw=0;LCD12864DataPort=dat;en=1; en=0;/*-*/向LCD发送命令/command :命令SendCommandToLCD(unsigned char comman
9、d)CheckState();rw=0;LCD12864DataPort=command;en=1; en=0;/*-*/设定行地址(页)-X 0-7void SetLine(unsigned char line)line=line & 0x07; / 0=line=7line=line|0xb8; /1011 1xxxSendCommandToLCD(line);/设定列地址-Y 0-63void SetColumn(unsigned char column)column=column &0x3f; / 0=COLUMN=63column=column | 0x40; /01xx xxxxS
10、endCommandToLCD(column);/设定显示开始行-XXvoid SetStartLine(unsigned char startline) /0-63startline=startline & 0x07;startline=startline|0xc0; /1100 0000SendCommandToLCD(startline);/开关显示void SetOnOff(unsigned char onoff)onoff=0x3e | onoff; /0011 111xSendCommandToLCD(onoff);/*-*/选择屏幕/screen: 0-全屏,1-左屏,2-右屏v
11、oid SelectScreen(unsigned char screen) /北京显示器:负有效 cs1: 0-右; cs2: 0-左switch(screen) case 0: cs1=0;/全屏_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();cs2=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_
12、();break; case 1: cs1=1;/左屏_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=0;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();break;case 2: cs1=0;/右屏_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _n
13、op_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break;/*-*/清屏/screen: 0-全屏,1-左屏,2-右void ClearScreen(unsigned char screen) unsigned char i,j;SelectScreen(screen);for(i=0;i8;i+) SetLine(i);for(
14、j=0;j16) return;if(column8) SelectScreen(1); /如果列数8(0,1,2,3,4,5,6,7)则写在第一屏上else SelectScreen(2); /否则 (8,9,10,11,12,13,14,15)写在第二屏上column=column & 0x07; /防止越界SetLine(lin);SetColumn(column3);for(i=0;i8;i+) WriteByte( CBYTEaddress+i );/*-*/显示8*16字符/旋转90度:字模被竖着切分/lin:行(0-3), column: 列(0-15)/character:字符
15、代码(标准ASCII码)void ShowChar(unsigned char lin,unsigned char column,unsigned char character) lin=lin1;Show88(lin ,column,ASCII816character-0x20 );Show88(lin+1,column,ASCII816character-0x20+8 );/*-*/*/显示8*16字符串/!只能显示在一行上即: 串长+column 15) break; /(只能显示在一行上即: 串长+column =15)ShowChar(lin,i+column,ch);string+
16、; i+;*/*-*/显示一个汉字/旋转90度:字模被竖着切分/lin:行(0-3), column: 列(0-7)/hzcode: 汉字代码(自定义的)/uchar code HZtablevoid ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)lin=lin1; /lin*2Show88(lin,column,HZTablehzcode);Show88(lin,column+1,HZTablehzcode+8);Show88(lin+1,column,HZTablehzcode+16);Show88(li
17、n+1,column+1,HZTablehzcode+24);/*-*/显示图片/旋转90度 :字模被竖着切分/startline :开始行/startcolumn:开始列/linechar :图片行点除8(图片以8*8点阵为单位)/columnchar :图片列点除8(图片以8*8点阵为单位)/address : 字模区首地址void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address
18、) unsigned char i,j;for(i=0;iCOLUMNCHAR;I+)for(j=0;jLINECHAR;J+)Show88(startline+i , startcolumn+j , address+(i*linechar+j)*8 );/*-*/显示一行字符串(汉字,字母混排,一行16字节)/lin:行/lineheadaddr: 此行汉字代码区首地址void ShowLine(unsigned char lin,unsigned char linehead) unsigned char i;unsigned char byte;unsigned int hzcode;fo
19、r( i=0; i16; ) byte=linehead;if(byte 15) return; /!编译器有问题,须强制退出ShowChar(lin, i , byte);i=i+1;else / byte = 0x80(汉字)if(i15) return; /!编译器有问题,须强制退出byte=byte & 0x7f; /最高位置0,即:减去0x8000hzcode=(unsigned int)byte8; /? /高8位hzcode=hzcode+lineheadi+1; /加低8位,组合成整型数地址ShowHZ( lin,i,hzcode);i=i+2;/*-*/显示一屏汉字/page
20、headaddr:此屏汉字代码地址区首地址void ShowPage(unsigned char pagehead16) unsigned char i;for(i=0;i4;i+) ShowLine(i,pagehead); /1行8个汉字,16字节/*-*/读显示数据unsigned char ReadByte()unsigned char dat;CheckState();di=1; rw=1;LCD12864DataPort=0xff;en=1; dat=LCD12864DataPort; en=0;return(dat);/*-*/反显一个8*8字块/lin:行(0-3), colu
21、mn: 列(0-7)void ReverseShow88(unsigned char lin,unsigned char column) unsigned char i;unsigned char tab8;if(column8) SelectScreen(1); /如果列数4(0,1,2,3),则写在第一屏上else SelectScreen(2); /否则 (4,5,6,7), 写在第二屏上/读上部8列column=column3; /每个方块8*8大小SetLine(lin);SetColumn(column);tab0=ReadByte(); /空读! /?for(i=0;i8;i+) tab=ReadByte();/写回SetLine(lin);SetColumn(column);for(i=0;i8;i+) WriteByte(tab);/*-*/*-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1