?? 122x32液晶1520控制器驅(qū)動程序(c51) .txt
字號:
#include "reg51.h"
#include "intrins.h"
#include "absacc.h"
#include ".\inc\ASCII816.h" //標準ASCII碼庫
#include ".\inc\HZTable.h" //自制的漢字庫
#include ".\inc\menu.h"</P><P> //自制的菜單庫
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 //數(shù)據(jù)口
void ClearScreen(void);
/*----------------------------------------------------------------------------
調(diào)用方式:void OutMI(unsigned char i)
函數(shù)說明:發(fā)指令i到主窗口。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
------------------------------------------------------------------------------*/
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_();</P><P>LCD12232_RW=0;
LCD12232_E1=1; _nop_();</P><P>LCD12232_DATA=i;_nop_();
LCD12232_E1=0; _nop_();
}
/*------------------------------------------------------------------------------
調(diào)用方式:void OutMD(unsigned char i)
函數(shù)說明:發(fā)數(shù)據(jù)i到主窗口。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
-------------------------------------------------------------------------------*/
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_();
}
*------------------------------------------------------------------------------
調(diào)用方式:void OutSI(unsigned char i)
函數(shù)說明:發(fā)指令i到從窗口。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
-------------------------------------------------------------------------------*/
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_();
}
/*------------------------------------------------------------------------------
調(diào)用方式:void OutSD(unsigned char i)
函數(shù)說明:發(fā)數(shù)據(jù)i到從窗口。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
-------------------------------------------------------------------------------*/
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_();
}</P><P>/*--------------------------------------------------------------------------------------------------*/
//顯示8*8點陣
//字模被豎著切分
//lin:行(0-3), column: 列(0-14)
//address : 字模區(qū)首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)
{
unsigned char i,j;</P><P> if( column > 14) return;</P><P></P><P> if( column < 7 ) //8*8點陣都在左屏(Master)
{ OutMI( 0xB8 | lin); //設(shè)置顯示行
OutMI( column*8 ); //設(shè)置顯示列
for(i=0; i<8 ; i++ ) { OutMD( CBYTE[address+i] ); }
}
if( column == 7) //8*8點陣,前6個在左屏(Master),后兩個在右屏(Slave)
{ OutMI( 0xB8 | lin); //設(shè)置顯示行
OutMI( column*8 ); //左屏
for(i=0; i<6 ; i++ )
{ OutMD( CBYTE[address+i] ); }</P><P> OutSI( 0xB8 | lin); //設(shè)置顯示行
OutSI( 0 ); //右屏
for(i=0; i<3 ; i++ ) { OutSD( CBYTE[address+i+5] ); }
}
if( column > 7) //8*8點陣都在右屏(Slave)
{ OutSI( 0xB8 | lin); //設(shè)置顯示行
OutSI( column*8-61 );
for(i=0; i<8 ; i++ ) { OutSD( CBYTE[address+i] ); }
}
}</P><P>/*------------------------------------------------------------------------------------------------*/
//顯示8*16字符
//旋轉(zhuǎn)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 );
}
/*----------------------------------------------------------------------------------------------*/
//顯示一個漢字
//旋轉(zhuǎn)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);
}
////////////////////////////////////////////////////////////////////////</P><P>
/*------------------------------------------------------------------------------
調(diào)用方式:void LcdIni(void)
函數(shù)說明:12232點陣液晶初始化,開機后僅調(diào)用一次。
------------------------------------------------------------------------------*/
void InitLCD(void)
{
OutMI(0XE2);OutSI(0XE2);//復(fù)位
OutMI(0XAE);OutSI(0XAE);//POWER SAVE
OutMI(0XA4);OutSI(0XA4);//動態(tài)驅(qū)動
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();
}</P><P>/*------------------------------------------------------------------------------
調(diào)用方式:void clrscr(void)
函數(shù)說明:清屏
------------------------------------------------------------------------------*/
void clrscr(void)
{
unsigned char i;
unsigned char page;
for( page=0;page<2; page ++)
{
for(i=0;i<5;i++) ShowChar( page,i,' ');
}
}///////////////////////////////////////////////////////////////////////
/*------------------------------------------------------------------------------
調(diào)用方式:void SetPage(unsigned char page0,unsigned char page1)
函數(shù)說明:同時設(shè)置主從顯示頁為0-3頁。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
------------------------------------------------------------------------------*/
void SetPage(unsigned char page0,unsigned char page1)
{
OutMI(0xB8|page1);
OutSI(0xB8|page0);
}
/*------------------------------------------------------------------------------
調(diào)用方式:void SetAddress(unsigned char address0,unsigned char address1)
函數(shù)說明:同時設(shè)置主從列地址為0-121。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
-------------------------------------------------------------------------------*/
void SetAddress(unsigned char address0,unsigned char address1)
{
OutMI(address1&0x7F);
OutSI(address0&0x7F);
}
/*------------------------------------------------------------------------------
調(diào)用方式:void PutChar0(unsigned char ch)
函數(shù)說明:在左頁當前地址畫一個字節(jié)8個點。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
-------------------------------------------------------------------------------*/
void PutChar0(unsigned char ch)
{
OutSD(ch);
}
/*------------------------------------------------------------------------------
調(diào)用方式:void PutChar1(unsigned char ch)
函數(shù)說明:在右頁當前地址畫一個字節(jié)8個點。(內(nèi)函數(shù),私有,用戶不直接調(diào)用)
-------------------------------------------------------------------------------*/
void PutChar1(unsigned char ch)
{
OutMD(ch);
}
/*------------------------------------------------------------------------------
調(diào)用方式:void DrawBmp(unsigned char x,bit layer,unsigned char width,unsigned char *bmp)
函數(shù)說明:畫一個圖,橫坐標是x,layer表示上下層,width是圖形的寬,高都是16,bmp是
圖形指針
使用zimo21軟件,采用縱向取模得到bmp數(shù)據(jù)。
------------------------------------------------------------------------------*/
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字節(jié))
//lin:行
//lineheadaddr: 此行漢字代碼區(qū)首地址
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位,組合成整型數(shù)地址
ShowHZ( lin,i,hzcode);
i=i+2;
}
}
}
//顯示一屏漢字
//pageheadaddr:此屏漢字代碼地址區(qū)首地址
void ShowPage(unsigned char pagehead[][16])
{ unsigned char i;
for(i=0;i<2;i++) ShowLine(i,pagehead[i]); //1行8個漢字,16字節(jié)
}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;</P><P> if( column < 7 ) //8*8點陣都在左屏(Master)
{ OutMI( 0xB8 | lin); //設(shè)置顯示行
OutMI( column*8 ); //設(shè)置顯示列
dat[i]=~ReadByte_1();
for(i=0;i<8;i++)
{
dat[i]=~ReadByte_1();
}
OutMI( 0xB8 | lin); //設(shè)置顯示行
OutMI( column*8 ); //設(shè)置顯示列
for(i=0; i<8 ; i++ ) { OutMD(dat[i]); }
}
if( column == 7) //8*8點陣,前6個在左屏(Master),后兩個在右屏(Slave)
{ OutMI( 0xB8 | lin); //設(shè)置顯示行
OutMI( column*8 ); //左屏
dat[i]=~ReadByte_1();
for(i=0;i<6;i++)
{
dat[i]=~ReadByte_1();
}
OutMI( 0xB8 | lin); //設(shè)置顯示行
OutMI( column*8 ); //左屏
for(i=0; i<6 ; i++ )
{ OutMD(dat[i]); }
OutSI( 0xB8 | lin); //設(shè)置顯示行
OutSI( 0 ); //右屏
dat[i]=~ReadByte_2();
for(i=0;i<2;i++)
{
dat[i]=~ReadByte_2();
}
OutSI( 0xB8 | lin); //設(shè)置顯示行
OutSI( 0 ); //右屏
for(i=0; i<2 ; i++ ) { OutSD(dat[i]); }
}
if( column > 7) //8*8點陣都在右屏(Slave)
{ OutSI( 0xB8 | lin); //設(shè)置顯示行
OutSI( column*8-62 );
dat[i]=~ReadByte_2();
for(i=0;i<8;i++)
{
dat[i]=~ReadByte_2();
}
OutSI( 0xB8 | lin); //設(shè)置顯示行
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);
}</P><P>void Reset() //液晶復(fù)位
{
_nop_(); _nop_();}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -