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

📄 lcd.c

📁 ATMEL ATSAM7S64处理器部分控制程序。
💻 C
字号:

#include "Lcd.h"
#include "Board.h"

void _nop_()
{
int i;
for (i=0;i<100;i++);
}


void DelayUs(int us_time)
{
 int i;
 for (i = 0;i <100*us_time; i++);

}
void DelayMs(int ms_time)
{
	int i;
	
	for( i = 0 ; i < 1000*ms_time ; i++ );
		
}

/*=======================================================
 显示光标定位
=======================================================*/
void LocateXY( char posx,char posy) {

    Uchar cmd;
    cmd = 0x80 | posx << 6 | posy;
	LcdWriteCommand(cmd,1);
}


/*=======================================================
 按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) 
{

	LocateXY( x, y );				// 定位显示地址
	LcdWriteData( Wdata );			// 写字符
}
/*=======================================================
 显示字符串
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar  *ptr)
 {
    Uchar i,l=0;
	while (ptr[l] >31)
	      {l++;};
	for (i=0;i<l;i++) 
	{
		DispOneChar(x,y++,ptr[i]);
		if ( x == 16 )
		{
			x = 0; y ^= 1;
		}
	}
 }

void LcdReset( void ) 
{

   	LcdWriteCommand( 0x38, 0);			// 显示模式设置(不检测忙信号)
		DelayMs(5);
	LcdWriteCommand( 0x38, 0);			// 共三次
		DelayMs(5);
	LcdWriteCommand( 0x38, 0);
		DelayMs(5);

	LcdWriteCommand( 0x38, 1);			// 显示模式设置(以后均检测忙信号)
    LcdWriteCommand( 0x08, 1);			// 显示关闭
   	LcdWriteCommand( 0x0c, 1);			// 显示清屏
//	LcdWriteCommand( 0x0f, 1);			// 显示光标移动设置
    LcdWriteCommand( 0x01, 1);			// 显示开及光标设置
	LcdWriteCommand( 0x06, 1);          //地址指针设置
	
}

/*=======================================================
 写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) 
{
    
    _nop_();
	if (AttribC) WaitForEnable();				// 检测忙信号?
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RS); //RS = 0;
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RW); //	RW = 0; 
		
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA,  LCM_PORT );
	_nop_();
    AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCM_PORT);
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, CMD<<24);//	DataPort = CMD; 
	_nop_();					// 送控制字子程序
	
	AT91F_PIO_SetOutput( AT91C_BASE_PIOA, ELCM);  //Elcm = 1;
	_nop_();
	_nop_();
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, ELCM);  //Elcm =0;
				// 操作允许脉冲信号	
}

/*=======================================================
 当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW ) 
{

    
	WaitForEnable();							// 检测忙信号
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, RS);  //RS = 1;
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RW); //	RW = 0; 
	 _nop_();
    
    AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCM_PORT); 
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, dataW<<24);//	DataPort = LCM_DATA ; 
    _nop_();
    
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, ELCM);  //Elcm = 1;
	_nop_();
	_nop_();
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, ELCM);  //Elcm =0;	

}

/*=======================================================
正常读写操作之前必须检测LCD控制器状态:	CS=1 RS=0 RW=1
DB7:    0  LCD控制器空闲; 1  LCD控制器忙
========================================================*/
void WaitForEnable( void ) 
{
   
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, 0xff000000); //DataPort = C;
    AT91F_PIO_CfgInput(AT91C_BASE_PIOA, LCM_PORT) ;
    
    
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, RS); //RS = 0;
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, RW); //	RW = 1; 
    _nop_();
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, ELCM);  //Elcm = 1;
    _nop_();
    _nop_();
	int z;
	z= AT91F_PIO_GetInput(AT91C_BASE_PIOA);	
	
	while((AT91F_PIO_GetInput(AT91C_BASE_PIOA) >>24) & Busy );
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCM_PORT );
	AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, ELCM);  //Elcm =0;
}	
                 

⌨️ 快捷键说明

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