122x32液晶1520控制器驱动程序(C51)

来源:本站
导读:目前正在解读《122x32液晶1520控制器驱动程序(C51)》的相关信息,《122x32液晶1520控制器驱动程序(C51)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《122x32液晶1520控制器驱动程序(C51)》的详细说明。
简介:本文主要介绍了122x32液晶1520控制器驱动程序(C51)。

#include "reg51.h"

#include "intrins.h"

#include "absacc.h"

#include ".incASCII816.h"//标准ASCII码库

#include ".incHZTable.h"//自制的汉字库

#include ".incmenu.h"

//自制的菜单库

sbit LCD12232_A0=P3^3;

sbit LCD12232_RW=P3^1; //读写

sbit LCD12232_E1=P3^5; //片选1(Master)

sbit LCD12232_E2=P3^4; //片选2(slave)

#define LCD12232_DATA P1 //数据口

void ClearScreen(void);

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

调用方式:void OutMI(unsigned char i)

函数说明:发指令i到主窗口。(内函数,私有,用户不直接调用)

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

void OutMI(unsigned char i)

{

LCD12232_E2=0; //确认

LCD12232_A0=0;

LCD12232_RW=1;

LCD12232_E1=1; _nop_();

LCD12232_DATA = i;

while( LCD12232_DATA & 0x80 ); //busy?

LCD12232_E1=0; _nop_();

LCD12232_RW=0;

LCD12232_E1=1; _nop_();

LCD12232_DATA=i;_nop_();

LCD12232_E1=0; _nop_();

}

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

调用方式:void OutMD(unsigned char i)

函数说明:发数据i到主窗口。(内函数,私有,用户不直接调用)

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

void OutMD(unsigned char i)

{

LCD12232_E2=0; //确

LCD12232_A0=0;

LCD12232_RW=1;

LCD12232_E1=1; _nop_();

LCD12232_DATA = i;

while( LCD12232_DATA & 0x80 );

LCD12232_E1=0; _nop_();LCD12232_A0=1;

LCD12232_RW=0;

LCD12232_E1=1; _nop_();

LCD12232_DATA=i; _nop_();

LCD12232_E1=0; _nop_();

}

*------------------------------------------------------------------------------

调用方式:void OutSI(unsigned char i)

函数说明:发指令i到从窗口。(内函数,私有,用户不直接调用)

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

void OutSI(unsigned char i)

{

LCD12232_E1=0; //确认

LCD12232_A0=0;

LCD12232_RW=1;

LCD12232_E2=1; _nop_();

LCD12232_DATA = i;

while( LCD12232_DATA & 0x80 );

LCD12232_E2=0; _nop_();

LCD12232_RW=0;

LCD12232_E2=1; _nop_();

LCD12232_DATA=i; _nop_();

LCD12232_E2=0; _nop_();

}

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

调用方式:void OutSD(unsigned char i)

函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用)

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

void OutSD(unsigned char i)

{

LCD12232_E1=0; //确认

LCD12232_A0=0;

LCD12232_RW=1;

LCD12232_E2=1; _nop_();

LCD12232_DATA =i;

while( LCD12232_DATA & 0x80 );

LCD12232_E2=0; _nop_();

LCD12232_A0=1;

LCD12232_RW=0;

LCD12232_E2=1; _nop_();

LCD12232_DATA=i; _nop_();

LCD12232_E2=0; _nop_();

}

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

//显示8*8点阵

//字模被竖着切分

//lin:行(0-3), column: 列(0-14)

//address : 字模区首地址

void Show88(unsigned char lin,unsigned char column,unsigned int address)

{

unsigned char i,j;

if( column > 14) return;

if( column < 7 ) //8*8点阵都在左屏(Master)

{ OutMI( 0xB8 | lin); //设置显示行

OutMI( column*8 ); //设置显示列

for(i=0; i<8 ; i++ ) { OutMD( CBYTE[address+i] ); }

}

if( column == 7) //8*8点阵,前6个在左屏(Master),后两个在右屏(Slave)

{ OutMI( 0xB8 | lin); //设置显示行

OutMI( column*8 ); //左屏

for(i=0; i<6 ; i++ )

{ OutMD( CBYTE[address+i] ); }

OutSI( 0xB8 | lin); //设置显示行

OutSI( 0 ); //右屏

for(i=0; i<3 ; i++ ) { OutSD( CBYTE[address+i+5] ); }

}

if( column > 7) //8*8点阵都在右屏(Slave)

{ OutSI( 0xB8 | lin); //设置显示行

OutSI( column*8-61 );

for(i=0; i<8 ; i++ ) { OutSD( CBYTE[address+i] ); }

}

}

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

//显示8*16字符

//旋转90度:字模被竖着切分

//lin:行(0-3), column: 列(0-15)

//character:字符代码(标准ASCII码)

void ShowChar(unsigned char lin,unsigned char column,unsigned char character)

{ lin=lin<<1;

Show88(lin ,column,ASCII816[character-0x20] );

Show88(lin+1,column,ASCII816[character-0x20]+8 );

}

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

//显示一个汉字

//旋转90度:字模被竖着切分

//lin:行(0-3), column: 列(0-7)

//hzcode: 汉字代码(自定义的)

//uchar code HZtable

void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)

{

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

}

////////////////////////////////////////////////////////////////////////

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

调用方式:void LcdIni(void)

函数说明:12232点阵液晶初始化,开机后仅调用一次。

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

void InitLCD(void)

{

OutMI(0XE2);OutSI(0XE2);//复位

OutMI(0XAE);OutSI(0XAE);//POWER SAVE

OutMI(0XA4);OutSI(0XA4);//动态驱动

OutMI(0XA9);OutSI(0XA9);//1/32占空比

OutMI(0XA0);OutSI(0XA0);//时钟线输出

OutMI(0XEE);OutSI(0XEE);//写模式

OutMI(0XC0);OutMI(0X00);//显示起始行为0,列地址为0

OutSI(0XC0);OutSI(0X00);//显示起始行为0,列地址为0

OutMI(0XAF);OutSI(0XAF); //开显示

ClearScreen();

}

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

调用方式:void clrscr(void)

函数说明:清屏

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

void clrscr(void)

{

unsigned char i;

unsigned char page;

for( page=0;page<2; page ++)

{

for(i=0;i<5;i++) ShowChar( page,i,' ');

}

}///////////////////////////////////////////////////////////////////////

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

调用方式:void SetPage(unsigned char page0,unsigned char page1)

函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用)

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

void SetPage(unsigned char page0,unsigned char page1)

{

OutMI(0xB8|page1);

OutSI(0xB8|page0);

}

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

调用方式:void SetAddress(unsigned char address0,unsigned char address1)

函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用)

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

void SetAddress(unsigned char address0,unsigned char address1)

{

OutMI(address1&0x7F);

OutSI(address0&0x7F);

}

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

调用方式:void PutChar0(unsigned char ch)

函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)

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

void PutChar0(unsigned char ch)

{

OutSD(ch);

}

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

调用方式:void PutChar1(unsigned char ch)

函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用)

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

void PutChar1(unsigned char ch)

{

OutMD(ch);

}

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

调用方式:void DrawBmp(unsigned char x,bit layer,unsigned char width,unsigned char *bmp)

函数说明:画一个图,横坐标是x,layer表示上下层,width是图形的宽,高都是16,bmp是

图形指针

使用zimo21软件,采用纵向取模得到bmp数据。

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

void DrawBmp(unsigned char x0,bit layer,unsigned char width,unsigned char *bmp)

{

unsigned char x,address,i=0; //address表示显存的物理地址

unsigned char page=0;

bit window=0; //page表示上下两页,window表示左右两页

if (layer) page=2;

for (x=x0;x<x0+width;x++)

{

if (x>62) {window=1;address=x%62;}

else address=x;

SetPage(page,page);

SetAddress(address,address);

if (window)

{

PutChar0(bmp[i]);

}

else

{

PutChar1(bmp[i]);// Master ,画上层

}

SetPage(page+1,page+1);

SetAddress(address,address);

if (window)

{

PutChar0(bmp[i+width]);

}

else

{

PutChar1(bmp[i+width]);//画下层

}

i++;

}

}

void ClearScreen(void)

{

unsigned char i;

unsigned char page;

for (page=0;page<4;page++)

{

SetPage(page,page);

SetAddress(0,0);

for (i=0;i<62;i++)

{

PutChar1(0x0);

PutChar0(0x0);

}

}

}

//显示一行字符串(汉字,字母混排,一行16字节)

//lin:行

//lineheadaddr: 此行汉字代码区首地址

void ShowLine(unsigned char lin,unsigned char linehead[])

{ unsigned char i;

unsigned char byte;

unsigned int hzcode;

for( i=0; i<16; )

{ byte=linehead[i];

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=(unsigned int)byte<<8; //?? //高8位

hzcode=hzcode+linehead[i+1]; //加低8位,组合成整型数地址

ShowHZ( lin,i,hzcode);

i=i+2;

}

}

}

//显示一屏汉字

//pageheadaddr:此屏汉字代码地址区首地址

void ShowPage(unsigned char pagehead[][16])

{ unsigned char i;

for(i=0;i<2;i++) ShowLine(i,pagehead[i]); //1行8个汉字,16字节

}unsigned char ReadByte_1()

{

unsigned char dat;

LCD12232_E2=0; //确

LCD12232_A0=1;

LCD12232_RW=1;

LCD12232_E1=1; _nop_(); _nop_();

LCD12232_DATA=0xff;

dat=LCD12232_DATA; _nop_(); _nop_();

LCD12232_E1=0; _nop_(); _nop_();

return dat;

}unsigned char ReadByte_2()

{

unsigned char dat;

LCD12232_E1=0; //确

LCD12232_A0=1;

LCD12232_RW=1;

LCD12232_E2=1; _nop_(); _nop_();

LCD12232_DATA=0xff;

dat=LCD12232_DATA; _nop_(); _nop_();

LCD12232_E2=0; _nop_(); _nop_();

return dat;

}

//反显一个8*8字块

//lin:行(0-3), column: 列(0-7)

void ReverseShow88(unsigned char lin,unsigned char column)

{

unsigned char i,j,dat[8];

if( column > 14) return;

if( column < 7 ) //8*8点阵都在左屏(Master)

{ OutMI( 0xB8 | lin); //设置显示行

OutMI( column*8 ); //设置显示列

dat[i]=~ReadByte_1();

for(i=0;i<8;i++)

{

dat[i]=~ReadByte_1();

}

OutMI( 0xB8 | lin); //设置显示行

OutMI( column*8 ); //设置显示列

for(i=0; i<8 ; i++ ) { OutMD(dat[i]); }

}

if( column == 7) //8*8点阵,前6个在左屏(Master),后两个在右屏(Slave)

{ OutMI( 0xB8 | lin); //设置显示行

OutMI( column*8 ); //左屏

dat[i]=~ReadByte_1();

for(i=0;i<6;i++)

{

dat[i]=~ReadByte_1();

}

OutMI( 0xB8 | lin); //设置显示行

OutMI( column*8 ); //左屏

for(i=0; i<6 ; i++ )

{ OutMD(dat[i]); }

OutSI( 0xB8 | lin); //设置显示行

OutSI( 0 ); //右屏

dat[i]=~ReadByte_2();

for(i=0;i<2;i++)

{

dat[i]=~ReadByte_2();

}

OutSI( 0xB8 | lin); //设置显示行

OutSI( 0 ); //右屏

for(i=0; i<2 ; i++ ) { OutSD(dat[i]); }

}

if( column > 7) //8*8点阵都在右屏(Slave)

{ OutSI( 0xB8 | lin); //设置显示行

OutSI( column*8-62 );

dat[i]=~ReadByte_2();

for(i=0;i<8;i++)

{

dat[i]=~ReadByte_2();

}

OutSI( 0xB8 | lin); //设置显示行

OutSI( column*8-62 );

for(i=0; i<8 ; i++ ) { OutSD(dat[i]); }

}

}

//反显一行

ReverseShow(unsigned char lin)

{

unsigned char i;

lin=lin*2;

for(i=0;i<15;i++)

{

ReverseShow88(lin,i);

ReverseShow88(lin+1,i);

}

}

//反显一个汉字

ReverseShowHZ(unsigned char lin,unsigned char col)

{

lin=lin*2;

ReverseShow88(lin,col);

ReverseShow88(lin+1,col);

ReverseShow88(lin,col+1);

ReverseShow88(lin+1,col+1);

}

//反显一个字符

ReverseShowChar(unsigned char lin,unsigned char col)

{

lin=lin*2;

ReverseShow88(lin,col);

ReverseShow88(lin+1,col);

}

void Reset() //液晶复位

{

_nop_(); _nop_();}

提醒:《122x32液晶1520控制器驱动程序(C51)》最后刷新时间 2024-03-14 01:07:56,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《122x32液晶1520控制器驱动程序(C51)》该内容的真实性请自行鉴别。