⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glcd.h

📁 128x64 Graphical LCD Driver With CodevisionAVR
💻 H
字号:


/*GRAPHIC LCD 128*64 Controller with MCS-51 microcontroller ( AT89C52 )  */

//      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//         do not change these value  //
#define DATAPORT PORTB
#define CTRLPORT PORTD
#define DISPLAY_ON         0x3f
#define DISPLAY_OFF        0x3e
#define DISPLAY_STARTLINE  0xc0
#define DISPLAY_PAGE_SET   0xb8
#define DISPLAY_COLUMN_SET 0x40
#define DATAREG 1
#define CONTROL 0

#define LCD_ENABLE      1
 //                        Zero Bit
#define LCD_CS1         0
//                        1'st Bit
#define LCD_CS2         6
//                        2'nd Bit
#define LCD_inst        8

#define LCD_R PORTC.0

#include "font\font2.h"
#include "include\string.h"

#pragma used+

typedef unsigned char byte;
void delay(unsigned char);
void OmaDelay(void);
void LCD_RST(void);
void output(unsigned char,unsigned char);
void SendLCDCommand(byte,byte);
void SendLCDData(unsigned char flash *,unsigned char);
void SendLCDData2(unsigned char);
void SetColumn(unsigned char);
void SetPage(unsigned char);
void SetStartLine(unsigned char);
void show(unsigned char flash *,unsigned char);
void LCDprintf2(unsigned char,unsigned char,unsigned char flash *);
void LCDprintf3(unsigned char,unsigned char,unsigned char *);
void sendlcddataram(unsigned char);
void putpixel(unsigned char, unsigned char);
void clrpixel(unsigned char, unsigned char);
void LCDprintf2Ram(unsigned char, unsigned char ,unsigned char *,...);
void line(unsigned char,unsigned char,unsigned char,unsigned char);
void Vline(unsigned char,unsigned char,unsigned char);
void Hline(unsigned char,unsigned char,unsigned char);
void circle(unsigned char,unsigned char,unsigned char);
void clear(void);
void on(void);
void off(void);


unsigned char CurrentColumn,DisplayData[8][128];

void delay(unsigned char j){
unsigned char i;
for(i=0;i<j;i++);
}


void OmaDelay(void){
delay(100);
}

void LCD_RST(void)
{
LCD_R=0;
delay_ms(1);
LCD_R=1;
}

unsigned char pow2(unsigned char a,unsigned char b){
unsigned char i=0,ret=1;
for(;i<b;i++) ret*=a;
return ret;
}

void sendlcddataram(unsigned char values){
byte c_s;
c_s = CurrentColumn>63?LCD_CS2:LCD_CS1;
output(CONTROL, c_s );   
OmaDelay();
output(DATAREG,values); 
OmaDelay();
output(CONTROL, LCD_ENABLE | c_s ); 
OmaDelay();
}

void putpixel(unsigned char x, unsigned char y){
	SetPage((y/8));
	SetColumn(x);
	DisplayData[y/8][x]|=pow2(2,y%8);
	sendlcddataram(DisplayData[y/8][x]);
}
 

void clrpixel(unsigned char x, unsigned char y){
	SetPage((y/8));
	SetColumn(x);
	DisplayData[y/8][x]&=~pow2(2,y%8);
	sendlcddataram(DisplayData[y/8][x]);
}

                
void output(unsigned char port, unsigned char value){
unsigned char st1=0;
unsigned char val1=0x80;
if(port) DATAPORT=value;
else{
	if(value&1) value&=0XFE; else value|=1;
	if(value&2) value&=0XFD; else value|=2;
	if(value&8) value&=0XF7; else value|=8;
      st1=value;
      if(st1&1) val1|=0x08;else val1&=0xF7;   
      st1=value;
      if(st1&2) val1|=0x40;else val1&=0xBF;   
      st1=value;
      if(st1&4) val1|=0x04;else val1&=0xFB;   
      st1=value;
      if(st1&8) val1|=0x20;else val1&=0xDF;   
	CTRLPORT=val1;
	}
}

void SendLCDCommand(byte value, byte CS)
{
	output(CONTROL,  CS | LCD_inst);
	OmaDelay();
	output(DATAREG, value);
	OmaDelay();
	output(CONTROL, LCD_ENABLE | CS | LCD_inst);
	OmaDelay();
	OmaDelay();
	}


void SendLCDData(unsigned char flash *values,unsigned char amount){
byte c_s;
unsigned char counter;
for (counter=0; counter < amount;counter++){
	c_s = CurrentColumn>63?LCD_CS2:LCD_CS1;
	output(CONTROL, c_s );
	OmaDelay();
	output(DATAREG, values[counter]);
	OmaDelay();
	output(CONTROL, LCD_ENABLE | c_s );
	OmaDelay();
	CurrentColumn++;
	if (CurrentColumn > 127)  return;
	}
}

void SendLCDData2(unsigned char values){
        byte c_s;
	c_s = CurrentColumn>63?LCD_CS2:LCD_CS1;
	output(CONTROL, c_s );
	OmaDelay();
	output(DATAREG, values);
	OmaDelay();
	output(CONTROL, LCD_ENABLE | c_s );
	OmaDelay();
}

void SendLCDData3(unsigned char *values, unsigned char amount){
byte c_s;
unsigned char counter;
for (counter=0; counter < amount;counter++){
	c_s = CurrentColumn>63?LCD_CS2:LCD_CS1;
	output(CONTROL, c_s );
	OmaDelay();
	output(DATAREG, values[counter]);
	OmaDelay();
	output(CONTROL, LCD_ENABLE | c_s );
	OmaDelay();
	CurrentColumn++;
	if (CurrentColumn > 127)  return;
	}
}


void SetColumn(unsigned char y){
CurrentColumn = y;
if (y < 64){
	SendLCDCommand(DISPLAY_COLUMN_SET | (y&63), LCD_CS1);
	SendLCDCommand(DISPLAY_COLUMN_SET | 0, LCD_CS2);
	 }
else{
	SendLCDCommand(DISPLAY_COLUMN_SET | 63, LCD_CS1);
	SendLCDCommand(DISPLAY_COLUMN_SET | ((y-64)&63), LCD_CS2);
	 }
}




void SetPage(unsigned char x){
	SendLCDCommand(DISPLAY_PAGE_SET | x, LCD_CS1);
	SendLCDCommand(DISPLAY_PAGE_SET | x, LCD_CS2);
}


void SetStartLine(unsigned char line){
	SendLCDCommand(DISPLAY_STARTLINE | (line & 63), LCD_CS1);
	SendLCDCommand(DISPLAY_STARTLINE | (line & 63), LCD_CS2);
}




void show(unsigned char flash *a,unsigned char delay1){
unsigned char i,j;
unsigned int temp;
SetColumn(0);
SetPage(0);
for (j=0;j<8;j++){
	SetPage(j);
	SetColumn(0);
	for (i=0;i<128;i++){
		temp=(unsigned int)128*j;
		temp+=i;
		SendLCDData(&a[temp],1);
		delay(delay1);
		}
	}
}

void LCDprintf2(unsigned char y, unsigned char page,  unsigned char flash *Str){
unsigned char n;
unsigned int yy;
SetColumn(y);
SetPage(page);
//SetColumn(y);
for (n = 0;Str[n]!=0;n++){
	yy=(*(Str+n)-32);
	yy*=5;
	SendLCDData(&font5x7[yy],5);
	SendLCDData(&value,1);
	}
}

void LCDprintf3(unsigned char y, unsigned char page,  unsigned char *Str){
unsigned char n;
unsigned int yy;
SetColumn(y);
SetPage(page);
SetColumn(y);
for (n = 0;Str[n]!=0;n++){
	yy=(*(Str+n)-32);
	yy*=5;
	SendLCDData(&font5x7[yy],5);
	SendLCDData(&value,1);
	}
}

void LCDprintf4(unsigned char y, unsigned char page,  unsigned int Str){
unsigned int yy;
SetColumn(y);
SetPage(page);
SetColumn(y);
	yy=Str;
	yy*=5;
	SendLCDData(&font5x7[yy],5);
	SendLCDData(&value,1);
}

void LCDprintf2Ram(unsigned char y, unsigned char page,unsigned char *Str,...){
unsigned char n;
unsigned int yy;
SetColumn(y);
SetPage(page);
SetColumn(y);
for (n = 0;Str[n]!=0;n++){
	yy=(*(Str+n)-32);
	yy*=5;
	SendLCDData(&font5x7[yy],5);
	SendLCDData(&value,1);
	}
}

void clear(void){
unsigned char x,a;
//PAGE=0;
//COLUMN=0;
for (x=0;x < 8;x++){
  SetPage(x);SetColumn(0);
  for (a = 0 ;a < 128; a++)
	 SendLCDData(&value,1);
	  }
}

void clearLine(unsigned char l){
unsigned char a;
SetPage(l);
SetColumn(0);
for (a=0;a<128;a++)
        SendLCDData(&value,1);
}

void clearfromLine(unsigned char L)
{
        unsigned char i;
        for(i=L;i<7;i++) clearLine(i);
}

void clearLCD(void)
{
    unsigned char i;
    for(i=0;i<8;i++) clearLine(i);
}    

void on(void){
SendLCDCommand(DISPLAY_ON, LCD_CS1);
SendLCDCommand(DISPLAY_ON, LCD_CS2);
}

void off(void){
SendLCDCommand(DISPLAY_OFF, LCD_CS1);
SendLCDCommand(DISPLAY_OFF, LCD_CS2);
}


void line(unsigned char Xa,unsigned char Ya,unsigned char Xb,unsigned char Yb){
float X,Y,Xinc,Yinc,m;
unsigned char i,step;
if(Ya<Yb){
	Y=(float)Ya;
	X=(float)Xa;
	}
else{
	Y=(float)Yb;
	X=(float)Xb;
	}
m=(float)fabs((float)Xb-(float)Xa)/fabs((float)Yb-(float)Ya);
if(m<=1){
	Yinc=1.0;
	step=abs(Yb-Ya);
	Xinc=m;
	}
else{
	Yinc=1.0/m;
	step=abs(Xb-Xa);
	Xinc=1.0;
	}
if ((X<128)&&(Y<64)) putpixel((unsigned char)X,(unsigned char)Y);
for(i=0;i<step;i++){
	Y+=Yinc;
	if(((Yb>Ya)&&(Xb>Xa))||((Yb<Ya)&&(Xb<Xa)))
		X+=Xinc;
	else
		X-=Xinc;
        if ((X<128)&&(Y<64)) putpixel((unsigned char)X,(unsigned char)Y);
	}
}

void Vline(unsigned char X,unsigned char Ya,unsigned char Yb)
{
        unsigned char i;
        if(Ya==Yb) putpixel(X,Ya);
        else if(Ya<Yb) for(i=Ya;i<=Yb;i++) putpixel(X,i);
        else if(Ya>Yb) for(i=Yb;i<=Ya;i++) putpixel(X,i);
}

void Hline(unsigned char Xa,unsigned char Xb,unsigned char Y)
{
        unsigned char i;
        if(Xa==Xb) putpixel(Xa,Y);
        else if(Xa<Xb) for(i=Xa;i<=Xb;i++) putpixel(i,Y);
        else if(Xa>Xb) for(i=Xb;i<=Xa;i++) putpixel(i,Y);
}


void circle(unsigned char Xo,unsigned char Yo,unsigned char r)
{
        float Xi,Yi,X,Y;
        unsigned int teta;
        for(teta=0;teta<360;teta++)
        {
                Xi=(float)r*(float)cos(teta);
                Yi=(float)r*(float)sin(teta);
                X=(float)Xo+Xi;
                Y=(float)Yo+Yi;
                if((X>-1)&&(X<128)&&(Y>-1)&&(Y<64))
                {
                        putpixel((unsigned char)X,(unsigned char)Y);
                }
        }
}

#pragma used-

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -