12864 液晶驱动程序.docx
- 文档编号:12565615
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:17
- 大小:19.68KB
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;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); } /*----------------------------------------------------------------------------------------- -----------*/ /*----------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 液晶驱动程序 液晶 驱动程序