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

📄 main.c

📁 单片机的液晶显示程序
💻 C
字号:
	#include <avr/io.h>
	#include <avr/signal.h>
	#include <avr/interrupt.h>
	#include <avr/delay.h> 

#define csl PORTD&=~_BV(PD1) //PD1
#define csh PORTD|=_BV(PD1) 

#define restl PORTD&=~_BV(PD0)  //PD0
#define resth PORTD|=_BV(PD0) 

#define sclkl PORTB&=~_BV(PB7)  //PB7
#define sclkh PORTB|=_BV(PB7) 

#define sdatal PORTB&=~_BV(PB5)  //PB5
#define sdatah PORTB|=_BV(PB5) 

#define GLCD_PIXELX			131
#define GLCD_PIXELY			131
#define GLCD_CACHE_SIZE		((GLCD_PIXELX * GLCD_PIXELY) / 8)
#define GLCD_X_END			GLCD_PIXELY
#define GLCD_Y_END			GLCD_PIXELY

#define GLCD_SER_PORT		PORTB
#define GLCD_SER_DDR		DDRB

// Colors
#define BLACK				0x00 		 //黑色
#define WHITE				0xFF		 //白色
#define RED					0x03		 //红色
#define GREEN				0x1C		 //绿色
#define BLUE				0xE0		 //蓝色
#define MAGENTA				0xE3		 //洋红
#define YELLOW				0x1F		 //黄色
#define CYAN				0xFC		 //青色

#define MEMWRITE			0x5C
#define ADDRX				0x75
#define ADDRY				0x15

typedef struct {
    unsigned char X1;
    unsigned char Y1;
    unsigned char X2;
    unsigned char Y2;
} glcdRect_t;

glcdRect_t      glcd_Clip;
#define glcdDoSwapCoord(x, y) {unsigned char t = x; x = y; y = t;}
#define glcdDoCheckCoord(x, y) {if (x > y) {glcdDoSwapCoord(x, y)}}
#define glcdSetRect(r,x1,y1,x2,y2) {r.X1 = x1; r.Y1 = y1; r.X2 = x2; r.Y2 = y2;}

unsigned char Color1=0,Color2=0;
unsigned char memAccessCtrl=0,zx=0,zy=0;
unsigned char colora,colorb;

int discode[192]=
{//广[16*16]上下列排
0x00,0x02,0x00,0x0C,0x3F,0xF0,0x20,0x00,
0x20,0x00,0x20,0x00,0x20,0x00,0xA0,0x00,
0x60,0x00,0x20,0x00,0x20,0x00,0x20,0x00,
0x20,0x00,0x60,0x00,0x20,0x00,0x00,0x00,

//东[16*16]上下列排
0x10,0x00,0x10,0x02,0x10,0x84,0x11,0x88,
0x16,0xB0,0x18,0x82,0xF0,0x81,0x17,0xFE,
0x10,0x80,0x10,0xA0,0x10,0x90,0x11,0x8C,
0x10,0x86,0x30,0x00,0x10,0x00,0x00,0x00,

//工[16*16]上下列排
0x00,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
0x20,0x04,0x20,0x04,0x20,0x04,0x3F,0xFC,
0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
0x60,0x04,0x20,0x0C,0x00,0x04,0x00,0x00,

//业[16*16]上下列排
0x00,0x02,0x08,0x02,0x06,0x02,0x01,0xE2,
0x00,0x02,0xFF,0xFE,0x00,0x02,0x00,0x02,
0x00,0x02,0xFF,0xFE,0x00,0x22,0x00,0xC2,
0x03,0x02,0x0C,0x06,0x00,0x02,0x00,0x00,

//大[16*16]上下列排
0x04,0x00,0x04,0x02,0x04,0x02,0x04,0x04,
0x04,0x08,0x04,0x30,0x05,0xC0,0xFE,0x00,
0x05,0x80,0x04,0x60,0x04,0x10,0x04,0x08,
0x04,0x04,0x0C,0x06,0x04,0x04,0x00,0x00,

//学[16*16]上下列排
0x02,0x20,0x0C,0x20,0x88,0x20,0x69,0x20,
0x09,0x20,0x09,0x22,0x89,0x21,0x69,0x7E,
0x09,0x60,0x09,0xA0,0x19,0x20,0x28,0x20,
0xC8,0x20,0x0A,0x60,0x0C,0x20,0x00,0x00};

unsigned int  a;
int x=0;


void glcdn_WriteData(unsigned char myData)
{
	csl;   
	sclkl; 
	sdatah;
	sclkh; 
	sclkl;
	SPCR = 0x50; 
	SPDR = myData;
	while(!(SPSR & 0x80));
	csh;
	SPCR = 0x00;
}

void glcdn_WriteCommand(unsigned char myData)
{
	csl;
	sclkl;
	sdatal;
	sclkh;
	sclkl;
	SPCR = 0x50;
	SPDR = myData;
	while(!(SPSR & 0x80));
	csh;
	SPCR = 0x00;	
}


void glcdn_SetPageArea(char x1, char x2, char y1, char y2)
{
	glcdn_WriteCommand(ADDRX);
	glcdn_WriteData(x1+1);
	glcdn_WriteData(x2+1);
	glcdn_WriteCommand(ADDRY);
	glcdn_WriteData(y1+1);
	glcdn_WriteData(y2+1);
}


void write()
{
	int g;
	for(g=0;g<8;g++)
	 {
	 if(a&0x80)
	 {
	  glcdn_WriteData(colora);
	  glcdn_WriteData(colora);
	  }
	 else
	 {
	  glcdn_WriteData(colorb);
	  glcdn_WriteData(colorb);
	 }
	  a<<=1;
	 } 
}

void glcdDoFillRect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) 
{
    if ((x1 > glcd_Clip.X2) | (x2 < glcd_Clip.X1) | (y1 > glcd_Clip.Y2) | (y2 < glcd_Clip.Y1)) {return;}
    if (x1 < glcd_Clip.X1) {x1 = glcd_Clip.X1;}
    if (y1 < glcd_Clip.Y1) {y1 = glcd_Clip.Y1;}
    if (x2 > glcd_Clip.X2) {x2 = glcd_Clip.X2;}
    if (y2 > glcd_Clip.Y2) {y2 = glcd_Clip.Y2;}
     
    glcdn_SetPageArea(x1,x2,y1,y2);
    glcdn_WriteCommand(MEMWRITE);
}

void glcdRectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) 
{
    glcdDoCheckCoord(x1, x2);
    glcdDoCheckCoord(y1, y2);
    glcdDoFillRect(x1, y1, x2, y2);   	
}

void glcdn_ClearLcd()
{
 	 unsigned int i;
	glcdn_SetPageArea(0, GLCD_X_END, 0, GLCD_Y_END);
	glcdn_WriteCommand(MEMWRITE);

	for(i=0; i<(GLCD_PIXELX*GLCD_PIXELY);i++)
	{
		glcdn_WriteData(Color1);
		glcdn_WriteData(Color2);
	}

}

void init_lcd()
{
	PORTB=0XF9;
	GLCD_SER_DDR = 0xA0;
	PORTD=0x0F;
	DDRD=0x03;
	PORTA=0XFF;
	DDRA=0X00;
	DDRC=0X00;
	PORTC=0XFF;
    csh;
	asm("nop");
	csl;
	restl;
	_delay_ms(1);
	resth;
	_delay_ms(1);
	sclkh;
	sdatah;
	csh;
	_delay_ms(1);		
	
	glcdn_WriteCommand(0x82);
	glcdn_WriteData(1);
	int w;
	for(w=0;w<13;w++) glcdn_WriteData(0);
	
	glcdn_WriteCommand(0xD1);
	
	glcdn_WriteCommand(0xCA);
	glcdn_WriteData(0x0f);	
	glcdn_WriteData(0x20);	
	glcdn_WriteData(0x0f);	
	glcdn_WriteData(0x01);	
	
	glcdn_WriteCommand(0x94);

	glcdn_WriteCommand(0xA9);

	glcdn_WriteCommand(0x20);
	glcdn_WriteData(0x0f);	

	glcdn_WriteCommand(0x81);
	glcdn_WriteData(0x0f);
	glcdn_WriteData(0x05);
	
	glcdn_WriteCommand(0xA7);
	
	glcdn_WriteCommand(0xBC);
	glcdn_WriteData(0x04);
	glcdn_WriteData(0x00);
	glcdn_WriteData(0x04);

	glcdn_WriteCommand(0xBB);
	glcdn_WriteData(0x01);
	
	glcdn_WriteCommand(0xAF);
	
	glcdn_WriteCommand(0xCE);
	glcdn_WriteData(0x00);
	glcdn_WriteData(0x01);
	glcdn_WriteData(0x02);
	glcdn_WriteData(0x03);
	glcdn_WriteData(0x04);
	glcdn_WriteData(0x05);
	glcdn_WriteData(0x06);
	glcdn_WriteData(0x07);

	glcdn_WriteData(0x00);
	glcdn_WriteData(0x01);
	glcdn_WriteData(0x02);
	glcdn_WriteData(0x03);
	glcdn_WriteData(0x04);
	glcdn_WriteData(0x05);
	glcdn_WriteData(0x06);
	glcdn_WriteData(0x07);

	glcdn_WriteData(0x00);
	glcdn_WriteData(0x01);
	glcdn_WriteData(0x02);
	glcdn_WriteData(0x03);

	glcdn_ClearLcd();
}

void RGB2(unsigned char red,unsigned char green,unsigned char blue)
{
 	 Color1=(red&0xf0>>4);
	 Color2=(green&0xf0)|((blue&0xf0)>>4);	
}

int main(void)
{	  
	 MCUCR=0x00;
	GICR=0x40;
	sei();
 	 SPCR = (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL);
	 RGB2(255,255,255);
     glcdSetRect(glcd_Clip, 0, 0, 130, 130);
	 init_lcd();			//初始化LCD

	 RGB2(255,255,255);		
	 glcdn_ClearLcd(); 		//清屏
	 	 
	while(1)
	{ 
	int h;
	int b=0,c=32,d=0,e=0,f=15,g=15;
	 colora=0x00;			//黑色
	 colorb=0xff;
	 for(h=0;h<6;h++)
	  {
		glcdRectangle(d,e,f,g); 
		for(b;b<c;b++)
		{
		a=discode[b];
		write();
		} 
		c=c+32;
		_delay_ms(500);	
		d=f+1;
		e=g+1;
		f=f+16;
		g=g+16;	
	  }	 	
	 RGB2(255,255,255);		
	 glcdn_ClearLcd(); 		//清屏
	} 	 
}


SIGNAL (SIG_INTERRUPT0)
{
MCUCR=0X00;
while(!(PIND&0X04));
_delay_ms(500);
x++;
if(x==1)
	{
	PORTB|=_BV(PB2);
	}
else 
	{
	DDRB&=~_BV(PB2);
	PORTB&=~_BV(PB2);
	x=0;
	}	
}

⌨️ 快捷键说明

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