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

📄 lcd_display.c.txt

📁 LCD display LCD display
💻 TXT
字号:


#define SCLK_SET PORTA |= BIT(PA5)   //PA5作为时钟管脚
#define SCLK_CLR PORTA &= ~BIT(PA5)
#define SID_SET PORTA |= BIT(PA6)    //PA6作为数据传输管脚
#define SID_CLR PORTA &= ~BIT(PA6)
#define CS_SET PORTA |= BIT(PA7)     //PA7作为片选管脚
#define CS_CLR PORTA &= ~BIT(PA7)
#define SRCLK_SET PORTG = PORTG | BIT(PG4)        //将PG4作为时钟输出线
#define SRCLK_CLR PORTG = PORTG & ~BIT(PG4)

#define Uint unsigned int
#define Uchar unsigned char

/*
***********************************************************
*函 数 名:  Byte_Transfer
*功    能:  向液晶模块传输一个字节
*输入参数:  dat_com:表示数据或指令
	    flag表示R/W,D/I且flag<4
*输出参数:  无
*返 回 值:  无
*==========================================================
*日    期:  2005.9.20
*作    者:  haifengliang
*修改记录:
***********************************************************
*/
void Byte_Transfer(Uchar dat_com,Uint flag)
{
 	 Uchar pb;
	 Uint i;
	 						   
	 //DDRA = 0x1c;
	 
	 SCLK_CLR;
	 SID_CLR;
	 CS_CLR;
	 CS_SET;
	 
	 SID_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;                              //Synchronizing Bit String
	 switch(flag)
	 {
	  		case 0:                           //RW=0,RS=0
				SCLK_CLR;
				SID_CLR;
				SCLK_SET;
				SCLK_CLR;
				SID_CLR;
				SCLK_SET;
				break;
			case 1:                          //RW=0,RS=1
				SCLK_CLR;
				SID_CLR;
				SCLK_SET;
				SCLK_CLR;
				SID_SET;
				SCLK_SET;
				break;
			case 2:                          //RW=1,RS=0;
			    SCLK_CLR;
				SID_SET;
				SCLK_SET;
				SCLK_CLR;
				SID_CLR;
				SCLK_SET;
				break;
			case 3:                          //RW=1,RS=1
				SCLK_CLR;
				SID_SET;
				SCLK_SET;
				SCLK_CLR;
				SID_SET;
				SCLK_SET;
				break;
			default:
			    break;		
	 }
	 SCLK_CLR;
	 SID_CLR;
	 SCLK_SET;                             //The first byte is over
	 
	 pb = dat_com;
	 pb = pb&0xf0;                       //obtain the higher 4 data
	 for(i = 0;i < 4;i++)                //OUTPUT HIGHER 4 DATA
	 {
	  	  if((pb & 0x80) != 0)
		  {
		   	  SCLK_CLR;
			  SID_SET;
			  SCLK_SET; 
		  }
		  else
		  {
		      SCLK_CLR;
			  SID_CLR;
			  SCLK_SET;
		  }
		  pb = pb<<1;
	 }
	 SID_CLR;                                     //OUTPUT 0000
	 SCLK_CLR;                     
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;                                  //the second byte is over
	 
	 pb = dat_com;
	 pb = pb&0x0f;
	 pb = pb << 4;
	 for(i = 0;i < 4;i++)                       //OUTPUT LOWER 4 DATA
	 {
	  	  if((pb & 0x80) != 0)
		  {
		   	  SCLK_CLR;
			  SID_SET;
			  SCLK_SET; 
		  }
		  else
		  {
		      SCLK_CLR;
			  SID_CLR;
			  SCLK_SET;
		  }
		  pb = pb << 1;
	 }
	 SID_CLR;                                  //OUTPUT 0000
	 SCLK_CLR;                     
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;
	 SCLK_CLR;
	 SCLK_SET;                                //the third byte is over
}


/*
***********************************************************
*函 数 名:  Write_Com
*功    能:  写命令
*输入参数:  com:待写指令
*输出参数:  无
*返 回 值:  无
*==========================================================
*日    期:  2005.9.20
*作    者:  haifengliang
*修改记录:
***********************************************************
*/
void Write_Com(Uchar com)
{
 	Uint flag;
	flag = 0;
	Byte_Transfer(com,flag);
}

/*
***********************************************************
*函 数 名:  Write_Dat
*功    能:  写数据
*输入参数:  dat:待写数据
*输出参数:  无
*返 回 值:  无
*==========================================================
*日    期:  2005.9.20
*作    者:  haifengliang
*修改记录:
***********************************************************
*/
/**********写数据**********/
void Write_Dat(Uchar dat)
{
 	 Uint flag;
	 flag = 1;
	 Byte_Transfer(dat,flag);
}


/*
***********************************************************
*函 数 名:  Lcd_Init
*功    能:  液晶模块初始化
*输入参数:  dat:待写数据
*输出参数:  无
*返 回 值:  无
*==========================================================
*日    期:  2005.9.20
*作    者:  haifengliang
*修改记录:
***********************************************************
*/
void Lcd_Init()
{
   
   Write_Com(0x30);//功能设定
   delay_ms(5);
   
   Write_Com(0x01);//清屏
   delay_ms(5);
   
   Write_Com(0x28); //功能设定,DL=0 asm("nop");
   delay_us(100);
   
   Write_Com(0x0c); //显示打开,光标关,反白显示关 
   delay_us(100);
   
}

/*
***********************************************************
*函 数 名:  Display
*功    能:  字符串或汉字显示
*输入参数:  ptr:待显示的字符或汉字
	    ddram:显示位置0x80<ddram<0x9F
*输出参数:  无
*返 回 值:  无
*==========================================================
*日    期:  2005.9.20
*作    者:  haifengliang
*修改记录:
***********************************************************
*/
void Display(const Uchar *ptr,Uchar ddram) 
{
 	 Uchar Length_String,Cur_Column;
	 Uchar i;
	 Length_String = 0;
	 while((ptr[Length_String] != '\0') && (Length_String < 0x10))
	 	Length_String++;
	
	if(ddram < 0x88)
	 	hang = 0;               //定位行地址:第一行0x80~0x88
	else if(ddram < 0x90)
		hang = 2;               //定位行地址:第三行0x88~0x8F
	else if(ddram < 0x98)
	    hang = 1;               //定位行地址:第二行0x90~0x98
	else
	    hang = 3;               //定位行地址:第四行0x98~0x9F
		
	lie = 0x0f & ddram;
	if(lie > 0x07)
		 lie = lie-0x08;
	Cur_Column = lie*2;          //针对字符串
	
	Write_Com(ddram);            //定位显示起始地址
	
	for(i = 0;i < Length_String;i++)
	{
	 	 Write_Dat(ptr[i]);      //输出单个字符
		 Cur_Column++;
		 if( Cur_Column == 0x10)
		 {
		  	 Cur_Column =0;
			 hang ++;
			 switch(hang)
			 {
			  	case 0:
					 Write_Com(0x80);
					 break;
				case 2:
				     Write_Com(0x90);
					 break;
				case 1:
				     Write_Com(0x88);
					 break;
				case 3:
				     Write_Com(0x98);
					 break;
				default:
				     break;
			 }
			 if(hang > 3)
			 {
			  	 Write_Com(0x80);
				 hang = 0;
			 }
		 }
	}
}

int main(void)
{
	flash Uchar STR1[] = "    上海交通大学   ";
	Display(STR1,0x88);
	while(1)
	{
	}
	return 0;
}

⌨️ 快捷键说明

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