12864 液晶驱动程序.docx

上传人:b****5 文档编号:12565615 上传时间:2023-04-20 格式:DOCX 页数:17 大小:19.68KB
下载 相关 举报
12864 液晶驱动程序.docx_第1页
第1页 / 共17页
12864 液晶驱动程序.docx_第2页
第2页 / 共17页
12864 液晶驱动程序.docx_第3页
第3页 / 共17页
12864 液晶驱动程序.docx_第4页
第4页 / 共17页
12864 液晶驱动程序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

12864 液晶驱动程序.docx

《12864 液晶驱动程序.docx》由会员分享,可在线阅读,更多相关《12864 液晶驱动程序.docx(17页珍藏版)》请在冰豆网上搜索。

12864 液晶驱动程序.docx

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;i

for(j=0;j

Show88(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);

}

/*-----------------------------------------------------------------------------------------

-----------*/

/*----------------------------------------------------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1