📄 单片机坐标128x64液晶ks0108驱动程序(c51).htm
字号:
<P></P>
<P>#include "absacc.h"<BR>#include "intrins.h"</P>
<P>//自定义库 在"C:\comp51\UserLib\"文件夹中<BR>#include
".\inc\ASCII816.h" //标准ASCII库<BR>#include ".\inc\HZTable.h"
//汉字点阵库(自做)<BR>#include ".\inc\Menu.h" //菜单库(自做)</P>
<P><BR>// LCD128*64 数据线<BR>#define LCD12864DataPort P1</P>
<P>// LCD128*64 I/O 信号管脚<BR>sbit di =P3^1; // 数据\指令 选择<BR>sbit
rw =P3^3; // 读\写 选择<BR>sbit en =P3^2; // 读\写使能<BR>sbit cs1
=P3^4; // 片选1,低有效(前64列)<BR>sbit cs2 =P3^5; //
片选2,低有效(后64列)</P>
<P>sbit reset=P0^7; // 复位</P>
<P></P>
<P>/*----------------------------------------------------------------------------------------------------*/<BR>/*
****函数列表****</P>
<P>//开关显示<BR>void SetOnOff(unsigned char onoff)</P>
<P>//选择屏幕<BR>//screen: 0-全屏,1-左屏,2-右<BR>void
SelectScreen(unsigned char screen)</P>
<P>//清屏<BR>//screen: 0-全屏,1-左屏,2-右<BR>void
ClearScreen(unsigned char screen)</P>
<P>//显示8*8点阵<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-7), column:
列(0-15)<BR>//address : 字模区首地址<BR>void Show88(unsigned char
lin,unsigned char column,unsigned int address)</P>
<P>//显示8*16字符<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-3), column:
列(0-15)<BR>//character:字符代码(标准ASCII码)<BR>void
ShowChar(unsigned char lin,unsigned char column,unsigned char
character)</P>
<P>//显示8*16字符串<BR>//!!!只能显示在一行上即: 串长+column
<=15<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-3), column:
列(0-15)<BR>//address : 字模区首地址<BR>void ShowString(unsigned char
lin,unsigned char column, unsigned char *string)</P>
<P>//显示一个汉字<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-3), column:
列(0-15)<BR>//hzcode: 汉字代码(自定义的)<BR>void ShowHZ(unsigned char
lin,unsigned char column,unsigned int hzcode)</P>
<P>//显示图片<BR>//旋转90度 :字模被竖着切分<BR>//startline
:开始行<BR>//startcolumn:开始列<BR>//linechar
:图片行点除8(图片以8*8点阵为单位)<BR>//columnchar
:图片列点除8(图片以8*8点阵为单位)<BR>//address : 字模区首地址<BR>void
ShowPicture(unsigned char startline,unsigned char
startcolumn,unsigned char linechar,unsigned char
columnchar,unsigned int
address)<BR>//!!问题大户<BR>//显示一行汉字<BR>//lin:行<BR>//lineheadaddr:
此行汉字代码区首地址<BR>void ShowLine(unsigned char lin,unsigned int
lineheadaddr)</P>
<P>//显示一屏汉字<BR>//pageheadaddr:此屏汉字代码地址区首地址<BR>void
ShowPage(unsigned int pageheadaddr)</P>
<P>//反显一个8*8字块<BR>//lin:行(0-3), column: 列(0-7)<BR>void
ReverseShow88(unsigned char lin,unsigned char column)</P>
<P><BR>//反显一个字符<BR>//lin:行(0-4), column: 列(0-15)<BR>void
ReverseShowChar(unsigned char lin,unsigned char column)</P>
<P><BR>//反显一个汉字<BR>//lin:行(0-3), column:
列(0-7)<BR>ReverseShowHZ(unsigned char lin,unsigned char
column)</P>
<P>//反显一行汉字<BR>//lin:行<BR>ReverseShow(unsigned char lin)</P>
<P>//初始化LCD<BR>void InitLCD()</P>
<P>****函数列表结束****
*/<BR>/*----------------------------------------------------------------------------------------------------*/<BR>/*--基本函数源程序------------------------------------------------------------------------------------*/<BR>//延时<BR>Lcd12864delay()<BR>{<BR>unsigned
int i=500;<BR>while(i--)
{;}<BR>}<BR>/*----------------------------------------------------------------------------------------------------*/<BR>//状态检查<BR>void
CheckState()<BR>{<BR>unsigned char
dat;<BR>di=0;<BR>rw=1;<BR>do{<BR>LCD12864DataPort=0xff;<BR>en=1;
dat=LCD12864DataPort; en=0;<BR>dat=0x90 & dat;
//仅当第4,7位为0时才可操作<BR>}while(!(dat==0x00));<BR>}<BR>/*----------------------------------------------------------------------------------------------------*/<BR>//写显示数据<BR>//dat:显示数据<BR>void
WriteByte(unsigned char dat)<BR>{<BR>CheckState();<BR>di=1;
rw=0;<BR>LCD12864DataPort=dat;<BR>en=1;
en=0;<BR>}<BR>/*-----------------------------------------------------------------------------------------------------*/<BR>//向LCD发送命令<BR>//command
:命令<BR>SendCommandToLCD(unsigned char
command)<BR>{<BR>CheckState();<BR>rw=0;<BR>LCD12864DataPort=command;<BR>en=1;
en=0;<BR>}<BR>/*----------------------------------------------------------------------------------------------------*/<BR>//设定行地址(页)--X
0-7<BR>void SetLine(unsigned char line)<BR>{<BR>line=line
& 0x07; // 0<=line<=7<BR>line=line|0xb8; //1011
1xxx<BR>SendCommandToLCD(line);<BR>}<BR>//设定列地址--Y
0-63<BR>void SetColumn(unsigned char
column)<BR>{<BR>column=column &0x3f; //
0=<column<=63<BR>column=column | 0x40; //01xx
xxxx<BR>SendCommandToLCD(column);<BR>}<BR>//设定显示开始行--XX<BR>void
SetStartLine(unsigned char startline)
//0--63<BR>{<BR>startline=startline &
0x07;<BR>startline=startline|0xc0; //1100
0000<BR>SendCommandToLCD(startline);<BR>}<BR>//开关显示<BR>void
SetOnOff(unsigned char onoff)<BR>{<BR>onoff=0x3e | onoff;
//0011
111x<BR>SendCommandToLCD(onoff);<BR>}<BR>/*---------------------------------------------------------------------------------------------------*/<BR>//选择屏幕<BR>//screen:
0-全屏,1-左屏,2-右屏<BR>void SelectScreen(unsigned char screen)<BR>{
//北京显示器:负有效 cs1: 0--右; cs2: 0--左<BR>switch(screen)<BR>{ case
0: cs1=0;//全屏<BR>_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_();<BR>cs2=0; <BR>_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_();<BR>break; <BR>case 1: cs1=1;//左屏<BR>_nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); <BR>cs2=0;<BR>_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_();<BR>break;<BR>case 2: cs1=0;//右屏<BR>_nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); <BR>cs2=1;<BR>_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_();
<BR>break;<BR>}<BR>}<BR>/*---------------------------------------------------------------------------------------------------*/<BR>//清屏<BR>//screen:
0-全屏,1-左屏,2-右<BR>void ClearScreen(unsigned char screen)<BR>{
unsigned char
i,j;<BR>SelectScreen(screen);<BR>for(i=0;i<8;i++)<BR>{
SetLine(i);<BR>for(j=0;j<64;j++)<BR>{<BR>WriteByte(0x00);<BR>}<BR>}<BR>}<BR>/*--------------------------------------------------------------------------------------------------*/<BR>//显示8*8点阵<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-7),
column: 列(0-15)<BR>//address : 字模区首地址<BR>void Show88(unsigned
char lin,unsigned char column,unsigned int address)<BR>{
unsigned char i;<BR>if(column>16)
{return;}<BR>if(column<8) SelectScreen(1);
//如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上<BR>else
{<BR>SelectScreen(2); //否则
(8,9,10,11,12,13,14,15)写在第二屏上<BR>column=column & 0x07;
//防止越界<BR>}<BR>SetLine(lin);<BR>SetColumn(column<<3);<BR>for(i=0;i<8;i++)
WriteByte( CBYTE[address+i]
);<BR>}<BR>/*------------------------------------------------------------------------------------------------*/<BR>//显示8*16字符<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-3),
column: 列(0-15)<BR>//character:字符代码(标准ASCII码)<BR>void
ShowChar(unsigned char lin,unsigned char column,unsigned char
character)<BR>{ lin=lin<<1;<BR>Show88(lin
,column,ASCII816[character-0x20]
);<BR>Show88(lin+1,column,ASCII816[character-0x20]+8
);<BR>}<BR>/*-----------------------------------------------------------------------------------------------*/<BR>/*<BR>//显示8*16字符串<BR>//!!!只能显示在一行上即:
串长+column <=15<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-3), column:
列(0-15)<BR>//address : 字模区首地址<BR>void ShowString(unsigned char
lin,unsigned char column, unsigned char *string)<BR>{ unsigned
char ch;<BR>unsigned char i=0;</P>
<P>while(*string!='\0')<BR>{<BR>ch=*string;<BR>if(i+column
>15) break; //(只能显示在一行上即: 串长+column
<=15)<BR>ShowChar(lin,i+column,ch);<BR>string++;
i++;<BR>}<BR>}<BR>*/<BR>/*----------------------------------------------------------------------------------------------*/<BR>//显示一个汉字<BR>//旋转90度:字模被竖着切分<BR>//lin:行(0-3),
column: 列(0-7)<BR>//hzcode: 汉字代码(自定义的)<BR>//uchar code
HZtable<BR>void ShowHZ(unsigned char lin,unsigned char
column,unsigned int hzcode)<BR>{<BR>lin=lin<<1;
//lin*2</P>
<P>Show88(lin,column,HZTable[hzcode]);<BR>Show88(lin,column+1,HZTable[hzcode]+8);<BR>Show88(lin+1,column,HZTable[hzcode]+16);<BR>Show88(lin+1,column+1,HZTable[hzcode]+24);<BR>}<BR>/*----------------------------------------------------------------------------------------------*/<BR>//显示图片<BR>//旋转90度
:字模被竖着切分<BR>//startline
:开始行<BR>//startcolumn:开始列<BR>//linechar
:图片行点除8(图片以8*8点阵为单位)<BR>//columnchar
:图片列点除8(图片以8*8点阵为单位)<BR>//address : 字模区首地址<BR>void
ShowPicture(unsigned char startline,unsigned char
startcolumn,unsigned char linechar,unsigned char
columnchar,unsigned int address)<BR>{ unsigned char
i,j;<BR>for(i=0;i<columnchar;i++)<BR>for(j=0;j<linechar;j++)<BR>Show88(startline+i
, startcolumn+j , address+(i*linechar+j)*8
);<BR>}<BR>/*----------------------------------------------------------------------------------------------*/<BR>//显示一行字符串(汉字,字母混排,一行16字节)<BR>//lin:行<BR>//lineheadaddr:
此行汉字代码区首地址<BR>void ShowLine(unsigned char lin,unsigned char
linehead[])<BR>{ unsigned char i;<BR>unsigned char
byte;<BR>unsigned int hzcode;<BR>for( i=0; i<16; )<BR>{
byte=linehead[i];<BR>if(byte < 0x80)
//字母<BR>{<BR>if(i>15) return; //!!编译器有问题,须强制退出</P>
<P>ShowChar(lin, i , byte);<BR>i=i+1;</P>
<P>}<BR>else // byte >= 0x80(汉字)<BR>{<BR>if(i>15)
return; //!!编译器有问题,须强制退出</P>
<P>byte=byte & 0x7f;
//最高位置0,即:减去0x8000<BR>hzcode=(unsigned int)byte<<8; //??
//高8位<BR>hzcode=hzcode+linehead[i+1];
//加低8位,组合成整型数地址<BR>ShowHZ(
lin,i,hzcode);<BR>i=i+2;<BR>}<BR>}<BR>}<BR>/*----------------------------------------------------------------------------------------------------*/<BR>//显示一屏汉字<BR>//pageheadaddr:此屏汉字代码地址区首地址<BR>void
ShowPage(unsigned char pagehead[][16])<BR>{ unsigned char
i;<BR>for(i=0;i<4;i++) ShowLine(i,pagehead[i]);
//1行8个汉字,16字节<BR>}<BR>/*----------------------------------------------------------------------------------------------------*/<BR>//读显示数据<BR>unsigned
char ReadByte()<BR>{<BR>unsigned char
dat;<BR>CheckState();<BR>di=1;
rw=1;<BR>LCD12864DataPort=0xff;<BR>en=1; dat=LCD12864DataPort;
en=0;<BR>return(dat);<BR>}</P>
<P>/*----------------------------------------------------------------------------------------------------*/<BR>//反显一个8*8字块<BR>//lin:行(0-3),
column: 列(0-7)<BR>void ReverseShow88(unsigned char
lin,unsigned char column)<BR>{ unsigned char i;<BR>unsigned
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -