?? lcd.c
字號:
/*----------------------------------------------------------------------------------------*/
//240*128液晶顯示驅動程序
//控制器件為:AT89S52
//T6963C接口:直接訪問形式
//程序設計:盧印舉
/*----------------------------------------------------------------------------------------*/
#include <reg51.h>
#include <math.h>
#include <hzk.c>
//信號管腳定義(全局變量)(注意:因為液晶數據口接P0,直接訪問方式)
unsigned char xdata Lcd_Cmd_Reg _at_ 0xfdff; // C/D-P2.0 CE-P2.1 p2.0=1 p2.1=0
unsigned char xdata Lcd_Data_Reg _at_ 0xfcff; // C/D-P2.0 CE-P2.1 p2.0=0 p2.1=0
//以8*8字符計算,顯示屏橫向、縱向可以顯示的點陣坐標;左、上、右、下以及當前的位置坐標
#define LCD_LEFT 0
#define LCD_TOP 0
#define LCD_RIGHT 239
#define LCD_BOTTOM 127
unsigned char data Lcd_CurrentX,Lcd_CurrentY,Lcd_Mask;
unsigned char data LeftMask[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};
unsigned char data RightMask[]={0xff,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe};
/*----------------------------------------------------------------------------------------*/
//延時子程序
/*----------------------------------------------------------------------------------------*/
void Lcddelay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
void lcdwc(unsigned char cmdcode)
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ; //當Lcd_Cmd_Reg低兩位不同時為1
Lcd_Cmd_Reg = cmdcode;
}
void lcdwc2(unsigned char cmdcode,unsigned char cmddata)
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = cmddata;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = cmdcode;
}
void lcdwc3(unsigned char cmdcode,unsigned char cmddata,unsigned char cmddata2)
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = cmddata;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = cmddata2;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = cmdcode;
}
void lcdwd(unsigned char dispdata) //寫數據
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Data_Reg = dispdata;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = 0xc0;
}
unsigned char lcdrdata(void) //讀數據
{ while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = 0xc5;
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
return Lcd_Data_Reg;
}
void lcdpos(void) //內部寫數指針定位
{ unsigned int CurrentAddress;
CurrentAddress = Lcd_CurrentY * 30 ;
CurrentAddress += Lcd_CurrentX/8;
lcdwc3(0x24,CurrentAddress & 0xff,CurrentAddress/256);
}
unsigned char lcdrd(void) //讀數據
{ lcdpos();
return lcdrdata();
}
void lcdcursornextbyte(void) //當前坐標移動到下一個點
{ Lcd_CurrentX+=8;
if(Lcd_CurrentX > LCD_RIGHT)
{ Lcd_CurrentX = LCD_LEFT;
Lcd_CurrentY++;
if(Lcd_CurrentY > LCD_BOTTOM) Lcd_CurrentY = LCD_TOP;
}
}
void displaybyte(unsigned char dispdata)
{ lcdpos();
if(Lcd_Mask == 0xff) lcdwd(dispdata);
else
{ unsigned char d=lcdrd();
d&=(~Lcd_Mask);
d|=(dispdata & Lcd_Mask);
lcdwd(d);
}
lcdcursornextbyte();
}
void Fill_Scr(unsigned char FillData) //LCD整屏顯示
{ Lcd_Mask=0xff;
for(Lcd_CurrentX = LCD_LEFT,Lcd_CurrentY = LCD_TOP;1;)
{ displaybyte(FillData);
if((Lcd_CurrentX == LCD_LEFT) && (Lcd_CurrentY == LCD_TOP)) break;
}
}
void lcdreset() //初始化LCD屏
{ lcdwc(0x80);
lcdwc(0x98);
lcdwc3(0x42,0,0);
lcdwc3(0x43,30,0);
}
void displaychinesechardot(unsigned int Index);
void displayenglishchardot(unsigned int Index);
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
void putchar(unsigned int uChar) //信息顯示
{ unsigned int i;
if(uChar<128)
for(i=0;i != ENGLISHCHARNUMBER;i++)
{ if(uChar ==EnglishCode[i])
{ displayenglishchardot(i);
break;
}
}
else
for(i=0;i != CHINESECHARNUMBER;i++)
{ if(uChar ==ChineseCode[i])
{ displaychinesechardot(i);
break;
}
}
}
void put_str(unsigned char code *s) //顯示漢字或英文字符
{ unsigned int i;
for (;*s != 0;s++)
{ i=*s;
if(*s > 127)
{ s++;
i=i*256+*s;
}
if(i == '\n')
{ Lcd_CurrentX = LCD_LEFT;
if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
else
Lcd_CurrentY+=CHINESECHARSIZE;
}
putchar(i);
}
}
void put_str_xy(unsigned char x,unsigned char y,unsigned char code *s)//顯示漢字或英文字符
{ Lcd_CurrentX=x;
Lcd_CurrentY=y;
put_str(s);
}
void displaychinesechardot(unsigned int Index)
{ unsigned char code *s;
s=ChineseCharDot+Index*CHINESECHARDOTSIZE;
if(Lcd_CurrentX > LCD_RIGHT-CHINESECHARSIZE+1)
{ Lcd_CurrentX = LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1) Lcd_CurrentY=LCD_TOP;
}
putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,s);
}
void displayenglishchardot(unsigned int Index)
{ unsigned char code *s;
s=EnglishCharDot+Index*ENGLISHCHARDOTSIZE;
if(Lcd_CurrentX > LCD_RIGHT-ENGLISHCHARSIZE+1)
{ Lcd_CurrentX = LCD_LEFT;
Lcd_CurrentY+=CHINESECHARSIZE;
if(Lcd_CurrentY > LCD_BOTTOM-CHINESECHARSIZE+1)
Lcd_CurrentY=LCD_TOP;
}
putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,s);
}
void point(unsigned char bitdata)
{ if(bitdata==0)
bitdata=0xf0+(0x7-(Lcd_CurrentX & 0x7));
else
bitdata=0xf8+(0x7-(Lcd_CurrentX & 0x7));
while((Lcd_Cmd_Reg & 0x3) != 0x3) ;
Lcd_Cmd_Reg = bitdata;
}
/*----------------------------------------------------------------------------------------*/
//繪制點子程序,最后一位為像素大小
/*----------------------------------------------------------------------------------------*/
void pointxy(unsigned char x,unsigned char y,unsigned char bitdata)
{ Lcd_CurrentX=x;
Lcd_CurrentY=y;
lcdpos();
point(bitdata);
}
/*----------------------------------------------------------------------------------------*/
//畫線子程序:最后一位為線條的像素寬度
/*----------------------------------------------------------------------------------------*/
void linexy(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bitdata)
{ //線
unsigned char i,k;
if(abs(y1-y0)>abs(x1-x0))
{ if(y1>y0)
for(i=y0;i<=y1;i++)
{ if(x1>x0)
{ k=x1-x0;
k*=(i-y0);
k/=y1-y0;
pointxy(x0+k,i,bitdata);
}
else //x1<x0
{ k=x0-x1;
k*=(i-y0);
k/=y1-y0;
pointxy(x0-k,i,bitdata);
}
}
else //y1<y0
for(i=y0;i>=y1;i--)
{ if(x1>x0)
{ k=x1-x0;
k*=(y0-i);
k/=y0-y1;
pointxy(x0+k,i,bitdata);
}
else //x1<x0
{ k=x0-x1;
k*=(y0-i);
k/=y0-y1;
pointxy(x0-k,i,bitdata);
}
}
}
else //abs(y1-y0)<abs(x1-x0)
{ if(x1>x0)
for(i=x0;i<=x1;i++)
{ if(y1==y0)
pointxy(i,y0,bitdata);
else if(y1>y0)
{ k=y1-y0;
k*=(i-x0);
k/=x1-x0;
pointxy(i,y0+k,bitdata);
}
else //y1<y0
{ k=y0-y1;
k*=(i-x0);
k/=x1-x0;
pointxy(i,y0-k,bitdata);
}
}
else
for(i=x0;i>=x1;i--)
{ if(y1==y0)
pointxy(i,y0,bitdata);
else if(y1>y0)
{ k=y1-y0;
k*=(x0-i);
k/=x0-x1;
pointxy(i,y0+k,bitdata);
}
else //y1<y0
{ k=y0-y1;
k*=(x0-i);
k/=x0-x1;
pointxy(i,y0-k,bitdata);
}
}
}
}
void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bitdata)
{ //矩形
linexy(x0,y0,x0,y1,bitdata);
linexy(x0,y0,x1,y0,bitdata);
linexy(x0,y1,x1,y1,bitdata);
linexy(x1,y0,x1,y1,bitdata);
}
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
{ unsigned char k,lx,ly,a1,a2,x;
Lcddelay(1000);
k=Lcd_CurrentX&0X7;
XSIZE+=k;
x=Lcd_CurrentX;
for(ly=0;ly<YSIZE;ly++,Lcd_CurrentY++)
for(Lcd_CurrentX=x,lx=k,a1=0;lx<XSIZE;s++)
{ unsigned char p;
a2=*s;
for(p=0;p<k;p++)
{ a2>>=1;
if((a1&0x1)==1) a2+=0x80;
a1>>=1;
}
lcdpos();
p=XSIZE&0X7;
if(lx<8)
{ if(XSIZE<8)
{ Lcd_Mask=LeftMask[k] & RightMask[p];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2 & Lcd_Mask);
lcdwd(a1);
lx=XSIZE;
Lcd_CurrentX+=XSIZE-k;
}
else //XSIZE>=8
{ Lcd_Mask=LeftMask[k];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2 & Lcd_Mask);
lcdwd(a1);
lx+=8-k;
Lcd_CurrentX+=8-k;
}
}
else if(lx>=XSIZE-p) //lx>=8
{ if(k>=p)
{ s--;
a1=*s;
a2=0;
for(p=0;p<k;p++)
{ a2>>=1;
if((a1&0x1)==1) a2+=0x80;
a1>>=1;
}
p=XSIZE&0X7;
}
Lcd_Mask=RightMask[p];
a1=lcdrd();
a1&=(~Lcd_Mask);
a1|=(a2 & Lcd_Mask);
lcdwd(a1);
lx+=p;
Lcd_CurrentX+=p;
}
else //lx>=8 and lx<XSIZE-p
{ lcdwd(a2);
lx+=8;
Lcd_CurrentX+=8;
}
a1=*s;
}
Lcd_CurrentY-=YSIZE;
}
void main()
{
lcdreset();
Fill_Scr(0x55); //顯示豎條
Lcddelay(6000); //系統延時
Fill_Scr(0xff); //顯示黑屏
Lcddelay(6000);
// put_str_xy(0,0,"創新科技檢測技術有限公司,聯系電話0512-86163888");//顯示漢字
put_str("創新科技檢測技術有限公司,聯系電話0512-86163888");
Fill_Scr(0x00);
//
rect(12,12,88,88,6);
Lcddelay(5000);
//Fill_Scr(0xff);
//rect(12,12,88,120,0);
lcdreset();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -