www.pudn.com > TESTLEDAAA.rar > 12864LED.c


#include "RT12864_LCD.h" 
#include "declare.h" 
 
/********************************************************** 
RT12864M LCD DISPLAY 
建立时间:2006年12月17号 
修改日期:2005年12月17号 
**********************************************************/ 
void ST7920_ChkBusy(void) 
{ 
	LCD_DATA_DIR &= ~LCD_DATA;	//SET DATA PORT IN =0 
	LCD_RS_PORT &= ~LCD_RS;		//RS=0 
	LCD_RW_PORT |= LCD_RW;		//RW=1 
	LCD_EN_PORT |= LCD_EN;		//EN=1 
	while(!(LCD_DATA_PIN&0x80)==0) 
	{ 
		; 
	} 
	LCD_EN_PORT &= ~LCD_EN;		//EN=0 
	LCD_DATA_DIR |= LCD_DATA;	//SET DATA PORT OUT 1 
} 
 
unsigned char ST7920_Read() 
{ 
	unsigned char readtmp; 
	ST7920_ChkBusy(); 
	LCD_DATA_DIR &= ~LCD_DATA;	//SET DATA PORT IN =0 
	LCD_RS_PORT |= LCD_RS;		//RS=1 
	LCD_RW_PORT |= LCD_RW;		//RW=1 
	LCD_EN_PORT |= LCD_EN;		//EN=1 
	delay_nus(1); 
	readtmp=LCD_DATA_PIN; 
	LCD_EN_PORT &= ~LCD_EN;		//EN=0 
	LCD_DATA_DIR |= LCD_DATA;	//SET DATA PORT OUT 1 
	return readtmp; 
} 
 
void ST7920_SendCmd(unsigned char cmd)			//write command to ST7920 
{ 
	ST7920_ChkBusy(); 
	LCD_DATA_PORT = cmd; 
	LCD_RS_PORT &= ~LCD_RS;		//RS=0 
	LCD_RW_PORT &= ~LCD_RW;		//RW=0 
	LCD_EN_PORT |= LCD_EN;		//EN=1 
	delay_nus(1); 
	LCD_EN_PORT &= ~LCD_EN;		//EN=0 
	delay_nus(1); 
	LCD_DATA_PORT = 0xff; 
} 
 
void ST7920_SendData(unsigned char dat)			//write data to ST7920 
{ 
	ST7920_ChkBusy(); 
	LCD_DATA_PORT = dat; 
	LCD_RS_PORT |= LCD_RS;		//RS=1 
	LCD_RW_PORT &= ~LCD_RW;		//RW=0 
	LCD_EN_PORT |= LCD_EN;		//EN=1 
	delay_nus(1); 
	LCD_EN_PORT &= ~LCD_EN;		//EN=0 
	delay_nus(1); 
	LCD_DATA_PORT = 0xff; 
} 
void LCD_Init(void) 
{ 
	delay_nms(10); 
	ST7920_SendCmd(0x30);		//function set :8-bit interface 
	delay_nms(1); 
	ST7920_SendCmd(0x30);		//basic instruction 
	delay_nms(1); 
	ST7920_SendCmd(0x0c);		//display on,cursor off,blink off 
	delay_nms(10); 
	ST7920_SendCmd(0x01);		//display clear 
	delay_nms(10); 
	ST7920_SendCmd(0x06);		//cursor move right AC increased by 1,display not shift 
	delay_nms(10); 
} 
 
void LCD_SetXY(unsigned char x, unsigned char y ) 
{ 
	unsigned char address; 
	switch(y) 
	{ 
		case 0: 
		{ 
			address = 0x80 + x; 
			break; 
		} 
		case 1: 
		{ 
			address = 0x90 + x; 
			break; 
		} 
		case 2: 
		{ 
			address = 0x88 + x; 
			break; 
		} 
		case 3: 
		{ 
			address = 0x98 + x; 
			break; 
		} 
		default:address = 0x80 + x; 
	} 
	ST7920_SendCmd(address); 
} 
 
void LCD_WriteString(unsigned char X,unsigned char Y,unsigned char *s) 
{ 
	LCD_SetXY( X, Y ); 
	while(*s) 
	{ 
		ST7920_SendData(*s); 
		*s ++; 
		delay_nms(1); 
	} 
} 
 
unsigned int LCD_Read16BIT(unsigned char X, unsigned char Y) 
{ 
        unsigned int tempread; 
          ST7920_SendCmd(0x34); 
          ST7920_SendCmd(Y); 
          ST7920_SendCmd(X); 
          ST7920_SendCmd(0x30); 
          ST7920_Read(); 
          tempread=(unsigned int)ST7920_Read(); 
          tempread=tempread<<8; 
          tempread+=(unsigned int)ST7920_Read(); 
        return tempread;         
} 
 
void LCD_DrawPoint(unsigned char X, unsigned char Y, unsigned char COLOR) 
{ 
        unsigned char x,y,xb; 
        unsigned char tmpv[2]; 
        unsigned int tmprd; 
        unsigned char MASK[8]={0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; 
        x=(X >> 4) + 8*(Y >> 5); 
        y=Y & 0x1f; 
        x+=0x80; 
        y+=0x80; 
        xb=X & 0x0f; 
        tmprd=LCD_Read16BIT(x,y); 
        tmpv[1]=(unsigned char)tmprd; 
        tmprd=tmprd>>8; 
        tmpv[0]=(unsigned char)tmprd;  
        if( (COLOR&0x01) != 0 ) 
        { 
          tmpv[xb>>3] |= MASK[xb&0x07]; 
        } 
        else 
        { 
          tmpv[xb>>3] &= (~MASK[xb&0x07]); 
        } 
        ST7920_SendCmd(0x34); 
        ST7920_SendCmd(y); 
        ST7920_SendCmd(x); 
        ST7920_SendCmd(0x30); 
        ST7920_SendData(tmpv[0]); 
        ST7920_SendData(tmpv[1]); 
        ST7920_SendCmd(0x36); 
}