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

📄 lcd_0108.c

📁 基于ATmega64单片机以及vs1003的SD卡方案的MP3播放源代码
💻 C
字号:
#include "LCD.H"

#define DefaultRow		0xc0
#define DefaultColumn	0x40
#define DefaultPage		0xb8                                                            

#define uchar unsigned char
#define uint unsigned int

uchar Dis_Buf[1024];

uchar AREA=1;
uchar error_flag=0;



//////////////////底层函数////////////////////////////////////////////////////////////////


/*************************************************/
/*      LCD初始化函数                            */
/*************************************************/
void InitialLcd(void)
{
	MCUCR |= (1<<SRE);             //使能总线
	//XMCRA |= (1<<SRW00)|(1<<SRW01);//加入等待

	SET_RST_OUTPUT();			//设RST为输出
	SET_CSA_OUTPUT();			//设CSA为输出		
	SET_CSB_OUTPUT();			//设CSB为输出
	SET_CSA();					//设置CSA CSB为无效状态
	SET_CSB();
	CLR_RST();					//拉地RST复位
	LCDDelay(255);				//延时
	SET_RST();					//拉高
	LCDDelay(255);				//延时
    ShowLcd(0x00);				//关显示
	ClearDisBuf(0x00);				//清屏
	UpdateDis();
	LocateLcdPageColumn(0x00,0x00);//定位显示点		
	ShowLcd(0x01 );				//开显示
}


/*************************************************/
/*      判忙函数 出错由全局变量error_flag带出    */
/*************************************************/
void BusyOrNot()
{
	uchar _data,i=0;
	while(1)
	{
		_data = CMD_READ;      //读命令状态
		_data=0x90 & _data;
		if(_data==0x00) break;//比较
		if(i++==255){error_flag=1;return;}//超时错误
	}
}

/*************************************************/
/*      向右区写命令                             */
/*************************************************/
void WriteCommandToRightArea(uchar Command)
{
	CLR_CSB();			//选中右区
	BusyOrNot();		//判忙
	CMD_WRITE = Command;//写命令
	SET_CSB();			//释放右区
}

/*************************************************/
/*      向右区写数据                             */
/*************************************************/
void WriteDataToRightArea(uchar _Data)
{
	CLR_CSB();			//选中右区
	BusyOrNot();		//判忙
	DAT_WRITE = _Data;	//写数据
	SET_CSB();			//释放右区
}

/*************************************************/
/*      向左区写命令                             */
/*************************************************/
void WriteCommandToLeftArea(uchar Command)
{
	CLR_CSA();			//选中右区
	BusyOrNot();		//判忙
	CMD_WRITE = Command;//写命令
	SET_CSA();			//释放右区
}

/*************************************************/
/*      向左区写数据                             */
/*************************************************/
void WriteDataToLeftArea(uchar _Data)
{
	CLR_CSA();			//选中右区
	BusyOrNot();		//判忙
	DAT_WRITE = _Data;	//写数据
	SET_CSA();			//释放右区
}




/*************************************************/
/*      清LCD屏                                  */
/*************************************************/
void ClearDisBuf(uchar val)
{
	uint i;
	for(i=0;i<1024;i++)Dis_Buf[i]=val;
}

/*************************************************/
/*      更新显示                                 */
/*************************************************/
void UpdateDis(void)
{
	uchar Page,Column;
	uchar *p = Dis_Buf;
	for(Page=0,Column=0;Page<8;Page++)
	{
		LocateLcdPageColumn(Page,Column);//定位右区页和列
		for(Column=0;Column<64;Column++)WriteDataToRightArea(*p++);//写右区
		LocateLcdPageColumn(Page,Column);//定位左区页和列
		for(Column=64;Column<128;Column++)WriteDataToLeftArea(*p++);//写左区
	}
	LocateLcdPageColumn(0x00,0x00);//定位显示点		
	ShowLcd(0x01 );				//开显示
}


/*************************************************/
/*      开关LCD显示                              */
/*************************************************/
void ShowLcd(uchar on)//LCD的显示开关,on=0x00,关;on=0x01,开.
{
	uchar temp;
	temp=0x3E;			//00111110B
	temp+=on;
	WriteCommandToRightArea(temp);
	WriteCommandToLeftArea(temp);
}

//定位列
void LocateLcdColumn(uchar Column)
{
	uchar temp;
	temp = DefaultColumn;//01000000B
	temp += Column;					   
	if(Column>63)
	{
		temp -= 64;		        //为数据写入指示右区
		WriteCommandToLeftArea(temp); //定位右区列
	}
	else WriteCommandToRightArea(temp);//定位左区列	   
}

//定位页
void LocateLcdPage(uchar Page)
{
	uchar temp;
	temp=DefaultPage;					//10111000B;
	temp+=Page;
	WriteCommandToRightArea(temp);
	WriteCommandToLeftArea(temp);
}

//定位页列
void LocateLcdPageColumn(uchar Page,uchar Column)
{
	LocateLcdPage(Page);
	LocateLcdColumn(Column);
}



////////////////以上为底层函数///////////////////////////////////////////////////////////////

/*************************************************/
/*    填充一个像素数据  x,y为坐标 val为0或1      */
/*************************************************/
void OnePixel(uchar x,uchar y,uchar val)
{
	uchar *p = &Dis_Buf[ ((y>>3)<<7) + x ];//找到对应字节
	if(val)*p |= (1<<(y%8));		//修改对应位
	else *p &= ~(1<<(y%8));
}

unsigned char ReadPixel(uchar x,uchar y)
{
	uchar *p = &Dis_Buf[ ((y>>3)<<7) + x ];//找到对应字节
	if(*p & (1<<(y%8)))return 1;
	else return 0;
}

void LCDDelay(uint n)
{
	while(n--)asm("nop;");
}


⌨️ 快捷键说明

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