您当前的位置:五五电子网电子知识单片机-工控设备51单片机122x32液晶1520控制器驱动程序(C51)--P2 正文
122x32液晶1520控制器驱动程序(C51)--P2

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

点击数:7466 次   录入时间:03-04 11:58:51   整理:http://www.55dianzi.com   51单片机
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{
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_();}




本文关键字:控制器  程序  51单片机单片机-工控设备 - 51单片机

《122x32液晶1520控制器驱动程序(C51)--P2》相关文章>>>