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

📄 lcd1286418.c

📁 AVR单片机驱动128×64LCD实现3D图像的旋转显示
💻 C
字号:
/***********************************************************************************************
*  FILE NAME: lcd1286418.c
*  PURPOSE: lcd1286418 drive Firmware
*  DESCRIPTION: KS0108
*  DEVELOPMENT HISTORY:
*    Date         Author         Release                   Description Of Change
*  --------    ------------     ---------     ------------------------------------------------
*  08-04-11     XuGuohong         1.0                        Testing Edition    	     
/**********************************************************************************************/

/* Include Global Parameters */
#include <iom128v.h>
#include "avr.h"

/* LCD PORTING ON ATMEGA128 */
/* D0---D7 */
#define LCDPORTDATA    PORTF
#define LCDDDRDATA     DDRF
#define LCDPINDATA     PINF
/* CS1 */
#define LCDPORTCS1     PORTE
#define LCDDDRCS1      DDRE
#define LCDCS1         PE2
/* CS2 */
#define LCDPORTCS2     PORTE
#define LCDDDRCS2      DDRE
#define LCDCS2         PE3
/* RW */
#define LCDPORTRW      PORTE
#define LCDDDRRW       DDRE
#define LCDRW          PE4
/* RS */
#define LCDPORTRS      PORTB
#define LCDDDRRS       DDRB
#define LCDRS          PB2
/* E */
#define LCDPORTEN      PORTB
#define LCDDDREN       DDRB
#define LCDEN          PB3

/* Include Global Parameters */
unsigned char displaybuffer[8][128];

/* Declare Prototypes */
void LcdInit(void);
void LcdWrCmd(unsigned char,unsigned char);
void LcdWrDat(unsigned char,unsigned char);
unsigned char LcdRdSta(unsigned char);
unsigned char LcdRdDat(unsigned char);
unsigned char LcdBusy(void);
void LcdClr(void);
void LcdDisplaySeg(unsigned char,unsigned char,unsigned char);
void LcdDisplayDot(unsigned char,unsigned char,unsigned char);
void LcdDsiplayRefresh(void);
void Delay1ms(void);

/*****************************************
*  FUNCTION NAME: LcdInit
*  DESCRIPTION:   LCD Initialization
/*****************************************/
void LcdInit(void)
{
    /* Ports Initialization */
	SetBit(LCDPORTCS1,LCDCS1);	
	SetBit(LCDPORTCS2,LCDCS2);
	ClrBit(LCDPORTEN,LCDEN);	
	SetOutput(LCDDDRRS,LCDRS);	
    SetOutput(LCDDDRRW,LCDRW);
    SetOutput(LCDDDRCS1,LCDCS1);	
	SetOutput(LCDDDRCS2,LCDCS2);	
	SetOutput(LCDDDREN,LCDEN);
	Delay1ms();
	/* Lcd Clear */
	LcdClr();
}

/*****************************************
*  FUNCTION NAME: LcdWrCmd
*  DESCRIPTION:   Write Command To LCD 
*                 chiplr = "L" or "R"
*                 chiplr = " B "同时选中
/*****************************************/
void LcdWrCmd(unsigned char chiplr,unsigned char data)
{
	while(LcdBusy() == 0)                   /* IF LCD BUSY,WAIT... */
        ;
	ClrBit(LCDPORTRS,LCDRS);				/* RS = 0 ,COMMAND */
	ClrBit(LCDPORTRW,LCDRW);				/* RW = 0 ,WRITE */
	if(chiplr == 'L')						/* CS = 0 ,CHIP SELECT */
	    ClrBit(LCDPORTCS1,LCDCS1);
	else if(chiplr == 'R')
	    ClrBit(LCDPORTCS2,LCDCS2);
	else
	    {
		    ClrBit(LCDPORTCS1,LCDCS1);
		    ClrBit(LCDPORTCS2,LCDCS2);
		}
    NOP;						  		   /* DELAY AT LEAS;T 140ns */
	NOP;
	SetBit(LCDPORTEN,LCDEN); 			   /* EN = 1 */
	NOP;						  		   /* DELAY AT LEAST 450ns */
	NOP;
	NOP;
	NOP;
	NOP;
	LCDDDRDATA = 0XFF;                     /* WRITE DATA TO LCD */
	LCDPORTDATA = data;
	ClrBit(LCDPORTEN,LCDEN); 			   /* EN = 0 */
	NOP;                                   /* DELAY AT LEAST 10ns */
	SetBit(LCDPORTCS1,LCDCS1);	           /* CHIP DISABLE */		
	SetBit(LCDPORTCS2,LCDCS2);
	NOP;
}

/*****************************************
*  FUNCTION NAME: LcdWrDat
*  DESCRIPTION:   Write Data To LCD 
*                 chiplr = "L" or "R"
/*****************************************/
void LcdWrDat(unsigned char chiplr,unsigned char data)
{
    while(LcdBusy() == 0)                   /* IF LCD BUSY,WAIT... */
	    ;
	SetBit(LCDPORTRS,LCDRS);				/* RS = 0 ,COMMAND */
	ClrBit(LCDPORTRW,LCDRW);				/* RW = 0 ,WRITE */
	if(chiplr == 'L')						/* CS = 0 ,CHIP SELECT */
	    ClrBit(LCDPORTCS1,LCDCS1);
	else if(chiplr == 'R')
	    ClrBit(LCDPORTCS2,LCDCS2);
	else
	    {
		    ClrBit(LCDPORTCS1,LCDCS1);
		    ClrBit(LCDPORTCS2,LCDCS2);
		}
    NOP;						  		   /* DELAY AT LEAST 140ns */
	NOP;
	SetBit(LCDPORTEN,LCDEN); 			   /* EN = 1 */
	NOP;						  		   /* DELAY AT LEAST 450ns */
	NOP;
	NOP;
	NOP;
	NOP;
	LCDDDRDATA = 0XFF;                     /* WRITE DATA TO LCD */
	LCDPORTDATA = data;
	ClrBit(LCDPORTEN,LCDEN); 			   /* EN = 0 */
	NOP;                                   /* DELAY AT LEAST 10ns */
	SetBit(LCDPORTCS1,LCDCS1);	           /* CHIP DISABLE */		
	SetBit(LCDPORTCS2,LCDCS2);
	NOP;
}

/*****************************************
*  FUNCTION NAME: LcdRdSta
*  DESCRIPTION:   Read Status From LCD
/*****************************************/
unsigned char LcdRdSta(unsigned char chiplr)
{
    unsigned char temp;
	ClrBit(LCDPORTRS,LCDRS);				/* RS = 0 ,COMMAND */
	SetBit(LCDPORTRW,LCDRW);				/* RW = 1 ,READ */
	if(chiplr == 'L')						/* CS = 0 ,CHIP SELECT */
	    ClrBit(LCDPORTCS1,LCDCS1);
	else if(chiplr == 'R')
	    ClrBit(LCDPORTCS2,LCDCS2);
	else
	    {
		    ClrBit(LCDPORTCS1,LCDCS1);
		    ClrBit(LCDPORTCS2,LCDCS2);
		}
    NOP;						  		   /* DELAY AT LEAS;T 140ns */
	NOP;
	SetBit(LCDPORTEN,LCDEN); 			   /* EN = 1 */
	NOP;						  		   /* DELAY AT LEAST 450ns */
	NOP;
	NOP;
	NOP;
	NOP;
	LCDDDRDATA = 0X00;                     /* READ DATA FROM LCD */
	temp = LCDPINDATA;
	ClrBit(LCDPORTEN,LCDEN); 			   /* EN = 0 */
	NOP;                                   /* DELAY AT LEAST 10ns */
	SetBit(LCDPORTCS1,LCDCS1);	           /* CHIP DISABLE */		
	SetBit(LCDPORTCS2,LCDCS2);
	NOP;
	return temp;    
}

/*****************************************
*  FUNCTION NAME: LcdRdDat
*  DESCRIPTION:   Read Data From LCD 
/*****************************************/
unsigned char LcdRdDat(unsigned char chiplr)
{
    unsigned char temp;
	while(LcdBusy() == 0)                   /* IF LCD BUSY,WAIT... */
	    ;
	SetBit(LCDPORTRS,LCDRS);				/* RS = 1 ,DATA */
	SetBit(LCDPORTRW,LCDRW);				/* RW = 1 ,READ */
	if(chiplr == 'L')						/* CS = 0 ,CHIP SELECT */
	    ClrBit(LCDPORTCS1,LCDCS1);
	else if(chiplr == 'R')
	    ClrBit(LCDPORTCS2,LCDCS2);
	else
	    {
		    ClrBit(LCDPORTCS1,LCDCS1);
		    ClrBit(LCDPORTCS2,LCDCS2);
		}
    NOP;						  		   /* DELAY AT LEAS;T 140ns */
	NOP;
	SetBit(LCDPORTEN,LCDEN); 			   /* EN = 1 */
	NOP;						  		   /* DELAY AT LEAST 450ns */
	NOP;
	NOP;
	NOP;
	NOP;
	LCDDDRDATA = 0X00;                     /* READ DATA FROM LCD */
	temp = LCDPINDATA;
	ClrBit(LCDPORTEN,LCDEN); 			   /* EN = 0 */
	NOP;                                   /* DELAY AT LEAST 10ns */
	SetBit(LCDPORTCS1,LCDCS1);	           /* CHIP DISABLE */		
	SetBit(LCDPORTCS2,LCDCS2);
	NOP;
	return temp;    
}

/*****************************************
*  FUNCTION NAME: LcdBusy
*  DESCRIPTION:   LCD BUSY OR NOT
*                 BUSY-RETURN 0
*                 NOT BUSY-RETURN 1
/*****************************************/
unsigned char LcdBusy(void)
{
    unsigned char temp1,temp2;
	temp1 = LcdRdSta('L'); 				   /* READ LCD STA. */
	temp1 = temp1&0X80;
	temp2 = LcdRdSta('R');
	temp2 = temp2&0X80;
	if(temp1|temp2)
	    return 0;
	else
	    return 1;
}

/*****************************************
*  FUNCTION NAME: LcdClr
*  DESCRIPTION:   CLEAR LCD
/*****************************************/
void LcdClr(void)
{
	unsigned char count;
	unsigned char temp;
	/* CLEAR LEFT&RIGHT SCREEN */
	LcdWrCmd('B',0X3E);      			   /* LCD OFF */
	LcdWrCmd('B',0XC0);                    /* SET ROW */
	for(count=0; count<8; count++)
	{
	    LcdWrCmd('B',0XB8+count);          /* SET PAGE */
		LcdWrCmd('B',0X40);     		   /* SET Y */
		for(temp=0; temp<64; temp++)
		{
		     LcdWrDat('B',0X00);
		}
	}
	LcdWrCmd('B',0X3F);      			   /* LCD ON */
}

/*****************************************
*  FUNCTION NAME: LcdDisplaySeg
*  DESCRIPTION:   DISPLAY 8-BIT SEGMENT
*  <---------offset 0 to 127----------->
*                page0
*                  |
*                page7
*  <---------offset 0 to 127----------->
/*****************************************/
void LcdDisplaySeg(unsigned char page,unsigned char offset,unsigned char data)
{
    /* Display at Left Part */
	if(offset < 64)
	{
		//LcdWrCmd('L',0X3F);      			   /* LCD ON */
 	    LcdWrCmd('L',0XC0);                    /* SET ROW */
		LcdWrCmd('L',0XB8+page);               /* SET PAGE */
		LcdWrCmd('L',0X40+offset);     		   /* SET Y */
		LcdWrDat('L',data);					   /* WRITE SEGMENT */
	}
    else
    {
	    LcdWrCmd('R',0X3F);      			   /* LCD ON */
 	    LcdWrCmd('R',0XC0);                    /* SET ROW */
		LcdWrCmd('R',0XB8+page);               /* SET PAGE */
		LcdWrCmd('R',0X40+offset-64);     	   /* SET Y */
		LcdWrDat('R',data);					   /* WRITE SEGMENT */
	}
}

/************************************************
*  FUNCTION NAME: LcdDisplayDot
*  DESCRIPTION:   DISPLAY 1-BIT DOT
*  不在单片机里面开设缓存,直接修改LCD的RAM后显示
*  <---------offset 0 to 127----------->
*                  0
*                  |
*                  64
*  <---------offset 0 to 127----------->
/*************************************************/
void LcdDisplayDot(unsigned char x,unsigned char y,unsigned char data)
{
    unsigned char temp1,temp2,a;
    if(x>127 | y>63)
	    return;
	temp1 = y / 8;			  	 			   /* GET VALUE OF WHICH PAGE */
    temp2 = y % 8;                             /* GET VALUE OF WHICH Y-OFFSET */
	/* IN ORDER TO NOT MODFIY NOW DISPLY VALUE */ 
	if(x < 64)							       /* GET PRE. SEGMENT VALUE */
	{
 	    LcdWrCmd('L',0XC0);                    /* SET ROW */
		LcdWrCmd('L',0XB8+temp1);              /* SET PAGE */
		LcdWrCmd('L',0X40+x);     		       /* SET X */
		a = LcdRdDat('L');				       /* READ NOW SEGMENT VALUE */
		a = LcdRdDat('L');	
		if(data == 0)						   /* DOT ON/OFF */
		    a&=~(1<<temp2);
		else
		    a|=(1<<temp2);
	}
    else
    {
 	    LcdWrCmd('R',0XC0);                    /* SET ROW */
		LcdWrCmd('R',0XB8+temp1);              /* SET PAGE */
		LcdWrCmd('R',0X40+x-64);     	       /* SET X*/
		a = LcdRdDat('R');				       /* READ NOW SEGMENT VALUE */
		a = LcdRdDat('R');	
		if(data == 0)						   /* DOT ON/OFF */
		    a&=~(1<<temp2);
		else
		    a|=(1<<temp2);
	}
	
	if(x < 64)							       /* WRITE VALUE AS SEGMENT */
	{
		//LcdWrCmd('L',0X3F);      			   /* LCD ON */
 	    LcdWrCmd('L',0XC0);                    /* SET ROW */
		LcdWrCmd('L',0XB8+temp1);              /* SET PAGE */
		LcdWrCmd('L',0X40+x);     		       /* SET X */
		LcdWrDat('L',a);				 	   /* WRITE SEGMENT */
	}
    else
    {
	    //LcdWrCmd('R',0X3F);      			   /* LCD ON */
 	    LcdWrCmd('R',0XC0);                    /* SET ROW */
		LcdWrCmd('R',0XB8+temp1);              /* SET PAGE */
		LcdWrCmd('R',0X40+x-64);     	       /* SET X*/
		LcdWrDat('R',a);				       /* WRITE SEGMENT */
	}
}

/*******************************************************
*  FUNCTION NAME: LcdDsiplayRefresh 				   *
*  DESCRIPTION: 显示内容写入单片机RAM中,再LCD上显示    *
*               为了提高3D图形显示速度。
/******************************************************/
void LcdDsiplayRefresh(void)
{
    unsigned char temp1,temp2;
	for(temp1=0; temp1<8; temp1++)
	{
	    for(temp2=0; temp2<128; temp2++)
		{
		    LcdDisplaySeg(temp1,temp2,displaybuffer[temp1][temp2]);	
		}
	}
}

/****************************************
*  FUNCTION NAME: Delay1ms 				*
*  DESCRIPTION: MCU CLOCK=11.0592Mhz    *
/***************************************/
void Delay1ms(void)
{
    unsigned int temp;   
	unsigned char i;
	for(i=0;i<10;i++)
	{     
       for(temp=20; temp>0;temp--)              /* Delay About 1ms */
       {
         NOP;                                 
	   }
	}
}

⌨️ 快捷键说明

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