⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 单片机坐标128x64液晶ks0108驱动程序(c51).htm

📁 单片机的坐标128x64液晶KS0108驱动程序(C51编写)
💻 HTM
📖 第 1 页 / 共 3 页
字号:

                  <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 
                  &lt;=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 &amp; 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 
                  &amp; 0x07; // 0&lt;=line&lt;=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 &amp;0x3f; // 
                  0=&lt;column&lt;=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 &amp; 
                  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&lt;8;i++)<BR>{ 
                  SetLine(i);<BR>for(j=0;j&lt;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&gt;16) 
                  {return;}<BR>if(column&lt;8) SelectScreen(1); 
                  //如果列数&lt;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 &amp; 0x07; 
                  //防止越界<BR>}<BR>SetLine(lin);<BR>SetColumn(column&lt;&lt;3);<BR>for(i=0;i&lt;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&lt;&lt;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 &lt;=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 
                  &gt;15) break; //(只能显示在一行上即: 串长+column 
                  &lt;=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&lt;&lt;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&lt;columnchar;i++)<BR>for(j=0;j&lt;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&lt;16; )<BR>{ 
                  byte=linehead[i];<BR>if(byte &lt; 0x80) 
                  //字母<BR>{<BR>if(i&gt;15) return; //!!编译器有问题,须强制退出</P>
                  <P>ShowChar(lin, i , byte);<BR>i=i+1;</P>
                  <P>}<BR>else // byte &gt;= 0x80(汉字)<BR>{<BR>if(i&gt;15) 
                  return; //!!编译器有问题,须强制退出</P>
                  <P>byte=byte &amp; 0x7f; 
                  //最高位置0,即:减去0x8000<BR>hzcode=(unsigned int)byte&lt;&lt;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&lt;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 + -