12864 液晶驱动程序.docx
《12864 液晶驱动程序.docx》由会员分享,可在线阅读,更多相关《12864 液晶驱动程序.docx(17页珍藏版)》请在冰豆网上搜索。
12864液晶驱动程序
*------------------------------------------------------------------------------------------
[文件名]12864.c
[功能]128X64驱动程序
[版本]2.0
[作者]
[最后修改时间]2003年5月12日
===========================================================================================*
/
#include"absacc.h"
#include"intrins.h"
//自定义库在"C:
\comp51\UserLib\"文件夹中
#include".\inc\ASCII816.h"//标准ASCII库
#include".\inc\HZTable.h"//汉字点阵库(自做)
#include".\inc\Menu.h"//菜单库(自做)
//LCD128*64数据线
#defineLCD12864DataPortP1
//LCD128*64I/O信号管脚
sbitdi=P3^1;//数据\指令选择
sbitrw=P3^3;//读\写选择
sbiten=P3^2;//读\写使能
sbitcs1=P3^4;//片选1,低有效(前64列)
sbitcs2=P3^5;//片选2,低有效(后64列)
sbitreset=P0^7;//复位
/*-----------------------------------------------------------------------------------------
-----------*/
/*****函数列表****
//开关显示
voidSetOnOff(unsignedcharonoff)
//选择屏幕
//screen:
0-全屏,1-左屏,2-右
voidSelectScreen(unsignedcharscreen)
//清屏
//screen:
0-全屏,1-左屏,2-右
voidClearScreen(unsignedcharscreen)
//显示8*8点阵
//旋转90度:
字模被竖着切分
//lin:
行(0-7),column:
列(0-15)
//address:
字模区首地址
voidShow88(unsignedcharlin,unsignedcharcolumn,unsignedintaddress)
//显示8*16字符
//旋转90度:
字模被竖着切分
//lin:
行(0-3),column:
列(0-15)
//character:
字符代码(标准ASCII码)
voidShowChar(unsignedcharlin,unsignedcharcolumn,unsignedcharcharacter)
//显示8*16字符串
//!
!
!
只能显示在一行上即:
串长+column<=15
//旋转90度:
字模被竖着切分
//lin:
行(0-3),column:
列(0-15)
//address:
字模区首地址
voidShowString(unsignedcharlin,unsignedcharcolumn,unsignedchar*string)
//显示一个汉字
//旋转90度:
字模被竖着切分
//lin:
行(0-3),column:
列(0-15)
//hzcode:
汉字代码(自定义的)
voidShowHZ(unsignedcharlin,unsignedcharcolumn,unsignedinthzcode)
//显示图片
//旋转90度:
字模被竖着切分
//startline:
开始行
//startcolumn:
开始列
//linechar:
图片行点除8(图片以8*8点阵为单位)
//columnchar:
图片列点除8(图片以8*8点阵为单位)
//address:
字模区首地址
voidShowPicture(unsignedcharstartline,unsignedcharstartcolumn,unsignedchar
linechar,unsignedcharcolumnchar,unsignedintaddress)
//!
!
问题大户
//显示一行汉字
//lin:
行
//lineheadaddr:
此行汉字代码区首地址
voidShowLine(unsignedcharlin,unsignedintlineheadaddr)
//显示一屏汉字
//pageheadaddr:
此屏汉字代码地址区首地址
voidShowPage(unsignedintpageheadaddr)
//反显一个8*8字块
//lin:
行(0-3),column:
列(0-7)
voidReverseShow88(unsignedcharlin,unsignedcharcolumn)
//反显一个字符
//lin:
行(0-4),column:
列(0-15)
voidReverseShowChar(unsignedcharlin,unsignedcharcolumn)
//反显一个汉字
//lin:
行(0-3),column:
列(0-7)
ReverseShowHZ(unsignedcharlin,unsignedcharcolumn)
//反显一行汉字
//lin:
行
ReverseShow(unsignedcharlin)
//初始化LCD
voidInitLCD()
****函数列表结束*****/
/*-----------------------------------------------------------------------------------------
-----------*/
/*--基本函数源程序-------------------------------------------------------------------------
-----------*/
//延时
Lcd12864delay()
{
unsignedinti=500;
while(i--){;}
}
/*-----------------------------------------------------------------------------------------
-----------*/
//状态检查
voidCheckState()
{
unsignedchardat;
di=0;
rw=1;
do{
LCD12864DataPort=0xff;
en=1;dat=LCD12864DataPort;en=0;
dat=0x90&dat;//仅当第4,7位为0时才可操作
}while(!
(dat==0x00));
}
/*-----------------------------------------------------------------------------------------
-----------*/
//写显示数据
//dat:
显示数据
voidWriteByte(unsignedchardat)
{
CheckState();
di=1;rw=0;
LCD12864DataPort=dat;
en=1;en=0;
}
/*-----------------------------------------------------------------------------------------
------------*/
//向LCD发送命令
//command:
命令
SendCommandToLCD(unsignedcharcommand)
{
CheckState();
rw=0;
LCD12864DataPort=command;
en=1;en=0;
}
/*-----------------------------------------------------------------------------------------
-----------*/
//设定行地址(页)--X0-7
voidSetLine(unsignedcharline)
{
line=line&0x07;//0<=line<=7
line=line|0xb8;//10111xxx
SendCommandToLCD(line);
}
//设定列地址--Y0-63
voidSetColumn(unsignedcharcolumn)
{
column=column&0x3f;//0=column=column|0x40;//01xxxxxx
SendCommandToLCD(column);
}
//设定显示开始行--XX
voidSetStartLine(unsignedcharstartline)//0--63
{
startline=startline&0x07;
startline=startline|0xc0;//11000000
SendCommandToLCD(startline);
}
//开关显示
voidSetOnOff(unsignedcharonoff)
{
onoff=0x3e|onoff;//0011111x
SendCommandToLCD(onoff);
}
/*-----------------------------------------------------------------------------------------
----------*/
//选择屏幕
//screen:
0-全屏,1-左屏,2-右屏
voidSelectScreen(unsignedcharscreen)
{//北京显示器:
负有效cs1:
0--右;cs2:
0--左
switch(screen)
{case0:
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_();
break;
case1:
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;
case2:
cs1=0;//右屏
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
cs2=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
break;
}
}
/*-----------------------------------------------------------------------------------------
----------*/
//清屏
//screen:
0-全屏,1-左屏,2-右
voidClearScreen(unsignedcharscreen)
{unsignedchari,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/*-----------------------------------------------------------------------------------------
---------*/
//显示8*8点阵
//旋转90度:
字模被竖着切分
//lin:
行(0-7),column:
列(0-15)
//address:
字模区首地址
voidShow88(unsignedcharlin,unsignedcharcolumn,unsignedintaddress)
{unsignedchari;
if(column>16){return;}
if(column<8)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(column<<3);
for(i=0;i<8;i++)WriteByte(CBYTE[address+i]);
}
/*-----------------------------------------------------------------------------------------
-------*/
//显示8*16字符
//旋转90度:
字模被竖着切分
//lin:
行(0-3),column:
列(0-15)
//character:
字符代码(标准ASCII码)
voidShowChar(unsignedcharlin,unsignedcharcolumn,unsignedcharcharacter)
{lin=lin<<1;
Show88(lin,column,ASCII816[character-0x20]);
Show88(lin+1,column,ASCII816[character-0x20]+8);
}
/*-----------------------------------------------------------------------------------------
------*/
/*
//显示8*16字符串
//!
!
!
只能显示在一行上即:
串长+column<=15
//旋转90度:
字模被竖着切分
//lin:
行(0-3),column:
列(0-15)
//address:
字模区首地址
voidShowString(unsignedcharlin,unsignedcharcolumn,unsignedchar*string)
{unsignedcharch;
unsignedchari=0;
while(*string!
=''''\0'''')
{
ch=*string;
if(i+column>15)break;//(只能显示在一行上即:
串长+column<=15)
ShowChar(lin,i+column,ch);
string++;i++;
}
}
*/
/*-----------------------------------------------------------------------------------------
-----*/
//显示一个汉字
//旋转90度:
字模被竖着切分
//lin:
行(0-3),column:
列(0-7)
//hzcode:
汉字代码(自定义的)
//ucharcodeHZtable
voidShowHZ(unsignedcharlin,unsignedcharcolumn,unsignedinthzcode)
{
lin=lin<<1;//lin*2
Show88(lin,column,HZTable[hzcode]);
Show88(lin,column+1,HZTable[hzcode]+8);
Show88(lin+1,column,HZTable[hzcode]+16);
Show88(lin+1,column+1,HZTable[hzcode]+24);
}
/*-----------------------------------------------------------------------------------------
-----*/
//显示图片
//旋转90度:
字模被竖着切分
//startline:
开始行
//startcolumn:
开始列
//linechar:
图片行点除8(图片以8*8点阵为单位)
//columnchar:
图片列点除8(图片以8*8点阵为单位)
//address:
字模区首地址
voidShowPicture(unsignedcharstartline,unsignedcharstartcolumn,unsignedchar
linechar,unsignedcharcolumnchar,unsignedintaddress)
{unsignedchari,j;
for(i=0;ifor(j=0;jShow88(startline+i,startcolumn+j,address+(i*linechar+j)*8);
}
/*-----------------------------------------------------------------------------------------
-----*/
//显示一行字符串(汉字,字母混排,一行16字节)
//lin:
行
//lineheadaddr:
此行汉字代码区首地址
voidShowLine(unsignedcharlin,unsignedcharlinehead[])
{unsignedchari;
unsignedcharbyte;
unsignedinthzcode;
for(i=0;i<16;)
{byte=linehead;
if(byte<0x80)//字母
{
if(i>15)return;//!
!
编译器有问题,须强制退出
ShowChar(lin,i,byte);
i=i+1;
}
else//byte>=0x80(汉字)
{
if(i>15)return;//!
!
编译器有问题,须强制退出
byte=byte&0x7f;//最高位置0,即:
减去0x8000
hzcode=(unsignedint)byte<<8;//?
?
//高8位
hzcode=hzcode+linehead[i+1];//加低8位,组合成整型数地址
ShowHZ(lin,i,hzcode);
i=i+2;
}
}
}
/*-----------------------------------------------------------------------------------------
-----------*/
//显示一屏汉字
//pageheadaddr:
此屏汉字代码地址区首地址
voidShowPage(unsignedcharpagehead[][16])
{unsignedchari;
for(i=0;i<4;i++)ShowLine(i,pagehead);//1行8个汉字,16字节
}
/*-----------------------------------------------------------------------------------------
-----------*/
//读显示数据
unsignedcharReadByte()
{
unsignedchardat;
CheckState();
di=1;rw=1;
LCD12864DataPort=0xff;
en=1;dat=LCD12864DataPort;en=0;
return(dat);
}
/*-----------------------------------------------------------------------------------------
-----------*/
//反显一个8*8字块
//lin:
行(0-3),column:
列(0-7)
voidReverseShow88(unsignedcharlin,unsignedcharcolumn)
{unsignedchari;
unsignedchartab[8];
if(column<8)SelectScreen
(1);//如果列数<4(0,1,2,3),则写在第一屏上
elseSelectScreen
(2);//否则(4,5,6,7),写在第二屏上
//读上部8列
column=column<<3;//每个方块8*8大小
SetLine(lin);
SetColumn(column);
tab[0]=ReadByte();//空读!
!
!
!
!
//?
for(i=0;i<8;i++)tab=~ReadByte();
//写回
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)WriteByte(tab);
}
/*-----------------------------------------------------------------------------------------
-----------*/
/*----------------------------------------------------------------